97 lines
2.6 KiB
Python
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()
|