Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,15 @@ write_to = "src/moin/_version.py"
line-length = 120
skip-magic-trailing-comma = true

[tool.mypy]
python_version = "3.10"
files = ["src"]
exclude = ["/_tests/"]
ignore_missing_imports = true
show_error_codes = true
pretty = true
strict = false

[tool.pytest.ini_options]
norecursedirs = [".git", "_build", "tmp*", "env*", "dlc", "wiki", "support"]
addopts = "--ignore=_ui_tests"
Expand Down
2 changes: 1 addition & 1 deletion src/moin/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ def _init_backends(app, info_name, clock):
logging.debug("Wiki index not found.")


def init_backends(app, create_backend=False):
def init_backends(app, create_backend: bool = False) -> None:
"""
initialize the backends
"""
Expand Down
36 changes: 20 additions & 16 deletions src/moin/cli/_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,39 +6,43 @@
MoinMoin - common utilities for CLI commands.
"""

from typing import Optional
from __future__ import annotations

from flask import current_app as app
from moin.storage.backends.stores import Backend
from moin import log
from moin.storage.backends.stores import Backend

logging = log.getLogger(__name__)


def get_backends(backends: Optional[str], all_backends: bool) -> set[Backend]:
"""Return a set of Backends for CLI parameters.
def get_backends(backends: str | None, all_backends: bool) -> set[Backend]:
"""
Return a set of Backends for CLI parameters.

:param backends: Comma-separated list of backend names.
:param all_backends: If True, include all backends (overrides 'backends').
"""
if all_backends:
return set(app.cfg.backend_mapping.values())
if backends:
existing_backends = set(app.cfg.backend_mapping)
backends = set(backends.split(","))
if backends.issubset(existing_backends):
return {app.cfg.backend_mapping.get(backend_name) for backend_name in backends}
else:
print("Error: Wrong backend name given.")
print("Given Backends: %r" % backends)
print("Configured Backends: %r" % existing_backends)
else:

if not backends:
logging.warning("no backends specified")
return set()

existing_backends = set(app.cfg.backend_mapping)
requested_backends = set(backends.split(","))
if not requested_backends.issubset(existing_backends):
print("Error: Wrong backend name given.")
print("Given Backends: %r" % backends)
print("Configured Backends: %r" % existing_backends)
return set()

return {app.cfg.backend_mapping.get(backend_name) for backend_name in requested_backends}

def drop_and_recreate_index(indexer, procs=None, limitmb=None, multisegment=False):
"""Drop the index and recreate, rebuild, and optimize it.

def drop_and_recreate_index(indexer, procs=None, limitmb=None, multisegment: bool = False) -> None:
"""
Drop the index and recreate, rebuild, and optimize it.

:param indexer: IndexingMiddleware object.
:param procs: Number of processors the writer will use.
Expand Down
112 changes: 81 additions & 31 deletions src/moin/config/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,18 @@

from __future__ import annotations

from typing import Any, Protocol, TypedDict
from typing_extensions import TypeAlias
from typing import Any, Protocol, runtime_checkable, TypeAlias, TypedDict, TYPE_CHECKING
from collections.abc import Callable

from moin.datastructures.backends import BaseDictsBackend, BaseGroupsBackend

if TYPE_CHECKING:
from moin.auth import BaseAuth
from moin.storage.backends import BackendBase

NamespaceMapping: TypeAlias = list[tuple[str, str]]

BackendMapping: TypeAlias = dict[str, Any]
BackendMapping: TypeAlias = dict[str, "BackendBase"]

ItemViews: TypeAlias = list[tuple[str, str, str, bool]]

Expand All @@ -24,42 +30,86 @@ class AclConfig(TypedDict):

AclMapping: TypeAlias = list[tuple[str, AclConfig]]

IndexStorageConfig: TypeAlias = tuple[str, tuple[str, Any], dict]


class PasswordHasherConfig(TypedDict):
time_cost: int
memory_cost: int
parallelism: int
hash_len: int
salt_len: int


@runtime_checkable
class WikiConfigProtocol(Protocol):
wikiconfig_dir: str
instance_dir: str
data_dir: str
index_storage: str
serve_files: dict[str, str]
template_dirs: list[str]
interwikiname: str
interwiki_map: dict[str, str]
sitename: str
edit_locking_policy: str
edit_lock_time: int
expanded_quicklinks_size: int
admin_emails: list[str]
email_tracebacks: bool
registration_only_by_superuser: bool
registration_hint: str
user_email_verification: bool
acl_functions: str
uri: str
namespaces: dict[str, str]
backends: dict[str, str]
acl_mapping: AclMapping
acl_rights_contents: list[str]
acl_rights_functions: list[str]
acls: dict[str, AclConfig]
namespace_mapping: NamespaceMapping
admin_emails: list[str]
auth: list[BaseAuth]
auth_can_logout: list[str]
auth_login_inputs: list[str]
auth_have_login: bool
backend_mapping: BackendMapping
acl_mapping: AclMapping
root_mapping: dict[str, str]
default_root: str
language_default: str
backends: dict[str, str]
config_check_enabled: bool
content_dir: str
content_security_policy: str
content_security_policy_report_only: str
content_security_policy_limit_per_day: int
contenttype_disabled: list[str]
contenttype_enabled: list[str]
data_dir: str
default_root: str
destroy_backend: bool
dicts: Callable[[], BaseDictsBackend]
edit_locking_policy: str
edit_lock_time: int
email_tracebacks: bool
endpoints_excluded: list[str]
expanded_quicklinks_size: int
groups: Callable[[], BaseGroupsBackend]
index_storage: IndexStorageConfig
instance_dir: str
interwikiname: str
interwiki_map: dict[str, str]
item_views: ItemViews
supplementation_item_names: list[str]
language_default: str
locale_default: str
mail_enabled: bool
mail_from: str | None
mail_username: str | None
mail_password: str | None
mail_sendmail: str | None
mail_smarthost: str | None
markdown_extensions: list[str] = []
mimetypes_to_index_as_empty: list[str] = []
namespace_mapping: NamespaceMapping
namespaces: dict[str, str]
navi_bar: NaviBarEntries
auth_login_inputs: list[str]
auth_have_login: bool
registration_hint: str
registration_only_by_superuser: bool
root_mapping: dict[str, str]
secrets: dict[str, str] | str
serve_files: dict[str, str]
show_hosts: bool
siteid: str
sitename: str
supplementation_item_names: list[str]
template_dirs: list[str]
theme_default: str
timezone_default: str
uri: str
user_defaults: dict[str, Any]
user_email_unique: bool
user_email_verification: bool
user_gravatar_default_img: str
user_homewiki: str
user_use_gravatar: bool
wikiconfig_dir: str

_plugin_modules: list[str]
_site_plugin_lists: dict[str, dict[str, str]]
Loading