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 | |
|---|---|---|---|---|
| fcs_ql_parser-1.3.0.tar.gz | 35.9 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| fcs_ql_parser-1.3.0-py3-none-any.whl | Python 3 | none | any | Details |
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.