validators!

This commit is contained in:
jbannon 2022-04-04 06:23:43 +00:00
parent 9d8bf31f73
commit 54d35dce0e
9 changed files with 110 additions and 27 deletions

View file

@ -2,6 +2,7 @@ import re
from keyword import iskeyword
from typing import List
from ytdl_subscribe.validators.base.validators import DictValidator
from ytdl_subscribe.validators.base.validators import StringValidator
@ -65,3 +66,15 @@ class StringFormatterValidator(StringValidator):
The literal format string, unformatted.
"""
return self._value
class DictFormatterValidator(DictValidator):
"""
Validates a dictionary made up of key: string_formatters
"""
def __init__(self, name, value):
super().__init__(name, value)
for key in self.keys:
_ = self.validate_key(key=key, validator=StringFormatterValidator)

View file

@ -123,7 +123,10 @@ class DictValidator(Validator):
return sorted(list(self.dict.keys()))
def validate_key(
self, key: str, validator: Type[T], default: Optional[Any] = None
self,
key: str,
validator: Type[T],
default: Optional[Any] = None,
) -> T:
"""
Parameters
@ -149,3 +152,14 @@ class DictValidator(Validator):
name=f"{self.name}.{key}",
value=value,
)
def validate_key_if_present(
self,
key: str,
validator: Type[T],
default: Optional[Any] = None,
) -> Optional[T]:
if key not in self.dict:
return None
return self.validate_key(key=key, validator=validator, default=default)

View file

@ -0,0 +1,27 @@
from ytdl_subscribe.validators.base.strict_dict_validator import StrictDictValidator
from ytdl_subscribe.validators.base.string_formatter_validator import (
DictFormatterValidator,
)
from ytdl_subscribe.validators.base.string_select_validator import StringSelectValidator
from ytdl_subscribe.validators.base.validators import StringValidator
class Id3VersionValidator(StringSelectValidator):
select_values = {"2.3", "2.4"}
class Id3Validator(StrictDictValidator):
required_keys = {"id3_version", "tags"}
optional_keys = {"multi_value_separator"}
def __init__(self, name, value):
super().__init__(name, value)
self.id3_version = self.validate_key(
key="id3_version", validator=Id3VersionValidator
).value
self.tags = self.validate_key(key="tags", validator=DictFormatterValidator)
self.multi_value_separator = self.validate_key_if_present(
key="multi_value_separator", validator=StringValidator
)

View file

@ -4,7 +4,8 @@ from ytdl_subscribe.validators.base.strict_dict_validator import StrictDictValid
from ytdl_subscribe.validators.base.string_formatter_validator import (
StringFormatterValidator,
)
from ytdl_subscribe.validators.base.string_select_validator import StringSelectValidator
from ytdl_subscribe.validators.config.metadata_options.id3_validator import Id3Validator
from ytdl_subscribe.validators.config.metadata_options.nfo_validator import NFOValidator
class MetadataOptionsValidator(StrictDictValidator):
@ -13,6 +14,9 @@ class MetadataOptionsValidator(StrictDictValidator):
def __init__(self, name, value):
super().__init__(name, value)
self.id3 = self.validate_key_if_present(key="id3", validator=Id3Validator)
self.nfo = self.validate_key_if_present(key="nfo", validator=NFOValidator)
self.output_directory: StringFormatterValidator = self.validate_key(
key="output_directory", validator=StringFormatterValidator
)
@ -20,15 +24,3 @@ class MetadataOptionsValidator(StrictDictValidator):
self.file_name: StringFormatterValidator = self.validate_key(
key="file_name", validator=StringFormatterValidator
)
self.convert_thumbnail: Optional[str] = None
if "convert_thumbnail" in self.dict:
self.convert_thumbnail = self.validate_key(
key="convert_thumbnail", validator=ConvertThumbnailValidator
).value
self.thumbnail_name: Optional[StringFormatterValidator] = None
if "thumbnail_name" in self.dict:
self.thumbnail_name = self.validate_key(
key="thumbnail_name", validator=StringFormatterValidator
)

View file

@ -0,0 +1,24 @@
from ytdl_subscribe.validators.base.strict_dict_validator import StrictDictValidator
from ytdl_subscribe.validators.base.string_formatter_validator import (
DictFormatterValidator,
)
from ytdl_subscribe.validators.base.string_formatter_validator import (
StringFormatterValidator,
)
from ytdl_subscribe.validators.base.string_select_validator import StringSelectValidator
from ytdl_subscribe.validators.base.validators import StringValidator
class NFOValidator(StrictDictValidator):
required_keys = {"nfo_name", "nfo_root", "tags"}
def __init__(self, name, value):
super().__init__(name, value)
self.nfo_name = self.validate_key(
key="nfo_name", validator=StringFormatterValidator
)
self.nfo_root = self.validate_key(
key="nfo_root", validator=StringFormatterValidator
)
self.tags = self.validate_key(key="tags", validator=DictFormatterValidator)

View file

@ -21,19 +21,13 @@ class OutputOptionsValidator(StrictDictValidator):
self.output_directory: StringFormatterValidator = self.validate_key(
key="output_directory", validator=StringFormatterValidator
)
self.file_name: StringFormatterValidator = self.validate_key(
key="file_name", validator=StringFormatterValidator
)
self.convert_thumbnail: Optional[str] = None
if "convert_thumbnail" in self.dict:
self.convert_thumbnail = self.validate_key(
key="convert_thumbnail", validator=ConvertThumbnailValidator
).value
self.thumbnail_name: Optional[StringFormatterValidator] = None
if "thumbnail_name" in self.dict:
self.thumbnail_name = self.validate_key(
key="thumbnail_name", validator=StringFormatterValidator
)
self.convert_thumbnail = self.validate_key_if_present(
key="convert_thumbnail", validator=ConvertThumbnailValidator
)
self.thumbnail_name = self.validate_key_if_present(
key="thumbnail_name", validator=StringFormatterValidator
)

View file

@ -4,7 +4,14 @@ from typing import Tuple
from ytdl_subscribe.utils.enums import SubscriptionSourceName
from ytdl_subscribe.validators.base.strict_dict_validator import StrictDictValidator
from ytdl_subscribe.validators.config.output_options_validator import (
from ytdl_subscribe.validators.base.string_formatter_validator import (
DictFormatterValidator,
)
from ytdl_subscribe.validators.base.validators import DictValidator
from ytdl_subscribe.validators.config.metadata_options.metadata_options_validator import (
MetadataOptionsValidator,
)
from ytdl_subscribe.validators.config.output_options.output_options_validator import (
OutputOptionsValidator,
)
from ytdl_subscribe.validators.config.sources.soundcloud_validators import (
@ -62,7 +69,19 @@ class PresetValidator(StrictDictValidator):
self.subscription_source_name,
self.subscription_source,
) = self.__validate_and_get_subscription_source()
self.output_options = self.validate_key(
key="output_options",
validator=OutputOptionsValidator,
)
self.metadata_options = self.validate_key(
key="metadata_options", validator=MetadataOptionsValidator
)
self.ytdl_options = self.validate_key_if_present(
key="ytdl_options", validator=DictValidator
)
self.overrides = self.validate_key_if_present(
key="overrides", validator=DictFormatterValidator
)