Metadata-Version: 2.3
Name: ftmq
Version: 4.1.2
Summary: followthemoney query dsl and io helpers
License: AGPLv3+
Author: Simon Wörpel
Author-email: simon.woerpel@pm.me
Requires-Python: >=3.11,<4
Classifier: Intended Audience :: Developers
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Provides-Extra: aleph
Provides-Extra: lake
Provides-Extra: level
Provides-Extra: postgres
Provides-Extra: redis
Provides-Extra: sql
Requires-Dist: alephclient (>=2.6.0,<3.0.0) ; extra == "aleph"
Requires-Dist: anystore (>=0.3.9,<0.4.0)
Requires-Dist: click (>=8.2.1,<9.0.0)
Requires-Dist: click-default-group (>=1.2.4,<2.0.0)
Requires-Dist: deltalake (>=1.1.4,<2.0.0) ; extra == "lake"
Requires-Dist: duckdb (>=1.3.2,<2.0.0) ; extra == "lake"
Requires-Dist: fakeredis (>=2.26.2,<3.0.0) ; extra == "redis"
Requires-Dist: followthemoney (>=4.1.2,<5.0.0)
Requires-Dist: furl (>=2.1.4,<3.0.0) ; extra == "aleph"
Requires-Dist: nomenklatura (>=4.1.1,<5.0.0)
Requires-Dist: orjson (>=3.10.18,<4.0.0)
Requires-Dist: pandas (>=2.3.1,<3.0.0) ; extra == "lake"
Requires-Dist: plyvel (>=1.5.1,<2.0.0) ; extra == "level"
Requires-Dist: psycopg2 (>=2.9.10,<3.0.0) ; extra == "postgres"
Requires-Dist: pyarrow (>=21.0.0,<22.0.0) ; extra == "lake"
Requires-Dist: pycountry (>=24.6.1,<25.0.0)
Requires-Dist: pydantic (>=2.11.3,<3.0.0)
Requires-Dist: pyicu (>=2.15.2,<3.0.0)
Requires-Dist: redis (>=5.2.1,<6.0.0) ; extra == "redis"
Requires-Dist: sqlalchemy (>=2.0.36,<3.0.0) ; extra == "postgres"
Requires-Dist: sqlalchemy (>=2.0.36,<3.0.0) ; extra == "sql"
Project-URL: Documentation, https://docs.investigraph.dev/lib/ftmq
Project-URL: Homepage, https://docs.investigraph.dev/lib/ftmq
Project-URL: Issues, https://github.com/dataresearchcenter/ftmq/issues
Project-URL: Repository, https://github.com/dataresearchcenter/ftmq
Description-Content-Type: text/markdown

[![Docs](https://img.shields.io/badge/docs-live-brightgreen)](https://docs.investigraph.dev/lib/ftmq/)
[![ftmq on pypi](https://img.shields.io/pypi/v/ftmq)](https://pypi.org/project/ftmq/)
[![PyPI Downloads](https://static.pepy.tech/badge/ftmq/month)](https://pepy.tech/projects/ftmq)
[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/ftmq)](https://pypi.org/project/ftmq/)
[![Python test and package](https://github.com/dataresearchcenter/ftmq/actions/workflows/python.yml/badge.svg)](https://github.com/dataresearchcenter/ftmq/actions/workflows/python.yml)
[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit)](https://github.com/pre-commit/pre-commit)
[![Coverage Status](https://coveralls.io/repos/github/dataresearchcenter/ftmq/badge.svg?branch=main)](https://coveralls.io/github/dataresearchcenter/ftmq?branch=main)
[![AGPLv3+ License](https://img.shields.io/pypi/l/ftmq)](./LICENSE)
[![Pydantic v2](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/pydantic/pydantic/main/docs/badge/v2.json)](https://pydantic.dev)

# ftmq

This library provides methods to query and filter entities formatted as [Follow The Money](https://followthemoney.tech) data, either from a json file/stream or using a statement-based store backend from [nomenklatura](https://github.com/opensanctions/nomenklatura).

It also provides a `Query` class that can be used in other libraries to work with SQL store queries or api queries.

`ftmq` is the base layer for [investigativedata.io's](https://investigativedata.io) libraries and applications dealing with [Follow The Money](https://followthemoney.tech) data.

To get familiar with the _Follow The Money_ ecosystem, you can have a look at [this pad here](https://pad.investigativedata.org/s/0qKuBEcsM#).

## Installation

Minimum Python version: 3.11

    pip install ftmq

## Usage

### Command line

```bash
cat entities.ftm.json | ftmq -s Company --country=de --incorporationDate__gte=2023 -o s3://data/entities-filtered.ftm.json
```

### Python Library

```python
from ftmq import Query, smart_read_proxies

q = Query() \
    .where(dataset="ec_meetings", date__lte=2020) \
    .where(schema="Event") \
    .order_by("date", ascending=False)

for proxy in smart_read_proxies("s3://data/entities.ftm.json"):
    if q.apply(proxy):
        yield proxy
```

## Documentation

https://docs.investigraph.dev/lib/ftmq

## Support

This project is part of [investigraph](https://investigraph.dev)

In 2023, development of `ftmq` was supported by [Media Tech Lab Bayern batch #3](https://github.com/media-tech-lab)

<a href="https://www.media-lab.de/en/programs/media-tech-lab">
    <img src="https://raw.githubusercontent.com/media-tech-lab/.github/main/assets/mtl-powered-by.png" width="240" title="Media Tech Lab powered by logo">
</a>

## License and Copyright

`ftmq`, (C) 2023 Simon Wörpel
`ftmq`, (C) 2024-2025 investigativedata.io
`ftmq`, (C) 2025 [Data and Research Center – DARC](https://dataresearchcenter.org)

`ftmq` is licensed under the AGPLv3 or later license.

Prior to version 0.8.0, `ftmq` was released under the MIT license.

see [NOTICE](./NOTICE) and [LICENSE](./LICENSE)

