Skip to main content

LQP Python SDK

Python SDK for the Logical Query Protocol (LQP). Provides ProtoBuf bindings, a parser and pretty-printer for the human-readable S-expression syntax, and a CLI for converting between S-expression and ProtoBuf formats.

Installation

The lqp package is available on PyPI. Install it with

uv add lqp

or, equivalently, pip install lqp.

CLI Usage

To run the CLI without installing it into your project, use uvx:

uvx lqp --help
usage: lqp [-h] [-v] [--no-validation] [--out] [--bin | --json | --lqp] input

Parse, validate, and translate LQP files.

positional arguments:
  input            .lqp or .bin file, or a directory

options:
  -h, --help       show this help message and exit
  -v, --version    show program's version number and exit
  --no-validation  skip validation
  --out            write output to stdout
  --bin            write protobuf binary output
  --json           write protobuf JSON output
  --lqp            pretty-print LQP output

Examples

lqp --no-validation --bin --json foo/bar.lqp

Will create two files in foo/ named bar.bin and bar.json containing the binary and JSON encodings of the parsed ProtoBuf. In this case, the parser will not go through the client-side validations we do to check for well-formed LQP.

lqp --bin --json foo

This will look for .lqp files both at the top-level and inside an lqp subdirectory. Then it will organize the generated binary and JSON into folders, as well as the original found files. So, for example, if foo has this structure:

foo/
| bar.lqp
| lqp/
| | baz.lqp

Then after executing the above command, it should have this structure:

foo/
| bin/
| | bar.bin
| | baz.bin
| json/
| | bar.json
| | baz.json
| lqp/
| | bar.lqp
| | baz.lqp
lqp --bin --out foo.lqp

Will write the ProtoBuf binary parsed from the foo.lqp to stdout. The result can be piped into the desired output file, e.g., lqp --bin --out foo.lqp > foo.bin.

Development

This project uses uv for dependency management. A uv.lock file is committed to the repo to ensure reproducible builds. There is no manual setup required — uv run automatically creates a virtualenv and installs locked dependencies on first use.

From the repo root, common tasks are available via make:

make test-python                     # run tests (includes lint + type check)
make test-python-update-snapshots    # update test snapshots
make check-python                    # lint + type check only
make format-python                   # auto-format with ruff

Or run tools directly from within sdks/python/:

uv run lqp --help                         # run the lqp CLI from source
uv run python -m pytest                   # run tests
uv run python -m pytest --snapshot-update # update snapshots
uv run ruff check                         # lint
uv run ruff format                        # auto-format
uv run pyrefly check                      # type check
uv run python -m build                    # build distribution

To add testcases, add a .lqp file to the top-level tests/lqp directory. New files get picked up automatically. To generate or update the corresponding output files (binary, debug mode, and pretty-printing snapshots), run pytest --snapshot-update.

Formatting

The LQP S-expression syntax was chosen to align with that of the Clojure programming language, in order to leverage the existing tools in that ecosystem. LQP syntax should be formatted via cljfmt with the following configuration:

;; .cljfmt.edn
{:indents {#re ".*" [[:inner 0]]}
 :remove-surrounding-whitespace?  false
 :remove-trailing-whitespace?     false
 :remove-consecutive-blank-lines? false}

This configuration is explained here and simply works better for LQP, which does not have many of the Clojure keywords that are treated as special cases during formatting by default.

See the next section for an easy way to integrate cljfmt into your VSCode workflow.

VSCode

Editing nested S-expressions by hand can get a little tedious, which is why paredit is an established tool in the Clojure world. To integrate paredit and cljfmt into your VSCode workflow, just install the Calva extension and follow the configuration guide to use the cljfmt configuration pasted in the previous section.

Out-of-the-box, Calva also runs a Clojure linter, which of course does not know what to do with LQP, resulting in lots of squiggly lines. For that reason, it is also advisable to create the following config file at .lsp/config.edn from the project root:

;; .lsp/config.edn
{:linters {:clj-kondo {:level :off}}}

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lqp-0.5.8.tar.gz (94.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

lqp-0.5.8-py3-none-any.whl (88.3 kB view details)

Uploaded Python 3

File details

Details for the file lqp-0.5.8.tar.gz.

File metadata

  • Download URL: lqp-0.5.8.tar.gz
  • Upload date:
  • Size: 94.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for lqp-0.5.8.tar.gz
Algorithm Hash digest
SHA256 54ade436a2d9733fb829e66dc0279552a6916f5014a5bf53c0daa97dba6e6f4d
MD5 886e8d58da188387d67927e399b7b417
BLAKE2b-256 1c2f118d851c40251ae4be3a305bcd746a7328833cca4d6200c73a3187201d39

See more details on using hashes here.

Provenance

The following attestation bundles were made for lqp-0.5.8.tar.gz:

Publisher: publish-python.yml on RelationalAI/logical-query-protocol

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file lqp-0.5.8-py3-none-any.whl.

File metadata

  • Download URL: lqp-0.5.8-py3-none-any.whl
  • Upload date:
  • Size: 88.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for lqp-0.5.8-py3-none-any.whl
Algorithm Hash digest
SHA256 57e8aa32e55e25113d369b9a082827f3467682e1090a095d8ff86e82a4049449
MD5 1622914006cca23941f03188ce8be042
BLAKE2b-256 1b2389b17c9f2ed5f6428c9a697c79205529826128a0b3db6addc5125973aa41

See more details on using hashes here.

Provenance

The following attestation bundles were made for lqp-0.5.8-py3-none-any.whl:

Publisher: publish-python.yml on RelationalAI/logical-query-protocol

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.5.8 This release

2 files

0.5.7

2 files

0.5.6

2 files

0.5.5

2 files

0.5.4

2 files

0.5.3

2 files

0.5.2

2 files

0.5.1

2 files

0.5.0

2 files

0.4.0

2 files

0.3.0

2 files

0.2.3

2 files

0.2.2

2 files

0.2.1

2 files

0.2.0

2 files

0.1.19

2 files

0.1.18

2 files

0.1.17

2 files

0.1.16

2 files

0.1.15

2 files

0.1.14

2 files

0.1.13

2 files

0.1.12

2 files

0.1.11

2 files

0.1.10

2 files

0.1.9

2 files

0.1.8

2 files

0.1.7

2 files

0.1.6

2 files

0.1.5

2 files

0.1.4

2 files

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

0.0.1

2 files

0.0.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page