This document contains notes on the major changes for each version of the Rule Engine. In comparison to the git log, this list is curated by the development team for note worthy changes.
Released v5.0.0 on May 17th, 2026
Breaking: Dropped support for Python versions 3.6, 3.7, 3.8 and 3.9.
Breaking: Changed the precedence of operators to be more aligned with common programming languages.
Breaking: The Debug REPL utility now requires development dependencies to be installed.
Breaking: BYTES literals now throw exceptions for invalid escape sequences
Breaking: Removed setup.py; project metadata now lives entirely in pyproject.toml (PEP 517/621).
Breaking: The rule_engine.ast module no longer re-exports names from rule_engine.types (e.g. DataType,
coerce_value); import them from rule_engine or rule_engine.types directly.
Migrated the development workflow and CI from pipenv to uv.
Added support for raw STRING literals using the r prefix (e.g. r'\w+').
Vendored the PLY dependency under rule_engine._vendor.ply — the upstream project is unmaintained, so the copy
removes an external install requirement and silences third-party vulnerability reports targeting it.
Added the new OBJECT compound data type for user-defined schemas with named,
typed attributes. See the OBJECT section in the Data Types page for details.
Use
reference()(or theselfshorthand sentinel) for self-referential and mutually-recursive schemas.Attribute access is validated at parse time against the declared schema.
Item access (
obj["name"]) and containment checks ("name" in obj) onOBJECTvalues are rejected at parse time.
SET(OBJECT(...))is rejected at construction; useARRAY(OBJECT(...))insteadA custom accessor callable can be specified per
OBJECTtype (default:getattr()).Added
from_dataclass()andtype_resolver_from_dataclass()for derivingOBJECTschemas and type_resolvers automatically from Pythondataclass()definitions, including nullability forOptionalfields and self / mutually-recursive references (closes #55).Added
from_sqlalchemy()andtype_resolver_from_sqlalchemy()for derivingOBJECTschemas and type_resolvers from SQLAlchemy ORM mapped classes. Columns, relationships, and cycles between mutually-related classes are all expanded automatically. SQLAlchemy is an optional dependency; the import is deferred until these entry points are called.The
from_dataclassandfrom_sqlalchemyentry points (and theirtype_resolver_from_*companions) accept astrictkeyword argument. The defaultstrict=TrueraisesValueErroron any field / column whose type cannot be mapped to a Rule Engine data type;strict=Falsefalls back toUNDEFINED.
Added ObjectAttributeError, a subclass of
AttributeResolutionError, raised when an attribute is not found in an OBJECT
schema
Promoted nullability to a first-class type-system construct via the new
NULLABLE one-argument type constructor. See the
NULLABLE section in the Data Types page for the full semantics.
from_type()maps Python’sOptional[T]/T | NonetoNULLABLE(from_type(T)).
from_dataclass()andfrom_sqlalchemy()wrap nullable fields, columns, and scalar relationships inNULLABLE(T);type_resolver_from_dataclass()andtype_resolver_from_sqlalchemy()preserve the wrappers through to the top-level symbol types.Compound element and value types (
ARRAY,SET,MAPPING) storeNULLABLE(T)directly when the member may beNone.AST operators reject
NULLABLEoperands at parse time whereverNonehas no meaningful semantics: arithmetic, ordered comparisons, the regex operators, bitwise and bitwise-shift operators, unary minus, containment, attribute access, item access, slicing, and function arguments all raiseEvaluationError(orFunctionCallErrorfor function arguments) with a message pointing at the discharge operators. Equality (==,!=), logical connectives (and,or,not), ternary expressions, and safe-navigation operators remain lenient.A new null-coalesce operator
left ?? rightdischargesNULLABLE(T)toT. Existing safe attribute (&.) and item (&[) accessors still apply to nullable receivers and are the only access forms that do.
Deprecated: The attributes_nullable kwarg on OBJECT and the
value_type_nullable kwarg on ARRAY, SET,
and MAPPING now emit DeprecationWarning. Wrap the relevant
attribute or element type in NULLABLE instead. The kwargs will be removed
in v6.0.
Deprecated: Accessing MAPPING keys via dot syntax (mapping.key) now
emits a MappingAttributeLookupDeprecation warning. Use bracket syntax
(mapping["key"]) instead. This fallback will be removed in v6.0. Set Context(mapping_attribute_lookup=False)
to opt out now.
Released v4.5.0 on June 19th, 2024
StringSyntaxError is now raised for invalid string literals
FunctionCallError is now raised when a typed function returns an incompatible value
Added the new BYTES data type
Added some new data attributes
Released v4.4.0 on April 5th, 2024
Added the $range builtin function
Added the rule_engine.parser.utilities module with a few functions and documentation
Released v4.3.0 on January 15th, 2024
Added the is_nan attribute for FLOAT values
Released v4.2.0 on December 11th, 2023
Added attributes for coercion of types to themselves, e.g. to_str for STRING values
Released v4.1.0 on August 3rd, 2023
Added the $abs builtin function
Added support to from_type to handle Python’s type hints
Released v4.0.0 on July 15th, 2023
Breaking: Changed STRING.to_ary to return an array of characters instead of splitting the string
Use the new builtin
$splitfunction to split a string on whitespace into an array of words
Breaking: Changed Context to use keyword-only arguments
Breaking: Dropped support for Python versions 3.4 and 3.5
Breaking: Invalid floating point literals now raise FloatSyntaxError instead of
RuleSyntaxError
Breaking: Moved rule_engine.engine.Builtins to rule_engine.builtins.Builtins
Added the new FUNCTION data type
Released v3.6.0 on June 16th, 2023
Removed testing for Python versions 3.4 and 3.5 on GitHub Actions
Add regex error details to the Debug REPL utility
Add support for Python-style comments
Released v3.5.0 on July 16th, 2022
Added the new TIMEDELTA data type
Released v3.4.0 on March 19th, 2022
Add support for string concatenation via the + operator
Released v3.3.0 on July 20th, 2021
Added to_epoch to DATETIME
Released v3.2.0 on April 3rd, 2021
Refactored the ast module to move the DataType class into a new,
dedicated types module.
Added the new ComprehensionExpression
Added suggestions to AttributeResolutionError and
SymbolResolutionError
Released v3.1.0 on March 15th, 2021
Added the new SET data type
Released v3.0.0 on March 1st, 2021
Released v2.4.0 on November 7th, 2020
Added the Debug REPL utility
Added the safe navigation version of the attribute, item and slice operators
Added the new MAPPING data type
Switched from Travis-CI to GitHub Actions for continuous integration
Added support for iterables to have multiple member types
Released v2.3.0 on October 11th, 2020
Added support for arithmetic comparisons for all currently supported data types
Added support for proper type hinting of builtin symbols
Added the $re_groups builtin symbol for extracting groups from a regular expression match
Added some new data attributes
Released v2.2.0 on September 9th, 2020
Added script entries to the Pipfile for development
Added support for slices on sequence data types
Released v2.1.0 on August 3rd, 2020
Released v2.0.0 on October 2nd, 2019
Added proper support for attributes
Added a change log
Added additional information to the Graphviz output
Added the new ARRAY data type
Started using Travis-CI
Added automatic unit testing using Travis-CI
Added automatic deployment of documentation using Travis-CI
Removed the resolver conversion functions
Removed
to_recursive_resolverin favor of attributesRemoved
to_default_resolverin favor of the default_value kwarg to__init__()
Released v1.1.0 on March 27th, 2019
Added the to_default_dict() function
Added the to_recursive_resolver() function
Released v1.0.0 on December 15th, 2018
First major release