move native validators into single file

This commit is contained in:
jbannon 2022-04-03 08:36:02 +00:00
parent 319cf1a3bb
commit 775342f0cf
11 changed files with 57 additions and 71 deletions

View file

@ -1,11 +0,0 @@
from typing import Any
from typing import Optional
from typing import Type
from ytdl_subscribe.validators.base.validator import Validator
from ytdl_subscribe.validators.exceptions import ValidationException
class BoolValidator(Validator):
expected_value_type: Type = bool
expected_value_type_name = "boolean"

View file

@ -5,7 +5,7 @@ from typing import Set
from typing import Type from typing import Type
from typing import TypeVar from typing import TypeVar
from ytdl_subscribe.validators.base.validator import Validator from ytdl_subscribe.validators.base.validators import Validator
from ytdl_subscribe.validators.exceptions import ValidationException from ytdl_subscribe.validators.exceptions import ValidationException
T = TypeVar("T", bound=Validator) T = TypeVar("T", bound=Validator)
@ -35,7 +35,7 @@ class DictValidator(Validator):
# If no extra fields are allowed, ensure all fields are either # If no extra fields are allowed, ensure all fields are either
# required or optional fields # required or optional fields
if not self._allow_extra_fields: if not self._allow_extra_fields:
for object_key in self.object_keys: for object_key in self.keys:
if object_key not in self.allowed_fields: if object_key not in self.allowed_fields:
error_msg = ( error_msg = (
f"'{self.name}' contains the field '{object_key}' which is not allowed. " f"'{self.name}' contains the field '{object_key}' which is not allowed. "
@ -43,18 +43,18 @@ class DictValidator(Validator):
) )
raise ValidationException(error_msg) raise ValidationException(error_msg)
def validate_dict_value( def validate_key(
self, dict_value_name: str, validator: Type[T], default: Optional[Any] = None self, key: str, validator: Type[T], default: Optional[Any] = None
) -> T: ) -> T:
value = self.get(object_key=dict_value_name, default=default) value = self.get(key=key, default=default)
if value is None: if value is None:
raise self._validation_exception( raise self._validation_exception(
f"{dict_value_name} is missing when it should be present." f"{key} is missing when it should be present."
) )
return validator( return validator(
name=f"{self.name}.{dict_value_name}", name=f"{self.name}.{key}",
value=self.get(object_key=dict_value_name, default=default), value=self.get(key=key, default=default),
) )
@property @property
@ -66,15 +66,11 @@ class DictValidator(Validator):
return sorted(self.required_fields.union(self.optional_fields)) return sorted(self.required_fields.union(self.optional_fields))
@property @property
def object_keys(self): def keys(self):
return sorted(list(self.dict.keys())) return sorted(list(self.dict.keys()))
@property def get(self, key: str, default: Optional[Any] = None) -> Any:
def object_items(self): return self.dict.get(key, default)
return self.dict.items()
def get(self, object_key: str, default: Optional[Any] = None) -> Any:
return self.dict.get(object_key, default)
class DictWithExtraFieldsValidator(DictValidator): class DictWithExtraFieldsValidator(DictValidator):

View file

@ -2,7 +2,7 @@ import re
from keyword import iskeyword from keyword import iskeyword
from typing import List from typing import List
from ytdl_subscribe.validators.base.string_validator import StringValidator from ytdl_subscribe.validators.base.validators import StringValidator
class StringFormatterValidator(StringValidator): class StringFormatterValidator(StringValidator):

View file

@ -1,15 +0,0 @@
from typing import Any
from typing import Optional
from typing import Type
from ytdl_subscribe.validators.base.validator import Validator
from ytdl_subscribe.validators.exceptions import ValidationException
class StringValidator(Validator):
expected_value_type: Type = str
expected_value_type_name = "string"
@property
def value(self) -> str:
return self._value

View file

@ -39,3 +39,21 @@ class Validator:
def _validation_exception(self, error_message: str): def _validation_exception(self, error_message: str):
prefix = f"Validation error in {self.name}: " prefix = f"Validation error in {self.name}: "
return ValidationException(f"{prefix}{error_message}") return ValidationException(f"{prefix}{error_message}")
class BoolValidator(Validator):
expected_value_type: Type = bool
expected_value_type_name = "boolean"
@property
def value(self) -> bool:
return self._value
class StringValidator(Validator):
expected_value_type: Type = str
expected_value_type_name = "string"
@property
def value(self) -> str:
return self._value

