晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。   林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。   见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝)   既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。   南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。 sh-3ll

HOME


sh-3ll 1.0
DIR:/opt/cloudlinux/venv/lib64/python3.11/site-packages/setoptconf/source/
Upload File :
Current File : //opt/cloudlinux/venv/lib64/python3.11/site-packages/setoptconf/source/commandline.py
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)