check if architecture list is not empty

This commit is contained in:
Evgenii Alekseev 2021-05-23 16:31:42 +03:00
parent f163dd4be4
commit fdc0df85e2
3 changed files with 31 additions and 14 deletions

View File

@ -23,7 +23,7 @@ import argparse
import logging import logging
from multiprocessing import Pool from multiprocessing import Pool
from typing import List, Type from typing import Set, Type
from ahriman.application.lock import Lock from ahriman.application.lock import Lock
from ahriman.core.configuration import Configuration from ahriman.core.configuration import Configuration
@ -63,11 +63,11 @@ class Handler:
architectures = cls.extract_architectures(args) architectures = cls.extract_architectures(args)
with Pool(len(architectures)) as pool: with Pool(len(architectures)) as pool:
result = pool.starmap( result = pool.starmap(
cls._call, [(args, architecture) for architecture in set(architectures)]) cls._call, [(args, architecture) for architecture in architectures])
return 0 if all(result) else 1 return 0 if all(result) else 1
@classmethod @classmethod
def extract_architectures(cls: Type[Handler], args: argparse.Namespace) -> List[str]: def extract_architectures(cls: Type[Handler], args: argparse.Namespace) -> Set[str]:
""" """
get known architectures get known architectures
:param args: command line args :param args: command line args
@ -76,13 +76,16 @@ class Handler:
if args.architecture is None: if args.architecture is None:
raise MissingArchitecture(args.command) raise MissingArchitecture(args.command)
if args.architecture: if args.architecture:
architectures: List[str] = args.architecture # avoid mypy warning return set(args.architecture)
return architectures
config = Configuration() config = Configuration()
config.load(args.configuration) config.load(args.configuration)
root = config.getpath("repository", "root") root = config.getpath("repository", "root")
return RepositoryPaths.known_architectures(root) architectures = RepositoryPaths.known_architectures(root)
if not architectures:
raise MissingArchitecture(args.command)
return architectures
@classmethod @classmethod
def run(cls: Type[Handler], args: argparse.Namespace, architecture: str, configuration: Configuration) -> None: def run(cls: Type[Handler], args: argparse.Namespace, architecture: str, configuration: Configuration) -> None:

View File

@ -21,7 +21,7 @@ from __future__ import annotations
from dataclasses import dataclass from dataclasses import dataclass
from pathlib import Path from pathlib import Path
from typing import List, Type from typing import Set, Type
@dataclass @dataclass
@ -79,18 +79,18 @@ class RepositoryPaths:
return self.root / "sources" / self.architecture return self.root / "sources" / self.architecture
@classmethod @classmethod
def known_architectures(cls: Type[RepositoryPaths], root: Path) -> List[str]: def known_architectures(cls: Type[RepositoryPaths], root: Path) -> Set[str]:
""" """
get known architectures get known architectures
:param root: repository root :param root: repository root
:return: list of architectures for which tree is created :return: list of architectures for which tree is created
""" """
paths = cls(root, "") paths = cls(root, "")
return [ return {
path.name path.name
for path in paths.repository.iterdir() for path in paths.repository.iterdir()
if path.is_dir() if path.is_dir()
] }
def create_tree(self) -> None: def create_tree(self) -> None:
""" """

View File

@ -57,12 +57,18 @@ def test_extract_architectures(args: argparse.Namespace, mocker: MockerFixture)
known_architectures_mock.assert_called_once() known_architectures_mock.assert_called_once()
def test_extract_architectures_specified(args: argparse.Namespace) -> None: def test_extract_architectures_empty(args: argparse.Namespace, mocker: MockerFixture) -> None:
""" """
must return architecture list if it has been specified must raise exception if no available architectures found
""" """
architectures = args.architecture = ["i686", "x86_64"] args.architecture = []
assert Handler.extract_architectures(args) == architectures args.command = "config"
args.configuration = Path("")
mocker.patch("ahriman.core.configuration.Configuration.getpath")
mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_architectures", return_value=set())
with pytest.raises(MissingArchitecture):
Handler.extract_architectures(args)
def test_extract_architectures_exception(args: argparse.Namespace) -> None: def test_extract_architectures_exception(args: argparse.Namespace) -> None:
@ -75,6 +81,14 @@ def test_extract_architectures_exception(args: argparse.Namespace) -> None:
Handler.extract_architectures(args) Handler.extract_architectures(args)
def test_extract_architectures_specified(args: argparse.Namespace) -> None:
"""
must return architecture list if it has been specified
"""
architectures = args.architecture = ["i686", "x86_64"]
assert Handler.extract_architectures(args) == set(architectures)
def test_run(args: argparse.Namespace, configuration: Configuration) -> None: def test_run(args: argparse.Namespace, configuration: Configuration) -> None:
""" """
must raise NotImplemented for missing method must raise NotImplemented for missing method