vibe.form_utils

Form data parsing utilities.

This module provides utilities for parsing flat HTML form data into nested Python structures. It consolidates the form key parsing patterns used by ListHandler and StructuredHandler.

MultiDictLike

Protocol for MultiDict-like form data objects.

Defines the interface expected by form parsing functions. This allows accepting werkzeug MultiDict, FormDataView, or any compatible object.

keys

keys() -> Iterator[str]

Return an iterator over all keys.

get

get(key: str, default: object | None = None) -> object

Get the first value for a key.

getlist

getlist(key: str) -> list[str]

Get all values for a key as a list.

items

items(multi: bool = False) -> Iterator[tuple[str, str]]

Iterate over key-value pairs.

FormDataView

Mock MultiDict-like interface for handler form processing.

This class provides a minimal interface that mimics werkzeug's MultiDict, allowing handlers to process nested form data without requiring actual MultiDict objects.

get

get(key: str, default: object | None = None) -> object

Get the first value for a key, or default if not present.

getlist

getlist(key: str) -> list[Any]

Get all values for a key as a list.

keys

keys() -> Iterator[str]

Return an iterator over all keys.

items

items(multi: bool = False) -> Iterator[tuple[str, Any]]

Iterate over key-value pairs.

parse_list_form_data

parse_list_form_data(form_data: MultiDictLike, name: str) -> dict[int, dict[str, list[Any]]]

Parse list-indexed form data into structured format.

Handles patterns: - name[index][field] -> regular field values - name[index][field][option] -> multichoice nested values

Parameters:
  • form_data (MultiDictLike) –

    MultiDict-like form data with items(multi=True) method

  • name (str) –

    Base name prefix to match

Returns:
  • dict[int, dict[str, list[Any]]]

    Dict mapping index -> {field_name: [values]}

parse_struct_form_data

parse_struct_form_data(form_data: MultiDictLike, name: str, valid_fields: set[str] | None = None) -> dict[str, list[Any]]

Parse dot-notation form data into structured format.

Handles pattern: name.field

Parameters:
  • form_data (MultiDictLike) –

    MultiDict-like form data with keys() and getlist() methods

  • name (str) –

    Base name prefix to match

  • valid_fields (set[str] | None, default: None ) –

    Optional set of valid field names to filter against

Returns:
  • dict[str, list[Any]]

    Dict mapping field_name -> [values]

get_max_list_index

get_max_list_index(indexed_data: dict[int, Any]) -> int

Get the maximum index from indexed form data.

Parameters:
  • indexed_data (dict[int, Any]) –

    Dict with integer keys

Returns:
  • int

    Maximum index, or -1 if no data