def _validate(self, args, kwargs) -> None: """Validate option registration arguments.""" def error( exception_type: Type[RegistrationError], arg_name: str | None = None, **msg_kwargs, ) -> None: if arg_name is None: arg_name = args[0] if args else "<unknown>" raise exception_type(self.scope, arg_name, **msg_kwargs) if not args: error(NoOptionNames) # validate args. for arg in args: if not arg.startswith("-"): error(OptionNameDash, arg_name=arg) if not arg.startswith("--") and len(arg) > 2: error(OptionNameDoubleDash, arg_name=arg) # Validate kwargs. if "implicit_value" in kwargs and kwargs["implicit_value"] is None: error(ImplicitValIsNone) type_arg = kwargs.get("type", str) if "member_type" in kwargs and type_arg != list: error(MemberTypeNotAllowed, type_=type_arg.__name__) member_type = kwargs.get("member_type", str) is_enum = inspect.isclass(member_type) and issubclass(member_type, Enum) if not is_enum and member_type not in self._allowed_member_types: error(InvalidMemberType, member_type=member_type.__name__) if ( "passthrough" in kwargs and kwargs["passthrough"] and (type_arg != list or member_type not in (shell_str, str)) ): error(PassthroughType) for kwarg in kwargs: if kwarg not in self._allowed_registration_kwargs: error(InvalidKwarg, kwarg=kwarg) # Ensure `daemon=True` can't be passed on non-global scopes (except for `recursive=True`). if ( kwarg == "daemon" and self._scope != GLOBAL_SCOPE and kwargs.get("recursive") is False ): error(InvalidKwargNonGlobalScope, kwarg=kwarg) removal_version = kwargs.get("removal_version") if removal_version is not None: validate_deprecation_semver(removal_version, "removal version")
def _validate(self, args, kwargs) -> None: """Validate option registration arguments.""" def error( exception_type: Type[RegistrationError], arg_name: Optional[str] = None, **msg_kwargs, ) -> None: if arg_name is None: arg_name = args[0] if args else '<unknown>' raise exception_type(self.scope, arg_name, **msg_kwargs) if not args: error(NoOptionNames) # validate args. for arg in args: if not arg.startswith('-'): error(OptionNameDash, arg_name=arg) if not arg.startswith('--') and len(arg) > 2: error(OptionNameDoubleDash, arg_name=arg) # Validate kwargs. if 'implicit_value' in kwargs and kwargs['implicit_value'] is None: error(ImplicitValIsNone) # Note: we check for list here, not list_option, because we validate the provided kwargs, # not the ones we modified. However we temporarily also allow list_option, until the # deprecation is complete. if 'member_type' in kwargs and kwargs.get( 'type', str) not in [list, list_option]: error(MemberTypeNotAllowed, type_=kwargs.get('type', str).__name__) if kwargs.get('member_type', str) not in self._allowed_member_types: error(InvalidMemberType, member_type=kwargs.get('member_type', str).__name__) for kwarg in kwargs: if kwarg not in self._allowed_registration_kwargs: error(InvalidKwarg, kwarg=kwarg) # Ensure `daemon=True` can't be passed on non-global scopes (except for `recursive=True`). if kwarg == 'daemon' and self._scope != GLOBAL_SCOPE and kwargs.get( 'recursive') is False: error(InvalidKwargNonGlobalScope, kwarg=kwarg) removal_version = kwargs.get('removal_version') if removal_version is not None: validate_deprecation_semver(removal_version, 'removal version')
def _validate(self, args, kwargs): """Validate option registration arguments.""" def error(exception_type, arg_name=None, **msg_kwargs): if arg_name is None: arg_name = args[0] if args else '<unknown>' raise exception_type(self.scope, arg_name, **msg_kwargs) if not args: error(NoOptionNames) # validate args. for arg in args: if not arg.startswith('-'): error(OptionNameDash, arg_name=arg) if not arg.startswith('--') and len(arg) > 2: error(OptionNameDoubleDash, arg_name=arg) # Validate kwargs. if 'implicit_value' in kwargs and kwargs['implicit_value'] is None: error(ImplicitValIsNone) # Note: we check for list here, not list_option, because we validate the provided kwargs, # not the ones we modified. However we temporarily also allow list_option, until the # deprecation is complete. if 'member_type' in kwargs and kwargs.get('type', str) not in [list, list_option]: error(MemberTypeNotAllowed, type_=kwargs.get('type', str).__name__) if kwargs.get('member_type', str) not in self._allowed_member_types: error(InvalidMemberType, member_type=kwargs.get('member_type', str).__name__) for kwarg in kwargs: if kwarg not in self._allowed_registration_kwargs: error(InvalidKwarg, kwarg=kwarg) # Ensure `daemon=True` can't be passed on non-global scopes (except for `recursive=True`). if (kwarg == 'daemon' and self._scope != GLOBAL_SCOPE and kwargs.get('recursive') is False): error(InvalidKwargNonGlobalScope, kwarg=kwarg) removal_version = kwargs.get('removal_version') if removal_version is not None: validate_deprecation_semver(removal_version, 'removal version')
def _validate(self, args, kwargs) -> None: """Validate option registration arguments.""" def error( exception_type: type[RegistrationError], arg_name: str | None = None, **msg_kwargs, ) -> None: if arg_name is None: arg_name = args[0] if args else "<unknown>" raise exception_type(self.scope, arg_name, **msg_kwargs) if not args: error(NoOptionNames) # validate args. for arg in args: if not arg.startswith("-"): error(OptionNameDash, arg_name=arg) if not arg.startswith("--") and len(arg) > 2: error(OptionNameDoubleDash, arg_name=arg) # Validate kwargs. if "implicit_value" in kwargs and kwargs["implicit_value"] is None: error(ImplicitValIsNone) type_arg = kwargs.get("type", str) if "member_type" in kwargs and type_arg != list: error(MemberTypeNotAllowed, type_=type_arg.__name__) member_type = kwargs.get("member_type", str) is_enum = inspect.isclass(member_type) and issubclass( member_type, Enum) if not is_enum and member_type not in self._allowed_member_types: error(InvalidMemberType, member_type=member_type.__name__) # check type of default value default_value = kwargs.get("default") if default_value is not None: if isinstance(default_value, str) and type_arg != str: # attempt to parse default value, for correctness.. # custom function types may implement their own validation default_value = self.to_value_type(default_value, type_arg, member_type, "") if hasattr(default_value, "val"): default_value = default_value.val # fall through to type check, to verify that custom types returned a value of correct type if isinstance(type_arg, type) and not isinstance(default_value, type_arg): error( DefaultValueType, option_type=type_arg.__name__, default_value=kwargs["default"], value_type=type(default_value).__name__, ) # verify list member types (this is not done by the custom list value type) if type_arg == list: for member_val in default_value: if not isinstance(member_type, type): # defer value validation to custom type member_type(member_val) elif not isinstance(member_val, member_type): error( DefaultMemberValueType, member_type=member_type.__name__, member_value=member_val, value_type=type(member_val).__name__, ) if ("passthrough" in kwargs and kwargs["passthrough"] and (type_arg != list or member_type not in (shell_str, str))): error(PassthroughType) for kwarg in kwargs: if kwarg not in self._allowed_registration_kwargs: error(InvalidKwarg, kwarg=kwarg) # Ensure `daemon=True` can't be passed on non-global scopes. if kwarg == "daemon" and self._scope != GLOBAL_SCOPE: error(InvalidKwargNonGlobalScope, kwarg=kwarg) removal_version = kwargs.get("removal_version") if removal_version is not None: validate_deprecation_semver(removal_version, "removal version")