feat: add __call__ method to printers

This commit is contained in:
2023-10-01 15:14:18 +03:00
parent 9fe760efdf
commit 8ff567cac3
28 changed files with 91 additions and 39 deletions

View File

@ -105,8 +105,7 @@ class Application(ApplicationPackages, ApplicationRepository):
tree = Tree.resolve(packages)
for level in tree:
for package in level:
UpdatePrinter(package, local_versions.get(package.base)).print(
verbose=True, log_fn=log_fn, separator=" -> ")
UpdatePrinter(package, local_versions.get(package.base))(verbose=True, log_fn=log_fn, separator=" -> ")
def with_dependencies(self, packages: list[Package], *, process_dependencies: bool) -> list[Package]:
"""

View File

@ -45,11 +45,11 @@ class Dump(Handler):
report(bool): force enable or disable reporting
"""
root, _ = configuration.check_loaded()
ConfigurationPathsPrinter(root, configuration.includes).print(verbose=True, separator=" = ")
ConfigurationPathsPrinter(root, configuration.includes)(verbose=True, separator=" = ")
# empty line
StringPrinter("").print(verbose=False)
StringPrinter("")(verbose=False)
dump = configuration.dump()
for section, values in sorted(dump.items()):
ConfigurationPrinter(section, values).print(verbose=not args.secure, separator=" = ")
ConfigurationPrinter(section, values)(verbose=not args.secure, separator=" = ")

View File

@ -133,7 +133,7 @@ class Patch(Handler):
Patch.check_if_empty(exit_code, not patches)
for base, patch in patches.items():
PatchPrinter(base, patch).print(verbose=True, separator=" = ")
PatchPrinter(base, patch)(verbose=True, separator=" = ")
@staticmethod
def patch_set_remove(application: Application, package_base: str, variables: list[str] | None) -> None:

View File

@ -49,7 +49,7 @@ class RemoveUnknown(Handler):
if args.dry_run:
for package in sorted(unknown_packages):
StringPrinter(package).print(verbose=False)
StringPrinter(package)(verbose=False)
return
application.remove(unknown_packages)

View File

@ -68,7 +68,7 @@ class Search(Handler):
for packages_list in (official_packages_list, aur_packages_list):
# keep sorting by packages source
for package in Search.sort(packages_list, args.sort_by):
AurPrinter(package).print(verbose=args.info)
AurPrinter(package)(verbose=args.info)
@staticmethod
def sort(packages: Iterable[AURPackage], sort_by: str) -> list[AURPackage]:

View File

@ -59,5 +59,5 @@ class ServiceUpdates(Handler):
if same_version:
return
UpdatePrinter(remote, local_version).print(verbose=True, separator=" -> ")
UpdatePrinter(remote, local_version)(verbose=True, separator=" -> ")
ServiceUpdates.check_if_empty(args.exit_code, not same_version)

View File

