Hide keyboard shortcuts

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/>. 

21 

22 

23import click 

24from functools import partial 

25 

26from ..utils import MWOptionDecorator, split_commas, split_kv, unwrap, yaml_presets 

27from lsst.daf.butler.registry import CollectionType 

28 

29 

30class CollectionTypeCallback: 

31 

32 collectionTypes = CollectionType.__members__.keys() 

33 

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) 

53 

54 

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)) 

61 

62config_option = MWOptionDecorator("-c", "--config", 

63 callback=split_kv, 

64 help="Config override, as a key-value pair.", 

65 multiple=True) 

66 

67 

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.""")) 

71 

72 

73dataset_type_option = MWOptionDecorator("-d", "--dataset-type", 

74 callback=split_commas, 

75 help="Specific DatasetType(s) to validate.", 

76 multiple=True) 

77 

78 

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) 

91 

92 

93long_log_option = MWOptionDecorator("--long-log", 

94 help="Make log messages appear in long format.", 

95 is_flag=True) 

96 

97 

98processes_option = MWOptionDecorator("-j", "--processes", 

99 default=1, 

100 help="Number of processes to use.", 

101 type=click.IntRange(min=1)) 

102 

103 

104regex_option = MWOptionDecorator("--regex") 

105 

106 

107run_option = MWOptionDecorator("--output-run", 

108 help="The name of the run datasets should be output to.") 

109 

110 

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)) 

117 

118 

119verbose_option = MWOptionDecorator("-v", "--verbose", 

120 help="Increase verbosity.", 

121 is_flag=True) 

122 

123 

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)