Skip to main content

No project description provided

Project description

adjudicator

Adjudicator (nount): An adjudicator is a person or body that makes formal judgments on a disputed matter. They are the ones who settle disputes or decide who is right in a disagreement. This could be a judge in a courtroom, an arbitrator in a negotiation, or any person or system given the power to make decisions of this type.

Adjudicator is a framework for implementing type-based rule engines largely inspired by the Pants build system. The rule graph consists of nodes which are concrete Python types and edges which are functions that take a set of input types and produce an output type.

Rules are matched on a set of facts, which populate the possible input types of a rule. Deriving a type may require chained execution of rules, which is supported. Global facts may be used to populate a potential input type for all rule executions.

The Adjudicator rule engine is designed to be used in a request-response fashion. A request is a set of facts that should be used to derive a type. A response is the derived type. The rule engine will execute the rules necessary to derive the type and return the response. If a rule was already executed with the same inputs, it will not be executed again. For optimal use of the caching mechanism, all types participating in the rule evaluation should be immutable and implement a stable hash (e.g. using @dataclass(frozen=True) and tuple instead of list, etc.).

When a mutable type should intentionally participate in the rule evaluation, usually this works automatically because the hash of a Python object that does not provide a custom __hash__() implementation or disables its hashing is based on the object's identity. This means that the hash is stable for the memory allocation of the object, and will not change if the object is mutated. For types that do not support hashing, support can be enabled explicitly using the RuleEngine.hashsupport object.

Table of Contents

Quickstart

The following example shows how to use Adjudicator to implement a simple "Hello World" application. The rule engine invokes the say_hello() production rule because a HelloResponse is requested and a HelloRequest is provided, which matches the rule's signature.

from dataclasses import dataclass
from adjudicator import Params, RuleEngine, rule

@dataclass(frozen=True)
class HelloRequest:
    name: str

@dataclass(frozen=True)
class HelloResponse:
    greeting: str

@rule()
def say_hello(request: HelloRequest) -> HelloResponse:
    return HelloResponse(greeting=f"Hello {request.name}!")

engine = RuleEngine()
engine.load_module(__name__)
response = engine.get(HelloResponse, Params(HelloRequest(name="World")))
print(response.greeting)

A more complex example can be found in the mksync project.

Installation

Adjudicator is available on PyPI. You need at least Python 3.10.

pip install python-adjudicator

Future Extensions

  • Currently the rule graph stores rules as connections between types and rules on edges. A more efficient representation would be the one illustrated above, where types are connected to rules which are connected to types.
  • The ability to mark facts as required to be consumed. If such a fact is not consumed during the execution of a request, an error will be raised.

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

python_adjudicator-0.5.0.tar.gz (17.8 kB view details)

Uploaded Source

Built Distribution

python_adjudicator-0.5.0-py3-none-any.whl (21.5 kB view details)

Uploaded Python 3

File details

Details for the file python_adjudicator-0.5.0.tar.gz.

File metadata

  • Download URL: python_adjudicator-0.5.0.tar.gz
  • Upload date:
  • Size: 17.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.9.6 readme-renderer/37.3 requests/2.28.2 requests-toolbelt/0.10.1 urllib3/1.26.14 tqdm/4.64.1 importlib-metadata/6.0.0 keyring/23.13.1 rfc3986/2.0.0 colorama/0.4.6 CPython/3.10.13

File hashes

Hashes for python_adjudicator-0.5.0.tar.gz
Algorithm Hash digest
SHA256 cfd17ff4851ea93e22fcbd6a696e9e0494076ed27f8e98f2c9189e40a7301c6a
MD5 5777e479123039fdd0219c81ed35e96a
BLAKE2b-256 2f21bcf9371e4cc0a833c57fd80222d447e9a96734a601b62b941c2c93a8e5a1

See more details on using hashes here.

File details

Details for the file python_adjudicator-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: python_adjudicator-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 21.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.9.6 readme-renderer/37.3 requests/2.28.2 requests-toolbelt/0.10.1 urllib3/1.26.14 tqdm/4.64.1 importlib-metadata/6.0.0 keyring/23.13.1 rfc3986/2.0.0 colorama/0.4.6 CPython/3.10.13

File hashes

Hashes for python_adjudicator-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b6abe4fc22e14159bdac7c6be8ef6fe337c132dc2ac8b49a40ddd31c43464483
MD5 7a40e79bb306ab559be0c558b28e57e3
BLAKE2b-256 b9433f08d6a2efc8e00754d419880fb802e2fcc37252e4ebe0e64a00c7fc9f6c

See more details on using hashes here.

Supported by

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