Source code for lector.types.bools

"""Classes for converting arrays to the boolean type."""
from __future__ import annotations

from contextlib import suppress
from dataclasses import dataclass

import pyarrow as pa
from pyarrow import Array

from ..utils import is_stringy
from .abc import Conversion, Converter, Registry


@dataclass
@Registry.register
[docs] class Boolean(Converter): """Converts stringy booleans ("true" / "False"), and ints (0/1) to the boolean type."""
[docs] def convert(self, array: Array) -> Conversion | None: if not is_stringy(array.type) or array.null_count == len(array): return None meta = {"semantic": "boolean"} with suppress(pa.ArrowInvalid): converted = array.cast(pa.bool_()) n = len(array) valid_before = n - array.null_count valid_after = n - converted.null_count proportion_valid = valid_after / valid_before if proportion_valid >= self.threshold: return Conversion(converted, meta=meta) return None