Module rollup_cascade.column

define CascadeColumn (base) and RollupColumn (derived) column classes

Classes

class CascadeColumn (*, column: str, when_not_empty: collections.abc.Sequence[str] = (), default_value: str = '', strict: bool = False, custom_trigger: collections.abc.Callable[[numpy.ndarray, numpy.ndarray, collections.abc.Iterable[str]], bool] | None = None)

Specify a column whose value should be cascaded to subsequent rows when one or more reference columns has a value.

KwArgs

column : str
the column whose value should be cascaded
when_not_empty : Sequence[str]
the columns that trigger the cascade when not empty. if this setting itself is empty, the cascade is triggered for ALL rows. Default is ().
default_value : str
the value to cascade when no value has been captured for the cascade column. Default is "".
strict : bool
if True, ALL when_not_empty columns must be populated to trigger a cascade. Default is False.
custom_trigger : Callable | None
a callable accepting the current row value set, the next row value set, and an iterable of all column names

Subclasses

Class variables

var column : str
var custom_trigger : collections.abc.Callable[[numpy.ndarray, numpy.ndarray, collections.abc.Iterable[str]], bool] | None
var default_value : str
var strict : bool
var when_not_empty : collections.abc.Sequence[str]

Instance variables

prop check_when_not_empty : collections.abc.Callable[[numpy.ndarray], bool]

Retuns the callable for testing whether or not a row meets the when_not_empty constraint.

Methods

def cascade(self, table: dict[str, list[str]]) ‑> dict[str, list[str]]

Cascade values in the table for self.column per defined custom_trigger or when_not_empty column status.

Args

table
dict of lists of strings representing table rows

Returns

dict[str, list[str]]
table after cascading self.column.
def cascade_it(self, row_a: numpy.ndarray, row_b: numpy.ndarray, table: dict[str, list[str]]) ‑> bool

Returns True if value from row_a should be cascaded to row_b.

If self.custom_trigger is defined, call it with the supplied parameters and return the result. Otherwise, return self.set_it(row_b, table).

Args

row_a : np.ndarray
the last row with a good value.
row_b : np.ndarray
the target of the cascade, if triggered
table
dict of lists of strings representing table rows

Returns

bool
True if the last good value should be cascaded to the next row
def column_value(self, row: numpy.ndarray, table: dict[str, list[str]]) ‑> str

Retrieves the value of self.column from the supplied row.

Args

row : np.ndarray
the row to check
table
dict of lists of strings representing table rows

Returns

str
the value of self.column in the supplied row.
def header_check(self, table: dict[str, list[str]]) ‑> bool

Check the columns in self (column + when_not_empty) against those in the header of a real table to determine if this operation is relevant given the columns available.

Args

table
dict of lists of strings representing table rows

Returns

bool
indicating whether this Cascade/RollupColumn is applicable given the columns available in the table instance.
def meets_when_not_empty(self, row: numpy.ndarray, table: dict[str, list[str]]) ‑> bool

Tests the when_not_empty constraint on this row of values.

Args

row : np.ndarray
the row to check
table
dict of lists of strings representing table rows

Returns

bool
True if when_not_empty isn't defined, strict==False and a value is found at the position of any when_not_empty column, or strict is True and a value is present at the positions of ALL when_not_empty columns.
def set_column(self, value: str, row: numpy.ndarray, table: dict[str, list[str]]) ‑> numpy.ndarray

Set the value of self.column in the supplied row to the supplied value.

Args

value : str
the new value for self.column
row : np.ndarray
the row to check
table
dict of lists of strings representing table rows

Returns

np.ndarray
the updated row
def set_it(self, row: numpy.ndarray, table: dict[str, list[str]]) ‑> bool

Returns True if column is empty but the when_not_empty check is True. Used for defaulting and cascading.

Args

row : np.ndarray
the row to check
table
dict of lists of strings representing table rows

Returns

bool
True if this row's value should be set to the default.
class RollupColumn (*, column: str, when_not_empty: collections.abc.Sequence[str] = (), default_value: str = '', strict: bool = False, custom_trigger: collections.abc.Callable[[numpy.ndarray, numpy.ndarray, collections.abc.Iterable[str]], bool] | None = None, pre_cascade: bool = True, post_cascade: bool = True, join_function: collections.abc.Callable[[tuple[str, str]], str] = <built-in method join of str object>)

Specify a column whose values should be rolled up into the first row in which one or more reference columns is not empty.

KwArgs

column : str
the column whose value should be rolled up
when_not_empty : Sequence[str]
the columns that trigger the rollup when not empty.
default_value : str
the value to use when no value is present in the rollup column. Default is "".
strict : bool
if True, ALL when_not_empty columns must be populated to trigger a rollup. Default is False.
pre_cascade : bool
if True, the rollup is performed before column values have been cascaded. Default is True.
post_cascade : bool
if True, the rollup is performed after column values have been cascaded. Default is True.
join_function : Callable[[tuple[str, str]], str]
method to use to join the values when a rollup is triggered. Defaults to " ".join.

Ancestors

Class variables

var post_cascade : bool
var pre_cascade : bool

Methods

def join_function(iterable, /) ‑> collections.abc.Callable[[tuple[str, str]], str]

Concatenate any number of strings.

The string whose method is called is inserted in between each given string. The result is returned as a new string.

Example: '.'.join(['ab', 'pq', 'rs']) -> 'ab.pq.rs'

def roll_it(self, row_a: numpy.ndarray, row_b: numpy.ndarray, table: dict[str, list[str]]) ‑> bool

Check two subsequent table rows to see if row_b should be rolled into row_a.

Triggers rolling behavior when: - row_a meets our when_not_empty constraint, and - row_b does NOT meet our when_not_empty constraint, and - row_a has a value in the target column, and - row_b has a value in the target column, ** OR ** - only the target column is populated in both this and next row

Args

row_a : np.ndarray
the first row to check
row_b : np.ndarray
the second row to check
table
dict of lists of strings representing table rows

Returns

bool
True if row_b should be rolled into row_a
def rollup(self, table: dict[str, list[str]]) ‑> dict[str, list[str]]

Roll up values in the table for self.column per defined custom_trigger or when_not_empty column status.

Args

table
dict of lists of strings representing table rows

Returns

dict[str, list[str]]
table after rolling up self.column.

Inherited members