diff --git a/src/bob/pad/base/script/cross.py b/src/bob/pad/base/script/cross.py index 62b8f26fe0ab140b832427bc43ab4ee618de0d6c..a3ab03e2c50b5a0271b2a4a33262d129bf6d216d 100644 --- a/src/bob/pad/base/script/cross.py +++ b/src/bob/pad/base/script/cross.py @@ -10,14 +10,10 @@ import click import jinja2 import yaml +from exposed.click import log_parameters, verbosity_option from tabulate import tabulate from bob.bio.base.score.load import get_negatives_positives, load_score -from bob.extension.scripts.click_helper import ( - bool_option, - log_parameters, - verbosity_option, -) from bob.measure import farfrr from bob.measure.script import common_options from bob.measure.utils import get_fta @@ -28,6 +24,47 @@ from .pad_commands import CRITERIA logger = logging.getLogger(__name__) +def bool_option(name, short_name, desc, dflt=False, **kwargs): + """Generic provider for boolean options + + Parameters + ---------- + name : str + name of the option + short_name : str + short name for the option + desc : str + short description for the option + dflt : bool or None + Default value + **kwargs + All kwargs are passed to click.option. + + Returns + ------- + ``callable`` + A decorator to be used for adding this option. + """ + + def custom_bool_option(func): + def callback(ctx, param, value): + ctx.meta[name.replace("-", "_")] = value + return value + + return click.option( + "-%s/-n%s" % (short_name, short_name), + "--%s/--no-%s" % (name, name), + default=dflt, + help=desc, + show_default=True, + callback=callback, + is_eager=True, + **kwargs, + )(func) + + return custom_bool_option + + def _ordered_load(stream, Loader=yaml.Loader, object_pairs_hook=dict): """Loads the contents of the YAML stream into :py:class:`collections.OrderedDict`'s @@ -234,7 +271,7 @@ Examples: @common_options.table_option() @common_options.output_log_metric_option() @common_options.decimal_option(dflt=2, short="-dec") -@verbosity_option() +@verbosity_option(logger) @click.pass_context def cross( ctx, diff --git a/src/bob/pad/base/script/finalize_scores.py b/src/bob/pad/base/script/finalize_scores.py index 6164d901a886782907a19b831719432f264da69a..7d81e0b9a54ca12cbdf2a903b1af7a514d1fe0c6 100644 --- a/src/bob/pad/base/script/finalize_scores.py +++ b/src/bob/pad/base/script/finalize_scores.py @@ -1,8 +1,12 @@ """Finalizes the scores that are produced by bob pad run-pipeline. """ +import logging + import click -from bob.extension.scripts.click_helper import log_parameters, verbosity_option +from exposed.click import log_parameters, verbosity_option + +logger = logging.getLogger(__name__) @click.command( @@ -27,7 +31,7 @@ Examples: @click.option( "--backup/--no-backup", default=True, help="Whether to backup scores." ) -@verbosity_option() +@verbosity_option(logger) def finalize_scores(scores, method, backup, verbose): """Finalizes the scores given by bob pad run-pipeline When using bob.pad.base, Algorithms can produce several score values for @@ -37,13 +41,11 @@ def finalize_scores(scores, method, backup, verbose): The conversion is done in-place (original files will be backed up). The order of scores will change. """ - import logging import shutil import numpy import pandas as pd - logger = logging.getLogger(__name__) log_parameters(logger) mean = { diff --git a/src/bob/pad/base/script/pad.py b/src/bob/pad/base/script/pad.py index e798bb200f6b9c5fd348bc7395a125576ea42bdc..518ebb2a50ea9e1bfa7b8f8c9ce93003f243eb44 100644 --- a/src/bob/pad/base/script/pad.py +++ b/src/bob/pad/base/script/pad.py @@ -4,8 +4,7 @@ import click import pkg_resources from click_plugins import with_plugins - -from bob.extension.scripts.click_helper import AliasedGroup +from exposed.click import AliasedGroup @with_plugins(pkg_resources.iter_entry_points("bob.pad.cli")) diff --git a/src/bob/pad/base/script/pad_commands.py b/src/bob/pad/base/script/pad_commands.py index 4fdabe9cb94173ed7c1b7cc9253a3a7f94bd0daa..b8227131279b3699e1ac867de4a2bf1d6b09ba6a 100644 --- a/src/bob/pad/base/script/pad_commands.py +++ b/src/bob/pad/base/script/pad_commands.py @@ -1,5 +1,6 @@ """The main entry for bob pad commands. """ +import logging import os from csv import DictWriter @@ -8,14 +9,17 @@ from functools import partial import click import numpy +from exposed.click import verbosity_option + import bob.measure.script.figure as measure_figure -from bob.extension.scripts.click_helper import verbosity_option from bob.measure.script import common_options from ..error_utils import split_csv_pad, split_csv_pad_per_pai from . import pad_figure as figure +logger = logging.getLogger(__name__) + SCORE_FORMAT = "Files must be in CSV format." CRITERIA = ( "eer", @@ -190,7 +194,7 @@ def gen_pad_csv_scores( ) @click.option("-s", "--n-samples", default=2, type=click.INT, show_default=True) @click.option("-a", "--n-attacks", default=2, type=click.INT, show_default=True) -@verbosity_option() +@verbosity_option(logger) @click.pass_context def gen( ctx, diff --git a/src/bob/pad/base/script/run_pipeline.py b/src/bob/pad/base/script/run_pipeline.py index 1686efeab0855b9372803f43104999e270a1e87c..f8f7e77fe635fa6c049b22a23f09e97167f57857 100644 --- a/src/bob/pad/base/script/run_pipeline.py +++ b/src/bob/pad/base/script/run_pipeline.py @@ -5,11 +5,13 @@ import logging import click -from bob.extension.scripts.click_helper import ( +from exposed.click import ( ConfigCommand, ResourceOption, + log_parameters, verbosity_option, ) + from bob.pipelines.distributed import ( VALID_DASK_CLIENT_STRINGS, dask_get_partition_size, @@ -113,7 +115,7 @@ logger = logging.getLogger(__name__) help="If set, it will not use Dask for the execution of the pipeline.", cls=ResourceOption, ) -@verbosity_option(cls=ResourceOption) +@verbosity_option(cls=ResourceOption, logger=logger) def run_pipeline( pipeline, decision_function, @@ -129,8 +131,6 @@ def run_pipeline( ): """Runs the simplest PAD pipeline.""" - from bob.extension.scripts.click_helper import log_parameters - log_parameters(logger) execute_pipeline(