@ -51,7 +51,7 @@ class Shell(Handler):
if args.verbose:
# licensed by https://creativecommons.org/licenses/by-sa/3.0
path = Path(sys.prefix) / "share" / "ahriman" / "templates" / "shell"
StringPrinter(path.read_text(encoding="utf8")).print(verbose=False)
StringPrinter(path.read_text(encoding="utf8"))(verbose=False)
local_variables = {
"architecture": repository_id.architecture,

View File

@ -53,7 +53,7 @@ class Status(Handler):
client = Application(repository_id, configuration, report=True).repository.reporter
if args.ahriman:
service_status = client.status_get()
StatusPrinter(service_status.status).print(verbose=args.info)
StatusPrinter(service_status.status)(verbose=args.info)
if args.package:
packages: list[tuple[Package, BuildStatus]] = sum(
(client.package_get(base) for base in args.package),
@ -67,4 +67,4 @@ class Status(Handler):
filter_fn: Callable[[tuple[Package, BuildStatus]], bool] =\
lambda item: args.status is None or item[1].status == args.status
for package, package_status in sorted(filter(filter_fn, packages), key=comparator):
PackagePrinter(package, package_status).print(verbose=args.info)
PackagePrinter(package, package_status)(verbose=args.info)

View File

@ -50,11 +50,11 @@ class Structure(Handler):
partitions = Tree.partition(application.repository.packages(), count=args.partitions)
for partition_id, partition in enumerate(partitions):
StringPrinter(f"partition #{partition_id}").print(verbose=False)
StringPrinter(f"partition #{partition_id}")(verbose=False)
tree = Tree.resolve(partition)
for num, level in enumerate(tree):
TreePrinter(num, level).print(verbose=True, separator=" ")
TreePrinter(num, level)(verbose=True, separator=" ")
# empty line
StringPrinter("").print(verbose=False)
StringPrinter("")(verbose=False)

View File

@ -50,7 +50,7 @@ class UnsafeCommands(Handler):
UnsafeCommands.check_unsafe(args.command, unsafe_commands, parser)
else:
for command in unsafe_commands:
StringPrinter(command).print(verbose=True)
StringPrinter(command)(verbose=True)
@staticmethod
def check_unsafe(command: list[str], unsafe_commands: list[str], parser: argparse.ArgumentParser) -> None:

View File

@ -61,7 +61,7 @@ class Users(Handler):
users = database.user_list(args.username, args.role)
Users.check_if_empty(args.exit_code, not users)
for user in users:
UserPrinter(user).print(verbose=True)
UserPrinter(user)(verbose=True)
case Action.Remove:
database.user_remove(args.username)

View File

@ -57,7 +57,7 @@ class Validate(Handler):
if validator.validate(configuration.dump()):
return # no errors found
for node, errors in validator.errors.items():
ValidationPrinter(node, errors).print(verbose=True)
ValidationPrinter(node, errors)(verbose=True)
# as we reach this part it means that we always have errors
Validate.check_if_empty(args.exit_code, True)

View File

@ -55,9 +55,9 @@ class Versions(Handler):
report(bool): force enable or disable reporting
"""
VersionPrinter(f"Module version {__version__}",
{"Python": sys.version}).print(verbose=False, separator=" ")
{"Python": sys.version})(verbose=False, separator=" ")
packages = Versions.package_dependencies("ahriman")
VersionPrinter("Installed packages", dict(packages)).print(verbose=False, separator=" ")
VersionPrinter("Installed packages", dict(packages))(verbose=False, separator=" ")
@staticmethod
def package_dependencies(root: str) -> Generator[tuple[str, str], None, None]:

View File

@ -45,7 +45,7 @@ class Validator(RootValidator):
Args:
configuration(Configuration): configuration instance used for extraction
*args(Any): positional arguments to be passed to base validator
**kwargs(): keyword arguments to be passed to base validator
**kwargs(Any): keyword arguments to be passed to base validator
"""
RootValidator.__init__(self, *args, **kwargs)
self.configuration: Configuration = kwargs["configuration"]

View File

@ -17,6 +17,8 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import builtins
from collections.abc import Callable
from ahriman.models.property import Property
@ -27,7 +29,9 @@ class Printer:
base class for formatters
"""
def print(self, *, verbose: bool, log_fn: Callable[[str], None] = print, separator: str = ": ") -> None:
_print = builtins.print # do not shadow with method
def print(self, *, verbose: bool, log_fn: Callable[[str], None] = _print, separator: str = ": ") -> None:
"""
print content
@ -60,3 +64,15 @@ class Printer:
Returns:
str | None: content title if it can be generated and None otherwise
"""
return None
def __call__(self, *, verbose: bool, log_fn: Callable[[str], None] = _print, separator: str = ": ") -> None:
"""
print content. Shortcut for ``Printer.print``
Args:
verbose(bool): print all fields
log_fn(Callable[[str], None], optional): logger function to log data (Default value = print)
separator(str, optional): separator for property name and property value (Default value = ": ")
"""
self.print(verbose=verbose, log_fn=log_fn, separator=separator)

View File

@ -54,6 +54,6 @@ class Console(Report):
result(Result): build result
"""
for package in result.success:
BuildPrinter(package, is_success=True, use_utf=self.use_utf).print(verbose=True)
BuildPrinter(package, is_success=True, use_utf=self.use_utf)(verbose=True)
for package in result.failed:
BuildPrinter(package, is_success=False, use_utf=self.use_utf).print(verbose=True)
BuildPrinter(package, is_success=False, use_utf=self.use_utf)(verbose=True)