]> jfr.im git - yt-dlp.git/blame - devscripts/lazy_load_template.py
[devscripts] `make_changelog`: Stop at `Release ...` commit
[yt-dlp.git] / devscripts / lazy_load_template.py
CommitLineData
82d02080 1import importlib
2import random
779822d9
JMF
3import re
4
24146491 5from ..utils import (
6 age_restricted,
7 bug_reports_message,
8 classproperty,
9 write_string,
10)
e6f21b3d 11
8f97a15d 12# These bloat the lazy_extractors, so allow them to passthrough silently
6368e2e6 13ALLOWED_CLASSMETHODS = {'extract_from_webpage', 'get_testcases', 'get_webpage_testcases'}
e5458d1d 14_WARNED = False
8f97a15d 15
779822d9 16
5bc4a65e 17class LazyLoadMetaClass(type):
18 def __getattr__(cls, name):
e5458d1d 19 global _WARNED
20 if ('_real_class' not in cls.__dict__
21 and name not in ALLOWED_CLASSMETHODS and not _WARNED):
22 _WARNED = True
23 write_string('WARNING: Falling back to normal extractor since lazy extractor '
24 f'{cls.__name__} does not have attribute {name}{bug_reports_message()}\n')
82d02080 25 return getattr(cls.real_class, name)
5bc4a65e 26
27
28class LazyLoadExtractor(metaclass=LazyLoadMetaClass):
82d02080 29 @classproperty
30 def real_class(cls):
e6f21b3d 31 if '_real_class' not in cls.__dict__:
82d02080 32 cls._real_class = getattr(importlib.import_module(cls._module), cls.__name__)
e6f21b3d 33 return cls._real_class
5bc4a65e 34
8a5dc1c1 35 def __new__(cls, *args, **kwargs):
82d02080 36 instance = cls.real_class.__new__(cls.real_class)
8a5dc1c1
JMF
37 instance.__init__(*args, **kwargs)
38 return instance