Coverage for python/lsst/daf/butler/cli/opt/options.py : 59%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# This file is part of daf_butler.
2#
3# Developed for the LSST Data Management System.
4# This product includes software developed by the LSST Project
5# (http://www.lsst.org).
6# See the COPYRIGHT file at the top-level directory of this distribution
7# for details of code ownership.
8#
9# This program is free software: you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation, either version 3 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program. If not, see <http://www.gnu.org/licenses/>.
23import click
24from functools import partial
26from ..utils import MWOptionDecorator, split_commas, split_kv, unwrap, yaml_presets
27from lsst.daf.butler.registry import CollectionType
30class CollectionTypeCallback:
32 collectionTypes = CollectionType.__members__.keys()
34 @staticmethod
35 def makeCollectionTypes(context, param, value):
36 if not value:
37 # Click seems to demand that the default be an empty tuple, rather
38 # than a sentinal like None. The behavior that we want is that
39 # not passing this option at all passes all collection types, while
40 # passing it uses only the passed collection types. That works
41 # fine for now, since there's no command-line option to subtract
42 # collection types, and hence the only way to get an empty tuple
43 # is as the default.
44 return tuple(CollectionType.all())
45 result = []
46 for item in split_commas(context, param, value):
47 item = item.upper()
48 try:
49 result.append(CollectionType.__members__[item])
50 except KeyError:
51 raise KeyError(f"{item} is not a valid CollectionType.") from None
52 return tuple(result)
55collection_type_option = MWOptionDecorator("--collection-type",
56 callback=CollectionTypeCallback.makeCollectionTypes,
57 multiple=True,
58 help="If provided, only list collections of this type.",
59 type=click.Choice(CollectionTypeCallback.collectionTypes,
60 case_sensitive=False))
62config_option = MWOptionDecorator("-c", "--config",
63 callback=split_kv,
64 help="Config override, as a key-value pair.",
65 multiple=True)
68config_file_option = MWOptionDecorator("-C", "--config-file",
69 help=unwrap("""Path to a pex config override to be included after the
70 Instrument config overrides are applied."""))
73dataset_type_option = MWOptionDecorator("-d", "--dataset-type",
74 callback=split_commas,
75 help="Specific DatasetType(s) to validate.",
76 multiple=True)
79logLevelChoices = ["CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"]
80log_level_option = MWOptionDecorator("--log-level",
81 callback=partial(split_kv,
82 choice=click.Choice(logLevelChoices,
83 case_sensitive=False),
84 normalize=True,
85 unseparated_okay=True),
86 help="The logging level. "
87 f"Supported levels are [{'|'.join(logLevelChoices)}]",
88 is_eager=True,
89 metavar="LEVEL|COMPONENT=LEVEL",
90 multiple=True)
93long_log_option = MWOptionDecorator("--long-log",
94 help="Make log messages appear in long format.",
95 is_flag=True)
98processes_option = MWOptionDecorator("-j", "--processes",
99 default=1,
100 help="Number of processes to use.",
101 type=click.IntRange(min=1))
104regex_option = MWOptionDecorator("--regex")
107run_option = MWOptionDecorator("--output-run",
108 help="The name of the run datasets should be output to.")
111transfer_option = MWOptionDecorator("-t", "--transfer",
112 default="auto", # set to `None` if using `required=True`
113 help="The external data transfer mode.",
114 type=click.Choice(["auto", "link", "symlink", "hardlink", "copy", "move",
115 "relsymlink"],
116 case_sensitive=False))
119verbose_option = MWOptionDecorator("-v", "--verbose",
120 help="Increase verbosity.",
121 is_flag=True)
124options_file_option = MWOptionDecorator("--options-file", "-@",
125 expose_value=False, # This option should not be forwarded
126 help=unwrap("""URI to YAML file containing overrides
127 of command line options. The YAML should be organized
128 as a hierarchy with subcommand names at the top
129 level options for that subcommand below."""),
130 callback=yaml_presets)