diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..eedeea3 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,18 @@ +version: 2 + +updates: + + - package-ecosystem: "pip" + directory: "/" + schedule: + interval: "weekly" + + - package-ecosystem: "pip" + directory: "/cratedb_sqlparse_py" + schedule: + interval: "weekly" + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "monthly" diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..24d9958 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,88 @@ +--- +name: Python Tests + +on: + pull_request: ~ + push: + branches: [ main ] + + # Allow job to be triggered manually. + workflow_dispatch: + + # Run job each night after CrateDB nightly has been published. + schedule: + - cron: '0 3 * * *' + +# Cancel in-progress jobs when pushing to the same branch. +concurrency: + cancel-in-progress: true + group: ${{ github.workflow }}-${{ github.ref }} + +# Select Python grammar. +defaults: + run: + working-directory: cratedb_sqlparse_py + +jobs: + + tests: + + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: ["ubuntu-latest"] + python-version: ["3.8", "3.12"] + + env: + OS: ${{ matrix.os }} + PYTHON: ${{ matrix.python-version }} + + # https://docs.github.com/en/actions/using-containerized-services/about-service-containers + services: + cratedb: + image: crate/crate:nightly + ports: + - 4200:4200 + - 5432:5432 + env: + CRATE_HEAP_SIZE: 4g + + name: Python ${{ matrix.python-version }} on OS ${{ matrix.os }} + steps: + + - name: Acquire sources + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + architecture: x64 + cache: 'pip' + cache-dependency-path: 'pyproject.toml' + + - name: Setup project + run: | + + # `setuptools 0.64.0` adds support for editable install hooks (PEP 660). + # https://github.com/pypa/setuptools/blob/main/CHANGES.rst#v6400 + pip install "setuptools>=64" --upgrade + + # Install package in editable mode. + pip install --use-pep517 --prefer-binary --editable='.[develop,generate,test]' + + - name: Run linter and software tests + run: | + poe check + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v4 + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + with: + files: ./coverage.xml + flags: unittests + env_vars: OS,PYTHON + name: codecov-umbrella + fail_ci_if_error: true diff --git a/.gitignore b/.gitignore index a21b9b3..d841e3a 100644 --- a/.gitignore +++ b/.gitignore @@ -164,11 +164,3 @@ cython_debug/ *.tokens *.interp *.g4 - - -*SqlBaseLexer.js -*SqlBaseParser.js - -*SqlBaseLexer.py -*SqlBaseParser.py -*SqlBaseParserListener.py diff --git a/CHANGES.md b/CHANGES.md new file mode 100644 index 0000000..1a35e43 --- /dev/null +++ b/CHANGES.md @@ -0,0 +1,6 @@ +# Changelog + +## Unreleased + +## 2024/05/17 0.0.1 +- Initial release diff --git a/README.md b/README.md index 65bc3d2..aa3f1e4 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,10 @@ # cratedb-sqlparse `Antlr4` is a parser generator for reading, processing and executing text, there are several -target languages (Java, Python, JavaScript, Dart...) available. CrateDB uses the Java target. +target languages (Java, Python, JavaScript, Dart) available. CrateDB uses the Java target. The repository holds libraries/packages created from some of those available languages, so -far: `Python` and `JavaScript`. -More might be added if needed in the future. +far: `Python` and `JavaScript`. More might be added if needed in the future. These libraries allow you to parse Crate's SQL dialect without sending it to a CrateDB instance. @@ -50,29 +49,23 @@ exceptions as error listener, dollar strings and any new one. See past commits t implemented in Python and Javascript, remember that CrateDB's SQLParser written in Java is the most complete and the default reference. -## Building locally & using a different CrateDB version. +## Building locally & using a different CrateDB version The generated parser is not uploaded to the repository since it's huge, to use the package locally or to build a different version use the build script. -#### Clone the project -`git clone git@github.com:crate/cratedb-sqlparse.git` - -#### Install the dependencies -`pip install antlr4-python3-runtime requests` - -#### Run the build script -`python3 setup_grammar.py` +### Acquire sources +```shell +git clone git@github.com:crate/cratedb-sqlparse.git +cd cratedb-sqlparse +``` +### Install dependencies +``` +pip install -r requirements.txt +``` -> At the end of the build script `setup_grammar.py` the target and the CrateDB version can be modified. -> -> ```python -> if __name__ == '__main__': -> version = '5.6.4' -> target = Antlr4Target.python -> download_cratedb_grammar(version) -> compile_grammar(target) -> patch_lexer(target) -> set_version(target, version) ->``` +### Generate grammar files +```shell +poe generate +``` diff --git a/cratedb_sqlparse_py/.gitignore b/cratedb_sqlparse_py/.gitignore new file mode 100644 index 0000000..5244462 --- /dev/null +++ b/cratedb_sqlparse_py/.gitignore @@ -0,0 +1,3 @@ +*/generated_parser/SqlBaseLexer.py +*/generated_parser/SqlBaseParser.py +*/generated_parser/SqlBaseParserListener.py diff --git a/cratedb_sqlparse_py/README.md b/cratedb_sqlparse_py/README.md index 9c641da..f59de78 100644 --- a/cratedb_sqlparse_py/README.md +++ b/cratedb_sqlparse_py/README.md @@ -1,4 +1,4 @@ -# cratedb_sqlparse +# CrateDB SQL Parser for Python This package provides utilities to validate and split SQL statements specifically designed for CrateDB. @@ -36,3 +36,14 @@ print(select_query.tree) sqlparse('SUUULECT * FROM sys.shards') # cratedb_sqlparse.parser.parser.ParsingException: line1:0 mismatched input 'SUUULECT' expecting {'SELECT', 'DEALLOCATE', ...} ``` + + +## Development +```shell +git clone https://github.com/crate/cratedb-sqlparse +cd cratedb-sqlparse/cratedb_sqlparse_py +python3 -m venv .venv +source .venv/bin/activate +pip install --editable='.[develop,generate,release,test]' +poe check +``` diff --git a/cratedb_sqlparse_py/cratedb_sqlparse/parser.py b/cratedb_sqlparse_py/cratedb_sqlparse/parser.py index ecc0caa..875511d 100644 --- a/cratedb_sqlparse_py/cratedb_sqlparse/parser.py +++ b/cratedb_sqlparse_py/cratedb_sqlparse/parser.py @@ -1,3 +1,5 @@ +from typing import List + from antlr4 import InputStream, CommonTokenStream, Token from antlr4.error.ErrorListener import ErrorListener @@ -90,7 +92,7 @@ def __repr__(self): return f'{self.__class__.__qualname__}<{self.query if len(self.query) < 15 else self.query[:15] + "..."}>' -def sqlparse(query: str) -> list[Statement]: +def sqlparse(query: str) -> List[Statement]: """ Parses a string into SQL `Statement`. """ diff --git a/cratedb_sqlparse_py/poetry.lock b/cratedb_sqlparse_py/poetry.lock deleted file mode 100644 index 399704b..0000000 --- a/cratedb_sqlparse_py/poetry.lock +++ /dev/null @@ -1,269 +0,0 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. - -[[package]] -name = "antlr4-python3-runtime" -version = "4.13.1" -description = "ANTLR 4.13.1 runtime for Python 3" -optional = false -python-versions = "*" -files = [ - {file = "antlr4-python3-runtime-4.13.1.tar.gz", hash = "sha256:3cd282f5ea7cfb841537fe01f143350fdb1c0b1ce7981443a2fa8513fddb6d1a"}, - {file = "antlr4_python3_runtime-4.13.1-py3-none-any.whl", hash = "sha256:78ec57aad12c97ac039ca27403ad61cb98aaec8a3f9bb8144f889aa0fa28b943"}, -] - -[[package]] -name = "antlr4-tools" -version = "0.2.1" -description = "Tools to run ANTLR4 tool and grammar interpreter/profiler" -optional = false -python-versions = "*" -files = [ - {file = "antlr4-tools-0.2.1.tar.gz", hash = "sha256:eabad95c7d6b2e15b9875f630e6695395f90ed557721aeef7844d5821ac1ca6a"}, - {file = "antlr4_tools-0.2.1-py3-none-any.whl", hash = "sha256:71bfe6d5f856cbf69e69c4ad1750eb8f2c84e72b07780efabced6a8e5194f2e4"}, -] - -[package.dependencies] -install-jdk = "*" - -[[package]] -name = "certifi" -version = "2024.2.2" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, -] - -[[package]] -name = "charset-normalizer" -version = "3.3.2" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, -] - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -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 = "idna" -version = "3.6" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, -] - -[[package]] -name = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -optional = false -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] - -[[package]] -name = "install-jdk" -version = "1.1.0" -description = "install-jdk allows you to easily install latest Java OpenJDK version. Supports OpenJDK builds from Adoptium (previously AdoptOpenJDK), Corretto, and Zulu. Simplify your Java development with the latest OpenJDK builds." -optional = false -python-versions = ">=3.6,<4.0" -files = [ - {file = "install_jdk-1.1.0-py3-none-any.whl", hash = "sha256:b63f0fcd63f7abab3443d4120ba92716397753b8a8ea3c85762a629925a9936e"}, - {file = "install_jdk-1.1.0.tar.gz", hash = "sha256:2bfd53caf660e4916df0215a5715519dcb9547fa2a5f07421fd97a8046851eaa"}, -] - -[[package]] -name = "packaging" -version = "24.0" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, -] - -[[package]] -name = "pluggy" -version = "1.4.0" -description = "plugin and hook calling mechanisms for python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, - {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "pytest" -version = "8.1.1" -description = "pytest: simple powerful testing with Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pytest-8.1.1-py3-none-any.whl", hash = "sha256:2a8386cfc11fa9d2c50ee7b2a57e7d898ef90470a7a34c4b949ff59662bb78b7"}, - {file = "pytest-8.1.1.tar.gz", hash = "sha256:ac978141a75948948817d360297b7aae0fcb9d6ff6bc9ec6d514b85d5a65c044"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=1.4,<2.0" - -[package.extras] -testing = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] - -[[package]] -name = "requests" -version = "2.31.0" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.7" -files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "urllib3" -version = "2.2.1" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.8" -files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - -[metadata] -lock-version = "2.0" -python-versions = "^3.11" -content-hash = "219ae57c327a59b44840bb8702fa53d6be4897efea08ece7e31591e836c65a8a" diff --git a/cratedb_sqlparse_py/pyproject.toml b/cratedb_sqlparse_py/pyproject.toml index 27a15cb..eb56846 100644 --- a/cratedb_sqlparse_py/pyproject.toml +++ b/cratedb_sqlparse_py/pyproject.toml @@ -1,21 +1,218 @@ -[tool.poetry] +[build-system] +build-backend = "setuptools.build_meta" +requires = [ + "setuptools>=42", # At least v42 of setuptools required. + "versioningit", +] + +[tool.versioningit.vcs] +method = "git" +default-tag = "0.0.0" + +[project] name = "cratedb-sqlparse" -version = "0.1.0" -description = "" -authors = ["surister "] +description = "Parsing utilities to validate and split SQL statements for CrateDB." readme = "README.md" -packages = [{include = "cratedb_sqlparse"}] +keywords = [ + "antlr4", + "antlr4 grammar", + "cratedb", + "grammar", + "sql", + "sql grammar", + "sql parser", + "sql parsing", +] +license = { text = "Apache License 2.0" } +authors = [ + { name = "Ivan Sanchez Valencia", email = "ivan.sanchezvalencia@crate.io" }, +] +requires-python = ">=3.8,<3.13" +classifiers = [ + "Development Status :: 3 - Alpha", + "Environment :: Console", + "Intended Audience :: Customer Service", + "Intended Audience :: Developers", + "Intended Audience :: Education", + "Intended Audience :: End Users/Desktop", + "Intended Audience :: Information Technology", + "Intended Audience :: Science/Research", + "Intended Audience :: Telecommunications Industry", + "License :: OSI Approved :: Apache Software License", + "Operating System :: MacOS :: MacOS X", + "Operating System :: Microsoft :: Windows", + "Operating System :: POSIX :: Linux", + "Operating System :: Unix", + "Programming Language :: Python", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: SQL", + "Topic :: Communications", + "Topic :: Database", + "Topic :: Documentation", + "Topic :: Education", + "Topic :: Office/Business", + "Topic :: Scientific/Engineering", + "Topic :: Software Development :: Libraries", + "Topic :: Software Development :: Testing", + "Topic :: System :: Archiving", + "Topic :: System :: Systems Administration", + "Topic :: Text Processing", + "Topic :: Utilities", +] +dynamic = [ + "version", +] +dependencies = [ + "antlr4-python3-runtime<4.14", +] +[project.optional-dependencies] +develop = [ + "mypy<1.10", + "poethepoet<0.26", + "pyproject-fmt<1.8", + "ruff<0.4", + "validate-pyproject<0.17", +] +generate = [ + "antlr4-tools<0.3", + "requests<3", +] +release = [ + "build<2", + "twine<6", +] +test = [ + "pytest<9", + "pytest-cov<6", +] +[project.urls] +changelog = "https://github.com/crate/cratedb-sqlparse/blob/main/CHANGES.md" +documentation = "https://github.com/crate/cratedb-sqlparse" +homepage = "https://github.com/crate/cratedb-sqlparse" +repository = "https://github.com/crate/cratedb-sqlparse" -[tool.poetry.dependencies] -python = "^3.11" -antlr4-python3-runtime = "^4.13.1" +[tool.black] +line-length = 120 +[tool.coverage.run] +branch = false +omit = [ + "tests/*", +] +source = ["cratedb_sqlparse"] -[tool.poetry.group.dev.dependencies] -requests = "^2.31.0" -antlr4-tools = "^0.2.1" -pytest = "^8.1.1" +[tool.coverage.report] +fail_under = 0 +show_missing = true -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" +[tool.mypy] +packages = ["cratedb_sqlparse"] +install_types = true +ignore_missing_imports = true +implicit_optional = true +non_interactive = true + +[tool.pytest.ini_options] +addopts = """ + -rA --verbosity=3 --capture=no + --cov --cov-report=term-missing --cov-report=xml +""" +minversion = "2.0" +log_level = "DEBUG" +log_cli_level = "DEBUG" +log_format = "%(asctime)-15s [%(name)-24s] %(levelname)-8s: %(message)s" +testpaths = [ + "cratedb_sqlparse", + "tests", +] +xfail_strict = true +markers = [ +] + +[tool.ruff] +line-length = 120 + +lint.select = [ + # Bandit + "S", + # Bugbear + "B", + # Builtins + "A", + # comprehensions + "C4", + # eradicate + "ERA", + # flake8-2020 + "YTT", + # isort + "I", + # pandas-vet + "PD", + # print + "T20", + # Pycodestyle + "E", + "W", + # Pyflakes + "F", + # return + "RET", +] + +lint.extend-ignore = [ + # Unnecessary variable assignment before `return` statement + "RET504", + # Unnecessary `elif` after `return` statement + "RET505", +] + +[tool.ruff.lint.per-file-ignores] +"tests/*" = [ + # Use of `assert` detected. + "S101", +] +"influxio/util/report.py" = [ + "T201", +] + +[tool.setuptools.packages.find] +namespaces = false + + +# =================== +# Tasks configuration +# =================== + +[tool.poe.tasks] + +check = [ + "lint", + "test", +] + +format = [ + # { cmd = "ruff format ." }, + # Configure Ruff not to auto-fix (remove!) unused variables (F841) and `print` statements (T201). + # { cmd = "ruff check --fix --ignore=ERA --ignore=F401 --ignore=F841 --ignore=T20 ." }, + { cmd = "pyproject-fmt --keep-full-version pyproject.toml" }, +] + +lint = [ + # { cmd = "ruff format --check ." }, + # { cmd = "ruff check ." }, + { cmd = "validate-pyproject pyproject.toml" }, + # { cmd = "mypy" }, +] + +release = [ + { cmd = "python -m build" }, + { cmd = "twine upload dist/*" }, +] + +test = { cmd = "pytest" } diff --git a/cratedb_sqlparse_py/tests/conftest.py b/cratedb_sqlparse_py/tests/conftest.py new file mode 100644 index 0000000..3d5d40f --- /dev/null +++ b/cratedb_sqlparse_py/tests/conftest.py @@ -0,0 +1,26 @@ +import subprocess +import sys +from pathlib import Path + +import pytest + + +HERE = Path(__file__).parent +PROJECT_ROOT = HERE.parent.parent +SETUP_GRAMMAR = PROJECT_ROOT / "setup_grammar.py" + + +@pytest.fixture(scope="session", autouse=True) +def generate(): + """ + Pytest fixture to generate runtime grammar from grammar description. + """ + try: + import cratedb_sqlparse.generated_parser.SqlBaseParser + except ImportError: + subprocess.check_call([sys.executable, SETUP_GRAMMAR], cwd=HERE.parent.parent) + + try: + import cratedb_sqlparse.generated_parser.SqlBaseParser + except ImportError: + raise RuntimeError("Python grammar has not been generated") diff --git a/cratedb_sqlparse_py/tests/test_lexer.py b/cratedb_sqlparse_py/tests/test_lexer.py index 860e08e..427df73 100644 --- a/cratedb_sqlparse_py/tests/test_lexer.py +++ b/cratedb_sqlparse_py/tests/test_lexer.py @@ -1,9 +1,8 @@ import pytest -from cratedb_sqlparse import sqlparse, ParsingException - def test_sqlparser_one_statement(query=None): + from cratedb_sqlparse import sqlparse query = query or 'SELECT 1;' r = sqlparse(query) @@ -17,6 +16,7 @@ def test_sqlparser_one_statement(query=None): def test_sqlparse_several_statements(): + from cratedb_sqlparse import sqlparse query = """ SELECT 1; INSERT INTO doc.tbl VALUES (1,2,3,4,5,6); @@ -34,6 +34,7 @@ def test_sqlparse_several_statements(): def test_sqlparse_dollar_string(): + from cratedb_sqlparse import sqlparse query = "update test set a=$$test;test$$" r = sqlparse(query) @@ -41,6 +42,7 @@ def test_sqlparse_dollar_string(): def test_sqlparse_raises_exception(): + from cratedb_sqlparse import sqlparse, ParsingException query = "SALUT MON AMIE" with pytest.raises(ParsingException): @@ -48,6 +50,7 @@ def test_sqlparse_raises_exception(): def test_sqlparse_is_case_insensitive(): + from cratedb_sqlparse import sqlparse query = "inSerT InTo doc.Tbl1 Values (1)" r = sqlparse(query) diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..0e682b0 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,5 @@ +[tool.poe.tasks] + +generate = [ + { cmd = "python setup_grammar.py" }, +] diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..6743876 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +antlr4-tools<0.3 +poethepoet<0.26 +requests<3 diff --git a/setup_grammar.py b/setup_grammar.py index 003fe29..b6050c4 100644 --- a/setup_grammar.py +++ b/setup_grammar.py @@ -1,11 +1,20 @@ import datetime -import pathlib +import logging import subprocess +import sys from enum import Enum +from pathlib import Path import requests +def setup_logging(): + logging.basicConfig(stream=sys.stderr, level=logging.INFO, format="%(asctime)s %(levelname)s %(name)s: %(message)s") + + +logger = logging.getLogger(__name__) + + class Antlr4Target(Enum): js = 'JavaScript' python = 'Python3' @@ -32,7 +41,7 @@ class Antlr4Target(Enum): ] } -PARSER_COMPILE_PATH = pathlib.Path(__file__).parent +PARSER_COMPILE_PATH = Path(__file__).parent def download_cratedb_grammar(version='master'): @@ -43,13 +52,16 @@ def download_cratedb_grammar(version='master'): $ curl https://api.github.com/repos/crate/crate/tags | jq -r '.[] | .name' """ for file in build_options['files']: - response = requests.get(file['url'].format(version=version)) + url = file['url'].format(version=version) + logger.info(f"Downloading grammar: {url}") + response = requests.get(url) # We annotate the CrateDB branch and date of download to the Grammar files for reference. text = f'/* crate_branch={version}, at={datetime.datetime.now()}, annotatedby=cratedb_sqlparse */\n' + response.text - with open(str(PARSER_COMPILE_PATH.parent / file['filename']), 'w') as f: - f.write(text) + outfile = PARSER_COMPILE_PATH / file['filename'] + logger.info(f"Writing downloaded grammar: {outfile}") + outfile.write_text(text) def compile_grammar(target: Antlr4Target): @@ -61,7 +73,9 @@ def compile_grammar(target: Antlr4Target): sub_dir = build_options['antlr4_compiled_target_subdir'] for file in build_options['files']: - subprocess.run( + outfile = PARSER_COMPILE_PATH / base_dir / sub_dir / file['filename'] + logger.info(f"Compiling grammar: {outfile}") + subprocess.check_call( [ 'antlr4', f'-Dlanguage={target.value}', '-o', @@ -76,6 +90,8 @@ def patch_lexer(target: Antlr4Target): Patches the lexer file, removing bad syntax generated by Antlr4. """ + logger.info(f"Patching lexer type: {target}") + REMOVE_LINES = [ 'import io.crate.sql.AbstractSqlBaseLexer;', ] @@ -87,14 +103,15 @@ def patch_lexer(target: Antlr4Target): sub_dir = build_options['antlr4_compiled_target_subdir'] file_name = build_options['files'][0]['filename'].replace('g4', extension) - lexer_file = PARSER_COMPILE_PATH / base_dir / sub_dir / file_name + lexer_file = Path(PARSER_COMPILE_PATH / base_dir / sub_dir / file_name) + logger.info(f"Patching lexer file: {lexer_file}") - text = pathlib.Path(lexer_file).read_text() + text = lexer_file.read_text() for text_to_remove in REMOVE_LINES: text = text.replace(text_to_remove, '') - pathlib.Path(lexer_file).write_text(text) + lexer_file.write_text(text) def set_version(target: Antlr4Target, version: str): @@ -120,11 +137,14 @@ def set_version(target: Antlr4Target, version: str): index_file = 'index.js' variable = 'export const __cratedb_version__' + # FIXME: Need to apply "replace" instead of "append"? with open(target_path / index_file, "a") as f: f.write(f"{variable} = {version}\n") if __name__ == '__main__': + setup_logging() + # TODO: Converge into command-line argument? version = '5.6.4' target = Antlr4Target.python download_cratedb_grammar(version)