Parsers
provide.foundation.parsers
¶
TODO: Add module docstring.
Functions¶
auto_parse
¶
Automatically parse value based on an attrs field's type and metadata.
This function first checks for a converter in the field's metadata, then falls back to type-based parsing.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
attr
|
Any
|
attrs field (from fields(Class)) |
required |
value
|
str
|
String value to parse |
required |
Returns:
| Type | Description |
|---|---|
Any
|
Parsed value based on field type or converter |
Examples:
>>> from attrs import define, field, fields
>>> @define
... class Config:
... count: int = field()
... enabled: bool = field()
... custom: str = field(converter=lambda x: x.upper())
>>> c = Config(count=0, enabled=False, custom="")
>>> auto_parse(fields(Config).count, "42")
42
>>> auto_parse(fields(Config).enabled, "true")
True
>>> auto_parse(fields(Config).custom, "hello")
'HELLO'
Source code in provide/foundation/parsers/attrs_integration.py
extract_concrete_type
¶
Extract concrete type from type annotation, handling unions, optionals, and string annotations.
This function handles: - Union types (str | None, Union[str, None]) - Optional types (str | None) - Regular types (str, int, bool) - String annotations (from future import annotations) - Generic types (list[int], dict[str, str])
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
annotation
|
Any
|
Type annotation from function signature or attrs field |
required |
Returns:
| Type | Description |
|---|---|
type
|
Concrete type that can be used for parsing |
Examples:
>>> extract_concrete_type(str | None)
<class 'str'>
>>> extract_concrete_type('str | None')
<class 'str'>
>>> extract_concrete_type(list[int])
list[int]
Source code in provide/foundation/parsers/typed.py
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | |
parse_bool
¶
Parse a boolean value from string or other types.
Accepts: true/false, yes/no, 1/0, on/off (case-insensitive)
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
value
|
Any
|
Value to parse as boolean |
required |
strict
|
bool
|
If True, only accept bool or string types (raise TypeError otherwise) |
False
|
Returns:
| Type | Description |
|---|---|
bool
|
Boolean value |
Raises:
| Type | Description |
|---|---|
TypeError
|
If strict=True and value is not bool or string, or if value is not bool/str |
ValueError
|
If value cannot be parsed as boolean |
Source code in provide/foundation/parsers/primitives.py
parse_bool_extended
¶
Parse boolean from string with lenient/forgiving interpretation.
This is the lenient boolean parser - designed for user-facing configuration where we want to be forgiving of various inputs. Any unrecognized string defaults to False rather than raising an error.
Use Cases: - Environment variables set by end users - Feature flags that should default to "off" if misconfigured - Optional telemetry settings where failure should not break the system
Recognized True Values: true, yes, 1, on (case-insensitive) Recognized False Values: false, no, 0, off (case-insensitive) Default Behavior: Any other string → False (no error)
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
value
|
str | bool
|
Boolean string representation or actual bool |
required |
Returns:
| Type | Description |
|---|---|
bool
|
Boolean value (defaults to False for unrecognized strings) |
Examples:
>>> parse_bool_extended("yes") # True
>>> parse_bool_extended("FALSE") # False
>>> parse_bool_extended("invalid") # False (no error)
>>> parse_bool_extended(True) # True
Source code in provide/foundation/parsers/primitives.py
parse_bool_strict
¶
Parse boolean from string with strict validation and clear error messages.
This is the strict boolean parser - designed for internal APIs and critical configuration where invalid values should cause immediate failure with helpful error messages.
Use Cases: - Internal API parameters where precision matters - Critical system configurations where misconfiguration is dangerous - Programmatic configuration where clear validation errors help developers
Recognized True Values: true, yes, 1, on, enabled (case-insensitive), 1.0 Recognized False Values: false, no, 0, off, disabled (case-insensitive), 0.0 Error Behavior: Raises ValueError with helpful message for invalid values
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
value
|
str | bool | int | float
|
Boolean value as string, bool, int, or float |
required |
Returns:
| Type | Description |
|---|---|
bool
|
Boolean value (never defaults - raises on invalid input) |
Raises:
| Type | Description |
|---|---|
TypeError
|
If value is not a string, bool, int, or float |
ValueError
|
If value cannot be parsed as boolean |
Examples:
>>> parse_bool_strict("yes") # True
>>> parse_bool_strict("FALSE") # False
>>> parse_bool_strict(1) # True
>>> parse_bool_strict(0.0) # False
>>> parse_bool_strict("invalid") # ValueError with helpful message
>>> parse_bool_strict(42) # ValueError - only 0/1 valid for numbers
Source code in provide/foundation/parsers/primitives.py
parse_comma_list
¶
parse_console_formatter
¶
Parse and validate console formatter string.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
value
|
str
|
Formatter string (case-insensitive) |
required |
Returns:
| Type | Description |
|---|---|
ConsoleFormatterStr
|
Valid formatter string in lowercase |
Raises:
| Type | Description |
|---|---|
ValueError
|
If the formatter is invalid |
Source code in provide/foundation/parsers/telemetry.py
parse_dict
¶
parse_dict(
value: str | dict[str, str],
item_separator: str = ",",
key_separator: str = "=",
strip: bool = True,
) -> dict[str, str]
Parse a dictionary from a string.
Format: "key1=value1,key2=value2"
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
value
|
str | dict[str, str]
|
String or dict to parse |
required |
item_separator
|
str
|
Separator between items |
','
|
key_separator
|
str
|
Separator between key and value |
'='
|
strip
|
bool
|
Whether to strip whitespace |
True
|
Returns:
| Type | Description |
|---|---|
dict[str, str]
|
Dictionary of string keys and values |
Raises:
| Type | Description |
|---|---|
ValueError
|
If format is invalid |
Source code in provide/foundation/parsers/collections.py
parse_float_with_validation
¶
parse_float_with_validation(
value: str,
min_val: float | None = None,
max_val: float | None = None,
) -> float
Parse float with optional range validation.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
value
|
str
|
String representation of float |
required |
min_val
|
float | None
|
Minimum allowed value (inclusive) |
None
|
max_val
|
float | None
|
Maximum allowed value (inclusive) |
None
|
Returns:
| Type | Description |
|---|---|
float
|
Parsed float value |
Raises:
| Type | Description |
|---|---|
ValueError
|
If value is not a valid float or out of range |
Source code in provide/foundation/parsers/primitives.py
parse_foundation_log_output
¶
Parse and validate foundation log output destination.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
value
|
str
|
Output destination string |
required |
Returns:
| Type | Description |
|---|---|
str
|
Valid output destination (stderr, stdout, main) |
Raises:
| Type | Description |
|---|---|
ValueError
|
If the value is invalid |
Source code in provide/foundation/parsers/telemetry.py
parse_headers
¶
Parse HTTP headers from string format.
Format Requirements: - Comma-separated key=value pairs: "key1=value1,key2=value2" - Header names and values are trimmed of whitespace - Empty header names are ignored - Each pair must contain exactly one '=' separator - Invalid pairs are silently skipped
Examples: >>> parse_headers("Authorization=Bearer token,Content-Type=application/json")
>>> parse_headers("X-API-Key=secret123") # Single header
{'X-API-Key': 'secret123'}
>>> parse_headers("valid=ok,invalid-no-equals,another=good") # Partial success
{'valid': 'ok', 'another': 'good'}
>>> parse_headers("empty-value=") # Empty values allowed
{'empty-value': ''}
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
value
|
str | dict[str, str]
|
Comma-separated key=value pairs for HTTP headers, or dict if already parsed |
required |
Returns:
| Type | Description |
|---|---|
dict[str, str]
|
Dictionary of header name-value pairs. |
dict[str, str]
|
Invalid entries are silently ignored. |
Note
This parser is lenient by design - invalid header pairs are skipped rather than raising errors to allow partial configuration success in production environments.
Source code in provide/foundation/parsers/structured.py
parse_json_dict
¶
Parse JSON string into dictionary.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
value
|
str
|
JSON string |
required |
Returns:
| Type | Description |
|---|---|
dict[str, Any]
|
Parsed dictionary |
Raises:
| Type | Description |
|---|---|
ValueError
|
If JSON is invalid |
Source code in provide/foundation/parsers/primitives.py
parse_json_list
¶
Parse JSON string into list.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
value
|
str
|
JSON string |
required |
Returns:
| Type | Description |
|---|---|
list[Any]
|
Parsed list |
Raises:
| Type | Description |
|---|---|
ValueError
|
If JSON is invalid |
Source code in provide/foundation/parsers/primitives.py
parse_list
¶
Parse a list from a string.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
value
|
str | list[str]
|
String or list to parse |
required |
separator
|
str
|
Separator character |
','
|
strip
|
bool
|
Whether to strip whitespace from items |
True
|
Returns:
| Type | Description |
|---|---|
list[str]
|
List of strings |
Source code in provide/foundation/parsers/collections.py
parse_log_level
¶
Parse and validate log level string.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
value
|
str
|
Log level string (case-insensitive) |
required |
Returns:
| Type | Description |
|---|---|
LogLevelStr
|
Valid log level string in uppercase |
Raises:
| Type | Description |
|---|---|
ValueError
|
If the log level is invalid |
Source code in provide/foundation/parsers/telemetry.py
parse_module_levels
¶
Parse module-specific log levels from string format.
Format Requirements: - String format: "module1:LEVEL,module2:LEVEL" (comma-separated pairs) - Dict format: Already parsed dictionary (validated and returned) - Log levels must be valid: TRACE, DEBUG, INFO, WARNING, ERROR, CRITICAL - Module names are trimmed of whitespace - Invalid log levels are silently ignored
Examples: >>> parse_module_levels("auth.service:DEBUG,database:ERROR")
>>> parse_module_levels("api:INFO") # Single module
{'api': 'INFO'}
>>> parse_module_levels({"web": "warning"}) # Dict input (case normalized)
{'web': 'WARNING'}
>>> parse_module_levels("api:INFO,bad:INVALID,db:ERROR") # Partial success
{'api': 'INFO', 'db': 'ERROR'}
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
value
|
str | dict[str, str]
|
Comma-separated module:level pairs or pre-parsed dict |
required |
Returns:
| Type | Description |
|---|---|
dict[str, LogLevelStr]
|
Dictionary mapping module names to validated log level strings. |
dict[str, LogLevelStr]
|
Invalid entries are silently ignored. |
Note
This parser is lenient by design - invalid log levels are skipped rather than raising errors to allow partial configuration success in production environments.
Source code in provide/foundation/parsers/structured.py
parse_rate_limits
¶
Parse per-logger rate limits from string format.
Format Requirements: - Comma-separated triplets: "logger1:rate:capacity,logger2:rate:capacity" - Rate and capacity must be valid float numbers - Logger names are trimmed of whitespace - Empty logger names are ignored - Invalid entries are silently skipped to allow partial success
Examples: >>> parse_rate_limits("api:10.0:100.0,worker:5.0:50.0")
>>> parse_rate_limits("db:1.5:25.0") # Single entry
{'db': (1.5, 25.0)}
>>> parse_rate_limits("api:10:100,invalid:bad,worker:5:50") # Partial success
{'api': (10.0, 100.0), 'worker': (5.0, 50.0)}
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
value
|
str
|
Comma-separated logger:rate:capacity triplets |
required |
Returns:
| Type | Description |
|---|---|
dict[str, tuple[float, float]]
|
Dictionary mapping logger names to (rate, capacity) tuples. |
dict[str, tuple[float, float]]
|
Invalid entries are silently ignored. |
Note
This parser is lenient by design - invalid entries are skipped rather than raising errors to allow partial configuration success in production environments.
Source code in provide/foundation/parsers/structured.py
parse_sample_rate
¶
Parse sampling rate (0.0 to 1.0).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
value
|
str
|
String representation of sampling rate |
required |
Returns:
| Type | Description |
|---|---|
float
|
Float between 0.0 and 1.0 |
Raises:
| Type | Description |
|---|---|
ValueError
|
If value is not valid or out of range |
Source code in provide/foundation/parsers/primitives.py
parse_set
¶
Parse a set from a string.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
value
|
str | set[str]
|
String or set to parse |
required |
separator
|
str
|
Separator character |
','
|
strip
|
bool
|
Whether to strip whitespace from items |
True
|
Returns:
| Type | Description |
|---|---|
set[str]
|
Set of strings (duplicates removed) |
Source code in provide/foundation/parsers/collections.py
parse_tuple
¶
parse_tuple(
value: str | tuple[str, ...],
separator: str = ",",
strip: bool = True,
) -> tuple[str, ...]
Parse a tuple from a string.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
value
|
str | tuple[str, ...]
|
String or tuple to parse |
required |
separator
|
str
|
Separator character |
','
|
strip
|
bool
|
Whether to strip whitespace from items |
True
|
Returns:
| Type | Description |
|---|---|
tuple[str, ...]
|
Tuple of strings |
Source code in provide/foundation/parsers/collections.py
parse_typed_value
¶
Parse a string value to a specific type.
Handles basic types (int, float, bool, str) and generic types (list, dict). For attrs fields, pass field.type as target_type.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
value
|
str
|
String value to parse |
required |
target_type
|
type
|
Target type to convert to |
required |
Returns:
| Type | Description |
|---|---|
Any
|
Parsed value of the target type |
Examples:
>>> parse_typed_value("42", int)
42
>>> parse_typed_value("true", bool)
True
>>> parse_typed_value("a,b,c", list)
['a', 'b', 'c']