Skip to main content

The Criteria Pattern is a Python package that simplifies and standardizes criteria based filtering, validation and selection.

Project description

🤏🏻 Criteria Pattern

CI Pipeline Coverage Pipeline Package Version Supported Python Versions Package Downloads Project Documentation

The Criteria Pattern is a Python 🐍 package that simplifies and standardizes criteria based filtering 🤏🏻, validation and selection. This package provides a set of prebuilt 👷🏻 objects and utilities that you can drop into your existing projects and not have to implement yourself.

These utilities 🛠️ are useful when you need complex filtering logic. It also enforces 👮🏻 best practices so all your filtering processes follow a uniform standard.

Easy to install and integrate, this is a must have for any Python developer looking to simplify their workflow, enforce design patterns and use the full power of modern ORMs and SQL 🗄️ in their projects 🚀.

Table of Contents

🔼 Back to top



📥 Installation

You can install Criteria Pattern using pip:

pip install criteria-pattern

🔼 Back to top



📚 Documentation

This project's documentation is powered by DeepWiki, which provides a comprehensive overview of the Criteria Pattern and its usage.

🔼 Back to top



💻 Utilization

from criteria_pattern import Criteria, Filter, Operator
from criteria_pattern.converters import CriteriaToPostgresqlConverter

is_adult = Criteria(filters=[Filter(field='age', operator=Operator.GREATER_OR_EQUAL, value=18)])
email_is_gmail = Criteria(filters=[Filter(field='email', operator=Operator.ENDS_WITH, value='@gmail.com')])
email_is_yahoo = Criteria(filters=[Filter(field='email', operator=Operator.ENDS_WITH, value='@yahoo.com')])

query, parameters = CriteriaToPostgresqlConverter.convert(criteria=is_adult & (email_is_gmail | email_is_yahoo), table='user')
print(query)
print(parameters)
# >>> SELECT * FROM user WHERE (age >= %(parameter_0)s AND (email LIKE '%%' || %(parameter_1)s OR email LIKE '%%' || %(parameter_2)s));
# >>> {'parameter_0': 18, 'parameter_1': '@gmail.com', 'parameter_2': '@yahoo.com'}

🔄 Available Converters

The package includes converters for SQL generation and request parsing:

🔼 Back to top

🎯 Real-Life Case: Multi-tenant User Search Service

Imagine an admin dashboard where each request must:

  1. Always restrict results to the current tenant.
  2. Optionally filter active users.
  3. Search only users with company emails.
  4. Sort by newest users first.

With Criteria Pattern, each concern is a small reusable criteria object. You combine them using & and |, then convert once to SQL:

from criteria_pattern import Criteria, Direction, Filter, Operator, Order
from criteria_pattern.converters import CriteriaToPostgresqlConverter


class UserSearchService:
    def __init__(self, tenant_id: str) -> None:
        self.tenant_id = tenant_id

    def build_query(self, *, only_active: bool, corporate_domain: str) -> tuple[str, dict[str, object]]:
        tenant_scope = Criteria(filters=[Filter(field='tenant_id', operator=Operator.EQUAL, value=self.tenant_id)])
        active_scope = Criteria(filters=[Filter(field='is_active', operator=Operator.EQUAL, value=True)])
        email_scope = Criteria(filters=[Filter(field='email', operator=Operator.ENDS_WITH, value=corporate_domain)])
        sort_scope = Criteria(orders=[Order(field='created_at', direction=Direction.DESC)])

        criteria = tenant_scope & email_scope & sort_scope
        if only_active:
            criteria = criteria & active_scope

        return CriteriaToPostgresqlConverter.convert(criteria=criteria, table='users')


service = UserSearchService(tenant_id='tenant_123')
query, parameters = service.build_query(only_active=True, corporate_domain='@acme.com')

print(query)
print(parameters)

🔼 Back to top



🤝 Contributing

We love community help! Before you open an issue or pull request, please read:

Thank you for helping make 🤏🏻 Criteria Pattern package awesome! 🌟

🔼 Back to top



🔑 License

This project is licensed under the terms of the MIT license.

🔼 Back to top

Project details


Download files

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

Source Distribution

criteria_pattern-3.10.0.tar.gz (27.5 kB view details)

Uploaded Source

Built Distribution

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

criteria_pattern-3.10.0-py3-none-any.whl (58.8 kB view details)

Uploaded Python 3

File details

Details for the file criteria_pattern-3.10.0.tar.gz.

File metadata

  • Download URL: criteria_pattern-3.10.0.tar.gz
  • Upload date:
  • Size: 27.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for criteria_pattern-3.10.0.tar.gz
Algorithm Hash digest
SHA256 2c31e695e503ec13e9e521b951714e7a1177b20c68a6df5f8cfe67a74fb4becb
MD5 8ec0788499ab90ae798e59369d0f8df0
BLAKE2b-256 5541a8b592b3ed392a64a702ef77e094c86121dd071a3367d381241d79751daf

See more details on using hashes here.

Provenance

The following attestation bundles were made for criteria_pattern-3.10.0.tar.gz:

Publisher: ci.yaml on adriamontoto/criteria-pattern

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

File details

Details for the file criteria_pattern-3.10.0-py3-none-any.whl.

File metadata

File hashes

Hashes for criteria_pattern-3.10.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3c87b659f4266c10eef9af9695e1a08256c20f9fd6e007d7aa4c441eaf583e68
MD5 5124db92c4c52fab7efb1d98c24ab1ee
BLAKE2b-256 d3c8488ffbd6a79902f3715d8501c75738620f3f09b4618e8d74365c312cc1d9

See more details on using hashes here.

Provenance

The following attestation bundles were made for criteria_pattern-3.10.0-py3-none-any.whl:

Publisher: ci.yaml on adriamontoto/criteria-pattern

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

Supported by

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