From f4e607c33c0015116b54798ed21aae36bfc1fe73 Mon Sep 17 00:00:00 2001 From: s-weigand Date: Fri, 13 Aug 2021 14:16:21 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=A9=B9=20CLI=20fixed=20result=20outformat?= =?UTF-8?q?=20accepting=20none=20supported=20formats?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- glotaran/cli/commands/optimize.py | 3 +-- glotaran/cli/commands/test/test_util.py | 10 ++++++++ glotaran/cli/commands/util.py | 32 +++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 glotaran/cli/commands/test/test_util.py diff --git a/glotaran/cli/commands/optimize.py b/glotaran/cli/commands/optimize.py index 9c39cc70d..6236e0be0 100644 --- a/glotaran/cli/commands/optimize.py +++ b/glotaran/cli/commands/optimize.py @@ -6,7 +6,6 @@ from glotaran.analysis.optimize import optimize from glotaran.cli.commands import util from glotaran.plugin_system.data_io_registration import known_data_formats -from glotaran.plugin_system.project_io_registration import known_project_formats from glotaran.plugin_system.project_io_registration import save_result from glotaran.project.scheme import Scheme @@ -37,7 +36,7 @@ "--outformat", "-ofmt", default="folder", - type=click.Choice(known_project_formats()), + type=click.Choice(util.project_io_list_supporting_plugins("save_result", ("yml_str"))), help="The format of the output.", show_default=True, ) diff --git a/glotaran/cli/commands/test/test_util.py b/glotaran/cli/commands/test/test_util.py new file mode 100644 index 000000000..6a9cce9da --- /dev/null +++ b/glotaran/cli/commands/test/test_util.py @@ -0,0 +1,10 @@ +from glotaran.cli.commands.util import project_io_list_supporting_plugins + + +def test_project_io_list_supporting_plugins_save_result(): + """Same as used in ``--outformat`` CLI option.""" + result = project_io_list_supporting_plugins("save_result", ("yml_str")) + + assert "csv" not in result + assert "yml_str" not in result + assert "folder" in result diff --git a/glotaran/cli/commands/util.py b/glotaran/cli/commands/util.py index ea17c6301..ef83b42ec 100644 --- a/glotaran/cli/commands/util.py +++ b/glotaran/cli/commands/util.py @@ -1,13 +1,20 @@ +from __future__ import annotations + import sys +from typing import Iterable import click from click import echo from click import prompt +from glotaran.io import ProjectIoInterface from glotaran.io import load_dataset from glotaran.io import load_model from glotaran.io import load_parameters from glotaran.io import load_scheme +from glotaran.plugin_system.base_registry import methods_differ_from_baseclass_table +from glotaran.plugin_system.project_io_registration import get_project_io +from glotaran.plugin_system.project_io_registration import known_project_formats def signature_analysis(cmd): @@ -121,6 +128,31 @@ def write_data(data, out): df.to_csv(out) +def project_io_list_supporting_plugins( + method_name: str, block_list: Iterable[str] | None = None +) -> Iterable[str]: + """List all project-io plugin that implement ``method_name``. + + Parameters + ---------- + method_name: str + Name of the method which should be supported. + block_list: Iterable[str] + Iterable of plugin names which should be omitted. + """ + if block_list is None: + block_list = [] + support_table = methods_differ_from_baseclass_table( + method_names=method_name, + plugin_registry_keys=known_project_formats(full_names=False), + get_plugin_function=get_project_io, + base_class=ProjectIoInterface, + ) + support_table = filter(lambda entry: entry[1], support_table) + supporting_list: Iterable[str] = (entry[0].replace("`", "") for entry in support_table) + return list(filter(lambda entry: entry not in block_list, supporting_list)) + + class ValOrRangeOrList(click.ParamType): name = "number or range or list"