FCS-QL for Python
- CLARIN-FCS Core 2.0 query language grammar and parser
- based on Github: clarin-eric/fcs-ql and Github: clarin-eric/fcs-simple-endpoint
- for more details visit: CLARIN FCS Technical Details
Installation
Install from PyPI:
python3 -m pip install fcs-ql-parser
Or install from source:
git clone https://github.com/Querela/fcs-ql-python.git
cd fcs-ql-python
uv build
# built package
python3 -m pip install dist/fcs_ql_parser-<version>-py3-none-any.whl
# or
python3 -m pip install dist/fcs_ql_parser-<version>.tar.gz
# for local development
python3 -m pip install -e .
Usage
The high-level interface fcsql.parser.QueryParser wraps the ANTLR4 parse tree into a simplified query node tree that is easier to work with. The fcsql-parser exposes a simple parsing function with fcsql.parse(input: str, enableSourceLocations: bool = True) -> fcsql.parser.QueryNode:
import fcsql
## parsing a valid query into a query node tree
# our query input string
input = '[ pos = "NOUN" ]'
# parse into QueryNode tree
sc = fcsql.parse(input)
# print stringified tree
print(str(sc))
## handling possibly invalid queries
input = "[ kaputt ]"
try:
fcsql.parse(input)
except fcsql.QueryParserException as ex:
print(f"Error: {ex}")
You can also use the more low-level ANTLR4 framework to parse the query string. A handy wrapper is provided with fcsql.antlr_parse(input: str) -> LexParser.QueryContext.
from antlr4 import CommonTokenStream, InputStream
from fcsql.parser import FCSLexer, FCSParser
input = '"test"'
input_stream = InputStream(input)
lexer = FCSLexer(input_stream)
stream = CommonTokenStream(lexer)
parser = FCSParser(stream)
tree: FCSParser.QueryContext = parser.query()
Parsed queries can also be checked against their specification conformance.
from fcsql import QueryParser
from fcsql.validation import FCSQLValidator, SpecificationValidationError
parser = QueryParser(enableSourceLocations=True)
query = '"Banane"'
node = parser.parse(query)
validator = FCSQLValidator()
validator.validate(node, query=query)
len(validator.errors) == 0 # no errors
# or to raise an error on first violation
query = '[ post = "NOUN" ]'
node = parser.parse(query)
validator = FCSQLValidator(raise_at_first_violation=True)
validator.validate(node, query=query) # raises SpecificationValidationError
A convenience method is provded with fcsql.validate(query: str):
from fcsql import validate
# simple boolean returns
validate("'apples'") # => True
validate("apples") # => False (parse error, invalid construct, not a simple string or token)
validate('[ pos = "NOUNT" ]{3,0}') # => False (repetition max must be >= min)
# or with list of errors
error = validate("pos = NOUN", return_errors=True)[0] # has one error
error.message # "mismatched input 'pos' expecting {'(', '[', REGEXP}"
error.type # "syntax-error"
error.fragment # "pos"
error.position.start # 0 (start offset in query string)
error.position.stop # 3 ( end offset in query string)
Development
Fetch (or update) grammar files:
git clone https://github.com/clarin-eric/fcs-ql.git
cp fcs-ql/src/main/antlr4/eu/clarin/sru/fcs/qlparser/fcs/*.g4 src/fcsql/
(Re-)Generate python parser code:
# setup environment
uv sync --extra antlr
# NOTE: you can activate the environment (if you do not want to prefix everything with `uv run`)
# NOTE: `uv` does not play nicely with `pyenv` - if you use `pyenv`, sourcing does NOT work!
source .venv/bin/activate
cd src/fcsql
uv run antlr4 -Dlanguage=Python3 *.g4 -listener -visitor
Run style checks:
# setup environment
uv sync --extra style
uv run isort --check --diff .
uv run black --check .
uv run flake8 . --show-source --statistics
uv run mypy src
Run tests (pytest with coverage, clarity and randomly plugins):
# setup environment
uv sync --extra test
uv run pytest
# to see output and run a specific test file
uv run pytest -v -rP tests/validation/test_validation.py
# with logs
uv run pytest -v -rP -o log_cli=true -o log_cli_level="DEBUG"
Build documentation:
# setup environment
uv sync --extra docs
# or if standalone
python3 -m pip install -r ./docs/requirements.txt
# build documentation and check links ...
uv run sphinx-build -b html docs dist/docs
uv run sphinx-build -b linkcheck docs dist/docs
Run check before publishing:
# setup environment
uv sync --extra build
# build the package
uv build
# run metadata check
# uv run python3 -m build
uv run twine check --strict dist/*
# (manual) check of package contents
tar tvf dist/fcs_ql_parser-*.tar.gz
See also
Metadata
Release files for fcs-ql-parser 1.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| fcs_ql_parser-1.3.0.tar.gz | 35.9 kB | Without provenance | Details for fcs_ql_parser-1.3.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| fcs_ql_parser-1.3.0-py3-none-any.whl | Python 3 | none | any | Details for fcs_ql_parser-1.3.0-py3-none-any.whl |
Total release size: 75.8 kB
Release files / fcs_ql_parser-1.3.0.tar.gz
| Download URL | fcs_ql_parser-1.3.0.tar.gz |
|---|---|
| Size | 35.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5d54ea3e234cef941d30a74a5bb171174b75127bb45761066d338a0a6ec6354d
|
|
BLAKE2b-256 checksum How to use checksums |
824bb9dfff6fc53f41796e8569d72d92b34ddf75d5be7cc6c128e534639a98bb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.2 {"installer":{"name":"uv","version":"0.10.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / fcs_ql_parser-1.3.0-py3-none-any.whl
| Download URL | fcs_ql_parser-1.3.0-py3-none-any.whl |
|---|---|
| Size | 39.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e207cfeda67cca0d7f5c79da48a85151a22b275137992e0d1a510c02b3958764
|
|
BLAKE2b-256 checksum How to use checksums |
481a2ad8b4236c47b3bea98f98aff5caaba58a8c40a9a625716cf3bf03a18eca
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.2 {"installer":{"name":"uv","version":"0.10.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for fcs-ql-parser 1.3.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.