/usr/lib/python3/dist-packages/setoptconf/source/commandline.py is in python3-setoptconf 0.2.0-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 | import argparse
import shlex
import sys
from copy import deepcopy
from ..config import Configuration
from ..setting import BooleanSetting, ChoiceSetting, ListSetting
from .base import Source
__all__ = (
'CommandLineSource',
)
# pylint: disable=R0201
class CommandLineSource(Source):
# pylint: disable=R0913
def __init__(
self,
arguments=None,
options=None,
version=None,
parser_options=None,
positional=None):
super(CommandLineSource, self).__init__()
if arguments is None:
self.arguments = sys.argv[1:]
elif isinstance(arguments, str):
self.arguments = shlex.split(arguments)
elif isinstance(arguments, (list, tuple)):
self.arguments = arguments
else:
raise TypeError('arguments must be a string or list of strings')
self.version = version
self.options = options or {}
self.parser_options = parser_options or {}
self.positional = positional or ()
def get_flags(self, setting):
if setting.name in self.options:
if 'flags' in self.options[setting.name]:
return self.options[setting.name]['flags']
flags = []
flag = '--%s' % setting.name.lower().replace('_', '-')
flags.append(flag)
return flags
def get_action(self, setting):
if isinstance(setting, BooleanSetting):
return 'store_false' if setting.default else 'store_true'
elif isinstance(setting, ListSetting):
return 'append'
else:
return 'store'
# pylint: disable=W0613
def get_default(self, setting):
# Caveat: Returning something other than SUPPRESS probably won't
# work the way you'd think.
return argparse.SUPPRESS
def get_type(self, setting):
if isinstance(setting, (ListSetting, BooleanSetting)):
return None
elif isinstance(setting, ChoiceSetting):
return setting.subtype.sanitize
else:
return setting.sanitize
def get_dest(self, setting):
return setting.name
def get_choices(self, setting):
if isinstance(setting, ChoiceSetting):
return setting.choices
else:
return None
def get_help(self, setting):
if setting.name in self.options:
if 'help' in self.options[setting.name]:
return self.options[setting.name]['help']
return None
def get_metavar(self, setting):
if setting.name in self.options:
if 'metavar' in self.options[setting.name]:
return self.options[setting.name]['metavar']
return None
def build_argument(self, setting):
flags = self.get_flags(setting)
action = self.get_action(setting)
default = self.get_default(setting)
argtype = self.get_type(setting)
dest = self.get_dest(setting)
choices = self.get_choices(setting)
arghelp = self.get_help(setting)
metavar = self.get_metavar(setting)
argument_kwargs = {
'action': action,
'default': default,
'dest': dest,
'help': arghelp,
}
if argtype:
argument_kwargs['type'] = argtype
if choices:
argument_kwargs['choices'] = choices
if metavar:
argument_kwargs['metavar'] = metavar
return flags, argument_kwargs
def build_parser(self, settings, manager):
parser_options = deepcopy(self.parser_options)
if not parser_options.get('prog') and manager:
parser_options['prog'] = manager.name
parser = argparse.ArgumentParser(**parser_options)
add_version = (self.version is not None)
for setting in settings:
flags, argument_kwargs = self.build_argument(setting)
parser.add_argument(*flags, **argument_kwargs)
if add_version and setting.name == 'version':
# Don't want to conflict with the desired setting
add_version = False
if add_version:
parser.add_argument(
'--version',
action='version',
version='%(prog)s ' + self.version,
)
if self.positional:
for name, options in self.positional:
parser.add_argument(name, **options)
return parser
def get_config(self, settings, manager=None, parent=None):
parser = self.build_parser(settings, manager)
parsed = parser.parse_args(self.arguments)
for setting in settings:
if hasattr(parsed, setting.name):
setting.value = getattr(parsed, setting.name)
if self.positional and manager:
arguments = {}
for name, _ in self.positional:
if hasattr(parsed, name):
arguments[name] = getattr(parsed, name)
setattr(manager, 'arguments', arguments)
return Configuration(settings=settings, parent=parent)
|