Skip to content

Configuration

config


Assembly:                Fonky
Filename:                config.py
Author:                  Terry D. Eppler
Created:                 05-31-2022

Last Modified By:        Terry D. Eppler
Last Modified On:        05-01-2025

       config.py
       Copyright ©  2026  Terry Eppler

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

You can contact me at: terryeppler@gmail.com or eppler.terry@epa.gov

Provides centralized runtime configuration for Fonky. Purpose: Defines application paths, exception logging settings, environment-driven API keys, service descriptions, loader descriptions, and request defaults used by the Fonky fetcher, loader, scraper, processor, and tool layers. The module keeps configuration import-safe by reading optional environment variables with deterministic fallbacks and by avoiding runtime service calls during import.

throw_if

throw_if(name: str, value: object) -> None

Raise a ValueError when a required value is empty.

Purpose

Provides a small, consistent guard for required arguments and configuration values. The function treats falsy values as invalid and raises a ValueError containing the caller-supplied argument or setting name.

Parameters:

Name Type Description Default
name str

Name of the argument or configuration value being validated.

required
value object

Value to validate.

required

Raises:

Type Description
ValueError

Raised when value is falsy.

Source code in config.py
def throw_if( name: str, value: object ) -> None:
	"""Raise a ``ValueError`` when a required value is empty.

	Purpose:
		Provides a small, consistent guard for required arguments and configuration values. The
		function treats falsy values as invalid and raises a ``ValueError`` containing the
		caller-supplied argument or setting name.

	Args:
		name (str): Name of the argument or configuration value being validated.
		value (object): Value to validate.

	Raises:
		ValueError: Raised when ``value`` is falsy.
	"""
	if not value:
		raise ValueError( f'Argument "{name}" cannot be empty!' )

get_bool

get_bool(name: str, default: bool = False) -> bool

Read a Boolean environment variable.

Purpose

Converts environment-variable text into a deterministic Boolean value. Missing variables return the caller-provided default. Values of 1, true, yes, y, and on are treated as True; all other defined values are treated as False.

Parameters:

Name Type Description Default
name str

Environment variable name.

required
default bool

Default value used when the environment variable is not defined.

False

Returns:

Type Description
bool

Parsed Boolean value, or the original default value when parsing fails.

Source code in config.py
def get_bool( name: str, default: bool = False ) -> bool:
	"""Read a Boolean environment variable.

	Purpose:
		Converts environment-variable text into a deterministic Boolean value. Missing
		variables return the caller-provided default. Values of ``1``, ``true``, ``yes``,
		``y``, and ``on`` are treated as ``True``; all other defined values are treated as
		``False``.

	Args:
		name (str): Environment variable name.
		default (bool): Default value used when the environment variable is not defined.

	Returns:
		Parsed Boolean value, or the original default value when parsing fails.
	"""
	try:
		throw_if( 'name', name )
		value = os.getenv( name )
		return default if value is None else value.strip( ).lower( ) in (
				'1',
				'true',
				'yes',
				'y',
				'on'
		)
	except Exception:
		return default

get_int

get_int(name: str, default: int) -> int

Read an integer environment variable.

Purpose

Parses an optional environment variable as an integer while preserving a safe default when the variable is missing, empty, or invalid. This keeps module import safe even when deployment configuration is incomplete.

Parameters:

Name Type Description Default
name str

Environment variable name.

required
default int

Default integer value used when parsing is not possible.

required

Returns:

Type Description
int

Parsed integer value or the supplied default value.

Source code in config.py
def get_int( name: str, default: int ) -> int:
	"""Read an integer environment variable.

	Purpose:
		Parses an optional environment variable as an integer while preserving a safe
		default when the variable is missing, empty, or invalid. This keeps module import
		safe even when deployment configuration is incomplete.

	Args:
		name (str): Environment variable name.
		default (int): Default integer value used when parsing is not possible.

	Returns:
		Parsed integer value or the supplied default value.
	"""
	try:
		throw_if( 'name', name )
		value = os.getenv( name )
		return default if value in (None, '') else int( str( value ).strip( ) )
	except Exception:
		return default

get_float

get_float(name: str, default: float) -> float

Read a floating-point environment variable.

Purpose

Parses an optional environment variable as a float while preserving a safe default when the variable is missing, empty, or invalid. This helper supports numeric configuration without making module import dependent on perfect environment state.

Parameters:

Name Type Description Default
name str

Environment variable name.

required
default float

Default floating-point value used when parsing is not possible.

required

Returns:

Type Description
float

Parsed floating-point value or the supplied default value.

Source code in config.py
def get_float( name: str, default: float ) -> float:
	"""Read a floating-point environment variable.

	Purpose:
		Parses an optional environment variable as a float while preserving a safe default
		when the variable is missing, empty, or invalid. This helper supports numeric
		configuration without making module import dependent on perfect environment state.

	Args:
		name (str): Environment variable name.
		default (float): Default floating-point value used when parsing is not possible.

	Returns:
		Parsed floating-point value or the supplied default value.
	"""
	try:
		throw_if( 'name', name )
		value = os.getenv( name )
		return default if value in (None, '') else float( str( value ).strip( ) )
	except Exception:
		return default

get_path

get_path(name: str, default: Path) -> Path

Read a path environment variable.

Purpose

Resolves optional filesystem configuration from the environment. Missing variables return the resolved default path, and invalid values fall back to the resolved default path rather than interrupting module import.

Parameters:

Name Type Description Default
name str

Environment variable name.

required
default Path

Default path used when the environment variable is not defined.

required

Returns:

Type Description
Path

Resolved path value or the resolved default path.

Source code in config.py
def get_path( name: str, default: Path ) -> Path:
	"""Read a path environment variable.

	Purpose:
		Resolves optional filesystem configuration from the environment. Missing variables
		return the resolved default path, and invalid values fall back to the resolved
		default path rather than interrupting module import.

	Args:
		name (str): Environment variable name.
		default (Path): Default path used when the environment variable is not defined.

	Returns:
		Resolved path value or the resolved default path.
	"""
	try:
		throw_if( 'name', name )
		throw_if( 'default', default )
		value = os.getenv( name )
		return Path( value ).resolve( ) if value else default.resolve( )
	except Exception:
		return default.resolve( )

get_text

get_text(name: str, default: str) -> str

Read a text environment variable.

Purpose

Returns an environment variable as text while preserving the supplied default when the variable is missing or empty. This keeps optional configuration centralized and stable for callers that import the module early in application startup.

Parameters:

Name Type Description Default
name str

Environment variable name.

required
default str

Default text value.

required

Returns:

Type Description
str

Environment value or supplied default.

Source code in config.py
def get_text( name: str, default: str ) -> str:
	"""Read a text environment variable.

	Purpose:
		Returns an environment variable as text while preserving the supplied default when
		the variable is missing or empty. This keeps optional configuration centralized and
		stable for callers that import the module early in application startup.

	Args:
		name (str): Environment variable name.
		default (str): Default text value.

	Returns:
		Environment value or supplied default.
	"""
	try:
		throw_if( 'name', name )
		value = os.getenv( name )
		return default if value in (None, '') else str( value )
	except Exception:
		return default