Metadata-Version: 2.1
Name: odata-query
Version: 0.4.0
Summary: An OData query parser and transpiler.
License: MIT
Keywords: OData,Query,Parser
Author: Oliver Hofkens
Author-email: oliver@gorilla.co
Requires-Python: >=3.7,<4.0
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Framework :: Django
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: SQL
Classifier: Topic :: Database
Classifier: Topic :: Internet :: WWW/HTTP
Classifier: Topic :: Internet :: WWW/HTTP :: Indexing/Search
Classifier: Topic :: Software Development :: Compilers
Provides-Extra: dev
Provides-Extra: django
Provides-Extra: docs
Provides-Extra: linting
Provides-Extra: sqlalchemy
Provides-Extra: testing
Requires-Dist: black (==20.8b1); extra == "linting"
Requires-Dist: bump2version (>=1.0,<2.0); extra == "dev"
Requires-Dist: django (>=2.2); extra == "django"
Requires-Dist: flake8 (>=3.8,<4.0); extra == "linting"
Requires-Dist: isort (>=5.7,<6.0); extra == "linting"
Requires-Dist: mypy (>=0.800,<0.801); extra == "linting"
Requires-Dist: myst-parser (>=0.14,<0.15); extra == "docs"
Requires-Dist: pytest (>=6.2,<7.0); extra == "testing"
Requires-Dist: pytest-cov; extra == "testing"
Requires-Dist: python-dateutil (>=2.8.1,<3.0.0)
Requires-Dist: sly (>=0.4,<0.5)
Requires-Dist: sphinx (<4.0); extra == "docs"
Requires-Dist: sphinx-rtd-theme (>=0.5,<0.6); extra == "docs"
Requires-Dist: sqlalchemy (>=1.4,<2.0); extra == "sqlalchemy"
Requires-Dist: vulture (>=2.3,<3.0); extra == "linting"
Description-Content-Type: text/markdown

# OData-Query

[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=gorillaco_odata-query&metric=alert_status&token=cb35257e036d950788a0f628af7062929318482b)](https://sonarcloud.io/dashboard?id=gorillaco_odata-query)
[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=gorillaco_odata-query&metric=coverage&token=cb35257e036d950788a0f628af7062929318482b)](https://sonarcloud.io/dashboard?id=gorillaco_odata-query)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
[![Documentation Status](https://readthedocs.org/projects/odata-query/badge/?version=latest)](https://odata-query.readthedocs.io/en/latest/?badge=latest)

`odata-query` is a library that parses [OData v4](https://www.odata.org/) filter strings, and can convert
them to other forms such as
[Django Queries](https://docs.djangoproject.com/en/3.2/topics/db/queries/),
[SQLAlchemy Queries](https://docs.sqlalchemy.org/en/14/orm/loading_objects.html),
or just plain SQL.


## Installation

`odata-query` is available on pypi, so can be installed with the package manager
of your choice:

```bash
pip install odata-query
# OR
poetry add odata-query
# OR
pipenv install odata-query
```

The package defines the following optional `extra`s:

- `django`: If you want to pin a compatible Django version.
- `sqlalchemy`: If you want to pin a compatible SQLAlchemy version.


The following `extra`s relate to the development of this library:

- `linting`: The linting and code style tools.
- `testing`: Packages for running the tests.
- `docs`: For building the project documentation.


You can install `extra`s by adding them between square brackets during
installation:

```bash
pip install odata-query[sqlalchemy]
```

## Quickstart

The most common use case is probably parsing an OData query string, and applying
it to a query your ORM understands. For this purpose there is an all-in-one function:
`apply_odata_query`.

Example for Django:

```python
from odata_query.django import apply_odata_query

orm_query = MyModel.objects  # This can be a Manager or a QuerySet.
odata_query = "name eq 'test'"  # This will usually come from a query string parameter.

query = apply_odata_query(orm_query, odata_query)
results = query.all()
```


Example for SQLAlchemy:

```python
from odata_query.sqlalchemy import apply_odata_query

orm_query = select(MyModel)  # This is any form of Query or Selectable.
odata_query = "name eq 'test'"  # This will usually come from a query string parameter.

query = apply_odata_query(orm_query, odata_query)
results = session.execute(query).scalars().all()
```

<!--- splitinclude-1 -->

## Advanced Usage

Not all use cases are as simple as that. Luckily, `odata-query` is very modular
and extensible. See the [Documentation](docs/source/index.rst) for advanced usage
or extending the library for other cases.

<!--- splitinclude-2 -->

## Contact

Got any questions or ideas? We'd love to hear from you. Check out our
[contributing guidelines](CONTRIBUTING.md) for ways to offer feedback and
contribute.


## License

Copyright (c) [Gorillini NV](https://gorilla.co/).
All rights reserved.

Licensed under the [MIT](LICENSE) License.

