Source code for elsheeto.parser.common

"""Shared models / value objects for CSV parsing configuration."""

from enum import Enum

from pydantic import BaseModel, ConfigDict


[docs] class CsvDelimiter(str, Enum): """Enumeration of common CSV delimiters.""" #: Auto-detect AUTO = "auto" #: Comma (,) COMMA = "comma" #: Tab (\t) TAB = "tab" #: Semicolon (;) SEMICOLON = "semicolon"
[docs] def candidate_delimiters(self) -> list[str]: """Return candidate delimiters for the given enum value.""" match self: case CsvDelimiter.AUTO: return [",", "\t", ";"] case CsvDelimiter.COMMA: return [","] case CsvDelimiter.TAB: return ["\t"] case CsvDelimiter.SEMICOLON: return [";"]
[docs] class ColumnConsistency(str, Enum): """Modes for handling inconsistent columns in CSV files.""" #: Strict mode requiring consistent columns in each section. STRICT_SECTIONED = "strict_sectioned" #: Strict mode requiring consistent columns globally. STRICT_GLOBAL = "strict_global" #: Loose mode allowing variable columns. LOOSE = "loose" #: Pad missing cells silently without warnings. PAD = "pad" #: Warning mode - pad missing cells and issue warnings. WARN_AND_PAD = "warn_and_pad"
[docs] class ParserConfiguration(BaseModel): """Configuration for a generic (sectioned) CSV parser. Allows for configuring common parameters used when parsing CSV-like files that are sectioned as common for sequencing sample sheets. """ #: Delimiter used in the CSV file, or auto-detect. delimiter: CsvDelimiter = CsvDelimiter.AUTO #: Whether section headers are required. require_section_headers: bool = True #: Whether to ignore empty lines. ignore_empty_lines: bool = True #: Line prefixes to recognize as comments. comment_prefixes: list[str] = ["#"] #: Column consistency configuration. column_consistency: ColumnConsistency = ColumnConsistency.WARN_AND_PAD model_config = ConfigDict( frozen=True, )