music-kraken-core/music_kraken/objects/lint_default_factories.py
2024-04-09 10:32:17 +02:00

97 lines
2.6 KiB
Python

from typing import List, TypeVar, Type
from .country import Language
from .lyrics import Lyrics
from .parents import OuterProxy
from .song import Song, Album, Artist, Label
from .source import Source
from .target import Target
T = TypeVar('T', bound=OuterProxy)
ALL_CLASSES: List[Type[T]] = [Song, Album, Artist, Label, Source, Target, Lyrics]
def print_lint_res(missing_values: dict):
print("_default_factories = {")
for key, value in missing_values.items():
print(f'\t"{key}": {value},')
print("}")
# def __init__(self, foo: str, bar) -> None: ...
def lint_type(cls: T):
all_values: dict = {}
missing_values: dict = {}
for key, value in cls.__annotations__.items():
if value is None:
continue
if (not key.islower()) or key.startswith("_") or (key.startswith("__") and key.endswith("__")):
continue
if key in cls._default_factories:
continue
factory = "lambda: None"
if isinstance(value, str):
if value == "SourceCollection":
factory = "SourceCollection"
elif "collection" in value.lower():
factory = "Collection"
elif value.istitle():
factory = value
else:
if value is Language:
factory = 'Language.by_alpha_2("en")'
else:
try:
value()
factory = value.__name__
except TypeError:
pass
missing_values[key] = factory
if len(missing_values) > 0:
print(f"{cls.__name__}:")
print_lint_res(missing_values)
print()
else:
print(f"Everything is fine at {cls.__name__}")
p = []
s = []
for key, value in cls.__annotations__.items():
has_default = key in cls._default_factories
if not isinstance(value, str):
value = value.__name__
if key.endswith("_collection"):
key = key.replace("_collection", "_list")
if isinstance(value, str):
if value.startswith("Collection[") and value.endswith("]"):
value = value.replace("Collection", "List")
if isinstance(value, str) and has_default:
value = value + " = None"
p.append(f'{key}: {value}')
s.append(f'{key}={key}')
p.append("**kwargs")
s.append("**kwargs")
print("# This is automatically generated")
print(f"def __init__(self, {', '.join(p)}) -> None:")
print(f"\tsuper().__init__({', '.join(s)})")
print()
def lint():
for i in ALL_CLASSES:
lint_type(i)
print()