88import polars as pl
99from polars .plugins import register_plugin_function
1010
11+ from dataframely .config import Config
12+
1113PLUGIN_PATH = Path (__file__ ).parent
1214
1315IntoExpr : TypeAlias = pl .Expr | str
@@ -57,8 +59,10 @@ def all_rules(rules: IntoExpr | Iterable[IntoExpr]) -> pl.Expr:
5759def all_rules_required (
5860 rules : IntoExpr | Iterable [IntoExpr ],
5961 * ,
62+ data_columns : Iterable [IntoExpr ],
6063 null_is_valid : bool = True ,
6164 schema_name : str ,
65+ primary_key_columns : list [str ] | None = None ,
6266) -> pl .Expr :
6367 """Execute :mod:`~polars.all_horizontal` and `.all` for a set of rules.
6468
@@ -73,18 +77,32 @@ def all_rules_required(
7377
7478 Args:
7579 rules: The rules to evaluate.
80+ data_columns: Data columns to include for generating example rows in error
81+ messages. If `max_failure_examples` is configured in `dy.Config`, values
82+ are extracted from here.
7683 schema_name: The name of the schema being validated. This is used to produce
7784 better error messages.
7885 null_is_valid: Whether to treat null values as valid (i.e., `true`).
86+ primary_key_columns: Optional list of primary key columns which are used for
87+ better error messages if data columns are provided.
7988
8089 Returns:
8190 A scalar boolean expression.
8291 """
92+ rules_list = [rules ] if isinstance (rules , pl .Expr ) else list (rules )
93+ num_rule_columns = len (rules_list )
94+ data_columns_list = list (data_columns ) if data_columns is not None else []
8395 return register_plugin_function (
8496 plugin_path = PLUGIN_PATH ,
8597 function_name = "all_rules_required" ,
86- args = rules ,
87- kwargs = {"null_is_valid" : null_is_valid , "schema_name" : schema_name },
98+ args = [* rules_list , * data_columns_list ],
99+ kwargs = {
100+ "null_is_valid" : null_is_valid ,
101+ "schema_name" : schema_name ,
102+ "num_rule_columns" : num_rule_columns ,
103+ "primary_key_columns" : primary_key_columns or [],
104+ "max_failure_examples" : Config .options ["max_failure_examples" ],
105+ },
88106 use_abs_path = True ,
89107 # NOTE: Conceptually, we're reducing the input to a single boolean value here.
90108 # However, we set this option to ensure that the plugin does not become
0 commit comments