Source code for click_extra.config.builtin
# Copyright Kevin Deldycke <kevin@deldycke.com> and contributors.
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
"""Click Extra's own built-in configuration schema and validators.
These are concrete *instances* of the configuration machinery, kept apart from
the reusable engine in {mod}`~click_extra.config.schema` and the option classes
in {mod}`~click_extra.config.option`:
- the dataclasses describing click-extra's own `[tool.click-extra]` section
({class}`ClickExtraConfig` and its `test-suite` and `prebake` sub-tables);
- {func}`_builtin_config_validators`, the validators click-extra registers on
every {class}`~click_extra.config.option.ConfigOption`.
A downstream project defines its *own* equivalent of this module; click-extra
just happens to ship one, built on the same generic engine.
"""
from __future__ import annotations
from dataclasses import dataclass, field
from .schema import (
CONFIG_PATH_METADATA_KEY,
EXTENSION_METADATA_KEY,
ConfigValidator,
)
THEMES_CONFIG_KEY: str = "themes"
"""Sub-key under `[tool.<cli>]` where user-defined themes live in config.
Used by {class}`~click_extra.config.option.ConfigOption` to find `[tool.<cli>.themes.<name>]` tables,
build them via {meth}`HelpTheme.from_dict
<click_extra.theme.HelpTheme.from_dict>`, and stash the result on
`ctx.meta[click_extra.context.THEME_OVERRIDES]`. The constant is the
single source of truth shared by `_builtin_config_validators`,
`ConfigOption._apply_theme_overrides`, and
{func}`click_extra.theme.themes_from_config`.
"""
[docs]
@dataclass
class TestSuiteConfig:
"""Config schema for a project's test suite, read from `[tool.<cli>.test-suite]`.
The `test-suite` CLI command resolves its cases from this config when no
suite is given on the command line. Map it onto an app's config section with
a field carrying ``metadata={CONFIG_PATH_METADATA_KEY: "test-suite"}``.
"""
file: str = "./tests/cli-test-suite.toml"
"""Path to a test suite file, resolved relative to the project root.
Its format is detected from the extension; the default is TOML, which (like
JSON) parses with no optional dependency, unlike YAML and the others.
"""
cases: list[dict] = field(
default_factory=list,
metadata={EXTENSION_METADATA_KEY: True},
)
"""Test cases written natively in the config format, an alternative to a
{attr}`~click_extra.config.builtin.TestSuiteConfig.file` suite, taking
precedence over it when both are set.
Each entry is a mapping of `CLITestCase` directive names, equivalent to one
item of a suite list. In TOML this reads as a `[[tool.<cli>.test-suite.cases]]`
array of tables. Declared as an extension point so the configuration engine
passes the raw mappings through unprocessed; the `test-suite` command turns
them into {class}`~click_extra.test_suite.CLITestCase` instances.
"""
timeout: int | None = None
"""Default timeout (seconds) for each case that does not set its own.
`None` leaves cases unbounded unless `--timeout` is passed.
"""
[docs]
@dataclass
class PrebakeConfig:
"""Config schema for the prebake commands, read from `[tool.<cli>.prebake]`.
Lets a project pin the target `__init__.py` once for its build pipeline,
instead of passing `--module` to every `click-extra prebake` command.
"""
module: str | None = None
"""Path to the `__init__.py` to pre-bake, resolved relative to the project
root. Overrides the `[project.scripts]` auto-discovery; leave unset to keep
it."""
def _builtin_config_validators() -> tuple[ConfigValidator, ...]:
"""Return the validators click-extra registers on every {class}`~click_extra.config.option.ConfigOption`.
Currently a single validator for `[tool.<cli>.themes.<name>]` tables.
Lazy-imports {func}`~click_extra.theme.validate_themes_config` to avoid
a load-time cycle: {mod}`click_extra.theme` is imported after
{mod}`click_extra.config` from the package `__init__`.
"""
from ..theme import validate_themes_config
return (
ConfigValidator(
extension_path=THEMES_CONFIG_KEY,
validator=validate_themes_config,
description=(
"Validate user-defined and override themes declared under "
"[tool.<cli>.themes.<name>]."
),
),
)