View file

@ -4,7 +4,7 @@ import yaml
from ytdl_subscribe.validators.base.dict_validator import DictValidator from ytdl_subscribe.validators.base.dict_validator import DictValidator
from ytdl_subscribe.validators.base.dict_validator import DictWithExtraFieldsValidator from ytdl_subscribe.validators.base.dict_validator import DictWithExtraFieldsValidator
from ytdl_subscribe.validators.base.string_validator import StringValidator from ytdl_subscribe.validators.base.validators import StringValidator
class ConfigValidator(DictValidator): class ConfigValidator(DictValidator):
@ -12,10 +12,8 @@ class ConfigValidator(DictValidator):
def __init__(self, name: str, value: Any): def __init__(self, name: str, value: Any):
super().__init__(name, value) super().__init__(name, value)
self.working_directory = self.validate_dict_value( self.working_directory = self.validate_key("working_directory", StringValidator)
"working_directory", StringValidator self.presets = self.validate_key("presets", DictWithExtraFieldsValidator)
)
self.presets = self.validate_dict_value("presets", DictWithExtraFieldsValidator)
@classmethod @classmethod
def from_file_path(cls, config_path) -> "ConfigValidator": def from_file_path(cls, config_path) -> "ConfigValidator":

View file

@ -27,22 +27,22 @@ class PresetValidator(DictValidator):
self.subscription_source: Optional[SourceValidator] = None self.subscription_source: Optional[SourceValidator] = None
self.subscription_source_name: Optional[str] = None self.subscription_source_name: Optional[str] = None
for object_key, object_value in self.object_items: for key, val in self.dict.items():
if object_key in SubscriptionSourceName.all() and self.subscription_source: if key in SubscriptionSourceName.all() and self.subscription_source:
raise ValidationException( raise ValidationException(
f"'{self.name}' can only have one of the following sources: {SubscriptionSourceName.pretty_all()}" f"'{self.name}' can only have one of the following sources: {SubscriptionSourceName.pretty_all()}"
) )
if object_key == SubscriptionSourceName.SOUNDCLOUD: if key == SubscriptionSourceName.SOUNDCLOUD:
self.subscription_source_name = SubscriptionSourceName.SOUNDCLOUD self.subscription_source_name = SubscriptionSourceName.SOUNDCLOUD
self.subscription_source = self.validate_dict_value( self.subscription_source = self.validate_key(
dict_value_name=object_key, key=key,
validator=SoundcloudSourceValidator, validator=SoundcloudSourceValidator,
) )
elif object_key == SubscriptionSourceName.YOUTUBE: elif key == SubscriptionSourceName.YOUTUBE:
self.subscription_source_name = SubscriptionSourceName.YOUTUBE self.subscription_source_name = SubscriptionSourceName.YOUTUBE
self.subscription_source = self.validate_dict_value( self.subscription_source = self.validate_key(
dict_value_name=object_key, key=key,
validator=YoutubeSourceValidator, validator=YoutubeSourceValidator,
) )

View file

@ -1,5 +1,5 @@
from ytdl_subscribe.validators.base.bool_validator import BoolValidator from ytdl_subscribe.validators.base.validators import BoolValidator
from ytdl_subscribe.validators.base.string_validator import StringValidator from ytdl_subscribe.validators.base.validators import StringValidator
from ytdl_subscribe.validators.config.sources.source_validator import ( from ytdl_subscribe.validators.config.sources.source_validator import (
DownloadStrategyValidator, DownloadStrategyValidator,
) )
@ -11,8 +11,8 @@ class SoundcloudAlbumsAndSinglesDownloadValidator(DownloadStrategyValidator):
def __init__(self, name, value): def __init__(self, name, value):
super().__init__(name, value) super().__init__(name, value)
self.username = self.validate_dict_value( self.username = self.validate_key(
dict_value_name="username", validator=StringValidator key="username", validator=StringValidator
).value ).value
@ -25,6 +25,6 @@ class SoundcloudSourceValidator(SourceValidator):
def __init__(self, name: str, value: dict): def __init__(self, name: str, value: dict):
super().__init__(name=name, value=value) super().__init__(name=name, value=value)
self.skip_premiere_tracks = self.validate_dict_value( self.skip_premiere_tracks = self.validate_key(
"skip_premiere_tracks", BoolValidator, default=True "skip_premiere_tracks", BoolValidator, default=True
).value ).value

