Fix `_ConfigFile` handling of sequence types

This commit is contained in:
Adam Turner 2024-04-11 17:59:28 +01:00 committed by Adam Turner
parent 6caf4ee17e
commit a5d7cce7f5

View File

@ -27,8 +27,6 @@ else:
from importlib_metadata import entry_points # type: ignore[import-not-found] from importlib_metadata import entry_points # type: ignore[import-not-found]
if TYPE_CHECKING: if TYPE_CHECKING:
from collections.abc import Iterable
from sphinx.application import Sphinx from sphinx.application import Sphinx
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -62,9 +60,9 @@ class Theme:
self.pygments_style_dark: str | None = None self.pygments_style_dark: str | None = None
for config in reversed(configs.values()): for config in reversed(configs.values()):
options |= config.options options |= config.options
if len(config.stylesheets): if config.stylesheets is not None:
self.stylesheets = config.stylesheets self.stylesheets = config.stylesheets
if len(config.sidebar_templates): if config.sidebar_templates is not None:
self.sidebar_templates = config.sidebar_templates self.sidebar_templates = config.sidebar_templates
if config.pygments_style_default is not None: if config.pygments_style_default is not None:
self.pygments_style_default = config.pygments_style_default self.pygments_style_default = config.pygments_style_default
@ -73,10 +71,6 @@ class Theme:
self._options = options self._options = options
if len(self.stylesheets) == 0:
msg = __("No loaded theme defines 'theme.stylesheet' in the configuration")
raise ThemeError(msg) from None
def get_theme_dirs(self) -> list[str]: def get_theme_dirs(self) -> list[str]:
"""Return a list of theme directories, beginning with this theme's, """Return a list of theme directories, beginning with this theme's,
then the base theme's, then that one's base theme's, etc. then the base theme's, then that one's base theme's, etc.
@ -261,7 +255,7 @@ def _load_theme(name: str, theme_path: str, /) -> tuple[str, str, str | None, _C
theme_dir = path.join(tmp_dir, name) theme_dir = path.join(tmp_dir, name)
_extract_zip(theme_path, theme_dir) _extract_zip(theme_path, theme_dir)
if os.path.isfile(conf_path := path.join(theme_dir, _THEME_CONF)): if path.isfile(conf_path := path.join(theme_dir, _THEME_CONF)):
_cfg_parser = _load_theme_conf(conf_path) _cfg_parser = _load_theme_conf(conf_path)
inherit = _validate_theme_conf(_cfg_parser, name) inherit = _validate_theme_conf(_cfg_parser, name)
config = _convert_theme_conf(_cfg_parser) config = _convert_theme_conf(_cfg_parser)
@ -302,13 +296,13 @@ def _validate_theme_conf(cfg: configparser.RawConfigParser, name: str) -> str:
def _convert_theme_conf(cfg: configparser.RawConfigParser, /) -> _ConfigFile: def _convert_theme_conf(cfg: configparser.RawConfigParser, /) -> _ConfigFile:
if stylesheet := cfg.get('theme', 'stylesheet', fallback=''): if stylesheet := cfg.get('theme', 'stylesheet', fallback=''):
stylesheets: tuple[str, ...] = tuple(map(str.strip, stylesheet.split(','))) stylesheets: tuple[str, ...] | None = tuple(map(str.strip, stylesheet.split(',')))
else: else:
stylesheets = () stylesheets = None
if sidebar := cfg.get('theme', 'sidebars', fallback=''): if sidebar := cfg.get('theme', 'sidebars', fallback=''):
sidebar_templates: tuple[str, ...] = tuple(map(str.strip, sidebar.split(','))) sidebar_templates: tuple[str, ...] | None = tuple(map(str.strip, sidebar.split(',')))
else: else:
sidebar_templates = () sidebar_templates = None
pygments_style_default: str | None = cfg.get('theme', 'pygments_style', fallback=None) pygments_style_default: str | None = cfg.get('theme', 'pygments_style', fallback=None)
pygments_style_dark: str | None = cfg.get('theme', 'pygments_dark_style', fallback=None) pygments_style_dark: str | None = cfg.get('theme', 'pygments_dark_style', fallback=None)
options = dict(cfg.items('options')) if cfg.has_section('options') else {} options = dict(cfg.items('options')) if cfg.has_section('options') else {}
@ -332,14 +326,14 @@ class _ConfigFile:
def __init__( def __init__(
self, self,
stylesheets: Iterable[str], stylesheets: tuple[str, ...] | None,
sidebar_templates: Iterable[str], sidebar_templates: tuple[str, ...] | None,
pygments_style_default: str | None, pygments_style_default: str | None,
pygments_style_dark: str | None, pygments_style_dark: str | None,
options: dict[str, str], options: dict[str, str],
) -> None: ) -> None:
self.stylesheets: tuple[str, ...] = tuple(stylesheets) self.stylesheets: tuple[str, ...] | None = stylesheets
self.sidebar_templates: tuple[str, ...] = tuple(sidebar_templates) self.sidebar_templates: tuple[str, ...] | None = sidebar_templates
self.pygments_style_default: str | None = pygments_style_default self.pygments_style_default: str | None = pygments_style_default
self.pygments_style_dark: str | None = pygments_style_dark self.pygments_style_dark: str | None = pygments_style_dark
self.options: dict[str, str] = options.copy() self.options: dict[str, str] = options.copy()