From 405aaffc1bef25d3b6dc62e7f386bfe3cf49b109 Mon Sep 17 00:00:00 2001 From: Andreas Motl Date: Wed, 22 May 2024 14:53:23 +0200 Subject: [PATCH] JavaScript: Add CI configuration for software tests and Dependabot --- .github/dependabot.yml | 10 +++ .github/workflows/javascript.yml | 82 ++++++++++++++++++++++ .github/workflows/{main.yml => python.yml} | 2 +- cratedb_sqlparse_js/package-lock.json | 4 +- cratedb_sqlparse_js/package.json | 2 +- cratedb_sqlparse_py/tests/conftest.py | 2 +- pyproject.toml | 3 +- setup_grammar.py | 15 +++- 8 files changed, 112 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/javascript.yml rename .github/workflows/{main.yml => python.yml} (98%) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index eedeea3..5cf18d5 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,3 +1,8 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + version: 2 updates: @@ -7,6 +12,11 @@ updates: schedule: interval: "weekly" + - package-ecosystem: "npm" + directory: "/cratedb_sqlparse_js" + schedule: + interval: "weekly" + - package-ecosystem: "pip" directory: "/cratedb_sqlparse_py" schedule: diff --git a/.github/workflows/javascript.yml b/.github/workflows/javascript.yml new file mode 100644 index 0000000..4492c51 --- /dev/null +++ b/.github/workflows/javascript.yml @@ -0,0 +1,82 @@ +--- +name: JavaScript 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 JavaScript grammar. +defaults: + run: + working-directory: cratedb_sqlparse_js + +jobs: + + tests: + + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: ["ubuntu-latest"] + node-version: ["18", "20", "22"] + + env: + OS: ${{ matrix.os }} + NODEJS: ${{ matrix.node-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: Node.js ${{ matrix.node-version }} on OS ${{ matrix.os }} + steps: + + - name: Acquire sources + uses: actions/checkout@v4 + + # https://github.com/actions/setup-python + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: 3.12 + architecture: x64 + + # https://github.com/actions/setup-node + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + cache-dependency-path: '**/package-lock.json' + + - name: Generate runtime grammar + run: | + cd .. + pip install --requirement requirements.txt + python setup_grammar.py javascript + + - name: Set up project + run: npm install + + - name: Run linter and software tests + run: npm test diff --git a/.github/workflows/main.yml b/.github/workflows/python.yml similarity index 98% rename from .github/workflows/main.yml rename to .github/workflows/python.yml index 24d9958..c8eac07 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/python.yml @@ -62,7 +62,7 @@ jobs: cache: 'pip' cache-dependency-path: 'pyproject.toml' - - name: Setup project + - name: Set up project run: | # `setuptools 0.64.0` adds support for editable install hooks (PEP 660). diff --git a/cratedb_sqlparse_js/package-lock.json b/cratedb_sqlparse_js/package-lock.json index 5b13d67..be74d47 100644 --- a/cratedb_sqlparse_js/package-lock.json +++ b/cratedb_sqlparse_js/package-lock.json @@ -1,12 +1,12 @@ { "name": "cratedb-sqlparse", - "version": "0.0.1", + "version": "0.0.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cratedb-sqlparse", - "version": "0.0.1", + "version": "0.0.2", "license": "MIT", "dependencies": { "antlr4": "^4.13.1-patch-1" diff --git a/cratedb_sqlparse_js/package.json b/cratedb_sqlparse_js/package.json index bb4fca8..490737f 100644 --- a/cratedb_sqlparse_js/package.json +++ b/cratedb_sqlparse_js/package.json @@ -25,7 +25,7 @@ "sql-dialect" ], "scripts": { - "test": "vitest", + "test": "vitest run", "build": "vite build" }, "devDependencies": { diff --git a/cratedb_sqlparse_py/tests/conftest.py b/cratedb_sqlparse_py/tests/conftest.py index fcddbce..e5bf4cd 100644 --- a/cratedb_sqlparse_py/tests/conftest.py +++ b/cratedb_sqlparse_py/tests/conftest.py @@ -19,7 +19,7 @@ def generate(): # Test module for availability. find_spec("cratedb_sqlparse.generated_parser.SqlBaseParser") except ImportError: - subprocess.check_call([sys.executable, SETUP_GRAMMAR], cwd=HERE.parent.parent) # noqa: S603 + subprocess.check_call([sys.executable, SETUP_GRAMMAR, "python"], cwd=HERE.parent.parent) # noqa: S603 try: # Test module for availability. diff --git a/pyproject.toml b/pyproject.toml index 0e682b0..d697afb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,6 @@ [tool.poe.tasks] generate = [ - { cmd = "python setup_grammar.py" }, + { cmd = "python setup_grammar.py python" }, + { cmd = "python setup_grammar.py javascript" }, ] diff --git a/setup_grammar.py b/setup_grammar.py index b6050c4..c834f8c 100644 --- a/setup_grammar.py +++ b/setup_grammar.py @@ -143,10 +143,21 @@ def set_version(target: Antlr4Target, version: str): if __name__ == '__main__': + """ + Invoke the grammar compiler / generator. + + TODO: Converge `version` into command-line argument? + TODO: Improve efficiency by generating runtime parser for all implemented languages at once. + """ setup_logging() - # TODO: Converge into command-line argument? + input_target = sys.argv[1] version = '5.6.4' - target = Antlr4Target.python + if input_target.startswith("py"): + target = Antlr4Target.python + elif input_target.startswith("js") or input_target.startswith("java"): + target = Antlr4Target.js + else: + raise NotImplementedError(f"Parser generator for target {input_target} not implemented") download_cratedb_grammar(version) compile_grammar(target) patch_lexer(target)