View file

@ -5,7 +5,7 @@ from typing import Type
from ytdl_subscribe.validators.base.dict_validator import DictValidator from ytdl_subscribe.validators.base.dict_validator import DictValidator
from ytdl_subscribe.validators.base.dict_validator import DictWithExtraFieldsValidator from ytdl_subscribe.validators.base.dict_validator import DictWithExtraFieldsValidator
from ytdl_subscribe.validators.base.string_validator import StringValidator from ytdl_subscribe.validators.base.validators import StringValidator
class DownloadStrategyValidator(DictValidator): class DownloadStrategyValidator(DictValidator):
@ -20,8 +20,8 @@ class SourceValidator(DictWithExtraFieldsValidator):
def __init__(self, name: str, value: Any): def __init__(self, name: str, value: Any):
super().__init__(name=name, value=value) super().__init__(name=name, value=value)
self.download_strategy_name = self.validate_dict_value( self.download_strategy_name = self.validate_key(
dict_value_name="download_strategy", key="download_strategy",
validator=StringValidator, validator=StringValidator,
).value ).value

View file

@ -1,6 +1,6 @@
from typing import Any from typing import Any
from ytdl_subscribe.validators.base.string_validator import StringValidator from ytdl_subscribe.validators.base.validators import StringValidator
from ytdl_subscribe.validators.config.sources.source_validator import ( from ytdl_subscribe.validators.config.sources.source_validator import (
DownloadStrategyValidator, DownloadStrategyValidator,
) )
@ -12,7 +12,7 @@ class YoutubePlaylistDownloadValidator(DownloadStrategyValidator):
def __init__(self, name, value): def __init__(self, name, value):
super().__init__(name, value) super().__init__(name, value)
self.playlist_id = self.validate_dict_value("playlist_id", StringValidator) self.playlist_id = self.validate_key("playlist_id", StringValidator)
class YoutubeSourceValidator(SourceValidator): class YoutubeSourceValidator(SourceValidator):

View file

@ -10,7 +10,7 @@ from ytdl_subscribe.subscriptions.youtube import YoutubeSubscription
from ytdl_subscribe.utils.enums import SubscriptionSourceName from ytdl_subscribe.utils.enums import SubscriptionSourceName
from ytdl_subscribe.validators.base.dict_validator import DictValidator from ytdl_subscribe.validators.base.dict_validator import DictValidator
from ytdl_subscribe.validators.base.dict_validator import DictWithExtraFieldsValidator from ytdl_subscribe.validators.base.dict_validator import DictWithExtraFieldsValidator
from ytdl_subscribe.validators.base.string_validator import StringValidator from ytdl_subscribe.validators.base.validators import StringValidator
from ytdl_subscribe.validators.config.config_validator import ConfigValidator from ytdl_subscribe.validators.config.config_validator import ConfigValidator
from ytdl_subscribe.validators.config.preset_validator import PresetValidator from ytdl_subscribe.validators.config.preset_validator import PresetValidator
@ -28,18 +28,18 @@ class SubscriptionValidator(DictValidator):
def __init__(self, config: ConfigValidator, name: str, value: Any): def __init__(self, config: ConfigValidator, name: str, value: Any):
super().__init__(name, value) super().__init__(name, value)
self.config = config self.config = config
self.overrides = self.validate_dict_value( self.overrides = self.validate_key(
dict_value_name="overrides", key="overrides",
validator=DictWithExtraFieldsValidator, validator=DictWithExtraFieldsValidator,
default={}, default={},
) )
preset_name = self.validate_dict_value( preset_name = self.validate_key(
dict_value_name="preset", key="preset",
validator=StringValidator, validator=StringValidator,
).value ).value
available_presets = self.config.presets.object_keys available_presets = self.config.presets.keys
if preset_name not in available_presets: if preset_name not in available_presets:
raise self._validation_exception( raise self._validation_exception(
f"'preset '{preset_name}' does not exist in the provided config. " f"'preset '{preset_name}' does not exist in the provided config. "