diff --git a/build/FactorioSync/Analysis-00.toc b/build/FactorioSync/Analysis-00.toc deleted file mode 100644 index 482f8b4..0000000 --- a/build/FactorioSync/Analysis-00.toc +++ /dev/null @@ -1,2428 +0,0 @@ -(['/home/borderban/Рабочий стол/client-py/client.py'], - ['/home/borderban/Рабочий стол/client-py'], - [], - [('/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks', - -1000), - ('/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib', - -1000)], - {}, - [], - [], - False, - {}, - 0, - [], - [], - '3.12.3 (main, Mar 3 2026, 12:15:18) [GCC 13.3.0]', - [('pyi_rth_inspect', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_inspect.py', - 'PYSOURCE'), - ('pyi_rth__tkinter', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth__tkinter.py', - 'PYSOURCE'), - ('pyi_rth_setuptools', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_setuptools.py', - 'PYSOURCE'), - ('pyi_rth_pkgutil', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgutil.py', - 'PYSOURCE'), - ('pyi_rth_multiprocessing', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_multiprocessing.py', - 'PYSOURCE'), - ('client', '/home/borderban/Рабочий стол/client-py/client.py', 'PYSOURCE')], - [('subprocess', '/usr/lib/python3.12/subprocess.py', 'PYMODULE'), - ('selectors', '/usr/lib/python3.12/selectors.py', 'PYMODULE'), - ('contextlib', '/usr/lib/python3.12/contextlib.py', 'PYMODULE'), - ('signal', '/usr/lib/python3.12/signal.py', 'PYMODULE'), - ('_strptime', '/usr/lib/python3.12/_strptime.py', 'PYMODULE'), - ('datetime', '/usr/lib/python3.12/datetime.py', 'PYMODULE'), - ('_pydatetime', '/usr/lib/python3.12/_pydatetime.py', 'PYMODULE'), - ('calendar', '/usr/lib/python3.12/calendar.py', 'PYMODULE'), - ('argparse', '/usr/lib/python3.12/argparse.py', 'PYMODULE'), - ('textwrap', '/usr/lib/python3.12/textwrap.py', 'PYMODULE'), - ('shutil', '/usr/lib/python3.12/shutil.py', 'PYMODULE'), - ('zipfile', '/usr/lib/python3.12/zipfile/__init__.py', 'PYMODULE'), - ('zipfile._path', - '/usr/lib/python3.12/zipfile/_path/__init__.py', - 'PYMODULE'), - ('zipfile._path.glob', - '/usr/lib/python3.12/zipfile/_path/glob.py', - 'PYMODULE'), - ('py_compile', '/usr/lib/python3.12/py_compile.py', 'PYMODULE'), - ('importlib.machinery', - '/usr/lib/python3.12/importlib/machinery.py', - 'PYMODULE'), - ('importlib', '/usr/lib/python3.12/importlib/__init__.py', 'PYMODULE'), - ('importlib._bootstrap', - '/usr/lib/python3.12/importlib/_bootstrap.py', - 'PYMODULE'), - ('importlib._bootstrap_external', - '/usr/lib/python3.12/importlib/_bootstrap_external.py', - 'PYMODULE'), - ('importlib.metadata', - '/usr/lib/python3.12/importlib/metadata/__init__.py', - 'PYMODULE'), - ('typing', '/usr/lib/python3.12/typing.py', 'PYMODULE'), - ('importlib.abc', '/usr/lib/python3.12/importlib/abc.py', 'PYMODULE'), - ('importlib.resources.abc', - '/usr/lib/python3.12/importlib/resources/abc.py', - 'PYMODULE'), - ('importlib.resources', - '/usr/lib/python3.12/importlib/resources/__init__.py', - 'PYMODULE'), - ('importlib.resources._legacy', - '/usr/lib/python3.12/importlib/resources/_legacy.py', - 'PYMODULE'), - ('importlib.resources._common', - '/usr/lib/python3.12/importlib/resources/_common.py', - 'PYMODULE'), - ('importlib.resources._adapters', - '/usr/lib/python3.12/importlib/resources/_adapters.py', - 'PYMODULE'), - ('tempfile', '/usr/lib/python3.12/tempfile.py', 'PYMODULE'), - ('random', '/usr/lib/python3.12/random.py', 'PYMODULE'), - ('statistics', '/usr/lib/python3.12/statistics.py', 'PYMODULE'), - ('decimal', '/usr/lib/python3.12/decimal.py', 'PYMODULE'), - ('_pydecimal', '/usr/lib/python3.12/_pydecimal.py', 'PYMODULE'), - ('contextvars', '/usr/lib/python3.12/contextvars.py', 'PYMODULE'), - ('fractions', '/usr/lib/python3.12/fractions.py', 'PYMODULE'), - ('numbers', '/usr/lib/python3.12/numbers.py', 'PYMODULE'), - ('bisect', '/usr/lib/python3.12/bisect.py', 'PYMODULE'), - ('importlib._abc', '/usr/lib/python3.12/importlib/_abc.py', 'PYMODULE'), - ('importlib.metadata._itertools', - '/usr/lib/python3.12/importlib/metadata/_itertools.py', - 'PYMODULE'), - ('importlib.metadata._functools', - '/usr/lib/python3.12/importlib/metadata/_functools.py', - 'PYMODULE'), - ('importlib.metadata._collections', - '/usr/lib/python3.12/importlib/metadata/_collections.py', - 'PYMODULE'), - ('importlib.metadata._meta', - '/usr/lib/python3.12/importlib/metadata/_meta.py', - 'PYMODULE'), - ('importlib.metadata._adapters', - '/usr/lib/python3.12/importlib/metadata/_adapters.py', - 'PYMODULE'), - ('importlib.metadata._text', - '/usr/lib/python3.12/importlib/metadata/_text.py', - 'PYMODULE'), - ('email.message', '/usr/lib/python3.12/email/message.py', 'PYMODULE'), - ('email.policy', '/usr/lib/python3.12/email/policy.py', 'PYMODULE'), - ('email.contentmanager', - '/usr/lib/python3.12/email/contentmanager.py', - 'PYMODULE'), - ('email.quoprimime', '/usr/lib/python3.12/email/quoprimime.py', 'PYMODULE'), - ('string', '/usr/lib/python3.12/string.py', 'PYMODULE'), - ('email.headerregistry', - '/usr/lib/python3.12/email/headerregistry.py', - 'PYMODULE'), - ('email._header_value_parser', - '/usr/lib/python3.12/email/_header_value_parser.py', - 'PYMODULE'), - ('urllib', '/usr/lib/python3.12/urllib/__init__.py', 'PYMODULE'), - ('email.iterators', '/usr/lib/python3.12/email/iterators.py', 'PYMODULE'), - ('email.generator', '/usr/lib/python3.12/email/generator.py', 'PYMODULE'), - ('email._encoded_words', - '/usr/lib/python3.12/email/_encoded_words.py', - 'PYMODULE'), - ('base64', '/usr/lib/python3.12/base64.py', 'PYMODULE'), - ('getopt', '/usr/lib/python3.12/getopt.py', 'PYMODULE'), - ('email.charset', '/usr/lib/python3.12/email/charset.py', 'PYMODULE'), - ('email.encoders', '/usr/lib/python3.12/email/encoders.py', 'PYMODULE'), - ('email.base64mime', '/usr/lib/python3.12/email/base64mime.py', 'PYMODULE'), - ('email._policybase', '/usr/lib/python3.12/email/_policybase.py', 'PYMODULE'), - ('email.header', '/usr/lib/python3.12/email/header.py', 'PYMODULE'), - ('email.errors', '/usr/lib/python3.12/email/errors.py', 'PYMODULE'), - ('email.utils', '/usr/lib/python3.12/email/utils.py', 'PYMODULE'), - ('email._parseaddr', '/usr/lib/python3.12/email/_parseaddr.py', 'PYMODULE'), - ('urllib.parse', '/usr/lib/python3.12/urllib/parse.py', 'PYMODULE'), - ('ipaddress', '/usr/lib/python3.12/ipaddress.py', 'PYMODULE'), - ('socket', '/usr/lib/python3.12/socket.py', 'PYMODULE'), - ('quopri', '/usr/lib/python3.12/quopri.py', 'PYMODULE'), - ('inspect', '/usr/lib/python3.12/inspect.py', 'PYMODULE'), - ('token', '/usr/lib/python3.12/token.py', 'PYMODULE'), - ('dis', '/usr/lib/python3.12/dis.py', 'PYMODULE'), - ('opcode', '/usr/lib/python3.12/opcode.py', 'PYMODULE'), - ('ast', '/usr/lib/python3.12/ast.py', 'PYMODULE'), - ('email', '/usr/lib/python3.12/email/__init__.py', 'PYMODULE'), - ('email.parser', '/usr/lib/python3.12/email/parser.py', 'PYMODULE'), - ('email.feedparser', '/usr/lib/python3.12/email/feedparser.py', 'PYMODULE'), - ('csv', '/usr/lib/python3.12/csv.py', 'PYMODULE'), - ('importlib.readers', '/usr/lib/python3.12/importlib/readers.py', 'PYMODULE'), - ('importlib.resources.readers', - '/usr/lib/python3.12/importlib/resources/readers.py', - 'PYMODULE'), - ('importlib.resources._itertools', - '/usr/lib/python3.12/importlib/resources/_itertools.py', - 'PYMODULE'), - ('tokenize', '/usr/lib/python3.12/tokenize.py', 'PYMODULE'), - ('struct', '/usr/lib/python3.12/struct.py', 'PYMODULE'), - ('importlib.util', '/usr/lib/python3.12/importlib/util.py', 'PYMODULE'), - ('tarfile', '/usr/lib/python3.12/tarfile.py', 'PYMODULE'), - ('gzip', '/usr/lib/python3.12/gzip.py', 'PYMODULE'), - ('_compression', '/usr/lib/python3.12/_compression.py', 'PYMODULE'), - ('lzma', '/usr/lib/python3.12/lzma.py', 'PYMODULE'), - ('bz2', '/usr/lib/python3.12/bz2.py', 'PYMODULE'), - ('fnmatch', '/usr/lib/python3.12/fnmatch.py', 'PYMODULE'), - ('copy', '/usr/lib/python3.12/copy.py', 'PYMODULE'), - ('gettext', '/usr/lib/python3.12/gettext.py', 'PYMODULE'), - ('multiprocessing.spawn', - '/usr/lib/python3.12/multiprocessing/spawn.py', - 'PYMODULE'), - ('multiprocessing.resource_tracker', - '/usr/lib/python3.12/multiprocessing/resource_tracker.py', - 'PYMODULE'), - ('multiprocessing.util', - '/usr/lib/python3.12/multiprocessing/util.py', - 'PYMODULE'), - ('multiprocessing.forkserver', - '/usr/lib/python3.12/multiprocessing/forkserver.py', - 'PYMODULE'), - ('multiprocessing.connection', - '/usr/lib/python3.12/multiprocessing/connection.py', - 'PYMODULE'), - ('multiprocessing.resource_sharer', - '/usr/lib/python3.12/multiprocessing/resource_sharer.py', - 'PYMODULE'), - ('xmlrpc.client', '/usr/lib/python3.12/xmlrpc/client.py', 'PYMODULE'), - ('xmlrpc', '/usr/lib/python3.12/xmlrpc/__init__.py', 'PYMODULE'), - ('xml.parsers.expat', '/usr/lib/python3.12/xml/parsers/expat.py', 'PYMODULE'), - ('xml.parsers', '/usr/lib/python3.12/xml/parsers/__init__.py', 'PYMODULE'), - ('xml', '/usr/lib/python3.12/xml/__init__.py', 'PYMODULE'), - ('xml.sax.expatreader', - '/usr/lib/python3.12/xml/sax/expatreader.py', - 'PYMODULE'), - ('xml.sax.saxutils', '/usr/lib/python3.12/xml/sax/saxutils.py', 'PYMODULE'), - ('urllib.request', '/usr/lib/python3.12/urllib/request.py', 'PYMODULE'), - ('getpass', '/usr/lib/python3.12/getpass.py', 'PYMODULE'), - ('nturl2path', '/usr/lib/python3.12/nturl2path.py', 'PYMODULE'), - ('ftplib', '/usr/lib/python3.12/ftplib.py', 'PYMODULE'), - ('netrc', '/usr/lib/python3.12/netrc.py', 'PYMODULE'), - ('mimetypes', '/usr/lib/python3.12/mimetypes.py', 'PYMODULE'), - ('http.cookiejar', '/usr/lib/python3.12/http/cookiejar.py', 'PYMODULE'), - ('http', '/usr/lib/python3.12/http/__init__.py', 'PYMODULE'), - ('ssl', '/usr/lib/python3.12/ssl.py', 'PYMODULE'), - ('urllib.response', '/usr/lib/python3.12/urllib/response.py', 'PYMODULE'), - ('urllib.error', '/usr/lib/python3.12/urllib/error.py', 'PYMODULE'), - ('xml.sax', '/usr/lib/python3.12/xml/sax/__init__.py', 'PYMODULE'), - ('xml.sax.handler', '/usr/lib/python3.12/xml/sax/handler.py', 'PYMODULE'), - ('xml.sax._exceptions', - '/usr/lib/python3.12/xml/sax/_exceptions.py', - 'PYMODULE'), - ('xml.sax.xmlreader', '/usr/lib/python3.12/xml/sax/xmlreader.py', 'PYMODULE'), - ('http.client', '/usr/lib/python3.12/http/client.py', 'PYMODULE'), - ('hmac', '/usr/lib/python3.12/hmac.py', 'PYMODULE'), - ('logging', '/usr/lib/python3.12/logging/__init__.py', 'PYMODULE'), - ('pickle', '/usr/lib/python3.12/pickle.py', 'PYMODULE'), - ('pprint', '/usr/lib/python3.12/pprint.py', 'PYMODULE'), - ('dataclasses', '/usr/lib/python3.12/dataclasses.py', 'PYMODULE'), - ('_compat_pickle', '/usr/lib/python3.12/_compat_pickle.py', 'PYMODULE'), - ('multiprocessing.context', - '/usr/lib/python3.12/multiprocessing/context.py', - 'PYMODULE'), - ('multiprocessing.popen_spawn_win32', - '/usr/lib/python3.12/multiprocessing/popen_spawn_win32.py', - 'PYMODULE'), - ('multiprocessing.popen_forkserver', - '/usr/lib/python3.12/multiprocessing/popen_forkserver.py', - 'PYMODULE'), - ('multiprocessing.popen_spawn_posix', - '/usr/lib/python3.12/multiprocessing/popen_spawn_posix.py', - 'PYMODULE'), - ('multiprocessing.popen_fork', - '/usr/lib/python3.12/multiprocessing/popen_fork.py', - 'PYMODULE'), - ('multiprocessing.sharedctypes', - '/usr/lib/python3.12/multiprocessing/sharedctypes.py', - 'PYMODULE'), - ('multiprocessing.heap', - '/usr/lib/python3.12/multiprocessing/heap.py', - 'PYMODULE'), - ('ctypes', '/usr/lib/python3.12/ctypes/__init__.py', 'PYMODULE'), - ('ctypes._endian', '/usr/lib/python3.12/ctypes/_endian.py', 'PYMODULE'), - ('multiprocessing.pool', - '/usr/lib/python3.12/multiprocessing/pool.py', - 'PYMODULE'), - ('multiprocessing.dummy', - '/usr/lib/python3.12/multiprocessing/dummy/__init__.py', - 'PYMODULE'), - ('multiprocessing.dummy.connection', - '/usr/lib/python3.12/multiprocessing/dummy/connection.py', - 'PYMODULE'), - ('queue', '/usr/lib/python3.12/queue.py', 'PYMODULE'), - ('multiprocessing.queues', - '/usr/lib/python3.12/multiprocessing/queues.py', - 'PYMODULE'), - ('multiprocessing.synchronize', - '/usr/lib/python3.12/multiprocessing/synchronize.py', - 'PYMODULE'), - ('multiprocessing.managers', - '/usr/lib/python3.12/multiprocessing/managers.py', - 'PYMODULE'), - ('multiprocessing.shared_memory', - '/usr/lib/python3.12/multiprocessing/shared_memory.py', - 'PYMODULE'), - ('secrets', '/usr/lib/python3.12/secrets.py', 'PYMODULE'), - ('multiprocessing.reduction', - '/usr/lib/python3.12/multiprocessing/reduction.py', - 'PYMODULE'), - ('multiprocessing.process', - '/usr/lib/python3.12/multiprocessing/process.py', - 'PYMODULE'), - ('runpy', '/usr/lib/python3.12/runpy.py', 'PYMODULE'), - ('pkgutil', '/usr/lib/python3.12/pkgutil.py', 'PYMODULE'), - ('zipimport', '/usr/lib/python3.12/zipimport.py', 'PYMODULE'), - ('multiprocessing', - '/usr/lib/python3.12/multiprocessing/__init__.py', - 'PYMODULE'), - ('_distutils_hack', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/_distutils_hack/__init__.py', - 'PYMODULE'), - ('setuptools', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/__init__.py', - 'PYMODULE'), - ('setuptools.msvc', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/msvc.py', - 'PYMODULE'), - ('setuptools._distutils.errors', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/errors.py', - 'PYMODULE'), - ('setuptools._distutils.sysconfig', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/sysconfig.py', - 'PYMODULE'), - ('setuptools._distutils.text_file', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/text_file.py', - 'PYMODULE'), - ('setuptools._distutils.util', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/util.py', - 'PYMODULE'), - ('setuptools._distutils.spawn', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/spawn.py', - 'PYMODULE'), - ('setuptools._distutils.debug', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/debug.py', - 'PYMODULE'), - ('setuptools._distutils._modified', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/_modified.py', - 'PYMODULE'), - ('setuptools._distutils._log', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/_log.py', - 'PYMODULE'), - ('setuptools._distutils.compat.py39', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/compat/py39.py', - 'PYMODULE'), - ('setuptools._distutils.compat', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/compat/__init__.py', - 'PYMODULE'), - ('setuptools._distutils.ccompiler', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/ccompiler.py', - 'PYMODULE'), - ('setuptools._distutils.compilers.C.base', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/compilers/C/base.py', - 'PYMODULE'), - ('setuptools._distutils.fancy_getopt', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/fancy_getopt.py', - 'PYMODULE'), - ('setuptools._distutils.file_util', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/file_util.py', - 'PYMODULE'), - ('setuptools._distutils.dir_util', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/dir_util.py', - 'PYMODULE'), - ('setuptools._distutils.compilers.C', '-', 'PYMODULE'), - ('setuptools._distutils.compilers.C.msvc', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/compilers/C/msvc.py', - 'PYMODULE'), - ('unittest.mock', '/usr/lib/python3.12/unittest/mock.py', 'PYMODULE'), - ('unittest', '/usr/lib/python3.12/unittest/__init__.py', 'PYMODULE'), - ('unittest.async_case', - '/usr/lib/python3.12/unittest/async_case.py', - 'PYMODULE'), - ('unittest.signals', '/usr/lib/python3.12/unittest/signals.py', 'PYMODULE'), - ('unittest.main', '/usr/lib/python3.12/unittest/main.py', 'PYMODULE'), - ('unittest.runner', '/usr/lib/python3.12/unittest/runner.py', 'PYMODULE'), - ('unittest.loader', '/usr/lib/python3.12/unittest/loader.py', 'PYMODULE'), - ('unittest.suite', '/usr/lib/python3.12/unittest/suite.py', 'PYMODULE'), - ('unittest.case', '/usr/lib/python3.12/unittest/case.py', 'PYMODULE'), - ('unittest._log', '/usr/lib/python3.12/unittest/_log.py', 'PYMODULE'), - ('difflib', '/usr/lib/python3.12/difflib.py', 'PYMODULE'), - ('unittest.result', '/usr/lib/python3.12/unittest/result.py', 'PYMODULE'), - ('unittest.util', '/usr/lib/python3.12/unittest/util.py', 'PYMODULE'), - ('asyncio', '/usr/lib/python3.12/asyncio/__init__.py', 'PYMODULE'), - ('asyncio.unix_events', - '/usr/lib/python3.12/asyncio/unix_events.py', - 'PYMODULE'), - ('asyncio.log', '/usr/lib/python3.12/asyncio/log.py', 'PYMODULE'), - ('asyncio.windows_events', - '/usr/lib/python3.12/asyncio/windows_events.py', - 'PYMODULE'), - ('asyncio.windows_utils', - '/usr/lib/python3.12/asyncio/windows_utils.py', - 'PYMODULE'), - ('asyncio.selector_events', - '/usr/lib/python3.12/asyncio/selector_events.py', - 'PYMODULE'), - ('asyncio.proactor_events', - '/usr/lib/python3.12/asyncio/proactor_events.py', - 'PYMODULE'), - ('asyncio.base_subprocess', - '/usr/lib/python3.12/asyncio/base_subprocess.py', - 'PYMODULE'), - ('asyncio.threads', '/usr/lib/python3.12/asyncio/threads.py', 'PYMODULE'), - ('asyncio.taskgroups', - '/usr/lib/python3.12/asyncio/taskgroups.py', - 'PYMODULE'), - ('asyncio.subprocess', - '/usr/lib/python3.12/asyncio/subprocess.py', - 'PYMODULE'), - ('asyncio.streams', '/usr/lib/python3.12/asyncio/streams.py', 'PYMODULE'), - ('asyncio.queues', '/usr/lib/python3.12/asyncio/queues.py', 'PYMODULE'), - ('asyncio.runners', '/usr/lib/python3.12/asyncio/runners.py', 'PYMODULE'), - ('asyncio.base_events', - '/usr/lib/python3.12/asyncio/base_events.py', - 'PYMODULE'), - ('concurrent.futures', - '/usr/lib/python3.12/concurrent/futures/__init__.py', - 'PYMODULE'), - ('concurrent.futures.thread', - '/usr/lib/python3.12/concurrent/futures/thread.py', - 'PYMODULE'), - ('concurrent.futures.process', - '/usr/lib/python3.12/concurrent/futures/process.py', - 'PYMODULE'), - ('concurrent.futures._base', - '/usr/lib/python3.12/concurrent/futures/_base.py', - 'PYMODULE'), - ('concurrent', '/usr/lib/python3.12/concurrent/__init__.py', 'PYMODULE'), - ('asyncio.trsock', '/usr/lib/python3.12/asyncio/trsock.py', 'PYMODULE'), - ('asyncio.staggered', '/usr/lib/python3.12/asyncio/staggered.py', 'PYMODULE'), - ('asyncio.timeouts', '/usr/lib/python3.12/asyncio/timeouts.py', 'PYMODULE'), - ('asyncio.tasks', '/usr/lib/python3.12/asyncio/tasks.py', 'PYMODULE'), - ('asyncio.base_tasks', - '/usr/lib/python3.12/asyncio/base_tasks.py', - 'PYMODULE'), - ('asyncio.locks', '/usr/lib/python3.12/asyncio/locks.py', 'PYMODULE'), - ('asyncio.mixins', '/usr/lib/python3.12/asyncio/mixins.py', 'PYMODULE'), - ('asyncio.sslproto', '/usr/lib/python3.12/asyncio/sslproto.py', 'PYMODULE'), - ('asyncio.transports', - '/usr/lib/python3.12/asyncio/transports.py', - 'PYMODULE'), - ('asyncio.protocols', '/usr/lib/python3.12/asyncio/protocols.py', 'PYMODULE'), - ('asyncio.futures', '/usr/lib/python3.12/asyncio/futures.py', 'PYMODULE'), - ('asyncio.base_futures', - '/usr/lib/python3.12/asyncio/base_futures.py', - 'PYMODULE'), - ('asyncio.exceptions', - '/usr/lib/python3.12/asyncio/exceptions.py', - 'PYMODULE'), - ('asyncio.events', '/usr/lib/python3.12/asyncio/events.py', 'PYMODULE'), - ('asyncio.format_helpers', - '/usr/lib/python3.12/asyncio/format_helpers.py', - 'PYMODULE'), - ('asyncio.coroutines', - '/usr/lib/python3.12/asyncio/coroutines.py', - 'PYMODULE'), - ('asyncio.constants', '/usr/lib/python3.12/asyncio/constants.py', 'PYMODULE'), - ('setuptools._distutils.compilers', '-', 'PYMODULE'), - ('setuptools._distutils.compat.numpy', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/compat/numpy.py', - 'PYMODULE'), - ('setuptools._vendor.jaraco.functools', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/jaraco/functools/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.jaraco', '-', 'PYMODULE'), - ('setuptools._vendor', '-', 'PYMODULE'), - ('sysconfig', '/usr/lib/python3.12/sysconfig.py', 'PYMODULE'), - ('_sysconfigdata__x86_64-linux-gnu', - '/usr/lib/python3.12/_sysconfigdata__x86_64-linux-gnu.py', - 'PYMODULE'), - ('_aix_support', '/usr/lib/python3.12/_aix_support.py', 'PYMODULE'), - ('setuptools._distutils', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/__init__.py', - 'PYMODULE'), - ('setuptools._distutils.version', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/version.py', - 'PYMODULE'), - ('setuptools._distutils.archive_util', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/archive_util.py', - 'PYMODULE'), - ('setuptools._distutils.compilers.C.errors', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/compilers/C/errors.py', - 'PYMODULE'), - ('setuptools.compat.py310', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/compat/py310.py', - 'PYMODULE'), - ('setuptools._vendor.tomli', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/tomli/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.tomli._parser', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/tomli/_parser.py', - 'PYMODULE'), - ('setuptools._vendor.tomli._types', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/tomli/_types.py', - 'PYMODULE'), - ('setuptools._vendor.tomli._re', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/tomli/_re.py', - 'PYMODULE'), - ('tomllib', '/usr/lib/python3.12/tomllib/__init__.py', 'PYMODULE'), - ('tomllib._parser', '/usr/lib/python3.12/tomllib/_parser.py', 'PYMODULE'), - ('tomllib._types', '/usr/lib/python3.12/tomllib/_types.py', 'PYMODULE'), - ('tomllib._re', '/usr/lib/python3.12/tomllib/_re.py', 'PYMODULE'), - ('setuptools.compat', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/compat/__init__.py', - 'PYMODULE'), - ('setuptools.compat.py311', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/compat/py311.py', - 'PYMODULE'), - ('setuptools.compat.py39', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/compat/py39.py', - 'PYMODULE'), - ('setuptools._path', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_path.py', - 'PYMODULE'), - ('setuptools._vendor.more_itertools', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/more_itertools/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.more_itertools.recipes', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/more_itertools/recipes.py', - 'PYMODULE'), - ('setuptools._vendor.more_itertools.more', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/more_itertools/more.py', - 'PYMODULE'), - ('platform', '/usr/lib/python3.12/platform.py', 'PYMODULE'), - ('setuptools._distutils.command.build_ext', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/command/build_ext.py', - 'PYMODULE'), - ('setuptools._distutils.command', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/command/__init__.py', - 'PYMODULE'), - ('setuptools._distutils._msvccompiler', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/_msvccompiler.py', - 'PYMODULE'), - ('setuptools._distutils.extension', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/extension.py', - 'PYMODULE'), - ('site', '/usr/lib/python3.12/site.py', 'PYMODULE'), - ('sitecustomize', '/usr/lib/python3.12/sitecustomize.py', 'PYMODULE'), - ('rlcompleter', '/usr/lib/python3.12/rlcompleter.py', 'PYMODULE'), - ('_sitebuiltins', '/usr/lib/python3.12/_sitebuiltins.py', 'PYMODULE'), - ('pydoc', '/usr/lib/python3.12/pydoc.py', 'PYMODULE'), - ('webbrowser', '/usr/lib/python3.12/webbrowser.py', 'PYMODULE'), - ('shlex', '/usr/lib/python3.12/shlex.py', 'PYMODULE'), - ('http.server', '/usr/lib/python3.12/http/server.py', 'PYMODULE'), - ('socketserver', '/usr/lib/python3.12/socketserver.py', 'PYMODULE'), - ('html', '/usr/lib/python3.12/html/__init__.py', 'PYMODULE'), - ('html.entities', '/usr/lib/python3.12/html/entities.py', 'PYMODULE'), - ('pydoc_data.topics', '/usr/lib/python3.12/pydoc_data/topics.py', 'PYMODULE'), - ('pydoc_data', '/usr/lib/python3.12/pydoc_data/__init__.py', 'PYMODULE'), - ('tty', '/usr/lib/python3.12/tty.py', 'PYMODULE'), - ('setuptools._distutils.core', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/core.py', - 'PYMODULE'), - ('setuptools._distutils.dist', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/dist.py', - 'PYMODULE'), - ('setuptools._distutils.versionpredicate', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/versionpredicate.py', - 'PYMODULE'), - ('configparser', '/usr/lib/python3.12/configparser.py', 'PYMODULE'), - ('packaging.utils', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/utils.py', - 'PYMODULE'), - ('packaging', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/__init__.py', - 'PYMODULE'), - ('packaging._musllinux', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/_musllinux.py', - 'PYMODULE'), - ('packaging._elffile', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/_elffile.py', - 'PYMODULE'), - ('packaging._manylinux', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/_manylinux.py', - 'PYMODULE'), - ('packaging.version', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/version.py', - 'PYMODULE'), - ('packaging._structures', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/_structures.py', - 'PYMODULE'), - ('packaging.tags', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/tags.py', - 'PYMODULE'), - ('setuptools._distutils.cmd', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/cmd.py', - 'PYMODULE'), - ('setuptools.warnings', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/warnings.py', - 'PYMODULE'), - ('setuptools.version', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/version.py', - 'PYMODULE'), - ('setuptools._importlib', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_importlib.py', - 'PYMODULE'), - ('setuptools._vendor.importlib_metadata', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.zipp.compat.overlay', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/zipp/compat/overlay.py', - 'PYMODULE'), - ('setuptools._vendor.zipp.compat', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/zipp/compat/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.zipp', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/zipp/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.zipp.glob', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/zipp/glob.py', - 'PYMODULE'), - ('setuptools._vendor.zipp.compat.py313', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/zipp/compat/py313.py', - 'PYMODULE'), - ('setuptools._vendor.zipp.compat.py310', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/zipp/compat/py310.py', - 'PYMODULE'), - ('setuptools._vendor.zipp._functools', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/zipp/_functools.py', - 'PYMODULE'), - ('setuptools._vendor.importlib_metadata._adapters', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py', - 'PYMODULE'), - ('setuptools._vendor.importlib_metadata._text', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata/_text.py', - 'PYMODULE'), - ('setuptools._vendor.importlib_metadata.compat.py311', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata/compat/py311.py', - 'PYMODULE'), - ('setuptools._vendor.importlib_metadata.compat.py39', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata/compat/py39.py', - 'PYMODULE'), - ('setuptools._vendor.importlib_metadata.compat', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata/compat/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.importlib_metadata._typing', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata/_typing.py', - 'PYMODULE'), - ('setuptools._vendor.importlib_metadata._itertools', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py', - 'PYMODULE'), - ('setuptools._vendor.importlib_metadata._functools', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata/_functools.py', - 'PYMODULE'), - ('setuptools._vendor.importlib_metadata._compat', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata/_compat.py', - 'PYMODULE'), - ('setuptools._vendor.importlib_metadata._collections', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata/_collections.py', - 'PYMODULE'), - ('setuptools._vendor.importlib_metadata._meta', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata/_meta.py', - 'PYMODULE'), - ('setuptools.extension', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/extension.py', - 'PYMODULE'), - ('setuptools.dist', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/dist.py', - 'PYMODULE'), - ('setuptools.command.bdist_wheel', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/command/bdist_wheel.py', - 'PYMODULE'), - ('setuptools._vendor.wheel.macosx_libfile', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/wheel/macosx_libfile.py', - 'PYMODULE'), - ('setuptools._vendor.wheel', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/wheel/__init__.py', - 'PYMODULE'), - ('setuptools.command.egg_info', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/command/egg_info.py', - 'PYMODULE'), - ('setuptools._distutils.filelist', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/filelist.py', - 'PYMODULE'), - ('setuptools.command._requirestxt', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/command/_requirestxt.py', - 'PYMODULE'), - ('setuptools._vendor.jaraco.text', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/jaraco/text/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.jaraco.context', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/jaraco/context/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.backports.tarfile', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/backports/tarfile/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.backports', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/backports/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.backports.tarfile.compat.py38', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/backports/tarfile/compat/py38.py', - 'PYMODULE'), - ('setuptools._vendor.backports.tarfile.compat', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/backports/tarfile/compat/__init__.py', - 'PYMODULE'), - ('setuptools.glob', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/glob.py', - 'PYMODULE'), - ('setuptools.command.setopt', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/command/setopt.py', - 'PYMODULE'), - ('setuptools.command.sdist', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/command/sdist.py', - 'PYMODULE'), - ('setuptools._distutils.command.sdist', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/command/sdist.py', - 'PYMODULE'), - ('setuptools.command.build', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/command/build.py', - 'PYMODULE'), - ('setuptools._distutils.command.build', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/command/build.py', - 'PYMODULE'), - ('setuptools.command.bdist_egg', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/command/bdist_egg.py', - 'PYMODULE'), - ('setuptools.unicode_utils', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/unicode_utils.py', - 'PYMODULE'), - ('packaging.requirements', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/requirements.py', - 'PYMODULE'), - ('packaging._tokenizer', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/_tokenizer.py', - 'PYMODULE'), - ('packaging._parser', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/_parser.py', - 'PYMODULE'), - ('setuptools._vendor.wheel.wheelfile', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/wheel/wheelfile.py', - 'PYMODULE'), - ('setuptools.installer', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/installer.py', - 'PYMODULE'), - ('setuptools.wheel', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/wheel.py', - 'PYMODULE'), - ('setuptools._discovery', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_discovery.py', - 'PYMODULE'), - ('setuptools.archive_util', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/archive_util.py', - 'PYMODULE'), - ('setuptools._distutils.log', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/log.py', - 'PYMODULE'), - ('setuptools.errors', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/errors.py', - 'PYMODULE'), - ('setuptools.config.setupcfg', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/config/setupcfg.py', - 'PYMODULE'), - ('setuptools.config.expand', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/config/expand.py', - 'PYMODULE'), - ('setuptools.config.pyprojecttoml', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/config/pyprojecttoml.py', - 'PYMODULE'), - ('setuptools.config._validate_pyproject', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/config/_validate_pyproject/__init__.py', - 'PYMODULE'), - ('setuptools.config._validate_pyproject.fastjsonschema_validations', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py', - 'PYMODULE'), - ('setuptools.config._validate_pyproject.fastjsonschema_exceptions', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py', - 'PYMODULE'), - ('setuptools.config._validate_pyproject.extra_validations', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/config/_validate_pyproject/extra_validations.py', - 'PYMODULE'), - ('setuptools.config._validate_pyproject.error_reporting', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/config/_validate_pyproject/error_reporting.py', - 'PYMODULE'), - ('setuptools.config._validate_pyproject.formats', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/config/_validate_pyproject/formats.py', - 'PYMODULE'), - ('packaging.licenses', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/licenses/__init__.py', - 'PYMODULE'), - ('packaging.licenses._spdx', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/licenses/_spdx.py', - 'PYMODULE'), - ('setuptools._vendor.packaging.requirements', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/requirements.py', - 'PYMODULE'), - ('setuptools._vendor.packaging.utils', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/utils.py', - 'PYMODULE'), - ('setuptools._vendor.packaging.version', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/version.py', - 'PYMODULE'), - ('setuptools._vendor.packaging._structures', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/_structures.py', - 'PYMODULE'), - ('setuptools._vendor.packaging.tags', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/tags.py', - 'PYMODULE'), - ('setuptools._vendor.packaging._musllinux', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/_musllinux.py', - 'PYMODULE'), - ('setuptools._vendor.packaging._elffile', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/_elffile.py', - 'PYMODULE'), - ('setuptools._vendor.packaging._manylinux', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/_manylinux.py', - 'PYMODULE'), - ('setuptools._vendor.packaging.specifiers', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/specifiers.py', - 'PYMODULE'), - ('setuptools._vendor.packaging.markers', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/markers.py', - 'PYMODULE'), - ('setuptools._vendor.packaging._tokenizer', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/_tokenizer.py', - 'PYMODULE'), - ('setuptools._vendor.packaging._parser', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/_parser.py', - 'PYMODULE'), - ('setuptools._vendor.packaging', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/__init__.py', - 'PYMODULE'), - ('setuptools.config._apply_pyprojecttoml', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/config/_apply_pyprojecttoml.py', - 'PYMODULE'), - ('setuptools.config', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/config/__init__.py', - 'PYMODULE'), - ('setuptools._static', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_static.py', - 'PYMODULE'), - ('packaging.specifiers', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/specifiers.py', - 'PYMODULE'), - ('packaging.markers', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/markers.py', - 'PYMODULE'), - ('glob', '/usr/lib/python3.12/glob.py', 'PYMODULE'), - ('setuptools._shutil', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_shutil.py', - 'PYMODULE'), - ('setuptools.windows_support', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/windows_support.py', - 'PYMODULE'), - ('ctypes.wintypes', '/usr/lib/python3.12/ctypes/wintypes.py', 'PYMODULE'), - ('setuptools.command', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/command/__init__.py', - 'PYMODULE'), - ('setuptools._distutils.command.bdist', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/command/bdist.py', - 'PYMODULE'), - ('setuptools._entry_points', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_entry_points.py', - 'PYMODULE'), - ('setuptools._itertools', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_itertools.py', - 'PYMODULE'), - ('setuptools.discovery', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/discovery.py', - 'PYMODULE'), - ('setuptools.depends', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/depends.py', - 'PYMODULE'), - ('setuptools._imp', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_imp.py', - 'PYMODULE'), - ('setuptools.logging', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/logging.py', - 'PYMODULE'), - ('setuptools.monkey', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/monkey.py', - 'PYMODULE'), - ('setuptools._core_metadata', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_core_metadata.py', - 'PYMODULE'), - ('setuptools._reqs', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_reqs.py', - 'PYMODULE'), - ('setuptools._normalization', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_normalization.py', - 'PYMODULE'), - ('_distutils_hack.override', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/_distutils_hack/override.py', - 'PYMODULE'), - ('__future__', '/usr/lib/python3.12/__future__.py', 'PYMODULE'), - ('stringprep', '/usr/lib/python3.12/stringprep.py', 'PYMODULE'), - ('_py_abc', '/usr/lib/python3.12/_py_abc.py', 'PYMODULE'), - ('tracemalloc', '/usr/lib/python3.12/tracemalloc.py', 'PYMODULE'), - ('threading', '/usr/lib/python3.12/threading.py', 'PYMODULE'), - ('_threading_local', '/usr/lib/python3.12/_threading_local.py', 'PYMODULE'), - ('pathlib', '/usr/lib/python3.12/pathlib.py', 'PYMODULE'), - ('tkinter.ttk', '/usr/lib/python3.12/tkinter/ttk.py', 'PYMODULE'), - ('tkinter.messagebox', - '/usr/lib/python3.12/tkinter/messagebox.py', - 'PYMODULE'), - ('tkinter.commondialog', - '/usr/lib/python3.12/tkinter/commondialog.py', - 'PYMODULE'), - ('tkinter.filedialog', - '/usr/lib/python3.12/tkinter/filedialog.py', - 'PYMODULE'), - ('tkinter.simpledialog', - '/usr/lib/python3.12/tkinter/simpledialog.py', - 'PYMODULE'), - ('tkinter.dialog', '/usr/lib/python3.12/tkinter/dialog.py', 'PYMODULE'), - ('tkinter', '/usr/lib/python3.12/tkinter/__init__.py', 'PYMODULE'), - ('tkinter.constants', '/usr/lib/python3.12/tkinter/constants.py', 'PYMODULE'), - ('requests', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/__init__.py', - 'PYMODULE'), - ('requests.status_codes', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/status_codes.py', - 'PYMODULE'), - ('requests.structures', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/structures.py', - 'PYMODULE'), - ('requests.compat', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/compat.py', - 'PYMODULE'), - ('http.cookies', '/usr/lib/python3.12/http/cookies.py', 'PYMODULE'), - ('requests.models', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/models.py', - 'PYMODULE'), - ('idna', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/idna/__init__.py', - 'PYMODULE'), - ('idna.package_data', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/idna/package_data.py', - 'PYMODULE'), - ('idna.intranges', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/idna/intranges.py', - 'PYMODULE'), - ('idna.core', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/idna/core.py', - 'PYMODULE'), - ('idna.uts46data', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/idna/uts46data.py', - 'PYMODULE'), - ('idna.idnadata', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/idna/idnadata.py', - 'PYMODULE'), - ('requests.hooks', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/hooks.py', - 'PYMODULE'), - ('requests.cookies', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/cookies.py', - 'PYMODULE'), - ('requests.auth', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/auth.py', - 'PYMODULE'), - ('requests._internal_utils', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/_internal_utils.py', - 'PYMODULE'), - ('urllib3.util', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/__init__.py', - 'PYMODULE'), - ('urllib3.util.wait', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/wait.py', - 'PYMODULE'), - ('urllib3.util.url', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/url.py', - 'PYMODULE'), - ('urllib3.util.util', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/util.py', - 'PYMODULE'), - ('urllib3.util.timeout', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/timeout.py', - 'PYMODULE'), - ('urllib3.util.ssl_', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/ssl_.py', - 'PYMODULE'), - ('urllib3.util.ssltransport', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/ssltransport.py', - 'PYMODULE'), - ('urllib3.util.retry', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/retry.py', - 'PYMODULE'), - ('urllib3.response', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/response.py', - 'PYMODULE'), - ('urllib3.connection', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/connection.py', - 'PYMODULE'), - ('urllib3.util.ssl_match_hostname', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/ssl_match_hostname.py', - 'PYMODULE'), - ('urllib3._version', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/_version.py', - 'PYMODULE'), - ('urllib3.http2.probe', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/http2/probe.py', - 'PYMODULE'), - ('urllib3.http2', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/http2/__init__.py', - 'PYMODULE'), - ('urllib3.http2.connection', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/http2/connection.py', - 'PYMODULE'), - ('urllib3._collections', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/_collections.py', - 'PYMODULE'), - ('urllib3._base_connection', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/_base_connection.py', - 'PYMODULE'), - ('urllib3.connectionpool', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/connectionpool.py', - 'PYMODULE'), - ('urllib3.util.proxy', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/proxy.py', - 'PYMODULE'), - ('urllib3._request_methods', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/_request_methods.py', - 'PYMODULE'), - ('urllib3.util.response', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/response.py', - 'PYMODULE'), - ('urllib3.util.request', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/request.py', - 'PYMODULE'), - ('urllib3.util.connection', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/connection.py', - 'PYMODULE'), - ('urllib3.filepost', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/filepost.py', - 'PYMODULE'), - ('urllib3.fields', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/fields.py', - 'PYMODULE'), - ('requests.api', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/api.py', - 'PYMODULE'), - ('requests.sessions', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/sessions.py', - 'PYMODULE'), - ('requests.adapters', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/adapters.py', - 'PYMODULE'), - ('urllib3.contrib.socks', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/contrib/socks.py', - 'PYMODULE'), - ('urllib3.poolmanager', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/poolmanager.py', - 'PYMODULE'), - ('requests.__version__', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/__version__.py', - 'PYMODULE'), - ('requests.utils', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/utils.py', - 'PYMODULE'), - ('requests.certs', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/certs.py', - 'PYMODULE'), - ('certifi', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/certifi/__init__.py', - 'PYMODULE'), - ('certifi.core', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/certifi/core.py', - 'PYMODULE'), - ('requests.packages', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/packages.py', - 'PYMODULE'), - ('urllib3.exceptions', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/exceptions.py', - 'PYMODULE'), - ('urllib3.contrib.pyopenssl', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/contrib/pyopenssl.py', - 'PYMODULE'), - ('urllib3.contrib', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/contrib/__init__.py', - 'PYMODULE'), - ('charset_normalizer', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/charset_normalizer/__init__.py', - 'PYMODULE'), - ('charset_normalizer.version', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/charset_normalizer/version.py', - 'PYMODULE'), - ('charset_normalizer.utils', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/charset_normalizer/utils.py', - 'PYMODULE'), - ('charset_normalizer.constant', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/charset_normalizer/constant.py', - 'PYMODULE'), - ('charset_normalizer.models', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/charset_normalizer/models.py', - 'PYMODULE'), - ('charset_normalizer.legacy', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/charset_normalizer/legacy.py', - 'PYMODULE'), - ('charset_normalizer.api', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/charset_normalizer/api.py', - 'PYMODULE'), - ('requests.exceptions', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/exceptions.py', - 'PYMODULE'), - ('urllib3', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/__init__.py', - 'PYMODULE'), - ('urllib3.contrib.emscripten', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__init__.py', - 'PYMODULE'), - ('urllib3.contrib.emscripten.connection', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/connection.py', - 'PYMODULE'), - ('urllib3.contrib.emscripten.response', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/response.py', - 'PYMODULE'), - ('urllib3.contrib.emscripten.request', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/request.py', - 'PYMODULE'), - ('urllib3.contrib.emscripten.fetch', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/fetch.py', - 'PYMODULE'), - ('json', '/usr/lib/python3.12/json/__init__.py', 'PYMODULE'), - ('json.encoder', '/usr/lib/python3.12/json/encoder.py', 'PYMODULE'), - ('json.decoder', '/usr/lib/python3.12/json/decoder.py', 'PYMODULE'), - ('json.scanner', '/usr/lib/python3.12/json/scanner.py', 'PYMODULE'), - ('hashlib', '/usr/lib/python3.12/hashlib.py', 'PYMODULE')], - [('libpython3.12.so.1.0', - '/lib/x86_64-linux-gnu/libpython3.12.so.1.0', - 'BINARY'), - ('python3.12/lib-dynload/_contextvars.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_contextvars.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_decimal.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_decimal.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/resource.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/resource.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_lzma.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_lzma.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_bz2.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_bz2.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_posixshmem.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_posixshmem.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_multiprocessing.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_multiprocessing.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/termios.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/termios.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_ssl.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_ssl.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_hashlib.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_hashlib.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/mmap.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/mmap.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_ctypes.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_ctypes.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_queue.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_queue.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_asyncio.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_asyncio.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/readline.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/readline.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_multibytecodec.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_multibytecodec.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_codecs_jp.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_codecs_jp.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_codecs_kr.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_codecs_kr.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_codecs_iso2022.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_codecs_iso2022.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_codecs_cn.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_codecs_cn.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_codecs_tw.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_codecs_tw.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_codecs_hk.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_codecs_hk.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_tkinter.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_tkinter.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('81d243bd2c585b0f4821__mypyc.cpython-312-x86_64-linux-gnu.so', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/81d243bd2c585b0f4821__mypyc.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('charset_normalizer/cd.cpython-312-x86_64-linux-gnu.so', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/charset_normalizer/cd.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('charset_normalizer/md.cpython-312-x86_64-linux-gnu.so', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_json.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_json.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('libz.so.1', '/lib/x86_64-linux-gnu/libz.so.1', 'BINARY'), - ('libexpat.so.1', '/lib/x86_64-linux-gnu/libexpat.so.1', 'BINARY'), - ('liblzma.so.5', '/lib/x86_64-linux-gnu/liblzma.so.5', 'BINARY'), - ('libbz2.so.1.0', '/lib/x86_64-linux-gnu/libbz2.so.1.0', 'BINARY'), - ('libssl.so.3', '/lib/x86_64-linux-gnu/libssl.so.3', 'BINARY'), - ('libcrypto.so.3', '/lib/x86_64-linux-gnu/libcrypto.so.3', 'BINARY'), - ('libffi.so.8', '/lib/x86_64-linux-gnu/libffi.so.8', 'BINARY'), - ('libreadline.so.8', '/lib/x86_64-linux-gnu/libreadline.so.8', 'BINARY'), - ('libtinfo.so.6', '/lib/x86_64-linux-gnu/libtinfo.so.6', 'BINARY'), - ('libXss.so.1', '/lib/x86_64-linux-gnu/libXss.so.1', 'BINARY'), - ('libbrotlicommon.so.1', - '/lib/x86_64-linux-gnu/libbrotlicommon.so.1', - 'BINARY'), - ('libXext.so.6', '/lib/x86_64-linux-gnu/libXext.so.6', 'BINARY'), - ('libbsd.so.0', '/lib/x86_64-linux-gnu/libbsd.so.0', 'BINARY'), - ('libtcl8.6.so', '/lib/x86_64-linux-gnu/libtcl8.6.so', 'BINARY'), - ('libfreetype.so.6', '/lib/x86_64-linux-gnu/libfreetype.so.6', 'BINARY'), - ('libX11.so.6', '/lib/x86_64-linux-gnu/libX11.so.6', 'BINARY'), - ('libXau.so.6', '/lib/x86_64-linux-gnu/libXau.so.6', 'BINARY'), - ('libbrotlidec.so.1', '/lib/x86_64-linux-gnu/libbrotlidec.so.1', 'BINARY'), - ('libXft.so.2', '/lib/x86_64-linux-gnu/libXft.so.2', 'BINARY'), - ('libmd.so.0', '/lib/x86_64-linux-gnu/libmd.so.0', 'BINARY'), - ('libBLT.2.5.so.8.6', '/lib/libBLT.2.5.so.8.6', 'BINARY'), - ('libpng16.so.16', '/lib/x86_64-linux-gnu/libpng16.so.16', 'BINARY'), - ('libXdmcp.so.6', '/lib/x86_64-linux-gnu/libXdmcp.so.6', 'BINARY'), - ('libfontconfig.so.1', '/lib/x86_64-linux-gnu/libfontconfig.so.1', 'BINARY'), - ('libtk8.6.so', '/lib/x86_64-linux-gnu/libtk8.6.so', 'BINARY'), - ('libXrender.so.1', '/lib/x86_64-linux-gnu/libXrender.so.1', 'BINARY')], - [], - [], - [('_tcl_data/encoding/cp949.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp949.enc', - 'DATA'), - ('_tcl_data/msgs/en_ca.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_ca.msg', - 'DATA'), - ('_tcl_data/msgs/es_cl.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_cl.msg', - 'DATA'), - ('_tcl_data/encoding/dingbats.enc', - '/usr/share/tcltk/tcl8.6/encoding/dingbats.enc', - 'DATA'), - ('_tcl_data/msgs/te_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/te_in.msg', - 'DATA'), - ('_tk_data/ttk/scrollbar.tcl', - '/usr/share/tcltk/tk8.6/ttk/scrollbar.tcl', - 'DATA'), - ('_tcl_data/encoding/iso8859-1.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-1.enc', - 'DATA'), - ('_tcl_data/msgs/pl.msg', '/usr/share/tcltk/tcl8.6/msgs/pl.msg', 'DATA'), - ('_tcl_data/msgs/it.msg', '/usr/share/tcltk/tcl8.6/msgs/it.msg', 'DATA'), - ('_tcl_data/encoding/iso8859-14.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-14.enc', - 'DATA'), - ('_tcl_data/msgs/fo.msg', '/usr/share/tcltk/tcl8.6/msgs/fo.msg', 'DATA'), - ('_tk_data/focus.tcl', '/usr/share/tcltk/tk8.6/focus.tcl', 'DATA'), - ('_tk_data/ttk/button.tcl', '/usr/share/tcltk/tk8.6/ttk/button.tcl', 'DATA'), - ('_tcl_data/msgs/eu_es.msg', - '/usr/share/tcltk/tcl8.6/msgs/eu_es.msg', - 'DATA'), - ('_tk_data/msgs/hu.msg', '/usr/share/tcltk/tk8.6/msgs/hu.msg', 'DATA'), - ('_tcl_data/parray.tcl', '/usr/share/tcltk/tcl8.6/parray.tcl', 'DATA'), - ('_tcl_data/msgs/ar.msg', '/usr/share/tcltk/tcl8.6/msgs/ar.msg', 'DATA'), - ('_tcl_data/msgs/zh_hk.msg', - '/usr/share/tcltk/tcl8.6/msgs/zh_hk.msg', - 'DATA'), - ('_tcl_data/encoding/macUkraine.enc', - '/usr/share/tcltk/tcl8.6/encoding/macUkraine.enc', - 'DATA'), - ('_tcl_data/encoding/cp1256.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1256.enc', - 'DATA'), - ('_tcl_data/encoding/macRomania.enc', - '/usr/share/tcltk/tcl8.6/encoding/macRomania.enc', - 'DATA'), - ('_tcl_data/encoding/macTurkish.enc', - '/usr/share/tcltk/tcl8.6/encoding/macTurkish.enc', - 'DATA'), - ('_tcl_data/encoding/gb1988.enc', - '/usr/share/tcltk/tcl8.6/encoding/gb1988.enc', - 'DATA'), - ('_tcl_data/msgs/uk.msg', '/usr/share/tcltk/tcl8.6/msgs/uk.msg', 'DATA'), - ('_tk_data/tclIndex', '/usr/share/tcltk/tk8.6/tclIndex', 'DATA'), - ('_tk_data/ttk/xpTheme.tcl', - '/usr/share/tcltk/tk8.6/ttk/xpTheme.tcl', - 'DATA'), - ('_tcl_data/msgs/sv.msg', '/usr/share/tcltk/tcl8.6/msgs/sv.msg', 'DATA'), - ('_tcl_data/encoding/iso8859-15.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-15.enc', - 'DATA'), - ('_tcl_data/encoding/iso8859-4.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-4.enc', - 'DATA'), - ('_tcl_data/msgs/hu.msg', '/usr/share/tcltk/tcl8.6/msgs/hu.msg', 'DATA'), - ('_tk_data/spinbox.tcl', '/usr/share/tcltk/tk8.6/spinbox.tcl', 'DATA'), - ('_tk_data/images/pwrdLogo75.gif', - '/usr/share/tcltk/tk8.6/images/pwrdLogo75.gif', - 'DATA'), - ('_tk_data/console.tcl', '/usr/share/tcltk/tk8.6/console.tcl', 'DATA'), - ('_tcl_data/encoding/iso8859-5.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-5.enc', - 'DATA'), - ('_tcl_data/msgs/sk.msg', '/usr/share/tcltk/tcl8.6/msgs/sk.msg', 'DATA'), - ('_tk_data/images/logo100.gif', - '/usr/share/tcltk/tk8.6/images/logo100.gif', - 'DATA'), - ('_tcl_data/encoding/cp737.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp737.enc', - 'DATA'), - ('_tcl_data/tcl8/platform-1.0.19.tm', - '/usr/share/tcltk/tcl8.6/tcl8/platform-1.0.19.tm', - 'DATA'), - ('_tk_data/comdlg.tcl', '/usr/share/tcltk/tk8.6/comdlg.tcl', 'DATA'), - ('_tcl_data/msgs/et.msg', '/usr/share/tcltk/tcl8.6/msgs/et.msg', 'DATA'), - ('_tk_data/scrlbar.tcl', '/usr/share/tcltk/tk8.6/scrlbar.tcl', 'DATA'), - ('_tk_data/entry.tcl', '/usr/share/tcltk/tk8.6/entry.tcl', 'DATA'), - ('_tcl_data/msgs/es.msg', '/usr/share/tcltk/tcl8.6/msgs/es.msg', 'DATA'), - ('_tcl_data/msgs/fa.msg', '/usr/share/tcltk/tcl8.6/msgs/fa.msg', 'DATA'), - ('_tk_data/palette.tcl', '/usr/share/tcltk/tk8.6/palette.tcl', 'DATA'), - ('_tcl_data/encoding/cp866.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp866.enc', - 'DATA'), - ('_tk_data/ttk/entry.tcl', '/usr/share/tcltk/tk8.6/ttk/entry.tcl', 'DATA'), - ('_tk_data/msgs/de.msg', '/usr/share/tcltk/tk8.6/msgs/de.msg', 'DATA'), - ('_tcl_data/msgs/de_be.msg', - '/usr/share/tcltk/tcl8.6/msgs/de_be.msg', - 'DATA'), - ('_tk_data/ttk/defaults.tcl', - '/usr/share/tcltk/tk8.6/ttk/defaults.tcl', - 'DATA'), - ('_tcl_data/encoding/cp1252.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1252.enc', - 'DATA'), - ('_tk_data/text.tcl', '/usr/share/tcltk/tk8.6/text.tcl', 'DATA'), - ('_tk_data/msgs/fi.msg', '/usr/share/tcltk/tk8.6/msgs/fi.msg', 'DATA'), - ('_tk_data/button.tcl', '/usr/share/tcltk/tk8.6/button.tcl', 'DATA'), - ('_tcl_data/encoding/iso8859-11.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-11.enc', - 'DATA'), - ('_tcl_data/msgs/cs.msg', '/usr/share/tcltk/tcl8.6/msgs/cs.msg', 'DATA'), - ('_tcl_data/msgs/es_co.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_co.msg', - 'DATA'), - ('_tk_data/ttk/scale.tcl', '/usr/share/tcltk/tk8.6/ttk/scale.tcl', 'DATA'), - ('_tcl_data/encoding/iso8859-10.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-10.enc', - 'DATA'), - ('_tcl_data/msgs/tr.msg', '/usr/share/tcltk/tcl8.6/msgs/tr.msg', 'DATA'), - ('_tcl_data/msgs/nl_be.msg', - '/usr/share/tcltk/tcl8.6/msgs/nl_be.msg', - 'DATA'), - ('_tcl_data/tclAppInit.c', '/usr/share/tcltk/tcl8.6/tclAppInit.c', 'DATA'), - ('_tcl_data/msgs/ar_sy.msg', - '/usr/share/tcltk/tcl8.6/msgs/ar_sy.msg', - 'DATA'), - ('_tcl_data/msgs/hi.msg', '/usr/share/tcltk/tcl8.6/msgs/hi.msg', 'DATA'), - ('_tcl_data/encoding/shiftjis.enc', - '/usr/share/tcltk/tcl8.6/encoding/shiftjis.enc', - 'DATA'), - ('_tcl_data/encoding/gb2312-raw.enc', - '/usr/share/tcltk/tcl8.6/encoding/gb2312-raw.enc', - 'DATA'), - ('_tk_data/ttk/ttk.tcl', '/usr/share/tcltk/tk8.6/ttk/ttk.tcl', 'DATA'), - ('_tcl_data/msgs/mk.msg', '/usr/share/tcltk/tcl8.6/msgs/mk.msg', 'DATA'), - ('_tcl_data/encoding/koi8-u.enc', - '/usr/share/tcltk/tcl8.6/encoding/koi8-u.enc', - 'DATA'), - ('_tcl_data/encoding/cp775.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp775.enc', - 'DATA'), - ('_tcl_data/msgs/es_mx.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_mx.msg', - 'DATA'), - ('_tcl_data/encoding/iso8859-2.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-2.enc', - 'DATA'), - ('_tcl_data/encoding/euc-cn.enc', - '/usr/share/tcltk/tcl8.6/encoding/euc-cn.enc', - 'DATA'), - ('_tcl_data/msgs/pt.msg', '/usr/share/tcltk/tcl8.6/msgs/pt.msg', 'DATA'), - ('_tcl_data/msgs/nl.msg', '/usr/share/tcltk/tcl8.6/msgs/nl.msg', 'DATA'), - ('_tcl_data/msgs/en_gb.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_gb.msg', - 'DATA'), - ('_tcl_data/encoding/cp1251.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1251.enc', - 'DATA'), - ('_tcl_data/msgs/th.msg', '/usr/share/tcltk/tcl8.6/msgs/th.msg', 'DATA'), - ('_tk_data/dialog.tcl', '/usr/share/tcltk/tk8.6/dialog.tcl', 'DATA'), - ('_tcl_data/msgs/fr_ch.msg', - '/usr/share/tcltk/tcl8.6/msgs/fr_ch.msg', - 'DATA'), - ('_tcl_data/encoding/iso8859-9.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-9.enc', - 'DATA'), - ('_tcl_data/msgs/nn.msg', '/usr/share/tcltk/tcl8.6/msgs/nn.msg', 'DATA'), - ('_tcl_data/msgs/eu.msg', '/usr/share/tcltk/tcl8.6/msgs/eu.msg', 'DATA'), - ('_tcl_data/msgs/ms.msg', '/usr/share/tcltk/tcl8.6/msgs/ms.msg', 'DATA'), - ('_tk_data/msgbox.tcl', '/usr/share/tcltk/tk8.6/msgbox.tcl', 'DATA'), - ('_tcl_data/http1.0/http.tcl', - '/usr/share/tcltk/tcl8.6/http1.0/http.tcl', - 'DATA'), - ('_tcl_data/encoding/cp862.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp862.enc', - 'DATA'), - ('_tcl_data/msgs/gv.msg', '/usr/share/tcltk/tcl8.6/msgs/gv.msg', 'DATA'), - ('_tcl_data/encoding/iso8859-8.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-8.enc', - 'DATA'), - ('_tk_data/ttk/altTheme.tcl', - '/usr/share/tcltk/tk8.6/ttk/altTheme.tcl', - 'DATA'), - ('_tcl_data/msgs/ko.msg', '/usr/share/tcltk/tcl8.6/msgs/ko.msg', 'DATA'), - ('_tcl_data/encoding/cns11643.enc', - '/usr/share/tcltk/tcl8.6/encoding/cns11643.enc', - 'DATA'), - ('_tcl_data/encoding/cp1257.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1257.enc', - 'DATA'), - ('_tcl_data/encoding/symbol.enc', - '/usr/share/tcltk/tcl8.6/encoding/symbol.enc', - 'DATA'), - ('_tcl_data/safe.tcl', '/usr/share/tcltk/tcl8.6/safe.tcl', 'DATA'), - ('_tcl_data/msgs/gl_es.msg', - '/usr/share/tcltk/tcl8.6/msgs/gl_es.msg', - 'DATA'), - ('_tcl_data/msgs/en_au.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_au.msg', - 'DATA'), - ('_tcl_data/encoding/cp1258.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1258.enc', - 'DATA'), - ('_tcl_data/msgs/es_bo.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_bo.msg', - 'DATA'), - ('_tcl_data/msgs/bn_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/bn_in.msg', - 'DATA'), - ('_tcl_data/msgs/te.msg', '/usr/share/tcltk/tcl8.6/msgs/te.msg', 'DATA'), - ('_tcl_data/msgs/fa_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/fa_in.msg', - 'DATA'), - ('_tcl_data/msgs/es_hn.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_hn.msg', - 'DATA'), - ('_tcl_data/msgs/id_id.msg', - '/usr/share/tcltk/tcl8.6/msgs/id_id.msg', - 'DATA'), - ('_tk_data/megawidget.tcl', '/usr/share/tcltk/tk8.6/megawidget.tcl', 'DATA'), - ('_tcl_data/msgs/es_gt.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_gt.msg', - 'DATA'), - ('_tk_data/ttk/utils.tcl', '/usr/share/tcltk/tk8.6/ttk/utils.tcl', 'DATA'), - ('_tk_data/listbox.tcl', '/usr/share/tcltk/tk8.6/listbox.tcl', 'DATA'), - ('_tcl_data/encoding/macThai.enc', - '/usr/share/tcltk/tcl8.6/encoding/macThai.enc', - 'DATA'), - ('_tk_data/ttk/panedwindow.tcl', - '/usr/share/tcltk/tk8.6/ttk/panedwindow.tcl', - 'DATA'), - ('_tcl_data/encoding/macJapan.enc', - '/usr/share/tcltk/tcl8.6/encoding/macJapan.enc', - 'DATA'), - ('_tcl_data/msgs/sh.msg', '/usr/share/tcltk/tcl8.6/msgs/sh.msg', 'DATA'), - ('_tcl_data/encoding/iso8859-6.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-6.enc', - 'DATA'), - ('_tcl_data/encoding/cp863.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp863.enc', - 'DATA'), - ('_tcl_data/msgs/bg.msg', '/usr/share/tcltk/tcl8.6/msgs/bg.msg', 'DATA'), - ('_tk_data/msgs/en.msg', '/usr/share/tcltk/tk8.6/msgs/en.msg', 'DATA'), - ('_tcl_data/msgs/ca.msg', '/usr/share/tcltk/tcl8.6/msgs/ca.msg', 'DATA'), - ('_tcl_data/encoding/cp1254.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1254.enc', - 'DATA'), - ('_tk_data/ttk/clamTheme.tcl', - '/usr/share/tcltk/tk8.6/ttk/clamTheme.tcl', - 'DATA'), - ('_tcl_data/encoding/ksc5601.enc', - '/usr/share/tcltk/tcl8.6/encoding/ksc5601.enc', - 'DATA'), - ('_tcl_data/msgs/en_za.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_za.msg', - 'DATA'), - ('_tcl_data/auto.tcl', '/usr/share/tcltk/tcl8.6/auto.tcl', 'DATA'), - ('_tk_data/ttk/spinbox.tcl', - '/usr/share/tcltk/tk8.6/ttk/spinbox.tcl', - 'DATA'), - ('_tcl_data/msgs/ta_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/ta_in.msg', - 'DATA'), - ('_tcl_data/msgs/mt.msg', '/usr/share/tcltk/tcl8.6/msgs/mt.msg', 'DATA'), - ('_tcl_data/msgs/ga_ie.msg', - '/usr/share/tcltk/tcl8.6/msgs/ga_ie.msg', - 'DATA'), - ('_tcl_data/msgs/sl.msg', '/usr/share/tcltk/tcl8.6/msgs/sl.msg', 'DATA'), - ('_tk_data/mkpsenc.tcl', '/usr/share/tcltk/tk8.6/mkpsenc.tcl', 'DATA'), - ('_tcl_data/msgs/es_ar.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_ar.msg', - 'DATA'), - ('_tk_data/ttk/progress.tcl', - '/usr/share/tcltk/tk8.6/ttk/progress.tcl', - 'DATA'), - ('_tk_data/choosedir.tcl', '/usr/share/tcltk/tk8.6/choosedir.tcl', 'DATA'), - ('_tk_data/ttk/menubutton.tcl', - '/usr/share/tcltk/tk8.6/ttk/menubutton.tcl', - 'DATA'), - ('_tcl_data/msgs/ta.msg', '/usr/share/tcltk/tcl8.6/msgs/ta.msg', 'DATA'), - ('_tcl_data/encoding/cp850.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp850.enc', - 'DATA'), - ('_tcl_data/msgs/mr_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/mr_in.msg', - 'DATA'), - ('_tk_data/msgs/ru.msg', '/usr/share/tcltk/tk8.6/msgs/ru.msg', 'DATA'), - ('_tk_data/optMenu.tcl', '/usr/share/tcltk/tk8.6/optMenu.tcl', 'DATA'), - ('_tk_data/icons.tcl', '/usr/share/tcltk/tk8.6/icons.tcl', 'DATA'), - ('_tcl_data/encoding/cp857.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp857.enc', - 'DATA'), - ('_tcl_data/opt0.4/pkgIndex.tcl', - '/usr/share/tcltk/tcl8.6/opt0.4/pkgIndex.tcl', - 'DATA'), - ('_tk_data/menu.tcl', '/usr/share/tcltk/tk8.6/menu.tcl', 'DATA'), - ('_tk_data/msgs/it.msg', '/usr/share/tcltk/tk8.6/msgs/it.msg', 'DATA'), - ('_tcl_data/encoding/cp932.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp932.enc', - 'DATA'), - ('_tcl_data/msgs/es_pa.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_pa.msg', - 'DATA'), - ('_tk_data/msgs/pt.msg', '/usr/share/tcltk/tk8.6/msgs/pt.msg', 'DATA'), - ('_tk_data/tk.tcl', '/usr/share/tcltk/tk8.6/tk.tcl', 'DATA'), - ('_tcl_data/encoding/iso8859-3.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-3.enc', - 'DATA'), - ('_tk_data/clrpick.tcl', '/usr/share/tcltk/tk8.6/clrpick.tcl', 'DATA'), - ('_tcl_data/msgs/kw_gb.msg', - '/usr/share/tcltk/tcl8.6/msgs/kw_gb.msg', - 'DATA'), - ('_tcl_data/encoding/euc-kr.enc', - '/usr/share/tcltk/tcl8.6/encoding/euc-kr.enc', - 'DATA'), - ('_tk_data/msgs/cs.msg', '/usr/share/tcltk/tk8.6/msgs/cs.msg', 'DATA'), - ('_tcl_data/msgs/es_ec.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_ec.msg', - 'DATA'), - ('_tcl_data/encoding/jis0201.enc', - '/usr/share/tcltk/tcl8.6/encoding/jis0201.enc', - 'DATA'), - ('_tcl_data/msgs/ru.msg', '/usr/share/tcltk/tcl8.6/msgs/ru.msg', 'DATA'), - ('_tcl_data/msgs/fo_fo.msg', - '/usr/share/tcltk/tcl8.6/msgs/fo_fo.msg', - 'DATA'), - ('_tcl_data/clock.tcl', '/usr/share/tcltk/tcl8.6/clock.tcl', 'DATA'), - ('_tcl_data/msgs/fi.msg', '/usr/share/tcltk/tcl8.6/msgs/fi.msg', 'DATA'), - ('_tcl_data/encoding/cp852.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp852.enc', - 'DATA'), - ('_tcl_data/encoding/ascii.enc', - '/usr/share/tcltk/tcl8.6/encoding/ascii.enc', - 'DATA'), - ('_tcl_data/msgs/af_za.msg', - '/usr/share/tcltk/tcl8.6/msgs/af_za.msg', - 'DATA'), - ('_tk_data/ttk/classicTheme.tcl', - '/usr/share/tcltk/tk8.6/ttk/classicTheme.tcl', - 'DATA'), - ('_tcl_data/encoding/koi8-r.enc', - '/usr/share/tcltk/tcl8.6/encoding/koi8-r.enc', - 'DATA'), - ('_tcl_data/msgs/eo.msg', '/usr/share/tcltk/tcl8.6/msgs/eo.msg', 'DATA'), - ('_tcl_data/msgs/zh_cn.msg', - '/usr/share/tcltk/tcl8.6/msgs/zh_cn.msg', - 'DATA'), - ('_tk_data/ttk/treeview.tcl', - '/usr/share/tcltk/tk8.6/ttk/treeview.tcl', - 'DATA'), - ('_tcl_data/tcl8/tcltest-2.5.7.tm', - '/usr/share/tcltk/tcl8.6/tcl8/tcltest-2.5.7.tm', - 'DATA'), - ('_tcl_data/msgs/es_pe.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_pe.msg', - 'DATA'), - ('_tcl_data/msgs/ko_kr.msg', - '/usr/share/tcltk/tcl8.6/msgs/ko_kr.msg', - 'DATA'), - ('_tcl_data/msgs/ar_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/ar_in.msg', - 'DATA'), - ('_tcl_data/msgs/ar_jo.msg', - '/usr/share/tcltk/tcl8.6/msgs/ar_jo.msg', - 'DATA'), - ('_tcl_data/msgs/en_nz.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_nz.msg', - 'DATA'), - ('_tk_data/msgs/fr.msg', '/usr/share/tcltk/tk8.6/msgs/fr.msg', 'DATA'), - ('_tcl_data/encoding/cp874.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp874.enc', - 'DATA'), - ('_tcl_data/encoding/cp1250.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1250.enc', - 'DATA'), - ('_tcl_data/msgs/es_ni.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_ni.msg', - 'DATA'), - ('_tk_data/ttk/cursors.tcl', - '/usr/share/tcltk/tk8.6/ttk/cursors.tcl', - 'DATA'), - ('_tk_data/tkfbox.tcl', '/usr/share/tcltk/tk8.6/tkfbox.tcl', 'DATA'), - ('_tcl_data/msgs/gv_gb.msg', - '/usr/share/tcltk/tcl8.6/msgs/gv_gb.msg', - 'DATA'), - ('_tk_data/panedwindow.tcl', - '/usr/share/tcltk/tk8.6/panedwindow.tcl', - 'DATA'), - ('_tk_data/msgs/en_gb.msg', '/usr/share/tcltk/tk8.6/msgs/en_gb.msg', 'DATA'), - ('_tcl_data/tm.tcl', '/usr/share/tcltk/tcl8.6/tm.tcl', 'DATA'), - ('_tk_data/ttk/combobox.tcl', - '/usr/share/tcltk/tk8.6/ttk/combobox.tcl', - 'DATA'), - ('_tcl_data/encoding/iso8859-16.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-16.enc', - 'DATA'), - ('_tk_data/images/logo64.gif', - '/usr/share/tcltk/tk8.6/images/logo64.gif', - 'DATA'), - ('_tk_data/msgs/es.msg', '/usr/share/tcltk/tk8.6/msgs/es.msg', 'DATA'), - ('_tcl_data/msgs/en_ie.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_ie.msg', - 'DATA'), - ('_tcl_data/msgs/en_sg.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_sg.msg', - 'DATA'), - ('_tcl_data/encoding/cp855.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp855.enc', - 'DATA'), - ('_tcl_data/msgs/sw.msg', '/usr/share/tcltk/tcl8.6/msgs/sw.msg', 'DATA'), - ('_tk_data/images/logoMed.gif', - '/usr/share/tcltk/tk8.6/images/logoMed.gif', - 'DATA'), - ('_tcl_data/encoding/macCentEuro.enc', - '/usr/share/tcltk/tcl8.6/encoding/macCentEuro.enc', - 'DATA'), - ('_tk_data/images/pwrdLogo.eps', - '/usr/share/tcltk/tk8.6/images/pwrdLogo.eps', - 'DATA'), - ('_tk_data/images/README', '/usr/share/tcltk/tk8.6/images/README', 'DATA'), - ('_tcl_data/msgs/id.msg', '/usr/share/tcltk/tcl8.6/msgs/id.msg', 'DATA'), - ('_tcl_data/msgs/es_sv.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_sv.msg', - 'DATA'), - ('_tcl_data/encoding/macGreek.enc', - '/usr/share/tcltk/tcl8.6/encoding/macGreek.enc', - 'DATA'), - ('_tcl_data/msgs/es_uy.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_uy.msg', - 'DATA'), - ('_tk_data/ttk/vistaTheme.tcl', - '/usr/share/tcltk/tk8.6/ttk/vistaTheme.tcl', - 'DATA'), - ('_tcl_data/msgs/da.msg', '/usr/share/tcltk/tcl8.6/msgs/da.msg', 'DATA'), - ('_tcl_data/msgs/lt.msg', '/usr/share/tcltk/tcl8.6/msgs/lt.msg', 'DATA'), - ('_tcl_data/msgs/es_cr.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_cr.msg', - 'DATA'), - ('_tcl_data/encoding/euc-jp.enc', - '/usr/share/tcltk/tcl8.6/encoding/euc-jp.enc', - 'DATA'), - ('_tcl_data/msgs/zh.msg', '/usr/share/tcltk/tcl8.6/msgs/zh.msg', 'DATA'), - ('_tcl_data/encoding/cp869.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp869.enc', - 'DATA'), - ('_tcl_data/http1.0/pkgIndex.tcl', - '/usr/share/tcltk/tcl8.6/http1.0/pkgIndex.tcl', - 'DATA'), - ('_tcl_data/tcl8/http-2.9.8.tm', - '/usr/share/tcltk/tcl8.6/tcl8/http-2.9.8.tm', - 'DATA'), - ('_tk_data/obsolete.tcl', '/usr/share/tcltk/tk8.6/obsolete.tcl', 'DATA'), - ('_tcl_data/history.tcl', '/usr/share/tcltk/tcl8.6/history.tcl', 'DATA'), - ('_tcl_data/encoding/cp1255.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1255.enc', - 'DATA'), - ('_tcl_data/encoding/gb2312.enc', - '/usr/share/tcltk/tcl8.6/encoding/gb2312.enc', - 'DATA'), - ('_tcl_data/msgs/hi_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/hi_in.msg', - 'DATA'), - ('_tcl_data/msgs/en_ph.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_ph.msg', - 'DATA'), - ('_tcl_data/msgs/is.msg', '/usr/share/tcltk/tcl8.6/msgs/is.msg', 'DATA'), - ('_tcl_data/tcl8/msgcat-1.6.1.tm', - '/usr/share/tcltk/tcl8.6/tcl8/msgcat-1.6.1.tm', - 'DATA'), - ('_tcl_data/encoding/iso2022-kr.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso2022-kr.enc', - 'DATA'), - ('_tcl_data/msgs/zh_tw.msg', - '/usr/share/tcltk/tcl8.6/msgs/zh_tw.msg', - 'DATA'), - ('_tcl_data/msgs/ru_ua.msg', - '/usr/share/tcltk/tcl8.6/msgs/ru_ua.msg', - 'DATA'), - ('_tcl_data/encoding/cp950.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp950.enc', - 'DATA'), - ('_tcl_data/encoding/jis0212.enc', - '/usr/share/tcltk/tcl8.6/encoding/jis0212.enc', - 'DATA'), - ('_tcl_data/msgs/hr.msg', '/usr/share/tcltk/tcl8.6/msgs/hr.msg', 'DATA'), - ('_tk_data/ttk/aquaTheme.tcl', - '/usr/share/tcltk/tk8.6/ttk/aquaTheme.tcl', - 'DATA'), - ('_tk_data/msgs/pl.msg', '/usr/share/tcltk/tk8.6/msgs/pl.msg', 'DATA'), - ('_tk_data/images/tai-ku.gif', - '/usr/share/tcltk/tk8.6/images/tai-ku.gif', - 'DATA'), - ('_tcl_data/encoding/macCyrillic.enc', - '/usr/share/tcltk/tcl8.6/encoding/macCyrillic.enc', - 'DATA'), - ('_tcl_data/tclIndex', '/usr/share/tcltk/tcl8.6/tclIndex', 'DATA'), - ('_tcl_data/encoding/iso2022.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso2022.enc', - 'DATA'), - ('_tcl_data/msgs/nb.msg', '/usr/share/tcltk/tcl8.6/msgs/nb.msg', 'DATA'), - ('_tk_data/images/pwrdLogo100.gif', - '/usr/share/tcltk/tk8.6/images/pwrdLogo100.gif', - 'DATA'), - ('_tcl_data/encoding/cp437.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp437.enc', - 'DATA'), - ('_tcl_data/encoding/cp864.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp864.enc', - 'DATA'), - ('_tcl_data/msgs/es_pr.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_pr.msg', - 'DATA'), - ('_tk_data/images/pwrdLogo175.gif', - '/usr/share/tcltk/tk8.6/images/pwrdLogo175.gif', - 'DATA'), - ('_tk_data/ttk/notebook.tcl', - '/usr/share/tcltk/tk8.6/ttk/notebook.tcl', - 'DATA'), - ('_tcl_data/msgs/ja.msg', '/usr/share/tcltk/tcl8.6/msgs/ja.msg', 'DATA'), - ('_tcl_data/msgs/gl.msg', '/usr/share/tcltk/tcl8.6/msgs/gl.msg', 'DATA'), - ('_tcl_data/msgs/lv.msg', '/usr/share/tcltk/tcl8.6/msgs/lv.msg', 'DATA'), - ('_tcl_data/msgs/mr.msg', '/usr/share/tcltk/tcl8.6/msgs/mr.msg', 'DATA'), - ('_tk_data/unsupported.tcl', - '/usr/share/tcltk/tk8.6/unsupported.tcl', - 'DATA'), - ('_tcl_data/msgs/fr_be.msg', - '/usr/share/tcltk/tcl8.6/msgs/fr_be.msg', - 'DATA'), - ('_tcl_data/encoding/big5.enc', - '/usr/share/tcltk/tcl8.6/encoding/big5.enc', - 'DATA'), - ('_tk_data/msgs/el.msg', '/usr/share/tcltk/tk8.6/msgs/el.msg', 'DATA'), - ('_tcl_data/msgs/es_ve.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_ve.msg', - 'DATA'), - ('_tcl_data/msgs/kw.msg', '/usr/share/tcltk/tcl8.6/msgs/kw.msg', 'DATA'), - ('_tk_data/images/logoLarge.gif', - '/usr/share/tcltk/tk8.6/images/logoLarge.gif', - 'DATA'), - ('_tk_data/ttk/fonts.tcl', '/usr/share/tcltk/tk8.6/ttk/fonts.tcl', 'DATA'), - ('_tcl_data/opt0.4/optparse.tcl', - '/usr/share/tcltk/tcl8.6/opt0.4/optparse.tcl', - 'DATA'), - ('_tk_data/tkAppInit.c', '/usr/share/tcltk/tk8.6/tkAppInit.c', 'DATA'), - ('_tcl_data/word.tcl', '/usr/share/tcltk/tcl8.6/word.tcl', 'DATA'), - ('_tcl_data/msgs/es_do.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_do.msg', - 'DATA'), - ('_tcl_data/msgs/en_hk.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_hk.msg', - 'DATA'), - ('_tk_data/ttk/sizegrip.tcl', - '/usr/share/tcltk/tk8.6/ttk/sizegrip.tcl', - 'DATA'), - ('_tcl_data/msgs/be.msg', '/usr/share/tcltk/tcl8.6/msgs/be.msg', 'DATA'), - ('_tcl_data/msgs/sr.msg', '/usr/share/tcltk/tcl8.6/msgs/sr.msg', 'DATA'), - ('_tk_data/images/pwrdLogo200.gif', - '/usr/share/tcltk/tk8.6/images/pwrdLogo200.gif', - 'DATA'), - ('_tcl_data/msgs/en_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_in.msg', - 'DATA'), - ('_tk_data/bgerror.tcl', '/usr/share/tcltk/tk8.6/bgerror.tcl', 'DATA'), - ('_tcl_data/msgs/de.msg', '/usr/share/tcltk/tcl8.6/msgs/de.msg', 'DATA'), - ('_tcl_data/msgs/ar_lb.msg', - '/usr/share/tcltk/tcl8.6/msgs/ar_lb.msg', - 'DATA'), - ('_tcl_data/msgs/zh_sg.msg', - '/usr/share/tcltk/tcl8.6/msgs/zh_sg.msg', - 'DATA'), - ('_tcl_data/msgs/en_be.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_be.msg', - 'DATA'), - ('_tk_data/msgs/sv.msg', '/usr/share/tcltk/tk8.6/msgs/sv.msg', 'DATA'), - ('_tcl_data/encoding/cp865.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp865.enc', - 'DATA'), - ('_tcl_data/package.tcl', '/usr/share/tcltk/tcl8.6/package.tcl', 'DATA'), - ('_tcl_data/encoding/tis-620.enc', - '/usr/share/tcltk/tcl8.6/encoding/tis-620.enc', - 'DATA'), - ('_tcl_data/msgs/kl_gl.msg', - '/usr/share/tcltk/tcl8.6/msgs/kl_gl.msg', - 'DATA'), - ('_tcl_data/encoding/cp860.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp860.enc', - 'DATA'), - ('_tk_data/images/pwrdLogo150.gif', - '/usr/share/tcltk/tk8.6/images/pwrdLogo150.gif', - 'DATA'), - ('_tcl_data/msgs/kok.msg', '/usr/share/tcltk/tcl8.6/msgs/kok.msg', 'DATA'), - ('_tk_data/iconlist.tcl', '/usr/share/tcltk/tk8.6/iconlist.tcl', 'DATA'), - ('_tcl_data/msgs/en_zw.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_zw.msg', - 'DATA'), - ('_tk_data/xmfbox.tcl', '/usr/share/tcltk/tk8.6/xmfbox.tcl', 'DATA'), - ('_tcl_data/tcl8/platform/shell-1.1.4.tm', - '/usr/share/tcltk/tcl8.6/tcl8/platform/shell-1.1.4.tm', - 'DATA'), - ('_tcl_data/msgs/ga.msg', '/usr/share/tcltk/tcl8.6/msgs/ga.msg', 'DATA'), - ('_tcl_data/msgs/de_at.msg', - '/usr/share/tcltk/tcl8.6/msgs/de_at.msg', - 'DATA'), - ('_tk_data/fontchooser.tcl', - '/usr/share/tcltk/tk8.6/fontchooser.tcl', - 'DATA'), - ('_tcl_data/msgs/pt_br.msg', - '/usr/share/tcltk/tcl8.6/msgs/pt_br.msg', - 'DATA'), - ('_tcl_data/encoding/macDingbats.enc', - '/usr/share/tcltk/tcl8.6/encoding/macDingbats.enc', - 'DATA'), - ('_tk_data/tearoff.tcl', '/usr/share/tcltk/tk8.6/tearoff.tcl', 'DATA'), - ('_tcl_data/encoding/iso8859-13.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-13.enc', - 'DATA'), - ('_tk_data/msgs/nl.msg', '/usr/share/tcltk/tk8.6/msgs/nl.msg', 'DATA'), - ('_tcl_data/msgs/ro.msg', '/usr/share/tcltk/tcl8.6/msgs/ro.msg', 'DATA'), - ('_tk_data/msgs/eo.msg', '/usr/share/tcltk/tk8.6/msgs/eo.msg', 'DATA'), - ('_tcl_data/encoding/cp1253.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1253.enc', - 'DATA'), - ('_tcl_data/encoding/macRoman.enc', - '/usr/share/tcltk/tcl8.6/encoding/macRoman.enc', - 'DATA'), - ('_tcl_data/encoding/macCroatian.enc', - '/usr/share/tcltk/tcl8.6/encoding/macCroatian.enc', - 'DATA'), - ('_tcl_data/encoding/ebcdic.enc', - '/usr/share/tcltk/tcl8.6/encoding/ebcdic.enc', - 'DATA'), - ('_tcl_data/msgs/kok_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/kok_in.msg', - 'DATA'), - ('_tcl_data/encoding/gb12345.enc', - '/usr/share/tcltk/tcl8.6/encoding/gb12345.enc', - 'DATA'), - ('_tcl_data/msgs/he.msg', '/usr/share/tcltk/tcl8.6/msgs/he.msg', 'DATA'), - ('_tcl_data/msgs/kl.msg', '/usr/share/tcltk/tcl8.6/msgs/kl.msg', 'DATA'), - ('_tcl_data/encoding/jis0208.enc', - '/usr/share/tcltk/tcl8.6/encoding/jis0208.enc', - 'DATA'), - ('_tcl_data/init.tcl', '/usr/share/tcltk/tcl8.6/init.tcl', 'DATA'), - ('_tk_data/msgs/da.msg', '/usr/share/tcltk/tk8.6/msgs/da.msg', 'DATA'), - ('_tcl_data/msgs/fr_ca.msg', - '/usr/share/tcltk/tcl8.6/msgs/fr_ca.msg', - 'DATA'), - ('_tcl_data/encoding/iso8859-7.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-7.enc', - 'DATA'), - ('_tcl_data/msgs/ms_my.msg', - '/usr/share/tcltk/tcl8.6/msgs/ms_my.msg', - 'DATA'), - ('_tk_data/scale.tcl', '/usr/share/tcltk/tk8.6/scale.tcl', 'DATA'), - ('_tcl_data/msgs/bn.msg', '/usr/share/tcltk/tcl8.6/msgs/bn.msg', 'DATA'), - ('_tcl_data/encoding/macIceland.enc', - '/usr/share/tcltk/tcl8.6/encoding/macIceland.enc', - 'DATA'), - ('_tcl_data/msgs/sq.msg', '/usr/share/tcltk/tcl8.6/msgs/sq.msg', 'DATA'), - ('_tk_data/msgs/zh_cn.msg', '/usr/share/tcltk/tk8.6/msgs/zh_cn.msg', 'DATA'), - ('_tcl_data/msgs/es_py.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_py.msg', - 'DATA'), - ('_tcl_data/msgs/fr.msg', '/usr/share/tcltk/tcl8.6/msgs/fr.msg', 'DATA'), - ('_tcl_data/msgs/el.msg', '/usr/share/tcltk/tcl8.6/msgs/el.msg', 'DATA'), - ('_tk_data/safetk.tcl', '/usr/share/tcltk/tk8.6/safetk.tcl', 'DATA'), - ('_tcl_data/encoding/cp936.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp936.enc', - 'DATA'), - ('_tk_data/images/logo.eps', - '/usr/share/tcltk/tk8.6/images/logo.eps', - 'DATA'), - ('_tcl_data/msgs/it_ch.msg', - '/usr/share/tcltk/tcl8.6/msgs/it_ch.msg', - 'DATA'), - ('_tcl_data/msgs/af.msg', '/usr/share/tcltk/tcl8.6/msgs/af.msg', 'DATA'), - ('_tcl_data/encoding/cp861.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp861.enc', - 'DATA'), - ('_tk_data/ttk/winTheme.tcl', - '/usr/share/tcltk/tk8.6/ttk/winTheme.tcl', - 'DATA'), - ('_tcl_data/msgs/vi.msg', '/usr/share/tcltk/tcl8.6/msgs/vi.msg', 'DATA'), - ('_tcl_data/encoding/iso2022-jp.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso2022-jp.enc', - 'DATA'), - ('_tcl_data/msgs/fa_ir.msg', - '/usr/share/tcltk/tcl8.6/msgs/fa_ir.msg', - 'DATA'), - ('_tcl_data/msgs/en_bw.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_bw.msg', - 'DATA'), - ('setuptools/_vendor/importlib_metadata-8.7.1.dist-info/top_level.txt', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/top_level.txt', - 'DATA'), - ('setuptools/_vendor/importlib_metadata-8.7.1.dist-info/WHEEL', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/WHEEL', - 'DATA'), - ('setuptools/_vendor/importlib_metadata-8.7.1.dist-info/licenses/LICENSE', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/licenses/LICENSE', - 'DATA'), - ('setuptools/_vendor/importlib_metadata-8.7.1.dist-info/REQUESTED', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/REQUESTED', - 'DATA'), - ('setuptools/_vendor/importlib_metadata-8.7.1.dist-info/INSTALLER', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/INSTALLER', - 'DATA'), - ('setuptools/_vendor/importlib_metadata-8.7.1.dist-info/METADATA', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/METADATA', - 'DATA'), - ('setuptools/_vendor/importlib_metadata-8.7.1.dist-info/RECORD', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/RECORD', - 'DATA'), - ('setuptools/_vendor/jaraco/text/Lorem ipsum.txt', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/jaraco/text/Lorem ' - 'ipsum.txt', - 'DATA'), - ('certifi/py.typed', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/certifi/py.typed', - 'DATA'), - ('certifi/cacert.pem', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/certifi/cacert.pem', - 'DATA'), - ('base_library.zip', - '/home/borderban/Рабочий стол/client-py/build/FactorioSync/base_library.zip', - 'DATA')], - [('copyreg', '/usr/lib/python3.12/copyreg.py', 'PYMODULE'), - ('re._parser', '/usr/lib/python3.12/re/_parser.py', 'PYMODULE'), - ('re._constants', '/usr/lib/python3.12/re/_constants.py', 'PYMODULE'), - ('re._compiler', '/usr/lib/python3.12/re/_compiler.py', 'PYMODULE'), - ('re._casefix', '/usr/lib/python3.12/re/_casefix.py', 'PYMODULE'), - ('re', '/usr/lib/python3.12/re/__init__.py', 'PYMODULE'), - ('locale', '/usr/lib/python3.12/locale.py', 'PYMODULE'), - ('sre_parse', '/usr/lib/python3.12/sre_parse.py', 'PYMODULE'), - ('encodings.zlib_codec', - '/usr/lib/python3.12/encodings/zlib_codec.py', - 'PYMODULE'), - ('encodings.uu_codec', - '/usr/lib/python3.12/encodings/uu_codec.py', - 'PYMODULE'), - ('encodings.utf_8_sig', - '/usr/lib/python3.12/encodings/utf_8_sig.py', - 'PYMODULE'), - ('encodings.utf_8', '/usr/lib/python3.12/encodings/utf_8.py', 'PYMODULE'), - ('encodings.utf_7', '/usr/lib/python3.12/encodings/utf_7.py', 'PYMODULE'), - ('encodings.utf_32_le', - '/usr/lib/python3.12/encodings/utf_32_le.py', - 'PYMODULE'), - ('encodings.utf_32_be', - '/usr/lib/python3.12/encodings/utf_32_be.py', - 'PYMODULE'), - ('encodings.utf_32', '/usr/lib/python3.12/encodings/utf_32.py', 'PYMODULE'), - ('encodings.utf_16_le', - '/usr/lib/python3.12/encodings/utf_16_le.py', - 'PYMODULE'), - ('encodings.utf_16_be', - '/usr/lib/python3.12/encodings/utf_16_be.py', - 'PYMODULE'), - ('encodings.utf_16', '/usr/lib/python3.12/encodings/utf_16.py', 'PYMODULE'), - ('encodings.unicode_escape', - '/usr/lib/python3.12/encodings/unicode_escape.py', - 'PYMODULE'), - ('encodings.undefined', - '/usr/lib/python3.12/encodings/undefined.py', - 'PYMODULE'), - ('encodings.tis_620', '/usr/lib/python3.12/encodings/tis_620.py', 'PYMODULE'), - ('encodings.shift_jisx0213', - '/usr/lib/python3.12/encodings/shift_jisx0213.py', - 'PYMODULE'), - ('encodings.shift_jis_2004', - '/usr/lib/python3.12/encodings/shift_jis_2004.py', - 'PYMODULE'), - ('encodings.shift_jis', - '/usr/lib/python3.12/encodings/shift_jis.py', - 'PYMODULE'), - ('encodings.rot_13', '/usr/lib/python3.12/encodings/rot_13.py', 'PYMODULE'), - ('encodings.raw_unicode_escape', - '/usr/lib/python3.12/encodings/raw_unicode_escape.py', - 'PYMODULE'), - ('encodings.quopri_codec', - '/usr/lib/python3.12/encodings/quopri_codec.py', - 'PYMODULE'), - ('encodings.punycode', - '/usr/lib/python3.12/encodings/punycode.py', - 'PYMODULE'), - ('encodings.ptcp154', '/usr/lib/python3.12/encodings/ptcp154.py', 'PYMODULE'), - ('encodings.palmos', '/usr/lib/python3.12/encodings/palmos.py', 'PYMODULE'), - ('encodings.oem', '/usr/lib/python3.12/encodings/oem.py', 'PYMODULE'), - ('encodings.mbcs', '/usr/lib/python3.12/encodings/mbcs.py', 'PYMODULE'), - ('encodings.mac_turkish', - '/usr/lib/python3.12/encodings/mac_turkish.py', - 'PYMODULE'), - ('encodings.mac_romanian', - '/usr/lib/python3.12/encodings/mac_romanian.py', - 'PYMODULE'), - ('encodings.mac_roman', - '/usr/lib/python3.12/encodings/mac_roman.py', - 'PYMODULE'), - ('encodings.mac_latin2', - '/usr/lib/python3.12/encodings/mac_latin2.py', - 'PYMODULE'), - ('encodings.mac_iceland', - '/usr/lib/python3.12/encodings/mac_iceland.py', - 'PYMODULE'), - ('encodings.mac_greek', - '/usr/lib/python3.12/encodings/mac_greek.py', - 'PYMODULE'), - ('encodings.mac_farsi', - '/usr/lib/python3.12/encodings/mac_farsi.py', - 'PYMODULE'), - ('encodings.mac_cyrillic', - '/usr/lib/python3.12/encodings/mac_cyrillic.py', - 'PYMODULE'), - ('encodings.mac_croatian', - '/usr/lib/python3.12/encodings/mac_croatian.py', - 'PYMODULE'), - ('encodings.mac_arabic', - '/usr/lib/python3.12/encodings/mac_arabic.py', - 'PYMODULE'), - ('encodings.latin_1', '/usr/lib/python3.12/encodings/latin_1.py', 'PYMODULE'), - ('encodings.kz1048', '/usr/lib/python3.12/encodings/kz1048.py', 'PYMODULE'), - ('encodings.koi8_u', '/usr/lib/python3.12/encodings/koi8_u.py', 'PYMODULE'), - ('encodings.koi8_t', '/usr/lib/python3.12/encodings/koi8_t.py', 'PYMODULE'), - ('encodings.koi8_r', '/usr/lib/python3.12/encodings/koi8_r.py', 'PYMODULE'), - ('encodings.johab', '/usr/lib/python3.12/encodings/johab.py', 'PYMODULE'), - ('encodings.iso8859_9', - '/usr/lib/python3.12/encodings/iso8859_9.py', - 'PYMODULE'), - ('encodings.iso8859_8', - '/usr/lib/python3.12/encodings/iso8859_8.py', - 'PYMODULE'), - ('encodings.iso8859_7', - '/usr/lib/python3.12/encodings/iso8859_7.py', - 'PYMODULE'), - ('encodings.iso8859_6', - '/usr/lib/python3.12/encodings/iso8859_6.py', - 'PYMODULE'), - ('encodings.iso8859_5', - '/usr/lib/python3.12/encodings/iso8859_5.py', - 'PYMODULE'), - ('encodings.iso8859_4', - '/usr/lib/python3.12/encodings/iso8859_4.py', - 'PYMODULE'), - ('encodings.iso8859_3', - '/usr/lib/python3.12/encodings/iso8859_3.py', - 'PYMODULE'), - ('encodings.iso8859_2', - '/usr/lib/python3.12/encodings/iso8859_2.py', - 'PYMODULE'), - ('encodings.iso8859_16', - '/usr/lib/python3.12/encodings/iso8859_16.py', - 'PYMODULE'), - ('encodings.iso8859_15', - '/usr/lib/python3.12/encodings/iso8859_15.py', - 'PYMODULE'), - ('encodings.iso8859_14', - '/usr/lib/python3.12/encodings/iso8859_14.py', - 'PYMODULE'), - ('encodings.iso8859_13', - '/usr/lib/python3.12/encodings/iso8859_13.py', - 'PYMODULE'), - ('encodings.iso8859_11', - '/usr/lib/python3.12/encodings/iso8859_11.py', - 'PYMODULE'), - ('encodings.iso8859_10', - '/usr/lib/python3.12/encodings/iso8859_10.py', - 'PYMODULE'), - ('encodings.iso8859_1', - '/usr/lib/python3.12/encodings/iso8859_1.py', - 'PYMODULE'), - ('encodings.iso2022_kr', - '/usr/lib/python3.12/encodings/iso2022_kr.py', - 'PYMODULE'), - ('encodings.iso2022_jp_ext', - '/usr/lib/python3.12/encodings/iso2022_jp_ext.py', - 'PYMODULE'), - ('encodings.iso2022_jp_3', - '/usr/lib/python3.12/encodings/iso2022_jp_3.py', - 'PYMODULE'), - ('encodings.iso2022_jp_2004', - '/usr/lib/python3.12/encodings/iso2022_jp_2004.py', - 'PYMODULE'), - ('encodings.iso2022_jp_2', - '/usr/lib/python3.12/encodings/iso2022_jp_2.py', - 'PYMODULE'), - ('encodings.iso2022_jp_1', - '/usr/lib/python3.12/encodings/iso2022_jp_1.py', - 'PYMODULE'), - ('encodings.iso2022_jp', - '/usr/lib/python3.12/encodings/iso2022_jp.py', - 'PYMODULE'), - ('encodings.idna', '/usr/lib/python3.12/encodings/idna.py', 'PYMODULE'), - ('encodings.hz', '/usr/lib/python3.12/encodings/hz.py', 'PYMODULE'), - ('encodings.hp_roman8', - '/usr/lib/python3.12/encodings/hp_roman8.py', - 'PYMODULE'), - ('encodings.hex_codec', - '/usr/lib/python3.12/encodings/hex_codec.py', - 'PYMODULE'), - ('encodings.gbk', '/usr/lib/python3.12/encodings/gbk.py', 'PYMODULE'), - ('encodings.gb2312', '/usr/lib/python3.12/encodings/gb2312.py', 'PYMODULE'), - ('encodings.gb18030', '/usr/lib/python3.12/encodings/gb18030.py', 'PYMODULE'), - ('encodings.euc_kr', '/usr/lib/python3.12/encodings/euc_kr.py', 'PYMODULE'), - ('encodings.euc_jp', '/usr/lib/python3.12/encodings/euc_jp.py', 'PYMODULE'), - ('encodings.euc_jisx0213', - '/usr/lib/python3.12/encodings/euc_jisx0213.py', - 'PYMODULE'), - ('encodings.euc_jis_2004', - '/usr/lib/python3.12/encodings/euc_jis_2004.py', - 'PYMODULE'), - ('encodings.cp950', '/usr/lib/python3.12/encodings/cp950.py', 'PYMODULE'), - ('encodings.cp949', '/usr/lib/python3.12/encodings/cp949.py', 'PYMODULE'), - ('encodings.cp932', '/usr/lib/python3.12/encodings/cp932.py', 'PYMODULE'), - ('encodings.cp875', '/usr/lib/python3.12/encodings/cp875.py', 'PYMODULE'), - ('encodings.cp874', '/usr/lib/python3.12/encodings/cp874.py', 'PYMODULE'), - ('encodings.cp869', '/usr/lib/python3.12/encodings/cp869.py', 'PYMODULE'), - ('encodings.cp866', '/usr/lib/python3.12/encodings/cp866.py', 'PYMODULE'), - ('encodings.cp865', '/usr/lib/python3.12/encodings/cp865.py', 'PYMODULE'), - ('encodings.cp864', '/usr/lib/python3.12/encodings/cp864.py', 'PYMODULE'), - ('encodings.cp863', '/usr/lib/python3.12/encodings/cp863.py', 'PYMODULE'), - ('encodings.cp862', '/usr/lib/python3.12/encodings/cp862.py', 'PYMODULE'), - ('encodings.cp861', '/usr/lib/python3.12/encodings/cp861.py', 'PYMODULE'), - ('encodings.cp860', '/usr/lib/python3.12/encodings/cp860.py', 'PYMODULE'), - ('encodings.cp858', '/usr/lib/python3.12/encodings/cp858.py', 'PYMODULE'), - ('encodings.cp857', '/usr/lib/python3.12/encodings/cp857.py', 'PYMODULE'), - ('encodings.cp856', '/usr/lib/python3.12/encodings/cp856.py', 'PYMODULE'), - ('encodings.cp855', '/usr/lib/python3.12/encodings/cp855.py', 'PYMODULE'), - ('encodings.cp852', '/usr/lib/python3.12/encodings/cp852.py', 'PYMODULE'), - ('encodings.cp850', '/usr/lib/python3.12/encodings/cp850.py', 'PYMODULE'), - ('encodings.cp775', '/usr/lib/python3.12/encodings/cp775.py', 'PYMODULE'), - ('encodings.cp737', '/usr/lib/python3.12/encodings/cp737.py', 'PYMODULE'), - ('encodings.cp720', '/usr/lib/python3.12/encodings/cp720.py', 'PYMODULE'), - ('encodings.cp500', '/usr/lib/python3.12/encodings/cp500.py', 'PYMODULE'), - ('encodings.cp437', '/usr/lib/python3.12/encodings/cp437.py', 'PYMODULE'), - ('encodings.cp424', '/usr/lib/python3.12/encodings/cp424.py', 'PYMODULE'), - ('encodings.cp273', '/usr/lib/python3.12/encodings/cp273.py', 'PYMODULE'), - ('encodings.cp1258', '/usr/lib/python3.12/encodings/cp1258.py', 'PYMODULE'), - ('encodings.cp1257', '/usr/lib/python3.12/encodings/cp1257.py', 'PYMODULE'), - ('encodings.cp1256', '/usr/lib/python3.12/encodings/cp1256.py', 'PYMODULE'), - ('encodings.cp1255', '/usr/lib/python3.12/encodings/cp1255.py', 'PYMODULE'), - ('encodings.cp1254', '/usr/lib/python3.12/encodings/cp1254.py', 'PYMODULE'), - ('encodings.cp1253', '/usr/lib/python3.12/encodings/cp1253.py', 'PYMODULE'), - ('encodings.cp1252', '/usr/lib/python3.12/encodings/cp1252.py', 'PYMODULE'), - ('encodings.cp1251', '/usr/lib/python3.12/encodings/cp1251.py', 'PYMODULE'), - ('encodings.cp1250', '/usr/lib/python3.12/encodings/cp1250.py', 'PYMODULE'), - ('encodings.cp1140', '/usr/lib/python3.12/encodings/cp1140.py', 'PYMODULE'), - ('encodings.cp1125', '/usr/lib/python3.12/encodings/cp1125.py', 'PYMODULE'), - ('encodings.cp1026', '/usr/lib/python3.12/encodings/cp1026.py', 'PYMODULE'), - ('encodings.cp1006', '/usr/lib/python3.12/encodings/cp1006.py', 'PYMODULE'), - ('encodings.cp037', '/usr/lib/python3.12/encodings/cp037.py', 'PYMODULE'), - ('encodings.charmap', '/usr/lib/python3.12/encodings/charmap.py', 'PYMODULE'), - ('encodings.bz2_codec', - '/usr/lib/python3.12/encodings/bz2_codec.py', - 'PYMODULE'), - ('encodings.big5hkscs', - '/usr/lib/python3.12/encodings/big5hkscs.py', - 'PYMODULE'), - ('encodings.big5', '/usr/lib/python3.12/encodings/big5.py', 'PYMODULE'), - ('encodings.base64_codec', - '/usr/lib/python3.12/encodings/base64_codec.py', - 'PYMODULE'), - ('encodings.ascii', '/usr/lib/python3.12/encodings/ascii.py', 'PYMODULE'), - ('encodings.aliases', '/usr/lib/python3.12/encodings/aliases.py', 'PYMODULE'), - ('encodings', '/usr/lib/python3.12/encodings/__init__.py', 'PYMODULE'), - ('abc', '/usr/lib/python3.12/abc.py', 'PYMODULE'), - ('warnings', '/usr/lib/python3.12/warnings.py', 'PYMODULE'), - ('weakref', '/usr/lib/python3.12/weakref.py', 'PYMODULE'), - ('operator', '/usr/lib/python3.12/operator.py', 'PYMODULE'), - ('codecs', '/usr/lib/python3.12/codecs.py', 'PYMODULE'), - ('linecache', '/usr/lib/python3.12/linecache.py', 'PYMODULE'), - ('sre_compile', '/usr/lib/python3.12/sre_compile.py', 'PYMODULE'), - ('_weakrefset', '/usr/lib/python3.12/_weakrefset.py', 'PYMODULE'), - ('genericpath', '/usr/lib/python3.12/genericpath.py', 'PYMODULE'), - ('keyword', '/usr/lib/python3.12/keyword.py', 'PYMODULE'), - ('traceback', '/usr/lib/python3.12/traceback.py', 'PYMODULE'), - ('ntpath', '/usr/lib/python3.12/ntpath.py', 'PYMODULE'), - ('collections.abc', '/usr/lib/python3.12/collections/abc.py', 'PYMODULE'), - ('collections', '/usr/lib/python3.12/collections/__init__.py', 'PYMODULE'), - ('sre_constants', '/usr/lib/python3.12/sre_constants.py', 'PYMODULE'), - ('posixpath', '/usr/lib/python3.12/posixpath.py', 'PYMODULE'), - ('enum', '/usr/lib/python3.12/enum.py', 'PYMODULE'), - ('_collections_abc', '/usr/lib/python3.12/_collections_abc.py', 'PYMODULE'), - ('heapq', '/usr/lib/python3.12/heapq.py', 'PYMODULE'), - ('stat', '/usr/lib/python3.12/stat.py', 'PYMODULE'), - ('types', '/usr/lib/python3.12/types.py', 'PYMODULE'), - ('reprlib', '/usr/lib/python3.12/reprlib.py', 'PYMODULE'), - ('io', '/usr/lib/python3.12/io.py', 'PYMODULE'), - ('functools', '/usr/lib/python3.12/functools.py', 'PYMODULE'), - ('os', '/usr/lib/python3.12/os.py', 'PYMODULE')]) diff --git a/build/FactorioSync/EXE-00.toc b/build/FactorioSync/EXE-00.toc deleted file mode 100644 index 9b8172b..0000000 --- a/build/FactorioSync/EXE-00.toc +++ /dev/null @@ -1,921 +0,0 @@ -('/home/borderban/Рабочий стол/client-py/dist/FactorioSync', - False, - False, - False, - None, - None, - False, - False, - None, - True, - False, - None, - None, - None, - '/home/borderban/Рабочий стол/client-py/build/FactorioSync/FactorioSync.pkg', - [('pyi-contents-directory _internal', '', 'OPTION'), - ('PYZ-00.pyz', - '/home/borderban/Рабочий стол/client-py/build/FactorioSync/PYZ-00.pyz', - 'PYZ'), - ('struct', - '/home/borderban/Рабочий ' - 'стол/client-py/build/FactorioSync/localpycs/struct.pyc', - 'PYMODULE'), - ('pyimod01_archive', - '/home/borderban/Рабочий ' - 'стол/client-py/build/FactorioSync/localpycs/pyimod01_archive.pyc', - 'PYMODULE'), - ('pyimod02_importers', - '/home/borderban/Рабочий ' - 'стол/client-py/build/FactorioSync/localpycs/pyimod02_importers.pyc', - 'PYMODULE'), - ('pyimod03_ctypes', - '/home/borderban/Рабочий ' - 'стол/client-py/build/FactorioSync/localpycs/pyimod03_ctypes.pyc', - 'PYMODULE'), - ('pyiboot01_bootstrap', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/PyInstaller/loader/pyiboot01_bootstrap.py', - 'PYSOURCE'), - ('pyi_rth_inspect', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_inspect.py', - 'PYSOURCE'), - ('pyi_rth__tkinter', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth__tkinter.py', - 'PYSOURCE'), - ('pyi_rth_setuptools', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_setuptools.py', - 'PYSOURCE'), - ('pyi_rth_pkgutil', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgutil.py', - 'PYSOURCE'), - ('pyi_rth_multiprocessing', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_multiprocessing.py', - 'PYSOURCE'), - ('client', '/home/borderban/Рабочий стол/client-py/client.py', 'PYSOURCE'), - ('libpython3.12.so.1.0', - '/lib/x86_64-linux-gnu/libpython3.12.so.1.0', - 'BINARY'), - ('python3.12/lib-dynload/_contextvars.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_contextvars.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_decimal.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_decimal.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/resource.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/resource.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_lzma.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_lzma.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_bz2.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_bz2.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_posixshmem.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_posixshmem.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_multiprocessing.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_multiprocessing.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/termios.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/termios.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_ssl.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_ssl.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_hashlib.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_hashlib.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/mmap.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/mmap.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_ctypes.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_ctypes.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_queue.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_queue.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_asyncio.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_asyncio.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/readline.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/readline.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_multibytecodec.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_multibytecodec.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_codecs_jp.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_codecs_jp.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_codecs_kr.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_codecs_kr.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_codecs_iso2022.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_codecs_iso2022.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_codecs_cn.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_codecs_cn.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_codecs_tw.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_codecs_tw.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_codecs_hk.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_codecs_hk.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_tkinter.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_tkinter.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('81d243bd2c585b0f4821__mypyc.cpython-312-x86_64-linux-gnu.so', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/81d243bd2c585b0f4821__mypyc.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('charset_normalizer/cd.cpython-312-x86_64-linux-gnu.so', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/charset_normalizer/cd.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('charset_normalizer/md.cpython-312-x86_64-linux-gnu.so', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_json.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_json.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('libz.so.1', '/lib/x86_64-linux-gnu/libz.so.1', 'BINARY'), - ('libexpat.so.1', '/lib/x86_64-linux-gnu/libexpat.so.1', 'BINARY'), - ('liblzma.so.5', '/lib/x86_64-linux-gnu/liblzma.so.5', 'BINARY'), - ('libbz2.so.1.0', '/lib/x86_64-linux-gnu/libbz2.so.1.0', 'BINARY'), - ('libssl.so.3', '/lib/x86_64-linux-gnu/libssl.so.3', 'BINARY'), - ('libcrypto.so.3', '/lib/x86_64-linux-gnu/libcrypto.so.3', 'BINARY'), - ('libffi.so.8', '/lib/x86_64-linux-gnu/libffi.so.8', 'BINARY'), - ('libreadline.so.8', '/lib/x86_64-linux-gnu/libreadline.so.8', 'BINARY'), - ('libtinfo.so.6', '/lib/x86_64-linux-gnu/libtinfo.so.6', 'BINARY'), - ('libXss.so.1', '/lib/x86_64-linux-gnu/libXss.so.1', 'BINARY'), - ('libbrotlicommon.so.1', - '/lib/x86_64-linux-gnu/libbrotlicommon.so.1', - 'BINARY'), - ('libXext.so.6', '/lib/x86_64-linux-gnu/libXext.so.6', 'BINARY'), - ('libbsd.so.0', '/lib/x86_64-linux-gnu/libbsd.so.0', 'BINARY'), - ('libtcl8.6.so', '/lib/x86_64-linux-gnu/libtcl8.6.so', 'BINARY'), - ('libfreetype.so.6', '/lib/x86_64-linux-gnu/libfreetype.so.6', 'BINARY'), - ('libX11.so.6', '/lib/x86_64-linux-gnu/libX11.so.6', 'BINARY'), - ('libXau.so.6', '/lib/x86_64-linux-gnu/libXau.so.6', 'BINARY'), - ('libbrotlidec.so.1', '/lib/x86_64-linux-gnu/libbrotlidec.so.1', 'BINARY'), - ('libXft.so.2', '/lib/x86_64-linux-gnu/libXft.so.2', 'BINARY'), - ('libmd.so.0', '/lib/x86_64-linux-gnu/libmd.so.0', 'BINARY'), - ('libBLT.2.5.so.8.6', '/lib/libBLT.2.5.so.8.6', 'BINARY'), - ('libpng16.so.16', '/lib/x86_64-linux-gnu/libpng16.so.16', 'BINARY'), - ('libXdmcp.so.6', '/lib/x86_64-linux-gnu/libXdmcp.so.6', 'BINARY'), - ('libfontconfig.so.1', '/lib/x86_64-linux-gnu/libfontconfig.so.1', 'BINARY'), - ('libtk8.6.so', '/lib/x86_64-linux-gnu/libtk8.6.so', 'BINARY'), - ('libXrender.so.1', '/lib/x86_64-linux-gnu/libXrender.so.1', 'BINARY'), - ('_tcl_data/encoding/cp949.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp949.enc', - 'DATA'), - ('_tcl_data/msgs/en_ca.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_ca.msg', - 'DATA'), - ('_tcl_data/msgs/es_cl.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_cl.msg', - 'DATA'), - ('_tcl_data/encoding/dingbats.enc', - '/usr/share/tcltk/tcl8.6/encoding/dingbats.enc', - 'DATA'), - ('_tcl_data/msgs/te_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/te_in.msg', - 'DATA'), - ('_tk_data/ttk/scrollbar.tcl', - '/usr/share/tcltk/tk8.6/ttk/scrollbar.tcl', - 'DATA'), - ('_tcl_data/encoding/iso8859-1.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-1.enc', - 'DATA'), - ('_tcl_data/msgs/pl.msg', '/usr/share/tcltk/tcl8.6/msgs/pl.msg', 'DATA'), - ('_tcl_data/msgs/it.msg', '/usr/share/tcltk/tcl8.6/msgs/it.msg', 'DATA'), - ('_tcl_data/encoding/iso8859-14.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-14.enc', - 'DATA'), - ('_tcl_data/msgs/fo.msg', '/usr/share/tcltk/tcl8.6/msgs/fo.msg', 'DATA'), - ('_tk_data/focus.tcl', '/usr/share/tcltk/tk8.6/focus.tcl', 'DATA'), - ('_tk_data/ttk/button.tcl', '/usr/share/tcltk/tk8.6/ttk/button.tcl', 'DATA'), - ('_tcl_data/msgs/eu_es.msg', - '/usr/share/tcltk/tcl8.6/msgs/eu_es.msg', - 'DATA'), - ('_tk_data/msgs/hu.msg', '/usr/share/tcltk/tk8.6/msgs/hu.msg', 'DATA'), - ('_tcl_data/parray.tcl', '/usr/share/tcltk/tcl8.6/parray.tcl', 'DATA'), - ('_tcl_data/msgs/ar.msg', '/usr/share/tcltk/tcl8.6/msgs/ar.msg', 'DATA'), - ('_tcl_data/msgs/zh_hk.msg', - '/usr/share/tcltk/tcl8.6/msgs/zh_hk.msg', - 'DATA'), - ('_tcl_data/encoding/macUkraine.enc', - '/usr/share/tcltk/tcl8.6/encoding/macUkraine.enc', - 'DATA'), - ('_tcl_data/encoding/cp1256.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1256.enc', - 'DATA'), - ('_tcl_data/encoding/macRomania.enc', - '/usr/share/tcltk/tcl8.6/encoding/macRomania.enc', - 'DATA'), - ('_tcl_data/encoding/macTurkish.enc', - '/usr/share/tcltk/tcl8.6/encoding/macTurkish.enc', - 'DATA'), - ('_tcl_data/encoding/gb1988.enc', - '/usr/share/tcltk/tcl8.6/encoding/gb1988.enc', - 'DATA'), - ('_tcl_data/msgs/uk.msg', '/usr/share/tcltk/tcl8.6/msgs/uk.msg', 'DATA'), - ('_tk_data/tclIndex', '/usr/share/tcltk/tk8.6/tclIndex', 'DATA'), - ('_tk_data/ttk/xpTheme.tcl', - '/usr/share/tcltk/tk8.6/ttk/xpTheme.tcl', - 'DATA'), - ('_tcl_data/msgs/sv.msg', '/usr/share/tcltk/tcl8.6/msgs/sv.msg', 'DATA'), - ('_tcl_data/encoding/iso8859-15.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-15.enc', - 'DATA'), - ('_tcl_data/encoding/iso8859-4.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-4.enc', - 'DATA'), - ('_tcl_data/msgs/hu.msg', '/usr/share/tcltk/tcl8.6/msgs/hu.msg', 'DATA'), - ('_tk_data/spinbox.tcl', '/usr/share/tcltk/tk8.6/spinbox.tcl', 'DATA'), - ('_tk_data/images/pwrdLogo75.gif', - '/usr/share/tcltk/tk8.6/images/pwrdLogo75.gif', - 'DATA'), - ('_tk_data/console.tcl', '/usr/share/tcltk/tk8.6/console.tcl', 'DATA'), - ('_tcl_data/encoding/iso8859-5.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-5.enc', - 'DATA'), - ('_tcl_data/msgs/sk.msg', '/usr/share/tcltk/tcl8.6/msgs/sk.msg', 'DATA'), - ('_tk_data/images/logo100.gif', - '/usr/share/tcltk/tk8.6/images/logo100.gif', - 'DATA'), - ('_tcl_data/encoding/cp737.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp737.enc', - 'DATA'), - ('_tcl_data/tcl8/platform-1.0.19.tm', - '/usr/share/tcltk/tcl8.6/tcl8/platform-1.0.19.tm', - 'DATA'), - ('_tk_data/comdlg.tcl', '/usr/share/tcltk/tk8.6/comdlg.tcl', 'DATA'), - ('_tcl_data/msgs/et.msg', '/usr/share/tcltk/tcl8.6/msgs/et.msg', 'DATA'), - ('_tk_data/scrlbar.tcl', '/usr/share/tcltk/tk8.6/scrlbar.tcl', 'DATA'), - ('_tk_data/entry.tcl', '/usr/share/tcltk/tk8.6/entry.tcl', 'DATA'), - ('_tcl_data/msgs/es.msg', '/usr/share/tcltk/tcl8.6/msgs/es.msg', 'DATA'), - ('_tcl_data/msgs/fa.msg', '/usr/share/tcltk/tcl8.6/msgs/fa.msg', 'DATA'), - ('_tk_data/palette.tcl', '/usr/share/tcltk/tk8.6/palette.tcl', 'DATA'), - ('_tcl_data/encoding/cp866.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp866.enc', - 'DATA'), - ('_tk_data/ttk/entry.tcl', '/usr/share/tcltk/tk8.6/ttk/entry.tcl', 'DATA'), - ('_tk_data/msgs/de.msg', '/usr/share/tcltk/tk8.6/msgs/de.msg', 'DATA'), - ('_tcl_data/msgs/de_be.msg', - '/usr/share/tcltk/tcl8.6/msgs/de_be.msg', - 'DATA'), - ('_tk_data/ttk/defaults.tcl', - '/usr/share/tcltk/tk8.6/ttk/defaults.tcl', - 'DATA'), - ('_tcl_data/encoding/cp1252.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1252.enc', - 'DATA'), - ('_tk_data/text.tcl', '/usr/share/tcltk/tk8.6/text.tcl', 'DATA'), - ('_tk_data/msgs/fi.msg', '/usr/share/tcltk/tk8.6/msgs/fi.msg', 'DATA'), - ('_tk_data/button.tcl', '/usr/share/tcltk/tk8.6/button.tcl', 'DATA'), - ('_tcl_data/encoding/iso8859-11.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-11.enc', - 'DATA'), - ('_tcl_data/msgs/cs.msg', '/usr/share/tcltk/tcl8.6/msgs/cs.msg', 'DATA'), - ('_tcl_data/msgs/es_co.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_co.msg', - 'DATA'), - ('_tk_data/ttk/scale.tcl', '/usr/share/tcltk/tk8.6/ttk/scale.tcl', 'DATA'), - ('_tcl_data/encoding/iso8859-10.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-10.enc', - 'DATA'), - ('_tcl_data/msgs/tr.msg', '/usr/share/tcltk/tcl8.6/msgs/tr.msg', 'DATA'), - ('_tcl_data/msgs/nl_be.msg', - '/usr/share/tcltk/tcl8.6/msgs/nl_be.msg', - 'DATA'), - ('_tcl_data/tclAppInit.c', '/usr/share/tcltk/tcl8.6/tclAppInit.c', 'DATA'), - ('_tcl_data/msgs/ar_sy.msg', - '/usr/share/tcltk/tcl8.6/msgs/ar_sy.msg', - 'DATA'), - ('_tcl_data/msgs/hi.msg', '/usr/share/tcltk/tcl8.6/msgs/hi.msg', 'DATA'), - ('_tcl_data/encoding/shiftjis.enc', - '/usr/share/tcltk/tcl8.6/encoding/shiftjis.enc', - 'DATA'), - ('_tcl_data/encoding/gb2312-raw.enc', - '/usr/share/tcltk/tcl8.6/encoding/gb2312-raw.enc', - 'DATA'), - ('_tk_data/ttk/ttk.tcl', '/usr/share/tcltk/tk8.6/ttk/ttk.tcl', 'DATA'), - ('_tcl_data/msgs/mk.msg', '/usr/share/tcltk/tcl8.6/msgs/mk.msg', 'DATA'), - ('_tcl_data/encoding/koi8-u.enc', - '/usr/share/tcltk/tcl8.6/encoding/koi8-u.enc', - 'DATA'), - ('_tcl_data/encoding/cp775.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp775.enc', - 'DATA'), - ('_tcl_data/msgs/es_mx.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_mx.msg', - 'DATA'), - ('_tcl_data/encoding/iso8859-2.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-2.enc', - 'DATA'), - ('_tcl_data/encoding/euc-cn.enc', - '/usr/share/tcltk/tcl8.6/encoding/euc-cn.enc', - 'DATA'), - ('_tcl_data/msgs/pt.msg', '/usr/share/tcltk/tcl8.6/msgs/pt.msg', 'DATA'), - ('_tcl_data/msgs/nl.msg', '/usr/share/tcltk/tcl8.6/msgs/nl.msg', 'DATA'), - ('_tcl_data/msgs/en_gb.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_gb.msg', - 'DATA'), - ('_tcl_data/encoding/cp1251.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1251.enc', - 'DATA'), - ('_tcl_data/msgs/th.msg', '/usr/share/tcltk/tcl8.6/msgs/th.msg', 'DATA'), - ('_tk_data/dialog.tcl', '/usr/share/tcltk/tk8.6/dialog.tcl', 'DATA'), - ('_tcl_data/msgs/fr_ch.msg', - '/usr/share/tcltk/tcl8.6/msgs/fr_ch.msg', - 'DATA'), - ('_tcl_data/encoding/iso8859-9.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-9.enc', - 'DATA'), - ('_tcl_data/msgs/nn.msg', '/usr/share/tcltk/tcl8.6/msgs/nn.msg', 'DATA'), - ('_tcl_data/msgs/eu.msg', '/usr/share/tcltk/tcl8.6/msgs/eu.msg', 'DATA'), - ('_tcl_data/msgs/ms.msg', '/usr/share/tcltk/tcl8.6/msgs/ms.msg', 'DATA'), - ('_tk_data/msgbox.tcl', '/usr/share/tcltk/tk8.6/msgbox.tcl', 'DATA'), - ('_tcl_data/http1.0/http.tcl', - '/usr/share/tcltk/tcl8.6/http1.0/http.tcl', - 'DATA'), - ('_tcl_data/encoding/cp862.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp862.enc', - 'DATA'), - ('_tcl_data/msgs/gv.msg', '/usr/share/tcltk/tcl8.6/msgs/gv.msg', 'DATA'), - ('_tcl_data/encoding/iso8859-8.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-8.enc', - 'DATA'), - ('_tk_data/ttk/altTheme.tcl', - '/usr/share/tcltk/tk8.6/ttk/altTheme.tcl', - 'DATA'), - ('_tcl_data/msgs/ko.msg', '/usr/share/tcltk/tcl8.6/msgs/ko.msg', 'DATA'), - ('_tcl_data/encoding/cns11643.enc', - '/usr/share/tcltk/tcl8.6/encoding/cns11643.enc', - 'DATA'), - ('_tcl_data/encoding/cp1257.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1257.enc', - 'DATA'), - ('_tcl_data/encoding/symbol.enc', - '/usr/share/tcltk/tcl8.6/encoding/symbol.enc', - 'DATA'), - ('_tcl_data/safe.tcl', '/usr/share/tcltk/tcl8.6/safe.tcl', 'DATA'), - ('_tcl_data/msgs/gl_es.msg', - '/usr/share/tcltk/tcl8.6/msgs/gl_es.msg', - 'DATA'), - ('_tcl_data/msgs/en_au.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_au.msg', - 'DATA'), - ('_tcl_data/encoding/cp1258.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1258.enc', - 'DATA'), - ('_tcl_data/msgs/es_bo.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_bo.msg', - 'DATA'), - ('_tcl_data/msgs/bn_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/bn_in.msg', - 'DATA'), - ('_tcl_data/msgs/te.msg', '/usr/share/tcltk/tcl8.6/msgs/te.msg', 'DATA'), - ('_tcl_data/msgs/fa_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/fa_in.msg', - 'DATA'), - ('_tcl_data/msgs/es_hn.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_hn.msg', - 'DATA'), - ('_tcl_data/msgs/id_id.msg', - '/usr/share/tcltk/tcl8.6/msgs/id_id.msg', - 'DATA'), - ('_tk_data/megawidget.tcl', '/usr/share/tcltk/tk8.6/megawidget.tcl', 'DATA'), - ('_tcl_data/msgs/es_gt.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_gt.msg', - 'DATA'), - ('_tk_data/ttk/utils.tcl', '/usr/share/tcltk/tk8.6/ttk/utils.tcl', 'DATA'), - ('_tk_data/listbox.tcl', '/usr/share/tcltk/tk8.6/listbox.tcl', 'DATA'), - ('_tcl_data/encoding/macThai.enc', - '/usr/share/tcltk/tcl8.6/encoding/macThai.enc', - 'DATA'), - ('_tk_data/ttk/panedwindow.tcl', - '/usr/share/tcltk/tk8.6/ttk/panedwindow.tcl', - 'DATA'), - ('_tcl_data/encoding/macJapan.enc', - '/usr/share/tcltk/tcl8.6/encoding/macJapan.enc', - 'DATA'), - ('_tcl_data/msgs/sh.msg', '/usr/share/tcltk/tcl8.6/msgs/sh.msg', 'DATA'), - ('_tcl_data/encoding/iso8859-6.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-6.enc', - 'DATA'), - ('_tcl_data/encoding/cp863.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp863.enc', - 'DATA'), - ('_tcl_data/msgs/bg.msg', '/usr/share/tcltk/tcl8.6/msgs/bg.msg', 'DATA'), - ('_tk_data/msgs/en.msg', '/usr/share/tcltk/tk8.6/msgs/en.msg', 'DATA'), - ('_tcl_data/msgs/ca.msg', '/usr/share/tcltk/tcl8.6/msgs/ca.msg', 'DATA'), - ('_tcl_data/encoding/cp1254.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1254.enc', - 'DATA'), - ('_tk_data/ttk/clamTheme.tcl', - '/usr/share/tcltk/tk8.6/ttk/clamTheme.tcl', - 'DATA'), - ('_tcl_data/encoding/ksc5601.enc', - '/usr/share/tcltk/tcl8.6/encoding/ksc5601.enc', - 'DATA'), - ('_tcl_data/msgs/en_za.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_za.msg', - 'DATA'), - ('_tcl_data/auto.tcl', '/usr/share/tcltk/tcl8.6/auto.tcl', 'DATA'), - ('_tk_data/ttk/spinbox.tcl', - '/usr/share/tcltk/tk8.6/ttk/spinbox.tcl', - 'DATA'), - ('_tcl_data/msgs/ta_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/ta_in.msg', - 'DATA'), - ('_tcl_data/msgs/mt.msg', '/usr/share/tcltk/tcl8.6/msgs/mt.msg', 'DATA'), - ('_tcl_data/msgs/ga_ie.msg', - '/usr/share/tcltk/tcl8.6/msgs/ga_ie.msg', - 'DATA'), - ('_tcl_data/msgs/sl.msg', '/usr/share/tcltk/tcl8.6/msgs/sl.msg', 'DATA'), - ('_tk_data/mkpsenc.tcl', '/usr/share/tcltk/tk8.6/mkpsenc.tcl', 'DATA'), - ('_tcl_data/msgs/es_ar.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_ar.msg', - 'DATA'), - ('_tk_data/ttk/progress.tcl', - '/usr/share/tcltk/tk8.6/ttk/progress.tcl', - 'DATA'), - ('_tk_data/choosedir.tcl', '/usr/share/tcltk/tk8.6/choosedir.tcl', 'DATA'), - ('_tk_data/ttk/menubutton.tcl', - '/usr/share/tcltk/tk8.6/ttk/menubutton.tcl', - 'DATA'), - ('_tcl_data/msgs/ta.msg', '/usr/share/tcltk/tcl8.6/msgs/ta.msg', 'DATA'), - ('_tcl_data/encoding/cp850.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp850.enc', - 'DATA'), - ('_tcl_data/msgs/mr_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/mr_in.msg', - 'DATA'), - ('_tk_data/msgs/ru.msg', '/usr/share/tcltk/tk8.6/msgs/ru.msg', 'DATA'), - ('_tk_data/optMenu.tcl', '/usr/share/tcltk/tk8.6/optMenu.tcl', 'DATA'), - ('_tk_data/icons.tcl', '/usr/share/tcltk/tk8.6/icons.tcl', 'DATA'), - ('_tcl_data/encoding/cp857.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp857.enc', - 'DATA'), - ('_tcl_data/opt0.4/pkgIndex.tcl', - '/usr/share/tcltk/tcl8.6/opt0.4/pkgIndex.tcl', - 'DATA'), - ('_tk_data/menu.tcl', '/usr/share/tcltk/tk8.6/menu.tcl', 'DATA'), - ('_tk_data/msgs/it.msg', '/usr/share/tcltk/tk8.6/msgs/it.msg', 'DATA'), - ('_tcl_data/encoding/cp932.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp932.enc', - 'DATA'), - ('_tcl_data/msgs/es_pa.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_pa.msg', - 'DATA'), - ('_tk_data/msgs/pt.msg', '/usr/share/tcltk/tk8.6/msgs/pt.msg', 'DATA'), - ('_tk_data/tk.tcl', '/usr/share/tcltk/tk8.6/tk.tcl', 'DATA'), - ('_tcl_data/encoding/iso8859-3.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-3.enc', - 'DATA'), - ('_tk_data/clrpick.tcl', '/usr/share/tcltk/tk8.6/clrpick.tcl', 'DATA'), - ('_tcl_data/msgs/kw_gb.msg', - '/usr/share/tcltk/tcl8.6/msgs/kw_gb.msg', - 'DATA'), - ('_tcl_data/encoding/euc-kr.enc', - '/usr/share/tcltk/tcl8.6/encoding/euc-kr.enc', - 'DATA'), - ('_tk_data/msgs/cs.msg', '/usr/share/tcltk/tk8.6/msgs/cs.msg', 'DATA'), - ('_tcl_data/msgs/es_ec.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_ec.msg', - 'DATA'), - ('_tcl_data/encoding/jis0201.enc', - '/usr/share/tcltk/tcl8.6/encoding/jis0201.enc', - 'DATA'), - ('_tcl_data/msgs/ru.msg', '/usr/share/tcltk/tcl8.6/msgs/ru.msg', 'DATA'), - ('_tcl_data/msgs/fo_fo.msg', - '/usr/share/tcltk/tcl8.6/msgs/fo_fo.msg', - 'DATA'), - ('_tcl_data/clock.tcl', '/usr/share/tcltk/tcl8.6/clock.tcl', 'DATA'), - ('_tcl_data/msgs/fi.msg', '/usr/share/tcltk/tcl8.6/msgs/fi.msg', 'DATA'), - ('_tcl_data/encoding/cp852.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp852.enc', - 'DATA'), - ('_tcl_data/encoding/ascii.enc', - '/usr/share/tcltk/tcl8.6/encoding/ascii.enc', - 'DATA'), - ('_tcl_data/msgs/af_za.msg', - '/usr/share/tcltk/tcl8.6/msgs/af_za.msg', - 'DATA'), - ('_tk_data/ttk/classicTheme.tcl', - '/usr/share/tcltk/tk8.6/ttk/classicTheme.tcl', - 'DATA'), - ('_tcl_data/encoding/koi8-r.enc', - '/usr/share/tcltk/tcl8.6/encoding/koi8-r.enc', - 'DATA'), - ('_tcl_data/msgs/eo.msg', '/usr/share/tcltk/tcl8.6/msgs/eo.msg', 'DATA'), - ('_tcl_data/msgs/zh_cn.msg', - '/usr/share/tcltk/tcl8.6/msgs/zh_cn.msg', - 'DATA'), - ('_tk_data/ttk/treeview.tcl', - '/usr/share/tcltk/tk8.6/ttk/treeview.tcl', - 'DATA'), - ('_tcl_data/tcl8/tcltest-2.5.7.tm', - '/usr/share/tcltk/tcl8.6/tcl8/tcltest-2.5.7.tm', - 'DATA'), - ('_tcl_data/msgs/es_pe.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_pe.msg', - 'DATA'), - ('_tcl_data/msgs/ko_kr.msg', - '/usr/share/tcltk/tcl8.6/msgs/ko_kr.msg', - 'DATA'), - ('_tcl_data/msgs/ar_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/ar_in.msg', - 'DATA'), - ('_tcl_data/msgs/ar_jo.msg', - '/usr/share/tcltk/tcl8.6/msgs/ar_jo.msg', - 'DATA'), - ('_tcl_data/msgs/en_nz.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_nz.msg', - 'DATA'), - ('_tk_data/msgs/fr.msg', '/usr/share/tcltk/tk8.6/msgs/fr.msg', 'DATA'), - ('_tcl_data/encoding/cp874.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp874.enc', - 'DATA'), - ('_tcl_data/encoding/cp1250.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1250.enc', - 'DATA'), - ('_tcl_data/msgs/es_ni.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_ni.msg', - 'DATA'), - ('_tk_data/ttk/cursors.tcl', - '/usr/share/tcltk/tk8.6/ttk/cursors.tcl', - 'DATA'), - ('_tk_data/tkfbox.tcl', '/usr/share/tcltk/tk8.6/tkfbox.tcl', 'DATA'), - ('_tcl_data/msgs/gv_gb.msg', - '/usr/share/tcltk/tcl8.6/msgs/gv_gb.msg', - 'DATA'), - ('_tk_data/panedwindow.tcl', - '/usr/share/tcltk/tk8.6/panedwindow.tcl', - 'DATA'), - ('_tk_data/msgs/en_gb.msg', '/usr/share/tcltk/tk8.6/msgs/en_gb.msg', 'DATA'), - ('_tcl_data/tm.tcl', '/usr/share/tcltk/tcl8.6/tm.tcl', 'DATA'), - ('_tk_data/ttk/combobox.tcl', - '/usr/share/tcltk/tk8.6/ttk/combobox.tcl', - 'DATA'), - ('_tcl_data/encoding/iso8859-16.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-16.enc', - 'DATA'), - ('_tk_data/images/logo64.gif', - '/usr/share/tcltk/tk8.6/images/logo64.gif', - 'DATA'), - ('_tk_data/msgs/es.msg', '/usr/share/tcltk/tk8.6/msgs/es.msg', 'DATA'), - ('_tcl_data/msgs/en_ie.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_ie.msg', - 'DATA'), - ('_tcl_data/msgs/en_sg.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_sg.msg', - 'DATA'), - ('_tcl_data/encoding/cp855.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp855.enc', - 'DATA'), - ('_tcl_data/msgs/sw.msg', '/usr/share/tcltk/tcl8.6/msgs/sw.msg', 'DATA'), - ('_tk_data/images/logoMed.gif', - '/usr/share/tcltk/tk8.6/images/logoMed.gif', - 'DATA'), - ('_tcl_data/encoding/macCentEuro.enc', - '/usr/share/tcltk/tcl8.6/encoding/macCentEuro.enc', - 'DATA'), - ('_tk_data/images/pwrdLogo.eps', - '/usr/share/tcltk/tk8.6/images/pwrdLogo.eps', - 'DATA'), - ('_tk_data/images/README', '/usr/share/tcltk/tk8.6/images/README', 'DATA'), - ('_tcl_data/msgs/id.msg', '/usr/share/tcltk/tcl8.6/msgs/id.msg', 'DATA'), - ('_tcl_data/msgs/es_sv.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_sv.msg', - 'DATA'), - ('_tcl_data/encoding/macGreek.enc', - '/usr/share/tcltk/tcl8.6/encoding/macGreek.enc', - 'DATA'), - ('_tcl_data/msgs/es_uy.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_uy.msg', - 'DATA'), - ('_tk_data/ttk/vistaTheme.tcl', - '/usr/share/tcltk/tk8.6/ttk/vistaTheme.tcl', - 'DATA'), - ('_tcl_data/msgs/da.msg', '/usr/share/tcltk/tcl8.6/msgs/da.msg', 'DATA'), - ('_tcl_data/msgs/lt.msg', '/usr/share/tcltk/tcl8.6/msgs/lt.msg', 'DATA'), - ('_tcl_data/msgs/es_cr.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_cr.msg', - 'DATA'), - ('_tcl_data/encoding/euc-jp.enc', - '/usr/share/tcltk/tcl8.6/encoding/euc-jp.enc', - 'DATA'), - ('_tcl_data/msgs/zh.msg', '/usr/share/tcltk/tcl8.6/msgs/zh.msg', 'DATA'), - ('_tcl_data/encoding/cp869.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp869.enc', - 'DATA'), - ('_tcl_data/http1.0/pkgIndex.tcl', - '/usr/share/tcltk/tcl8.6/http1.0/pkgIndex.tcl', - 'DATA'), - ('_tcl_data/tcl8/http-2.9.8.tm', - '/usr/share/tcltk/tcl8.6/tcl8/http-2.9.8.tm', - 'DATA'), - ('_tk_data/obsolete.tcl', '/usr/share/tcltk/tk8.6/obsolete.tcl', 'DATA'), - ('_tcl_data/history.tcl', '/usr/share/tcltk/tcl8.6/history.tcl', 'DATA'), - ('_tcl_data/encoding/cp1255.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1255.enc', - 'DATA'), - ('_tcl_data/encoding/gb2312.enc', - '/usr/share/tcltk/tcl8.6/encoding/gb2312.enc', - 'DATA'), - ('_tcl_data/msgs/hi_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/hi_in.msg', - 'DATA'), - ('_tcl_data/msgs/en_ph.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_ph.msg', - 'DATA'), - ('_tcl_data/msgs/is.msg', '/usr/share/tcltk/tcl8.6/msgs/is.msg', 'DATA'), - ('_tcl_data/tcl8/msgcat-1.6.1.tm', - '/usr/share/tcltk/tcl8.6/tcl8/msgcat-1.6.1.tm', - 'DATA'), - ('_tcl_data/encoding/iso2022-kr.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso2022-kr.enc', - 'DATA'), - ('_tcl_data/msgs/zh_tw.msg', - '/usr/share/tcltk/tcl8.6/msgs/zh_tw.msg', - 'DATA'), - ('_tcl_data/msgs/ru_ua.msg', - '/usr/share/tcltk/tcl8.6/msgs/ru_ua.msg', - 'DATA'), - ('_tcl_data/encoding/cp950.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp950.enc', - 'DATA'), - ('_tcl_data/encoding/jis0212.enc', - '/usr/share/tcltk/tcl8.6/encoding/jis0212.enc', - 'DATA'), - ('_tcl_data/msgs/hr.msg', '/usr/share/tcltk/tcl8.6/msgs/hr.msg', 'DATA'), - ('_tk_data/ttk/aquaTheme.tcl', - '/usr/share/tcltk/tk8.6/ttk/aquaTheme.tcl', - 'DATA'), - ('_tk_data/msgs/pl.msg', '/usr/share/tcltk/tk8.6/msgs/pl.msg', 'DATA'), - ('_tk_data/images/tai-ku.gif', - '/usr/share/tcltk/tk8.6/images/tai-ku.gif', - 'DATA'), - ('_tcl_data/encoding/macCyrillic.enc', - '/usr/share/tcltk/tcl8.6/encoding/macCyrillic.enc', - 'DATA'), - ('_tcl_data/tclIndex', '/usr/share/tcltk/tcl8.6/tclIndex', 'DATA'), - ('_tcl_data/encoding/iso2022.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso2022.enc', - 'DATA'), - ('_tcl_data/msgs/nb.msg', '/usr/share/tcltk/tcl8.6/msgs/nb.msg', 'DATA'), - ('_tk_data/images/pwrdLogo100.gif', - '/usr/share/tcltk/tk8.6/images/pwrdLogo100.gif', - 'DATA'), - ('_tcl_data/encoding/cp437.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp437.enc', - 'DATA'), - ('_tcl_data/encoding/cp864.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp864.enc', - 'DATA'), - ('_tcl_data/msgs/es_pr.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_pr.msg', - 'DATA'), - ('_tk_data/images/pwrdLogo175.gif', - '/usr/share/tcltk/tk8.6/images/pwrdLogo175.gif', - 'DATA'), - ('_tk_data/ttk/notebook.tcl', - '/usr/share/tcltk/tk8.6/ttk/notebook.tcl', - 'DATA'), - ('_tcl_data/msgs/ja.msg', '/usr/share/tcltk/tcl8.6/msgs/ja.msg', 'DATA'), - ('_tcl_data/msgs/gl.msg', '/usr/share/tcltk/tcl8.6/msgs/gl.msg', 'DATA'), - ('_tcl_data/msgs/lv.msg', '/usr/share/tcltk/tcl8.6/msgs/lv.msg', 'DATA'), - ('_tcl_data/msgs/mr.msg', '/usr/share/tcltk/tcl8.6/msgs/mr.msg', 'DATA'), - ('_tk_data/unsupported.tcl', - '/usr/share/tcltk/tk8.6/unsupported.tcl', - 'DATA'), - ('_tcl_data/msgs/fr_be.msg', - '/usr/share/tcltk/tcl8.6/msgs/fr_be.msg', - 'DATA'), - ('_tcl_data/encoding/big5.enc', - '/usr/share/tcltk/tcl8.6/encoding/big5.enc', - 'DATA'), - ('_tk_data/msgs/el.msg', '/usr/share/tcltk/tk8.6/msgs/el.msg', 'DATA'), - ('_tcl_data/msgs/es_ve.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_ve.msg', - 'DATA'), - ('_tcl_data/msgs/kw.msg', '/usr/share/tcltk/tcl8.6/msgs/kw.msg', 'DATA'), - ('_tk_data/images/logoLarge.gif', - '/usr/share/tcltk/tk8.6/images/logoLarge.gif', - 'DATA'), - ('_tk_data/ttk/fonts.tcl', '/usr/share/tcltk/tk8.6/ttk/fonts.tcl', 'DATA'), - ('_tcl_data/opt0.4/optparse.tcl', - '/usr/share/tcltk/tcl8.6/opt0.4/optparse.tcl', - 'DATA'), - ('_tk_data/tkAppInit.c', '/usr/share/tcltk/tk8.6/tkAppInit.c', 'DATA'), - ('_tcl_data/word.tcl', '/usr/share/tcltk/tcl8.6/word.tcl', 'DATA'), - ('_tcl_data/msgs/es_do.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_do.msg', - 'DATA'), - ('_tcl_data/msgs/en_hk.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_hk.msg', - 'DATA'), - ('_tk_data/ttk/sizegrip.tcl', - '/usr/share/tcltk/tk8.6/ttk/sizegrip.tcl', - 'DATA'), - ('_tcl_data/msgs/be.msg', '/usr/share/tcltk/tcl8.6/msgs/be.msg', 'DATA'), - ('_tcl_data/msgs/sr.msg', '/usr/share/tcltk/tcl8.6/msgs/sr.msg', 'DATA'), - ('_tk_data/images/pwrdLogo200.gif', - '/usr/share/tcltk/tk8.6/images/pwrdLogo200.gif', - 'DATA'), - ('_tcl_data/msgs/en_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_in.msg', - 'DATA'), - ('_tk_data/bgerror.tcl', '/usr/share/tcltk/tk8.6/bgerror.tcl', 'DATA'), - ('_tcl_data/msgs/de.msg', '/usr/share/tcltk/tcl8.6/msgs/de.msg', 'DATA'), - ('_tcl_data/msgs/ar_lb.msg', - '/usr/share/tcltk/tcl8.6/msgs/ar_lb.msg', - 'DATA'), - ('_tcl_data/msgs/zh_sg.msg', - '/usr/share/tcltk/tcl8.6/msgs/zh_sg.msg', - 'DATA'), - ('_tcl_data/msgs/en_be.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_be.msg', - 'DATA'), - ('_tk_data/msgs/sv.msg', '/usr/share/tcltk/tk8.6/msgs/sv.msg', 'DATA'), - ('_tcl_data/encoding/cp865.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp865.enc', - 'DATA'), - ('_tcl_data/package.tcl', '/usr/share/tcltk/tcl8.6/package.tcl', 'DATA'), - ('_tcl_data/encoding/tis-620.enc', - '/usr/share/tcltk/tcl8.6/encoding/tis-620.enc', - 'DATA'), - ('_tcl_data/msgs/kl_gl.msg', - '/usr/share/tcltk/tcl8.6/msgs/kl_gl.msg', - 'DATA'), - ('_tcl_data/encoding/cp860.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp860.enc', - 'DATA'), - ('_tk_data/images/pwrdLogo150.gif', - '/usr/share/tcltk/tk8.6/images/pwrdLogo150.gif', - 'DATA'), - ('_tcl_data/msgs/kok.msg', '/usr/share/tcltk/tcl8.6/msgs/kok.msg', 'DATA'), - ('_tk_data/iconlist.tcl', '/usr/share/tcltk/tk8.6/iconlist.tcl', 'DATA'), - ('_tcl_data/msgs/en_zw.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_zw.msg', - 'DATA'), - ('_tk_data/xmfbox.tcl', '/usr/share/tcltk/tk8.6/xmfbox.tcl', 'DATA'), - ('_tcl_data/tcl8/platform/shell-1.1.4.tm', - '/usr/share/tcltk/tcl8.6/tcl8/platform/shell-1.1.4.tm', - 'DATA'), - ('_tcl_data/msgs/ga.msg', '/usr/share/tcltk/tcl8.6/msgs/ga.msg', 'DATA'), - ('_tcl_data/msgs/de_at.msg', - '/usr/share/tcltk/tcl8.6/msgs/de_at.msg', - 'DATA'), - ('_tk_data/fontchooser.tcl', - '/usr/share/tcltk/tk8.6/fontchooser.tcl', - 'DATA'), - ('_tcl_data/msgs/pt_br.msg', - '/usr/share/tcltk/tcl8.6/msgs/pt_br.msg', - 'DATA'), - ('_tcl_data/encoding/macDingbats.enc', - '/usr/share/tcltk/tcl8.6/encoding/macDingbats.enc', - 'DATA'), - ('_tk_data/tearoff.tcl', '/usr/share/tcltk/tk8.6/tearoff.tcl', 'DATA'), - ('_tcl_data/encoding/iso8859-13.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-13.enc', - 'DATA'), - ('_tk_data/msgs/nl.msg', '/usr/share/tcltk/tk8.6/msgs/nl.msg', 'DATA'), - ('_tcl_data/msgs/ro.msg', '/usr/share/tcltk/tcl8.6/msgs/ro.msg', 'DATA'), - ('_tk_data/msgs/eo.msg', '/usr/share/tcltk/tk8.6/msgs/eo.msg', 'DATA'), - ('_tcl_data/encoding/cp1253.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1253.enc', - 'DATA'), - ('_tcl_data/encoding/macRoman.enc', - '/usr/share/tcltk/tcl8.6/encoding/macRoman.enc', - 'DATA'), - ('_tcl_data/encoding/macCroatian.enc', - '/usr/share/tcltk/tcl8.6/encoding/macCroatian.enc', - 'DATA'), - ('_tcl_data/encoding/ebcdic.enc', - '/usr/share/tcltk/tcl8.6/encoding/ebcdic.enc', - 'DATA'), - ('_tcl_data/msgs/kok_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/kok_in.msg', - 'DATA'), - ('_tcl_data/encoding/gb12345.enc', - '/usr/share/tcltk/tcl8.6/encoding/gb12345.enc', - 'DATA'), - ('_tcl_data/msgs/he.msg', '/usr/share/tcltk/tcl8.6/msgs/he.msg', 'DATA'), - ('_tcl_data/msgs/kl.msg', '/usr/share/tcltk/tcl8.6/msgs/kl.msg', 'DATA'), - ('_tcl_data/encoding/jis0208.enc', - '/usr/share/tcltk/tcl8.6/encoding/jis0208.enc', - 'DATA'), - ('_tcl_data/init.tcl', '/usr/share/tcltk/tcl8.6/init.tcl', 'DATA'), - ('_tk_data/msgs/da.msg', '/usr/share/tcltk/tk8.6/msgs/da.msg', 'DATA'), - ('_tcl_data/msgs/fr_ca.msg', - '/usr/share/tcltk/tcl8.6/msgs/fr_ca.msg', - 'DATA'), - ('_tcl_data/encoding/iso8859-7.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-7.enc', - 'DATA'), - ('_tcl_data/msgs/ms_my.msg', - '/usr/share/tcltk/tcl8.6/msgs/ms_my.msg', - 'DATA'), - ('_tk_data/scale.tcl', '/usr/share/tcltk/tk8.6/scale.tcl', 'DATA'), - ('_tcl_data/msgs/bn.msg', '/usr/share/tcltk/tcl8.6/msgs/bn.msg', 'DATA'), - ('_tcl_data/encoding/macIceland.enc', - '/usr/share/tcltk/tcl8.6/encoding/macIceland.enc', - 'DATA'), - ('_tcl_data/msgs/sq.msg', '/usr/share/tcltk/tcl8.6/msgs/sq.msg', 'DATA'), - ('_tk_data/msgs/zh_cn.msg', '/usr/share/tcltk/tk8.6/msgs/zh_cn.msg', 'DATA'), - ('_tcl_data/msgs/es_py.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_py.msg', - 'DATA'), - ('_tcl_data/msgs/fr.msg', '/usr/share/tcltk/tcl8.6/msgs/fr.msg', 'DATA'), - ('_tcl_data/msgs/el.msg', '/usr/share/tcltk/tcl8.6/msgs/el.msg', 'DATA'), - ('_tk_data/safetk.tcl', '/usr/share/tcltk/tk8.6/safetk.tcl', 'DATA'), - ('_tcl_data/encoding/cp936.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp936.enc', - 'DATA'), - ('_tk_data/images/logo.eps', - '/usr/share/tcltk/tk8.6/images/logo.eps', - 'DATA'), - ('_tcl_data/msgs/it_ch.msg', - '/usr/share/tcltk/tcl8.6/msgs/it_ch.msg', - 'DATA'), - ('_tcl_data/msgs/af.msg', '/usr/share/tcltk/tcl8.6/msgs/af.msg', 'DATA'), - ('_tcl_data/encoding/cp861.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp861.enc', - 'DATA'), - ('_tk_data/ttk/winTheme.tcl', - '/usr/share/tcltk/tk8.6/ttk/winTheme.tcl', - 'DATA'), - ('_tcl_data/msgs/vi.msg', '/usr/share/tcltk/tcl8.6/msgs/vi.msg', 'DATA'), - ('_tcl_data/encoding/iso2022-jp.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso2022-jp.enc', - 'DATA'), - ('_tcl_data/msgs/fa_ir.msg', - '/usr/share/tcltk/tcl8.6/msgs/fa_ir.msg', - 'DATA'), - ('_tcl_data/msgs/en_bw.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_bw.msg', - 'DATA'), - ('setuptools/_vendor/importlib_metadata-8.7.1.dist-info/top_level.txt', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/top_level.txt', - 'DATA'), - ('setuptools/_vendor/importlib_metadata-8.7.1.dist-info/WHEEL', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/WHEEL', - 'DATA'), - ('setuptools/_vendor/importlib_metadata-8.7.1.dist-info/licenses/LICENSE', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/licenses/LICENSE', - 'DATA'), - ('setuptools/_vendor/importlib_metadata-8.7.1.dist-info/REQUESTED', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/REQUESTED', - 'DATA'), - ('setuptools/_vendor/importlib_metadata-8.7.1.dist-info/INSTALLER', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/INSTALLER', - 'DATA'), - ('setuptools/_vendor/importlib_metadata-8.7.1.dist-info/METADATA', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/METADATA', - 'DATA'), - ('setuptools/_vendor/importlib_metadata-8.7.1.dist-info/RECORD', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/RECORD', - 'DATA'), - ('setuptools/_vendor/jaraco/text/Lorem ipsum.txt', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/jaraco/text/Lorem ' - 'ipsum.txt', - 'DATA'), - ('certifi/py.typed', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/certifi/py.typed', - 'DATA'), - ('certifi/cacert.pem', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/certifi/cacert.pem', - 'DATA'), - ('base_library.zip', - '/home/borderban/Рабочий стол/client-py/build/FactorioSync/base_library.zip', - 'DATA')], - [], - False, - False, - 1776188915, - [('run', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/PyInstaller/bootloader/Linux-64bit-intel/run', - 'EXECUTABLE')], - '/lib/x86_64-linux-gnu/libpython3.12.so.1.0') diff --git a/build/FactorioSync/FactorioSync.pkg b/build/FactorioSync/FactorioSync.pkg deleted file mode 100644 index 2d37c20..0000000 Binary files a/build/FactorioSync/FactorioSync.pkg and /dev/null differ diff --git a/build/FactorioSync/PKG-00.toc b/build/FactorioSync/PKG-00.toc deleted file mode 100644 index cc02d22..0000000 --- a/build/FactorioSync/PKG-00.toc +++ /dev/null @@ -1,915 +0,0 @@ -('/home/borderban/Рабочий стол/client-py/build/FactorioSync/FactorioSync.pkg', - {'BINARY': True, - 'DATA': True, - 'EXECUTABLE': True, - 'EXTENSION': True, - 'PYMODULE': True, - 'PYSOURCE': True, - 'PYZ': False, - 'SPLASH': True, - 'SYMLINK': False}, - [('pyi-contents-directory _internal', '', 'OPTION'), - ('PYZ-00.pyz', - '/home/borderban/Рабочий стол/client-py/build/FactorioSync/PYZ-00.pyz', - 'PYZ'), - ('struct', - '/home/borderban/Рабочий ' - 'стол/client-py/build/FactorioSync/localpycs/struct.pyc', - 'PYMODULE'), - ('pyimod01_archive', - '/home/borderban/Рабочий ' - 'стол/client-py/build/FactorioSync/localpycs/pyimod01_archive.pyc', - 'PYMODULE'), - ('pyimod02_importers', - '/home/borderban/Рабочий ' - 'стол/client-py/build/FactorioSync/localpycs/pyimod02_importers.pyc', - 'PYMODULE'), - ('pyimod03_ctypes', - '/home/borderban/Рабочий ' - 'стол/client-py/build/FactorioSync/localpycs/pyimod03_ctypes.pyc', - 'PYMODULE'), - ('pyiboot01_bootstrap', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/PyInstaller/loader/pyiboot01_bootstrap.py', - 'PYSOURCE'), - ('pyi_rth_inspect', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_inspect.py', - 'PYSOURCE'), - ('pyi_rth__tkinter', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth__tkinter.py', - 'PYSOURCE'), - ('pyi_rth_setuptools', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_setuptools.py', - 'PYSOURCE'), - ('pyi_rth_pkgutil', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgutil.py', - 'PYSOURCE'), - ('pyi_rth_multiprocessing', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_multiprocessing.py', - 'PYSOURCE'), - ('client', '/home/borderban/Рабочий стол/client-py/client.py', 'PYSOURCE'), - ('libpython3.12.so.1.0', - '/lib/x86_64-linux-gnu/libpython3.12.so.1.0', - 'BINARY'), - ('python3.12/lib-dynload/_contextvars.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_contextvars.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_decimal.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_decimal.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/resource.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/resource.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_lzma.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_lzma.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_bz2.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_bz2.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_posixshmem.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_posixshmem.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_multiprocessing.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_multiprocessing.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/termios.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/termios.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_ssl.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_ssl.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_hashlib.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_hashlib.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/mmap.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/mmap.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_ctypes.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_ctypes.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_queue.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_queue.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_asyncio.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_asyncio.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/readline.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/readline.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_multibytecodec.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_multibytecodec.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_codecs_jp.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_codecs_jp.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_codecs_kr.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_codecs_kr.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_codecs_iso2022.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_codecs_iso2022.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_codecs_cn.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_codecs_cn.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_codecs_tw.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_codecs_tw.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_codecs_hk.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_codecs_hk.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_tkinter.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_tkinter.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('81d243bd2c585b0f4821__mypyc.cpython-312-x86_64-linux-gnu.so', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/81d243bd2c585b0f4821__mypyc.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('charset_normalizer/cd.cpython-312-x86_64-linux-gnu.so', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/charset_normalizer/cd.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('charset_normalizer/md.cpython-312-x86_64-linux-gnu.so', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('python3.12/lib-dynload/_json.cpython-312-x86_64-linux-gnu.so', - '/usr/lib/python3.12/lib-dynload/_json.cpython-312-x86_64-linux-gnu.so', - 'EXTENSION'), - ('libz.so.1', '/lib/x86_64-linux-gnu/libz.so.1', 'BINARY'), - ('libexpat.so.1', '/lib/x86_64-linux-gnu/libexpat.so.1', 'BINARY'), - ('liblzma.so.5', '/lib/x86_64-linux-gnu/liblzma.so.5', 'BINARY'), - ('libbz2.so.1.0', '/lib/x86_64-linux-gnu/libbz2.so.1.0', 'BINARY'), - ('libssl.so.3', '/lib/x86_64-linux-gnu/libssl.so.3', 'BINARY'), - ('libcrypto.so.3', '/lib/x86_64-linux-gnu/libcrypto.so.3', 'BINARY'), - ('libffi.so.8', '/lib/x86_64-linux-gnu/libffi.so.8', 'BINARY'), - ('libreadline.so.8', '/lib/x86_64-linux-gnu/libreadline.so.8', 'BINARY'), - ('libtinfo.so.6', '/lib/x86_64-linux-gnu/libtinfo.so.6', 'BINARY'), - ('libXss.so.1', '/lib/x86_64-linux-gnu/libXss.so.1', 'BINARY'), - ('libbrotlicommon.so.1', - '/lib/x86_64-linux-gnu/libbrotlicommon.so.1', - 'BINARY'), - ('libXext.so.6', '/lib/x86_64-linux-gnu/libXext.so.6', 'BINARY'), - ('libbsd.so.0', '/lib/x86_64-linux-gnu/libbsd.so.0', 'BINARY'), - ('libtcl8.6.so', '/lib/x86_64-linux-gnu/libtcl8.6.so', 'BINARY'), - ('libfreetype.so.6', '/lib/x86_64-linux-gnu/libfreetype.so.6', 'BINARY'), - ('libX11.so.6', '/lib/x86_64-linux-gnu/libX11.so.6', 'BINARY'), - ('libXau.so.6', '/lib/x86_64-linux-gnu/libXau.so.6', 'BINARY'), - ('libbrotlidec.so.1', '/lib/x86_64-linux-gnu/libbrotlidec.so.1', 'BINARY'), - ('libXft.so.2', '/lib/x86_64-linux-gnu/libXft.so.2', 'BINARY'), - ('libmd.so.0', '/lib/x86_64-linux-gnu/libmd.so.0', 'BINARY'), - ('libBLT.2.5.so.8.6', '/lib/libBLT.2.5.so.8.6', 'BINARY'), - ('libpng16.so.16', '/lib/x86_64-linux-gnu/libpng16.so.16', 'BINARY'), - ('libXdmcp.so.6', '/lib/x86_64-linux-gnu/libXdmcp.so.6', 'BINARY'), - ('libfontconfig.so.1', '/lib/x86_64-linux-gnu/libfontconfig.so.1', 'BINARY'), - ('libtk8.6.so', '/lib/x86_64-linux-gnu/libtk8.6.so', 'BINARY'), - ('libXrender.so.1', '/lib/x86_64-linux-gnu/libXrender.so.1', 'BINARY'), - ('_tcl_data/encoding/cp949.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp949.enc', - 'DATA'), - ('_tcl_data/msgs/en_ca.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_ca.msg', - 'DATA'), - ('_tcl_data/msgs/es_cl.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_cl.msg', - 'DATA'), - ('_tcl_data/encoding/dingbats.enc', - '/usr/share/tcltk/tcl8.6/encoding/dingbats.enc', - 'DATA'), - ('_tcl_data/msgs/te_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/te_in.msg', - 'DATA'), - ('_tk_data/ttk/scrollbar.tcl', - '/usr/share/tcltk/tk8.6/ttk/scrollbar.tcl', - 'DATA'), - ('_tcl_data/encoding/iso8859-1.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-1.enc', - 'DATA'), - ('_tcl_data/msgs/pl.msg', '/usr/share/tcltk/tcl8.6/msgs/pl.msg', 'DATA'), - ('_tcl_data/msgs/it.msg', '/usr/share/tcltk/tcl8.6/msgs/it.msg', 'DATA'), - ('_tcl_data/encoding/iso8859-14.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-14.enc', - 'DATA'), - ('_tcl_data/msgs/fo.msg', '/usr/share/tcltk/tcl8.6/msgs/fo.msg', 'DATA'), - ('_tk_data/focus.tcl', '/usr/share/tcltk/tk8.6/focus.tcl', 'DATA'), - ('_tk_data/ttk/button.tcl', '/usr/share/tcltk/tk8.6/ttk/button.tcl', 'DATA'), - ('_tcl_data/msgs/eu_es.msg', - '/usr/share/tcltk/tcl8.6/msgs/eu_es.msg', - 'DATA'), - ('_tk_data/msgs/hu.msg', '/usr/share/tcltk/tk8.6/msgs/hu.msg', 'DATA'), - ('_tcl_data/parray.tcl', '/usr/share/tcltk/tcl8.6/parray.tcl', 'DATA'), - ('_tcl_data/msgs/ar.msg', '/usr/share/tcltk/tcl8.6/msgs/ar.msg', 'DATA'), - ('_tcl_data/msgs/zh_hk.msg', - '/usr/share/tcltk/tcl8.6/msgs/zh_hk.msg', - 'DATA'), - ('_tcl_data/encoding/macUkraine.enc', - '/usr/share/tcltk/tcl8.6/encoding/macUkraine.enc', - 'DATA'), - ('_tcl_data/encoding/cp1256.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1256.enc', - 'DATA'), - ('_tcl_data/encoding/macRomania.enc', - '/usr/share/tcltk/tcl8.6/encoding/macRomania.enc', - 'DATA'), - ('_tcl_data/encoding/macTurkish.enc', - '/usr/share/tcltk/tcl8.6/encoding/macTurkish.enc', - 'DATA'), - ('_tcl_data/encoding/gb1988.enc', - '/usr/share/tcltk/tcl8.6/encoding/gb1988.enc', - 'DATA'), - ('_tcl_data/msgs/uk.msg', '/usr/share/tcltk/tcl8.6/msgs/uk.msg', 'DATA'), - ('_tk_data/tclIndex', '/usr/share/tcltk/tk8.6/tclIndex', 'DATA'), - ('_tk_data/ttk/xpTheme.tcl', - '/usr/share/tcltk/tk8.6/ttk/xpTheme.tcl', - 'DATA'), - ('_tcl_data/msgs/sv.msg', '/usr/share/tcltk/tcl8.6/msgs/sv.msg', 'DATA'), - ('_tcl_data/encoding/iso8859-15.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-15.enc', - 'DATA'), - ('_tcl_data/encoding/iso8859-4.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-4.enc', - 'DATA'), - ('_tcl_data/msgs/hu.msg', '/usr/share/tcltk/tcl8.6/msgs/hu.msg', 'DATA'), - ('_tk_data/spinbox.tcl', '/usr/share/tcltk/tk8.6/spinbox.tcl', 'DATA'), - ('_tk_data/images/pwrdLogo75.gif', - '/usr/share/tcltk/tk8.6/images/pwrdLogo75.gif', - 'DATA'), - ('_tk_data/console.tcl', '/usr/share/tcltk/tk8.6/console.tcl', 'DATA'), - ('_tcl_data/encoding/iso8859-5.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-5.enc', - 'DATA'), - ('_tcl_data/msgs/sk.msg', '/usr/share/tcltk/tcl8.6/msgs/sk.msg', 'DATA'), - ('_tk_data/images/logo100.gif', - '/usr/share/tcltk/tk8.6/images/logo100.gif', - 'DATA'), - ('_tcl_data/encoding/cp737.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp737.enc', - 'DATA'), - ('_tcl_data/tcl8/platform-1.0.19.tm', - '/usr/share/tcltk/tcl8.6/tcl8/platform-1.0.19.tm', - 'DATA'), - ('_tk_data/comdlg.tcl', '/usr/share/tcltk/tk8.6/comdlg.tcl', 'DATA'), - ('_tcl_data/msgs/et.msg', '/usr/share/tcltk/tcl8.6/msgs/et.msg', 'DATA'), - ('_tk_data/scrlbar.tcl', '/usr/share/tcltk/tk8.6/scrlbar.tcl', 'DATA'), - ('_tk_data/entry.tcl', '/usr/share/tcltk/tk8.6/entry.tcl', 'DATA'), - ('_tcl_data/msgs/es.msg', '/usr/share/tcltk/tcl8.6/msgs/es.msg', 'DATA'), - ('_tcl_data/msgs/fa.msg', '/usr/share/tcltk/tcl8.6/msgs/fa.msg', 'DATA'), - ('_tk_data/palette.tcl', '/usr/share/tcltk/tk8.6/palette.tcl', 'DATA'), - ('_tcl_data/encoding/cp866.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp866.enc', - 'DATA'), - ('_tk_data/ttk/entry.tcl', '/usr/share/tcltk/tk8.6/ttk/entry.tcl', 'DATA'), - ('_tk_data/msgs/de.msg', '/usr/share/tcltk/tk8.6/msgs/de.msg', 'DATA'), - ('_tcl_data/msgs/de_be.msg', - '/usr/share/tcltk/tcl8.6/msgs/de_be.msg', - 'DATA'), - ('_tk_data/ttk/defaults.tcl', - '/usr/share/tcltk/tk8.6/ttk/defaults.tcl', - 'DATA'), - ('_tcl_data/encoding/cp1252.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1252.enc', - 'DATA'), - ('_tk_data/text.tcl', '/usr/share/tcltk/tk8.6/text.tcl', 'DATA'), - ('_tk_data/msgs/fi.msg', '/usr/share/tcltk/tk8.6/msgs/fi.msg', 'DATA'), - ('_tk_data/button.tcl', '/usr/share/tcltk/tk8.6/button.tcl', 'DATA'), - ('_tcl_data/encoding/iso8859-11.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-11.enc', - 'DATA'), - ('_tcl_data/msgs/cs.msg', '/usr/share/tcltk/tcl8.6/msgs/cs.msg', 'DATA'), - ('_tcl_data/msgs/es_co.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_co.msg', - 'DATA'), - ('_tk_data/ttk/scale.tcl', '/usr/share/tcltk/tk8.6/ttk/scale.tcl', 'DATA'), - ('_tcl_data/encoding/iso8859-10.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-10.enc', - 'DATA'), - ('_tcl_data/msgs/tr.msg', '/usr/share/tcltk/tcl8.6/msgs/tr.msg', 'DATA'), - ('_tcl_data/msgs/nl_be.msg', - '/usr/share/tcltk/tcl8.6/msgs/nl_be.msg', - 'DATA'), - ('_tcl_data/tclAppInit.c', '/usr/share/tcltk/tcl8.6/tclAppInit.c', 'DATA'), - ('_tcl_data/msgs/ar_sy.msg', - '/usr/share/tcltk/tcl8.6/msgs/ar_sy.msg', - 'DATA'), - ('_tcl_data/msgs/hi.msg', '/usr/share/tcltk/tcl8.6/msgs/hi.msg', 'DATA'), - ('_tcl_data/encoding/shiftjis.enc', - '/usr/share/tcltk/tcl8.6/encoding/shiftjis.enc', - 'DATA'), - ('_tcl_data/encoding/gb2312-raw.enc', - '/usr/share/tcltk/tcl8.6/encoding/gb2312-raw.enc', - 'DATA'), - ('_tk_data/ttk/ttk.tcl', '/usr/share/tcltk/tk8.6/ttk/ttk.tcl', 'DATA'), - ('_tcl_data/msgs/mk.msg', '/usr/share/tcltk/tcl8.6/msgs/mk.msg', 'DATA'), - ('_tcl_data/encoding/koi8-u.enc', - '/usr/share/tcltk/tcl8.6/encoding/koi8-u.enc', - 'DATA'), - ('_tcl_data/encoding/cp775.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp775.enc', - 'DATA'), - ('_tcl_data/msgs/es_mx.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_mx.msg', - 'DATA'), - ('_tcl_data/encoding/iso8859-2.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-2.enc', - 'DATA'), - ('_tcl_data/encoding/euc-cn.enc', - '/usr/share/tcltk/tcl8.6/encoding/euc-cn.enc', - 'DATA'), - ('_tcl_data/msgs/pt.msg', '/usr/share/tcltk/tcl8.6/msgs/pt.msg', 'DATA'), - ('_tcl_data/msgs/nl.msg', '/usr/share/tcltk/tcl8.6/msgs/nl.msg', 'DATA'), - ('_tcl_data/msgs/en_gb.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_gb.msg', - 'DATA'), - ('_tcl_data/encoding/cp1251.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1251.enc', - 'DATA'), - ('_tcl_data/msgs/th.msg', '/usr/share/tcltk/tcl8.6/msgs/th.msg', 'DATA'), - ('_tk_data/dialog.tcl', '/usr/share/tcltk/tk8.6/dialog.tcl', 'DATA'), - ('_tcl_data/msgs/fr_ch.msg', - '/usr/share/tcltk/tcl8.6/msgs/fr_ch.msg', - 'DATA'), - ('_tcl_data/encoding/iso8859-9.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-9.enc', - 'DATA'), - ('_tcl_data/msgs/nn.msg', '/usr/share/tcltk/tcl8.6/msgs/nn.msg', 'DATA'), - ('_tcl_data/msgs/eu.msg', '/usr/share/tcltk/tcl8.6/msgs/eu.msg', 'DATA'), - ('_tcl_data/msgs/ms.msg', '/usr/share/tcltk/tcl8.6/msgs/ms.msg', 'DATA'), - ('_tk_data/msgbox.tcl', '/usr/share/tcltk/tk8.6/msgbox.tcl', 'DATA'), - ('_tcl_data/http1.0/http.tcl', - '/usr/share/tcltk/tcl8.6/http1.0/http.tcl', - 'DATA'), - ('_tcl_data/encoding/cp862.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp862.enc', - 'DATA'), - ('_tcl_data/msgs/gv.msg', '/usr/share/tcltk/tcl8.6/msgs/gv.msg', 'DATA'), - ('_tcl_data/encoding/iso8859-8.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-8.enc', - 'DATA'), - ('_tk_data/ttk/altTheme.tcl', - '/usr/share/tcltk/tk8.6/ttk/altTheme.tcl', - 'DATA'), - ('_tcl_data/msgs/ko.msg', '/usr/share/tcltk/tcl8.6/msgs/ko.msg', 'DATA'), - ('_tcl_data/encoding/cns11643.enc', - '/usr/share/tcltk/tcl8.6/encoding/cns11643.enc', - 'DATA'), - ('_tcl_data/encoding/cp1257.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1257.enc', - 'DATA'), - ('_tcl_data/encoding/symbol.enc', - '/usr/share/tcltk/tcl8.6/encoding/symbol.enc', - 'DATA'), - ('_tcl_data/safe.tcl', '/usr/share/tcltk/tcl8.6/safe.tcl', 'DATA'), - ('_tcl_data/msgs/gl_es.msg', - '/usr/share/tcltk/tcl8.6/msgs/gl_es.msg', - 'DATA'), - ('_tcl_data/msgs/en_au.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_au.msg', - 'DATA'), - ('_tcl_data/encoding/cp1258.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1258.enc', - 'DATA'), - ('_tcl_data/msgs/es_bo.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_bo.msg', - 'DATA'), - ('_tcl_data/msgs/bn_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/bn_in.msg', - 'DATA'), - ('_tcl_data/msgs/te.msg', '/usr/share/tcltk/tcl8.6/msgs/te.msg', 'DATA'), - ('_tcl_data/msgs/fa_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/fa_in.msg', - 'DATA'), - ('_tcl_data/msgs/es_hn.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_hn.msg', - 'DATA'), - ('_tcl_data/msgs/id_id.msg', - '/usr/share/tcltk/tcl8.6/msgs/id_id.msg', - 'DATA'), - ('_tk_data/megawidget.tcl', '/usr/share/tcltk/tk8.6/megawidget.tcl', 'DATA'), - ('_tcl_data/msgs/es_gt.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_gt.msg', - 'DATA'), - ('_tk_data/ttk/utils.tcl', '/usr/share/tcltk/tk8.6/ttk/utils.tcl', 'DATA'), - ('_tk_data/listbox.tcl', '/usr/share/tcltk/tk8.6/listbox.tcl', 'DATA'), - ('_tcl_data/encoding/macThai.enc', - '/usr/share/tcltk/tcl8.6/encoding/macThai.enc', - 'DATA'), - ('_tk_data/ttk/panedwindow.tcl', - '/usr/share/tcltk/tk8.6/ttk/panedwindow.tcl', - 'DATA'), - ('_tcl_data/encoding/macJapan.enc', - '/usr/share/tcltk/tcl8.6/encoding/macJapan.enc', - 'DATA'), - ('_tcl_data/msgs/sh.msg', '/usr/share/tcltk/tcl8.6/msgs/sh.msg', 'DATA'), - ('_tcl_data/encoding/iso8859-6.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-6.enc', - 'DATA'), - ('_tcl_data/encoding/cp863.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp863.enc', - 'DATA'), - ('_tcl_data/msgs/bg.msg', '/usr/share/tcltk/tcl8.6/msgs/bg.msg', 'DATA'), - ('_tk_data/msgs/en.msg', '/usr/share/tcltk/tk8.6/msgs/en.msg', 'DATA'), - ('_tcl_data/msgs/ca.msg', '/usr/share/tcltk/tcl8.6/msgs/ca.msg', 'DATA'), - ('_tcl_data/encoding/cp1254.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1254.enc', - 'DATA'), - ('_tk_data/ttk/clamTheme.tcl', - '/usr/share/tcltk/tk8.6/ttk/clamTheme.tcl', - 'DATA'), - ('_tcl_data/encoding/ksc5601.enc', - '/usr/share/tcltk/tcl8.6/encoding/ksc5601.enc', - 'DATA'), - ('_tcl_data/msgs/en_za.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_za.msg', - 'DATA'), - ('_tcl_data/auto.tcl', '/usr/share/tcltk/tcl8.6/auto.tcl', 'DATA'), - ('_tk_data/ttk/spinbox.tcl', - '/usr/share/tcltk/tk8.6/ttk/spinbox.tcl', - 'DATA'), - ('_tcl_data/msgs/ta_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/ta_in.msg', - 'DATA'), - ('_tcl_data/msgs/mt.msg', '/usr/share/tcltk/tcl8.6/msgs/mt.msg', 'DATA'), - ('_tcl_data/msgs/ga_ie.msg', - '/usr/share/tcltk/tcl8.6/msgs/ga_ie.msg', - 'DATA'), - ('_tcl_data/msgs/sl.msg', '/usr/share/tcltk/tcl8.6/msgs/sl.msg', 'DATA'), - ('_tk_data/mkpsenc.tcl', '/usr/share/tcltk/tk8.6/mkpsenc.tcl', 'DATA'), - ('_tcl_data/msgs/es_ar.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_ar.msg', - 'DATA'), - ('_tk_data/ttk/progress.tcl', - '/usr/share/tcltk/tk8.6/ttk/progress.tcl', - 'DATA'), - ('_tk_data/choosedir.tcl', '/usr/share/tcltk/tk8.6/choosedir.tcl', 'DATA'), - ('_tk_data/ttk/menubutton.tcl', - '/usr/share/tcltk/tk8.6/ttk/menubutton.tcl', - 'DATA'), - ('_tcl_data/msgs/ta.msg', '/usr/share/tcltk/tcl8.6/msgs/ta.msg', 'DATA'), - ('_tcl_data/encoding/cp850.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp850.enc', - 'DATA'), - ('_tcl_data/msgs/mr_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/mr_in.msg', - 'DATA'), - ('_tk_data/msgs/ru.msg', '/usr/share/tcltk/tk8.6/msgs/ru.msg', 'DATA'), - ('_tk_data/optMenu.tcl', '/usr/share/tcltk/tk8.6/optMenu.tcl', 'DATA'), - ('_tk_data/icons.tcl', '/usr/share/tcltk/tk8.6/icons.tcl', 'DATA'), - ('_tcl_data/encoding/cp857.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp857.enc', - 'DATA'), - ('_tcl_data/opt0.4/pkgIndex.tcl', - '/usr/share/tcltk/tcl8.6/opt0.4/pkgIndex.tcl', - 'DATA'), - ('_tk_data/menu.tcl', '/usr/share/tcltk/tk8.6/menu.tcl', 'DATA'), - ('_tk_data/msgs/it.msg', '/usr/share/tcltk/tk8.6/msgs/it.msg', 'DATA'), - ('_tcl_data/encoding/cp932.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp932.enc', - 'DATA'), - ('_tcl_data/msgs/es_pa.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_pa.msg', - 'DATA'), - ('_tk_data/msgs/pt.msg', '/usr/share/tcltk/tk8.6/msgs/pt.msg', 'DATA'), - ('_tk_data/tk.tcl', '/usr/share/tcltk/tk8.6/tk.tcl', 'DATA'), - ('_tcl_data/encoding/iso8859-3.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-3.enc', - 'DATA'), - ('_tk_data/clrpick.tcl', '/usr/share/tcltk/tk8.6/clrpick.tcl', 'DATA'), - ('_tcl_data/msgs/kw_gb.msg', - '/usr/share/tcltk/tcl8.6/msgs/kw_gb.msg', - 'DATA'), - ('_tcl_data/encoding/euc-kr.enc', - '/usr/share/tcltk/tcl8.6/encoding/euc-kr.enc', - 'DATA'), - ('_tk_data/msgs/cs.msg', '/usr/share/tcltk/tk8.6/msgs/cs.msg', 'DATA'), - ('_tcl_data/msgs/es_ec.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_ec.msg', - 'DATA'), - ('_tcl_data/encoding/jis0201.enc', - '/usr/share/tcltk/tcl8.6/encoding/jis0201.enc', - 'DATA'), - ('_tcl_data/msgs/ru.msg', '/usr/share/tcltk/tcl8.6/msgs/ru.msg', 'DATA'), - ('_tcl_data/msgs/fo_fo.msg', - '/usr/share/tcltk/tcl8.6/msgs/fo_fo.msg', - 'DATA'), - ('_tcl_data/clock.tcl', '/usr/share/tcltk/tcl8.6/clock.tcl', 'DATA'), - ('_tcl_data/msgs/fi.msg', '/usr/share/tcltk/tcl8.6/msgs/fi.msg', 'DATA'), - ('_tcl_data/encoding/cp852.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp852.enc', - 'DATA'), - ('_tcl_data/encoding/ascii.enc', - '/usr/share/tcltk/tcl8.6/encoding/ascii.enc', - 'DATA'), - ('_tcl_data/msgs/af_za.msg', - '/usr/share/tcltk/tcl8.6/msgs/af_za.msg', - 'DATA'), - ('_tk_data/ttk/classicTheme.tcl', - '/usr/share/tcltk/tk8.6/ttk/classicTheme.tcl', - 'DATA'), - ('_tcl_data/encoding/koi8-r.enc', - '/usr/share/tcltk/tcl8.6/encoding/koi8-r.enc', - 'DATA'), - ('_tcl_data/msgs/eo.msg', '/usr/share/tcltk/tcl8.6/msgs/eo.msg', 'DATA'), - ('_tcl_data/msgs/zh_cn.msg', - '/usr/share/tcltk/tcl8.6/msgs/zh_cn.msg', - 'DATA'), - ('_tk_data/ttk/treeview.tcl', - '/usr/share/tcltk/tk8.6/ttk/treeview.tcl', - 'DATA'), - ('_tcl_data/tcl8/tcltest-2.5.7.tm', - '/usr/share/tcltk/tcl8.6/tcl8/tcltest-2.5.7.tm', - 'DATA'), - ('_tcl_data/msgs/es_pe.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_pe.msg', - 'DATA'), - ('_tcl_data/msgs/ko_kr.msg', - '/usr/share/tcltk/tcl8.6/msgs/ko_kr.msg', - 'DATA'), - ('_tcl_data/msgs/ar_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/ar_in.msg', - 'DATA'), - ('_tcl_data/msgs/ar_jo.msg', - '/usr/share/tcltk/tcl8.6/msgs/ar_jo.msg', - 'DATA'), - ('_tcl_data/msgs/en_nz.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_nz.msg', - 'DATA'), - ('_tk_data/msgs/fr.msg', '/usr/share/tcltk/tk8.6/msgs/fr.msg', 'DATA'), - ('_tcl_data/encoding/cp874.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp874.enc', - 'DATA'), - ('_tcl_data/encoding/cp1250.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1250.enc', - 'DATA'), - ('_tcl_data/msgs/es_ni.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_ni.msg', - 'DATA'), - ('_tk_data/ttk/cursors.tcl', - '/usr/share/tcltk/tk8.6/ttk/cursors.tcl', - 'DATA'), - ('_tk_data/tkfbox.tcl', '/usr/share/tcltk/tk8.6/tkfbox.tcl', 'DATA'), - ('_tcl_data/msgs/gv_gb.msg', - '/usr/share/tcltk/tcl8.6/msgs/gv_gb.msg', - 'DATA'), - ('_tk_data/panedwindow.tcl', - '/usr/share/tcltk/tk8.6/panedwindow.tcl', - 'DATA'), - ('_tk_data/msgs/en_gb.msg', '/usr/share/tcltk/tk8.6/msgs/en_gb.msg', 'DATA'), - ('_tcl_data/tm.tcl', '/usr/share/tcltk/tcl8.6/tm.tcl', 'DATA'), - ('_tk_data/ttk/combobox.tcl', - '/usr/share/tcltk/tk8.6/ttk/combobox.tcl', - 'DATA'), - ('_tcl_data/encoding/iso8859-16.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-16.enc', - 'DATA'), - ('_tk_data/images/logo64.gif', - '/usr/share/tcltk/tk8.6/images/logo64.gif', - 'DATA'), - ('_tk_data/msgs/es.msg', '/usr/share/tcltk/tk8.6/msgs/es.msg', 'DATA'), - ('_tcl_data/msgs/en_ie.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_ie.msg', - 'DATA'), - ('_tcl_data/msgs/en_sg.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_sg.msg', - 'DATA'), - ('_tcl_data/encoding/cp855.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp855.enc', - 'DATA'), - ('_tcl_data/msgs/sw.msg', '/usr/share/tcltk/tcl8.6/msgs/sw.msg', 'DATA'), - ('_tk_data/images/logoMed.gif', - '/usr/share/tcltk/tk8.6/images/logoMed.gif', - 'DATA'), - ('_tcl_data/encoding/macCentEuro.enc', - '/usr/share/tcltk/tcl8.6/encoding/macCentEuro.enc', - 'DATA'), - ('_tk_data/images/pwrdLogo.eps', - '/usr/share/tcltk/tk8.6/images/pwrdLogo.eps', - 'DATA'), - ('_tk_data/images/README', '/usr/share/tcltk/tk8.6/images/README', 'DATA'), - ('_tcl_data/msgs/id.msg', '/usr/share/tcltk/tcl8.6/msgs/id.msg', 'DATA'), - ('_tcl_data/msgs/es_sv.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_sv.msg', - 'DATA'), - ('_tcl_data/encoding/macGreek.enc', - '/usr/share/tcltk/tcl8.6/encoding/macGreek.enc', - 'DATA'), - ('_tcl_data/msgs/es_uy.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_uy.msg', - 'DATA'), - ('_tk_data/ttk/vistaTheme.tcl', - '/usr/share/tcltk/tk8.6/ttk/vistaTheme.tcl', - 'DATA'), - ('_tcl_data/msgs/da.msg', '/usr/share/tcltk/tcl8.6/msgs/da.msg', 'DATA'), - ('_tcl_data/msgs/lt.msg', '/usr/share/tcltk/tcl8.6/msgs/lt.msg', 'DATA'), - ('_tcl_data/msgs/es_cr.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_cr.msg', - 'DATA'), - ('_tcl_data/encoding/euc-jp.enc', - '/usr/share/tcltk/tcl8.6/encoding/euc-jp.enc', - 'DATA'), - ('_tcl_data/msgs/zh.msg', '/usr/share/tcltk/tcl8.6/msgs/zh.msg', 'DATA'), - ('_tcl_data/encoding/cp869.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp869.enc', - 'DATA'), - ('_tcl_data/http1.0/pkgIndex.tcl', - '/usr/share/tcltk/tcl8.6/http1.0/pkgIndex.tcl', - 'DATA'), - ('_tcl_data/tcl8/http-2.9.8.tm', - '/usr/share/tcltk/tcl8.6/tcl8/http-2.9.8.tm', - 'DATA'), - ('_tk_data/obsolete.tcl', '/usr/share/tcltk/tk8.6/obsolete.tcl', 'DATA'), - ('_tcl_data/history.tcl', '/usr/share/tcltk/tcl8.6/history.tcl', 'DATA'), - ('_tcl_data/encoding/cp1255.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1255.enc', - 'DATA'), - ('_tcl_data/encoding/gb2312.enc', - '/usr/share/tcltk/tcl8.6/encoding/gb2312.enc', - 'DATA'), - ('_tcl_data/msgs/hi_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/hi_in.msg', - 'DATA'), - ('_tcl_data/msgs/en_ph.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_ph.msg', - 'DATA'), - ('_tcl_data/msgs/is.msg', '/usr/share/tcltk/tcl8.6/msgs/is.msg', 'DATA'), - ('_tcl_data/tcl8/msgcat-1.6.1.tm', - '/usr/share/tcltk/tcl8.6/tcl8/msgcat-1.6.1.tm', - 'DATA'), - ('_tcl_data/encoding/iso2022-kr.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso2022-kr.enc', - 'DATA'), - ('_tcl_data/msgs/zh_tw.msg', - '/usr/share/tcltk/tcl8.6/msgs/zh_tw.msg', - 'DATA'), - ('_tcl_data/msgs/ru_ua.msg', - '/usr/share/tcltk/tcl8.6/msgs/ru_ua.msg', - 'DATA'), - ('_tcl_data/encoding/cp950.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp950.enc', - 'DATA'), - ('_tcl_data/encoding/jis0212.enc', - '/usr/share/tcltk/tcl8.6/encoding/jis0212.enc', - 'DATA'), - ('_tcl_data/msgs/hr.msg', '/usr/share/tcltk/tcl8.6/msgs/hr.msg', 'DATA'), - ('_tk_data/ttk/aquaTheme.tcl', - '/usr/share/tcltk/tk8.6/ttk/aquaTheme.tcl', - 'DATA'), - ('_tk_data/msgs/pl.msg', '/usr/share/tcltk/tk8.6/msgs/pl.msg', 'DATA'), - ('_tk_data/images/tai-ku.gif', - '/usr/share/tcltk/tk8.6/images/tai-ku.gif', - 'DATA'), - ('_tcl_data/encoding/macCyrillic.enc', - '/usr/share/tcltk/tcl8.6/encoding/macCyrillic.enc', - 'DATA'), - ('_tcl_data/tclIndex', '/usr/share/tcltk/tcl8.6/tclIndex', 'DATA'), - ('_tcl_data/encoding/iso2022.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso2022.enc', - 'DATA'), - ('_tcl_data/msgs/nb.msg', '/usr/share/tcltk/tcl8.6/msgs/nb.msg', 'DATA'), - ('_tk_data/images/pwrdLogo100.gif', - '/usr/share/tcltk/tk8.6/images/pwrdLogo100.gif', - 'DATA'), - ('_tcl_data/encoding/cp437.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp437.enc', - 'DATA'), - ('_tcl_data/encoding/cp864.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp864.enc', - 'DATA'), - ('_tcl_data/msgs/es_pr.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_pr.msg', - 'DATA'), - ('_tk_data/images/pwrdLogo175.gif', - '/usr/share/tcltk/tk8.6/images/pwrdLogo175.gif', - 'DATA'), - ('_tk_data/ttk/notebook.tcl', - '/usr/share/tcltk/tk8.6/ttk/notebook.tcl', - 'DATA'), - ('_tcl_data/msgs/ja.msg', '/usr/share/tcltk/tcl8.6/msgs/ja.msg', 'DATA'), - ('_tcl_data/msgs/gl.msg', '/usr/share/tcltk/tcl8.6/msgs/gl.msg', 'DATA'), - ('_tcl_data/msgs/lv.msg', '/usr/share/tcltk/tcl8.6/msgs/lv.msg', 'DATA'), - ('_tcl_data/msgs/mr.msg', '/usr/share/tcltk/tcl8.6/msgs/mr.msg', 'DATA'), - ('_tk_data/unsupported.tcl', - '/usr/share/tcltk/tk8.6/unsupported.tcl', - 'DATA'), - ('_tcl_data/msgs/fr_be.msg', - '/usr/share/tcltk/tcl8.6/msgs/fr_be.msg', - 'DATA'), - ('_tcl_data/encoding/big5.enc', - '/usr/share/tcltk/tcl8.6/encoding/big5.enc', - 'DATA'), - ('_tk_data/msgs/el.msg', '/usr/share/tcltk/tk8.6/msgs/el.msg', 'DATA'), - ('_tcl_data/msgs/es_ve.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_ve.msg', - 'DATA'), - ('_tcl_data/msgs/kw.msg', '/usr/share/tcltk/tcl8.6/msgs/kw.msg', 'DATA'), - ('_tk_data/images/logoLarge.gif', - '/usr/share/tcltk/tk8.6/images/logoLarge.gif', - 'DATA'), - ('_tk_data/ttk/fonts.tcl', '/usr/share/tcltk/tk8.6/ttk/fonts.tcl', 'DATA'), - ('_tcl_data/opt0.4/optparse.tcl', - '/usr/share/tcltk/tcl8.6/opt0.4/optparse.tcl', - 'DATA'), - ('_tk_data/tkAppInit.c', '/usr/share/tcltk/tk8.6/tkAppInit.c', 'DATA'), - ('_tcl_data/word.tcl', '/usr/share/tcltk/tcl8.6/word.tcl', 'DATA'), - ('_tcl_data/msgs/es_do.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_do.msg', - 'DATA'), - ('_tcl_data/msgs/en_hk.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_hk.msg', - 'DATA'), - ('_tk_data/ttk/sizegrip.tcl', - '/usr/share/tcltk/tk8.6/ttk/sizegrip.tcl', - 'DATA'), - ('_tcl_data/msgs/be.msg', '/usr/share/tcltk/tcl8.6/msgs/be.msg', 'DATA'), - ('_tcl_data/msgs/sr.msg', '/usr/share/tcltk/tcl8.6/msgs/sr.msg', 'DATA'), - ('_tk_data/images/pwrdLogo200.gif', - '/usr/share/tcltk/tk8.6/images/pwrdLogo200.gif', - 'DATA'), - ('_tcl_data/msgs/en_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_in.msg', - 'DATA'), - ('_tk_data/bgerror.tcl', '/usr/share/tcltk/tk8.6/bgerror.tcl', 'DATA'), - ('_tcl_data/msgs/de.msg', '/usr/share/tcltk/tcl8.6/msgs/de.msg', 'DATA'), - ('_tcl_data/msgs/ar_lb.msg', - '/usr/share/tcltk/tcl8.6/msgs/ar_lb.msg', - 'DATA'), - ('_tcl_data/msgs/zh_sg.msg', - '/usr/share/tcltk/tcl8.6/msgs/zh_sg.msg', - 'DATA'), - ('_tcl_data/msgs/en_be.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_be.msg', - 'DATA'), - ('_tk_data/msgs/sv.msg', '/usr/share/tcltk/tk8.6/msgs/sv.msg', 'DATA'), - ('_tcl_data/encoding/cp865.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp865.enc', - 'DATA'), - ('_tcl_data/package.tcl', '/usr/share/tcltk/tcl8.6/package.tcl', 'DATA'), - ('_tcl_data/encoding/tis-620.enc', - '/usr/share/tcltk/tcl8.6/encoding/tis-620.enc', - 'DATA'), - ('_tcl_data/msgs/kl_gl.msg', - '/usr/share/tcltk/tcl8.6/msgs/kl_gl.msg', - 'DATA'), - ('_tcl_data/encoding/cp860.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp860.enc', - 'DATA'), - ('_tk_data/images/pwrdLogo150.gif', - '/usr/share/tcltk/tk8.6/images/pwrdLogo150.gif', - 'DATA'), - ('_tcl_data/msgs/kok.msg', '/usr/share/tcltk/tcl8.6/msgs/kok.msg', 'DATA'), - ('_tk_data/iconlist.tcl', '/usr/share/tcltk/tk8.6/iconlist.tcl', 'DATA'), - ('_tcl_data/msgs/en_zw.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_zw.msg', - 'DATA'), - ('_tk_data/xmfbox.tcl', '/usr/share/tcltk/tk8.6/xmfbox.tcl', 'DATA'), - ('_tcl_data/tcl8/platform/shell-1.1.4.tm', - '/usr/share/tcltk/tcl8.6/tcl8/platform/shell-1.1.4.tm', - 'DATA'), - ('_tcl_data/msgs/ga.msg', '/usr/share/tcltk/tcl8.6/msgs/ga.msg', 'DATA'), - ('_tcl_data/msgs/de_at.msg', - '/usr/share/tcltk/tcl8.6/msgs/de_at.msg', - 'DATA'), - ('_tk_data/fontchooser.tcl', - '/usr/share/tcltk/tk8.6/fontchooser.tcl', - 'DATA'), - ('_tcl_data/msgs/pt_br.msg', - '/usr/share/tcltk/tcl8.6/msgs/pt_br.msg', - 'DATA'), - ('_tcl_data/encoding/macDingbats.enc', - '/usr/share/tcltk/tcl8.6/encoding/macDingbats.enc', - 'DATA'), - ('_tk_data/tearoff.tcl', '/usr/share/tcltk/tk8.6/tearoff.tcl', 'DATA'), - ('_tcl_data/encoding/iso8859-13.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-13.enc', - 'DATA'), - ('_tk_data/msgs/nl.msg', '/usr/share/tcltk/tk8.6/msgs/nl.msg', 'DATA'), - ('_tcl_data/msgs/ro.msg', '/usr/share/tcltk/tcl8.6/msgs/ro.msg', 'DATA'), - ('_tk_data/msgs/eo.msg', '/usr/share/tcltk/tk8.6/msgs/eo.msg', 'DATA'), - ('_tcl_data/encoding/cp1253.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp1253.enc', - 'DATA'), - ('_tcl_data/encoding/macRoman.enc', - '/usr/share/tcltk/tcl8.6/encoding/macRoman.enc', - 'DATA'), - ('_tcl_data/encoding/macCroatian.enc', - '/usr/share/tcltk/tcl8.6/encoding/macCroatian.enc', - 'DATA'), - ('_tcl_data/encoding/ebcdic.enc', - '/usr/share/tcltk/tcl8.6/encoding/ebcdic.enc', - 'DATA'), - ('_tcl_data/msgs/kok_in.msg', - '/usr/share/tcltk/tcl8.6/msgs/kok_in.msg', - 'DATA'), - ('_tcl_data/encoding/gb12345.enc', - '/usr/share/tcltk/tcl8.6/encoding/gb12345.enc', - 'DATA'), - ('_tcl_data/msgs/he.msg', '/usr/share/tcltk/tcl8.6/msgs/he.msg', 'DATA'), - ('_tcl_data/msgs/kl.msg', '/usr/share/tcltk/tcl8.6/msgs/kl.msg', 'DATA'), - ('_tcl_data/encoding/jis0208.enc', - '/usr/share/tcltk/tcl8.6/encoding/jis0208.enc', - 'DATA'), - ('_tcl_data/init.tcl', '/usr/share/tcltk/tcl8.6/init.tcl', 'DATA'), - ('_tk_data/msgs/da.msg', '/usr/share/tcltk/tk8.6/msgs/da.msg', 'DATA'), - ('_tcl_data/msgs/fr_ca.msg', - '/usr/share/tcltk/tcl8.6/msgs/fr_ca.msg', - 'DATA'), - ('_tcl_data/encoding/iso8859-7.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso8859-7.enc', - 'DATA'), - ('_tcl_data/msgs/ms_my.msg', - '/usr/share/tcltk/tcl8.6/msgs/ms_my.msg', - 'DATA'), - ('_tk_data/scale.tcl', '/usr/share/tcltk/tk8.6/scale.tcl', 'DATA'), - ('_tcl_data/msgs/bn.msg', '/usr/share/tcltk/tcl8.6/msgs/bn.msg', 'DATA'), - ('_tcl_data/encoding/macIceland.enc', - '/usr/share/tcltk/tcl8.6/encoding/macIceland.enc', - 'DATA'), - ('_tcl_data/msgs/sq.msg', '/usr/share/tcltk/tcl8.6/msgs/sq.msg', 'DATA'), - ('_tk_data/msgs/zh_cn.msg', '/usr/share/tcltk/tk8.6/msgs/zh_cn.msg', 'DATA'), - ('_tcl_data/msgs/es_py.msg', - '/usr/share/tcltk/tcl8.6/msgs/es_py.msg', - 'DATA'), - ('_tcl_data/msgs/fr.msg', '/usr/share/tcltk/tcl8.6/msgs/fr.msg', 'DATA'), - ('_tcl_data/msgs/el.msg', '/usr/share/tcltk/tcl8.6/msgs/el.msg', 'DATA'), - ('_tk_data/safetk.tcl', '/usr/share/tcltk/tk8.6/safetk.tcl', 'DATA'), - ('_tcl_data/encoding/cp936.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp936.enc', - 'DATA'), - ('_tk_data/images/logo.eps', - '/usr/share/tcltk/tk8.6/images/logo.eps', - 'DATA'), - ('_tcl_data/msgs/it_ch.msg', - '/usr/share/tcltk/tcl8.6/msgs/it_ch.msg', - 'DATA'), - ('_tcl_data/msgs/af.msg', '/usr/share/tcltk/tcl8.6/msgs/af.msg', 'DATA'), - ('_tcl_data/encoding/cp861.enc', - '/usr/share/tcltk/tcl8.6/encoding/cp861.enc', - 'DATA'), - ('_tk_data/ttk/winTheme.tcl', - '/usr/share/tcltk/tk8.6/ttk/winTheme.tcl', - 'DATA'), - ('_tcl_data/msgs/vi.msg', '/usr/share/tcltk/tcl8.6/msgs/vi.msg', 'DATA'), - ('_tcl_data/encoding/iso2022-jp.enc', - '/usr/share/tcltk/tcl8.6/encoding/iso2022-jp.enc', - 'DATA'), - ('_tcl_data/msgs/fa_ir.msg', - '/usr/share/tcltk/tcl8.6/msgs/fa_ir.msg', - 'DATA'), - ('_tcl_data/msgs/en_bw.msg', - '/usr/share/tcltk/tcl8.6/msgs/en_bw.msg', - 'DATA'), - ('setuptools/_vendor/importlib_metadata-8.7.1.dist-info/top_level.txt', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/top_level.txt', - 'DATA'), - ('setuptools/_vendor/importlib_metadata-8.7.1.dist-info/WHEEL', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/WHEEL', - 'DATA'), - ('setuptools/_vendor/importlib_metadata-8.7.1.dist-info/licenses/LICENSE', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/licenses/LICENSE', - 'DATA'), - ('setuptools/_vendor/importlib_metadata-8.7.1.dist-info/REQUESTED', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/REQUESTED', - 'DATA'), - ('setuptools/_vendor/importlib_metadata-8.7.1.dist-info/INSTALLER', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/INSTALLER', - 'DATA'), - ('setuptools/_vendor/importlib_metadata-8.7.1.dist-info/METADATA', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/METADATA', - 'DATA'), - ('setuptools/_vendor/importlib_metadata-8.7.1.dist-info/RECORD', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/RECORD', - 'DATA'), - ('setuptools/_vendor/jaraco/text/Lorem ipsum.txt', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/jaraco/text/Lorem ' - 'ipsum.txt', - 'DATA'), - ('certifi/py.typed', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/certifi/py.typed', - 'DATA'), - ('certifi/cacert.pem', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/certifi/cacert.pem', - 'DATA'), - ('base_library.zip', - '/home/borderban/Рабочий стол/client-py/build/FactorioSync/base_library.zip', - 'DATA')], - 'libpython3.12.so.1.0', - False, - False, - False, - [], - None, - None, - None) diff --git a/build/FactorioSync/PYZ-00.pyz b/build/FactorioSync/PYZ-00.pyz deleted file mode 100644 index 2b69e5f..0000000 Binary files a/build/FactorioSync/PYZ-00.pyz and /dev/null differ diff --git a/build/FactorioSync/PYZ-00.toc b/build/FactorioSync/PYZ-00.toc deleted file mode 100644 index bd70acb..0000000 --- a/build/FactorioSync/PYZ-00.toc +++ /dev/null @@ -1,1272 +0,0 @@ -('/home/borderban/Рабочий стол/client-py/build/FactorioSync/PYZ-00.pyz', - [('__future__', '/usr/lib/python3.12/__future__.py', 'PYMODULE'), - ('_aix_support', '/usr/lib/python3.12/_aix_support.py', 'PYMODULE'), - ('_compat_pickle', '/usr/lib/python3.12/_compat_pickle.py', 'PYMODULE'), - ('_compression', '/usr/lib/python3.12/_compression.py', 'PYMODULE'), - ('_distutils_hack', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/_distutils_hack/__init__.py', - 'PYMODULE'), - ('_distutils_hack.override', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/_distutils_hack/override.py', - 'PYMODULE'), - ('_py_abc', '/usr/lib/python3.12/_py_abc.py', 'PYMODULE'), - ('_pydatetime', '/usr/lib/python3.12/_pydatetime.py', 'PYMODULE'), - ('_pydecimal', '/usr/lib/python3.12/_pydecimal.py', 'PYMODULE'), - ('_sitebuiltins', '/usr/lib/python3.12/_sitebuiltins.py', 'PYMODULE'), - ('_strptime', '/usr/lib/python3.12/_strptime.py', 'PYMODULE'), - ('_sysconfigdata__x86_64-linux-gnu', - '/usr/lib/python3.12/_sysconfigdata__x86_64-linux-gnu.py', - 'PYMODULE'), - ('_threading_local', '/usr/lib/python3.12/_threading_local.py', 'PYMODULE'), - ('argparse', '/usr/lib/python3.12/argparse.py', 'PYMODULE'), - ('ast', '/usr/lib/python3.12/ast.py', 'PYMODULE'), - ('asyncio', '/usr/lib/python3.12/asyncio/__init__.py', 'PYMODULE'), - ('asyncio.base_events', - '/usr/lib/python3.12/asyncio/base_events.py', - 'PYMODULE'), - ('asyncio.base_futures', - '/usr/lib/python3.12/asyncio/base_futures.py', - 'PYMODULE'), - ('asyncio.base_subprocess', - '/usr/lib/python3.12/asyncio/base_subprocess.py', - 'PYMODULE'), - ('asyncio.base_tasks', - '/usr/lib/python3.12/asyncio/base_tasks.py', - 'PYMODULE'), - ('asyncio.constants', '/usr/lib/python3.12/asyncio/constants.py', 'PYMODULE'), - ('asyncio.coroutines', - '/usr/lib/python3.12/asyncio/coroutines.py', - 'PYMODULE'), - ('asyncio.events', '/usr/lib/python3.12/asyncio/events.py', 'PYMODULE'), - ('asyncio.exceptions', - '/usr/lib/python3.12/asyncio/exceptions.py', - 'PYMODULE'), - ('asyncio.format_helpers', - '/usr/lib/python3.12/asyncio/format_helpers.py', - 'PYMODULE'), - ('asyncio.futures', '/usr/lib/python3.12/asyncio/futures.py', 'PYMODULE'), - ('asyncio.locks', '/usr/lib/python3.12/asyncio/locks.py', 'PYMODULE'), - ('asyncio.log', '/usr/lib/python3.12/asyncio/log.py', 'PYMODULE'), - ('asyncio.mixins', '/usr/lib/python3.12/asyncio/mixins.py', 'PYMODULE'), - ('asyncio.proactor_events', - '/usr/lib/python3.12/asyncio/proactor_events.py', - 'PYMODULE'), - ('asyncio.protocols', '/usr/lib/python3.12/asyncio/protocols.py', 'PYMODULE'), - ('asyncio.queues', '/usr/lib/python3.12/asyncio/queues.py', 'PYMODULE'), - ('asyncio.runners', '/usr/lib/python3.12/asyncio/runners.py', 'PYMODULE'), - ('asyncio.selector_events', - '/usr/lib/python3.12/asyncio/selector_events.py', - 'PYMODULE'), - ('asyncio.sslproto', '/usr/lib/python3.12/asyncio/sslproto.py', 'PYMODULE'), - ('asyncio.staggered', '/usr/lib/python3.12/asyncio/staggered.py', 'PYMODULE'), - ('asyncio.streams', '/usr/lib/python3.12/asyncio/streams.py', 'PYMODULE'), - ('asyncio.subprocess', - '/usr/lib/python3.12/asyncio/subprocess.py', - 'PYMODULE'), - ('asyncio.taskgroups', - '/usr/lib/python3.12/asyncio/taskgroups.py', - 'PYMODULE'), - ('asyncio.tasks', '/usr/lib/python3.12/asyncio/tasks.py', 'PYMODULE'), - ('asyncio.threads', '/usr/lib/python3.12/asyncio/threads.py', 'PYMODULE'), - ('asyncio.timeouts', '/usr/lib/python3.12/asyncio/timeouts.py', 'PYMODULE'), - ('asyncio.transports', - '/usr/lib/python3.12/asyncio/transports.py', - 'PYMODULE'), - ('asyncio.trsock', '/usr/lib/python3.12/asyncio/trsock.py', 'PYMODULE'), - ('asyncio.unix_events', - '/usr/lib/python3.12/asyncio/unix_events.py', - 'PYMODULE'), - ('asyncio.windows_events', - '/usr/lib/python3.12/asyncio/windows_events.py', - 'PYMODULE'), - ('asyncio.windows_utils', - '/usr/lib/python3.12/asyncio/windows_utils.py', - 'PYMODULE'), - ('base64', '/usr/lib/python3.12/base64.py', 'PYMODULE'), - ('bisect', '/usr/lib/python3.12/bisect.py', 'PYMODULE'), - ('bz2', '/usr/lib/python3.12/bz2.py', 'PYMODULE'), - ('calendar', '/usr/lib/python3.12/calendar.py', 'PYMODULE'), - ('certifi', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/certifi/__init__.py', - 'PYMODULE'), - ('certifi.core', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/certifi/core.py', - 'PYMODULE'), - ('charset_normalizer', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/charset_normalizer/__init__.py', - 'PYMODULE'), - ('charset_normalizer.api', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/charset_normalizer/api.py', - 'PYMODULE'), - ('charset_normalizer.constant', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/charset_normalizer/constant.py', - 'PYMODULE'), - ('charset_normalizer.legacy', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/charset_normalizer/legacy.py', - 'PYMODULE'), - ('charset_normalizer.models', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/charset_normalizer/models.py', - 'PYMODULE'), - ('charset_normalizer.utils', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/charset_normalizer/utils.py', - 'PYMODULE'), - ('charset_normalizer.version', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/charset_normalizer/version.py', - 'PYMODULE'), - ('concurrent', '/usr/lib/python3.12/concurrent/__init__.py', 'PYMODULE'), - ('concurrent.futures', - '/usr/lib/python3.12/concurrent/futures/__init__.py', - 'PYMODULE'), - ('concurrent.futures._base', - '/usr/lib/python3.12/concurrent/futures/_base.py', - 'PYMODULE'), - ('concurrent.futures.process', - '/usr/lib/python3.12/concurrent/futures/process.py', - 'PYMODULE'), - ('concurrent.futures.thread', - '/usr/lib/python3.12/concurrent/futures/thread.py', - 'PYMODULE'), - ('configparser', '/usr/lib/python3.12/configparser.py', 'PYMODULE'), - ('contextlib', '/usr/lib/python3.12/contextlib.py', 'PYMODULE'), - ('contextvars', '/usr/lib/python3.12/contextvars.py', 'PYMODULE'), - ('copy', '/usr/lib/python3.12/copy.py', 'PYMODULE'), - ('csv', '/usr/lib/python3.12/csv.py', 'PYMODULE'), - ('ctypes', '/usr/lib/python3.12/ctypes/__init__.py', 'PYMODULE'), - ('ctypes._endian', '/usr/lib/python3.12/ctypes/_endian.py', 'PYMODULE'), - ('ctypes.wintypes', '/usr/lib/python3.12/ctypes/wintypes.py', 'PYMODULE'), - ('dataclasses', '/usr/lib/python3.12/dataclasses.py', 'PYMODULE'), - ('datetime', '/usr/lib/python3.12/datetime.py', 'PYMODULE'), - ('decimal', '/usr/lib/python3.12/decimal.py', 'PYMODULE'), - ('difflib', '/usr/lib/python3.12/difflib.py', 'PYMODULE'), - ('dis', '/usr/lib/python3.12/dis.py', 'PYMODULE'), - ('email', '/usr/lib/python3.12/email/__init__.py', 'PYMODULE'), - ('email._encoded_words', - '/usr/lib/python3.12/email/_encoded_words.py', - 'PYMODULE'), - ('email._header_value_parser', - '/usr/lib/python3.12/email/_header_value_parser.py', - 'PYMODULE'), - ('email._parseaddr', '/usr/lib/python3.12/email/_parseaddr.py', 'PYMODULE'), - ('email._policybase', '/usr/lib/python3.12/email/_policybase.py', 'PYMODULE'), - ('email.base64mime', '/usr/lib/python3.12/email/base64mime.py', 'PYMODULE'), - ('email.charset', '/usr/lib/python3.12/email/charset.py', 'PYMODULE'), - ('email.contentmanager', - '/usr/lib/python3.12/email/contentmanager.py', - 'PYMODULE'), - ('email.encoders', '/usr/lib/python3.12/email/encoders.py', 'PYMODULE'), - ('email.errors', '/usr/lib/python3.12/email/errors.py', 'PYMODULE'), - ('email.feedparser', '/usr/lib/python3.12/email/feedparser.py', 'PYMODULE'), - ('email.generator', '/usr/lib/python3.12/email/generator.py', 'PYMODULE'), - ('email.header', '/usr/lib/python3.12/email/header.py', 'PYMODULE'), - ('email.headerregistry', - '/usr/lib/python3.12/email/headerregistry.py', - 'PYMODULE'), - ('email.iterators', '/usr/lib/python3.12/email/iterators.py', 'PYMODULE'), - ('email.message', '/usr/lib/python3.12/email/message.py', 'PYMODULE'), - ('email.parser', '/usr/lib/python3.12/email/parser.py', 'PYMODULE'), - ('email.policy', '/usr/lib/python3.12/email/policy.py', 'PYMODULE'), - ('email.quoprimime', '/usr/lib/python3.12/email/quoprimime.py', 'PYMODULE'), - ('email.utils', '/usr/lib/python3.12/email/utils.py', 'PYMODULE'), - ('fnmatch', '/usr/lib/python3.12/fnmatch.py', 'PYMODULE'), - ('fractions', '/usr/lib/python3.12/fractions.py', 'PYMODULE'), - ('ftplib', '/usr/lib/python3.12/ftplib.py', 'PYMODULE'), - ('getopt', '/usr/lib/python3.12/getopt.py', 'PYMODULE'), - ('getpass', '/usr/lib/python3.12/getpass.py', 'PYMODULE'), - ('gettext', '/usr/lib/python3.12/gettext.py', 'PYMODULE'), - ('glob', '/usr/lib/python3.12/glob.py', 'PYMODULE'), - ('gzip', '/usr/lib/python3.12/gzip.py', 'PYMODULE'), - ('hashlib', '/usr/lib/python3.12/hashlib.py', 'PYMODULE'), - ('hmac', '/usr/lib/python3.12/hmac.py', 'PYMODULE'), - ('html', '/usr/lib/python3.12/html/__init__.py', 'PYMODULE'), - ('html.entities', '/usr/lib/python3.12/html/entities.py', 'PYMODULE'), - ('http', '/usr/lib/python3.12/http/__init__.py', 'PYMODULE'), - ('http.client', '/usr/lib/python3.12/http/client.py', 'PYMODULE'), - ('http.cookiejar', '/usr/lib/python3.12/http/cookiejar.py', 'PYMODULE'), - ('http.cookies', '/usr/lib/python3.12/http/cookies.py', 'PYMODULE'), - ('http.server', '/usr/lib/python3.12/http/server.py', 'PYMODULE'), - ('idna', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/idna/__init__.py', - 'PYMODULE'), - ('idna.core', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/idna/core.py', - 'PYMODULE'), - ('idna.idnadata', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/idna/idnadata.py', - 'PYMODULE'), - ('idna.intranges', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/idna/intranges.py', - 'PYMODULE'), - ('idna.package_data', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/idna/package_data.py', - 'PYMODULE'), - ('idna.uts46data', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/idna/uts46data.py', - 'PYMODULE'), - ('importlib', '/usr/lib/python3.12/importlib/__init__.py', 'PYMODULE'), - ('importlib._abc', '/usr/lib/python3.12/importlib/_abc.py', 'PYMODULE'), - ('importlib._bootstrap', - '/usr/lib/python3.12/importlib/_bootstrap.py', - 'PYMODULE'), - ('importlib._bootstrap_external', - '/usr/lib/python3.12/importlib/_bootstrap_external.py', - 'PYMODULE'), - ('importlib.abc', '/usr/lib/python3.12/importlib/abc.py', 'PYMODULE'), - ('importlib.machinery', - '/usr/lib/python3.12/importlib/machinery.py', - 'PYMODULE'), - ('importlib.metadata', - '/usr/lib/python3.12/importlib/metadata/__init__.py', - 'PYMODULE'), - ('importlib.metadata._adapters', - '/usr/lib/python3.12/importlib/metadata/_adapters.py', - 'PYMODULE'), - ('importlib.metadata._collections', - '/usr/lib/python3.12/importlib/metadata/_collections.py', - 'PYMODULE'), - ('importlib.metadata._functools', - '/usr/lib/python3.12/importlib/metadata/_functools.py', - 'PYMODULE'), - ('importlib.metadata._itertools', - '/usr/lib/python3.12/importlib/metadata/_itertools.py', - 'PYMODULE'), - ('importlib.metadata._meta', - '/usr/lib/python3.12/importlib/metadata/_meta.py', - 'PYMODULE'), - ('importlib.metadata._text', - '/usr/lib/python3.12/importlib/metadata/_text.py', - 'PYMODULE'), - ('importlib.readers', '/usr/lib/python3.12/importlib/readers.py', 'PYMODULE'), - ('importlib.resources', - '/usr/lib/python3.12/importlib/resources/__init__.py', - 'PYMODULE'), - ('importlib.resources._adapters', - '/usr/lib/python3.12/importlib/resources/_adapters.py', - 'PYMODULE'), - ('importlib.resources._common', - '/usr/lib/python3.12/importlib/resources/_common.py', - 'PYMODULE'), - ('importlib.resources._itertools', - '/usr/lib/python3.12/importlib/resources/_itertools.py', - 'PYMODULE'), - ('importlib.resources._legacy', - '/usr/lib/python3.12/importlib/resources/_legacy.py', - 'PYMODULE'), - ('importlib.resources.abc', - '/usr/lib/python3.12/importlib/resources/abc.py', - 'PYMODULE'), - ('importlib.resources.readers', - '/usr/lib/python3.12/importlib/resources/readers.py', - 'PYMODULE'), - ('importlib.util', '/usr/lib/python3.12/importlib/util.py', 'PYMODULE'), - ('inspect', '/usr/lib/python3.12/inspect.py', 'PYMODULE'), - ('ipaddress', '/usr/lib/python3.12/ipaddress.py', 'PYMODULE'), - ('json', '/usr/lib/python3.12/json/__init__.py', 'PYMODULE'), - ('json.decoder', '/usr/lib/python3.12/json/decoder.py', 'PYMODULE'), - ('json.encoder', '/usr/lib/python3.12/json/encoder.py', 'PYMODULE'), - ('json.scanner', '/usr/lib/python3.12/json/scanner.py', 'PYMODULE'), - ('logging', '/usr/lib/python3.12/logging/__init__.py', 'PYMODULE'), - ('lzma', '/usr/lib/python3.12/lzma.py', 'PYMODULE'), - ('mimetypes', '/usr/lib/python3.12/mimetypes.py', 'PYMODULE'), - ('multiprocessing', - '/usr/lib/python3.12/multiprocessing/__init__.py', - 'PYMODULE'), - ('multiprocessing.connection', - '/usr/lib/python3.12/multiprocessing/connection.py', - 'PYMODULE'), - ('multiprocessing.context', - '/usr/lib/python3.12/multiprocessing/context.py', - 'PYMODULE'), - ('multiprocessing.dummy', - '/usr/lib/python3.12/multiprocessing/dummy/__init__.py', - 'PYMODULE'), - ('multiprocessing.dummy.connection', - '/usr/lib/python3.12/multiprocessing/dummy/connection.py', - 'PYMODULE'), - ('multiprocessing.forkserver', - '/usr/lib/python3.12/multiprocessing/forkserver.py', - 'PYMODULE'), - ('multiprocessing.heap', - '/usr/lib/python3.12/multiprocessing/heap.py', - 'PYMODULE'), - ('multiprocessing.managers', - '/usr/lib/python3.12/multiprocessing/managers.py', - 'PYMODULE'), - ('multiprocessing.pool', - '/usr/lib/python3.12/multiprocessing/pool.py', - 'PYMODULE'), - ('multiprocessing.popen_fork', - '/usr/lib/python3.12/multiprocessing/popen_fork.py', - 'PYMODULE'), - ('multiprocessing.popen_forkserver', - '/usr/lib/python3.12/multiprocessing/popen_forkserver.py', - 'PYMODULE'), - ('multiprocessing.popen_spawn_posix', - '/usr/lib/python3.12/multiprocessing/popen_spawn_posix.py', - 'PYMODULE'), - ('multiprocessing.popen_spawn_win32', - '/usr/lib/python3.12/multiprocessing/popen_spawn_win32.py', - 'PYMODULE'), - ('multiprocessing.process', - '/usr/lib/python3.12/multiprocessing/process.py', - 'PYMODULE'), - ('multiprocessing.queues', - '/usr/lib/python3.12/multiprocessing/queues.py', - 'PYMODULE'), - ('multiprocessing.reduction', - '/usr/lib/python3.12/multiprocessing/reduction.py', - 'PYMODULE'), - ('multiprocessing.resource_sharer', - '/usr/lib/python3.12/multiprocessing/resource_sharer.py', - 'PYMODULE'), - ('multiprocessing.resource_tracker', - '/usr/lib/python3.12/multiprocessing/resource_tracker.py', - 'PYMODULE'), - ('multiprocessing.shared_memory', - '/usr/lib/python3.12/multiprocessing/shared_memory.py', - 'PYMODULE'), - ('multiprocessing.sharedctypes', - '/usr/lib/python3.12/multiprocessing/sharedctypes.py', - 'PYMODULE'), - ('multiprocessing.spawn', - '/usr/lib/python3.12/multiprocessing/spawn.py', - 'PYMODULE'), - ('multiprocessing.synchronize', - '/usr/lib/python3.12/multiprocessing/synchronize.py', - 'PYMODULE'), - ('multiprocessing.util', - '/usr/lib/python3.12/multiprocessing/util.py', - 'PYMODULE'), - ('netrc', '/usr/lib/python3.12/netrc.py', 'PYMODULE'), - ('nturl2path', '/usr/lib/python3.12/nturl2path.py', 'PYMODULE'), - ('numbers', '/usr/lib/python3.12/numbers.py', 'PYMODULE'), - ('opcode', '/usr/lib/python3.12/opcode.py', 'PYMODULE'), - ('packaging', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/__init__.py', - 'PYMODULE'), - ('packaging._elffile', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/_elffile.py', - 'PYMODULE'), - ('packaging._manylinux', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/_manylinux.py', - 'PYMODULE'), - ('packaging._musllinux', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/_musllinux.py', - 'PYMODULE'), - ('packaging._parser', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/_parser.py', - 'PYMODULE'), - ('packaging._structures', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/_structures.py', - 'PYMODULE'), - ('packaging._tokenizer', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/_tokenizer.py', - 'PYMODULE'), - ('packaging.licenses', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/licenses/__init__.py', - 'PYMODULE'), - ('packaging.licenses._spdx', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/licenses/_spdx.py', - 'PYMODULE'), - ('packaging.markers', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/markers.py', - 'PYMODULE'), - ('packaging.requirements', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/requirements.py', - 'PYMODULE'), - ('packaging.specifiers', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/specifiers.py', - 'PYMODULE'), - ('packaging.tags', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/tags.py', - 'PYMODULE'), - ('packaging.utils', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/utils.py', - 'PYMODULE'), - ('packaging.version', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/packaging/version.py', - 'PYMODULE'), - ('pathlib', '/usr/lib/python3.12/pathlib.py', 'PYMODULE'), - ('pickle', '/usr/lib/python3.12/pickle.py', 'PYMODULE'), - ('pkgutil', '/usr/lib/python3.12/pkgutil.py', 'PYMODULE'), - ('platform', '/usr/lib/python3.12/platform.py', 'PYMODULE'), - ('pprint', '/usr/lib/python3.12/pprint.py', 'PYMODULE'), - ('py_compile', '/usr/lib/python3.12/py_compile.py', 'PYMODULE'), - ('pydoc', '/usr/lib/python3.12/pydoc.py', 'PYMODULE'), - ('pydoc_data', '/usr/lib/python3.12/pydoc_data/__init__.py', 'PYMODULE'), - ('pydoc_data.topics', '/usr/lib/python3.12/pydoc_data/topics.py', 'PYMODULE'), - ('queue', '/usr/lib/python3.12/queue.py', 'PYMODULE'), - ('quopri', '/usr/lib/python3.12/quopri.py', 'PYMODULE'), - ('random', '/usr/lib/python3.12/random.py', 'PYMODULE'), - ('requests', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/__init__.py', - 'PYMODULE'), - ('requests.__version__', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/__version__.py', - 'PYMODULE'), - ('requests._internal_utils', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/_internal_utils.py', - 'PYMODULE'), - ('requests.adapters', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/adapters.py', - 'PYMODULE'), - ('requests.api', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/api.py', - 'PYMODULE'), - ('requests.auth', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/auth.py', - 'PYMODULE'), - ('requests.certs', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/certs.py', - 'PYMODULE'), - ('requests.compat', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/compat.py', - 'PYMODULE'), - ('requests.cookies', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/cookies.py', - 'PYMODULE'), - ('requests.exceptions', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/exceptions.py', - 'PYMODULE'), - ('requests.hooks', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/hooks.py', - 'PYMODULE'), - ('requests.models', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/models.py', - 'PYMODULE'), - ('requests.packages', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/packages.py', - 'PYMODULE'), - ('requests.sessions', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/sessions.py', - 'PYMODULE'), - ('requests.status_codes', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/status_codes.py', - 'PYMODULE'), - ('requests.structures', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/structures.py', - 'PYMODULE'), - ('requests.utils', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/requests/utils.py', - 'PYMODULE'), - ('rlcompleter', '/usr/lib/python3.12/rlcompleter.py', 'PYMODULE'), - ('runpy', '/usr/lib/python3.12/runpy.py', 'PYMODULE'), - ('secrets', '/usr/lib/python3.12/secrets.py', 'PYMODULE'), - ('selectors', '/usr/lib/python3.12/selectors.py', 'PYMODULE'), - ('setuptools', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/__init__.py', - 'PYMODULE'), - ('setuptools._core_metadata', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_core_metadata.py', - 'PYMODULE'), - ('setuptools._discovery', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_discovery.py', - 'PYMODULE'), - ('setuptools._distutils', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/__init__.py', - 'PYMODULE'), - ('setuptools._distutils._log', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/_log.py', - 'PYMODULE'), - ('setuptools._distutils._modified', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/_modified.py', - 'PYMODULE'), - ('setuptools._distutils._msvccompiler', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/_msvccompiler.py', - 'PYMODULE'), - ('setuptools._distutils.archive_util', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/archive_util.py', - 'PYMODULE'), - ('setuptools._distutils.ccompiler', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/ccompiler.py', - 'PYMODULE'), - ('setuptools._distutils.cmd', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/cmd.py', - 'PYMODULE'), - ('setuptools._distutils.command', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/command/__init__.py', - 'PYMODULE'), - ('setuptools._distutils.command.bdist', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/command/bdist.py', - 'PYMODULE'), - ('setuptools._distutils.command.build', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/command/build.py', - 'PYMODULE'), - ('setuptools._distutils.command.build_ext', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/command/build_ext.py', - 'PYMODULE'), - ('setuptools._distutils.command.sdist', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/command/sdist.py', - 'PYMODULE'), - ('setuptools._distutils.compat', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/compat/__init__.py', - 'PYMODULE'), - ('setuptools._distutils.compat.numpy', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/compat/numpy.py', - 'PYMODULE'), - ('setuptools._distutils.compat.py39', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/compat/py39.py', - 'PYMODULE'), - ('setuptools._distutils.compilers', '-', 'PYMODULE'), - ('setuptools._distutils.compilers.C', '-', 'PYMODULE'), - ('setuptools._distutils.compilers.C.base', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/compilers/C/base.py', - 'PYMODULE'), - ('setuptools._distutils.compilers.C.errors', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/compilers/C/errors.py', - 'PYMODULE'), - ('setuptools._distutils.compilers.C.msvc', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/compilers/C/msvc.py', - 'PYMODULE'), - ('setuptools._distutils.core', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/core.py', - 'PYMODULE'), - ('setuptools._distutils.debug', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/debug.py', - 'PYMODULE'), - ('setuptools._distutils.dir_util', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/dir_util.py', - 'PYMODULE'), - ('setuptools._distutils.dist', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/dist.py', - 'PYMODULE'), - ('setuptools._distutils.errors', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/errors.py', - 'PYMODULE'), - ('setuptools._distutils.extension', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/extension.py', - 'PYMODULE'), - ('setuptools._distutils.fancy_getopt', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/fancy_getopt.py', - 'PYMODULE'), - ('setuptools._distutils.file_util', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/file_util.py', - 'PYMODULE'), - ('setuptools._distutils.filelist', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/filelist.py', - 'PYMODULE'), - ('setuptools._distutils.log', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/log.py', - 'PYMODULE'), - ('setuptools._distutils.spawn', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/spawn.py', - 'PYMODULE'), - ('setuptools._distutils.sysconfig', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/sysconfig.py', - 'PYMODULE'), - ('setuptools._distutils.text_file', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/text_file.py', - 'PYMODULE'), - ('setuptools._distutils.util', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/util.py', - 'PYMODULE'), - ('setuptools._distutils.version', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/version.py', - 'PYMODULE'), - ('setuptools._distutils.versionpredicate', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_distutils/versionpredicate.py', - 'PYMODULE'), - ('setuptools._entry_points', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_entry_points.py', - 'PYMODULE'), - ('setuptools._imp', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_imp.py', - 'PYMODULE'), - ('setuptools._importlib', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_importlib.py', - 'PYMODULE'), - ('setuptools._itertools', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_itertools.py', - 'PYMODULE'), - ('setuptools._normalization', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_normalization.py', - 'PYMODULE'), - ('setuptools._path', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_path.py', - 'PYMODULE'), - ('setuptools._reqs', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_reqs.py', - 'PYMODULE'), - ('setuptools._shutil', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_shutil.py', - 'PYMODULE'), - ('setuptools._static', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_static.py', - 'PYMODULE'), - ('setuptools._vendor', '-', 'PYMODULE'), - ('setuptools._vendor.backports', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/backports/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.backports.tarfile', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/backports/tarfile/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.backports.tarfile.compat', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/backports/tarfile/compat/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.backports.tarfile.compat.py38', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/backports/tarfile/compat/py38.py', - 'PYMODULE'), - ('setuptools._vendor.importlib_metadata', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.importlib_metadata._adapters', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py', - 'PYMODULE'), - ('setuptools._vendor.importlib_metadata._collections', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata/_collections.py', - 'PYMODULE'), - ('setuptools._vendor.importlib_metadata._compat', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata/_compat.py', - 'PYMODULE'), - ('setuptools._vendor.importlib_metadata._functools', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata/_functools.py', - 'PYMODULE'), - ('setuptools._vendor.importlib_metadata._itertools', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py', - 'PYMODULE'), - ('setuptools._vendor.importlib_metadata._meta', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata/_meta.py', - 'PYMODULE'), - ('setuptools._vendor.importlib_metadata._text', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata/_text.py', - 'PYMODULE'), - ('setuptools._vendor.importlib_metadata._typing', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata/_typing.py', - 'PYMODULE'), - ('setuptools._vendor.importlib_metadata.compat', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata/compat/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.importlib_metadata.compat.py311', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata/compat/py311.py', - 'PYMODULE'), - ('setuptools._vendor.importlib_metadata.compat.py39', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/importlib_metadata/compat/py39.py', - 'PYMODULE'), - ('setuptools._vendor.jaraco', '-', 'PYMODULE'), - ('setuptools._vendor.jaraco.context', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/jaraco/context/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.jaraco.functools', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/jaraco/functools/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.jaraco.text', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/jaraco/text/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.more_itertools', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/more_itertools/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.more_itertools.more', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/more_itertools/more.py', - 'PYMODULE'), - ('setuptools._vendor.more_itertools.recipes', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/more_itertools/recipes.py', - 'PYMODULE'), - ('setuptools._vendor.packaging', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.packaging._elffile', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/_elffile.py', - 'PYMODULE'), - ('setuptools._vendor.packaging._manylinux', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/_manylinux.py', - 'PYMODULE'), - ('setuptools._vendor.packaging._musllinux', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/_musllinux.py', - 'PYMODULE'), - ('setuptools._vendor.packaging._parser', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/_parser.py', - 'PYMODULE'), - ('setuptools._vendor.packaging._structures', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/_structures.py', - 'PYMODULE'), - ('setuptools._vendor.packaging._tokenizer', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/_tokenizer.py', - 'PYMODULE'), - ('setuptools._vendor.packaging.markers', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/markers.py', - 'PYMODULE'), - ('setuptools._vendor.packaging.requirements', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/requirements.py', - 'PYMODULE'), - ('setuptools._vendor.packaging.specifiers', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/specifiers.py', - 'PYMODULE'), - ('setuptools._vendor.packaging.tags', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/tags.py', - 'PYMODULE'), - ('setuptools._vendor.packaging.utils', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/utils.py', - 'PYMODULE'), - ('setuptools._vendor.packaging.version', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/packaging/version.py', - 'PYMODULE'), - ('setuptools._vendor.tomli', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/tomli/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.tomli._parser', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/tomli/_parser.py', - 'PYMODULE'), - ('setuptools._vendor.tomli._re', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/tomli/_re.py', - 'PYMODULE'), - ('setuptools._vendor.tomli._types', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/tomli/_types.py', - 'PYMODULE'), - ('setuptools._vendor.wheel', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/wheel/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.wheel.macosx_libfile', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/wheel/macosx_libfile.py', - 'PYMODULE'), - ('setuptools._vendor.wheel.wheelfile', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/wheel/wheelfile.py', - 'PYMODULE'), - ('setuptools._vendor.zipp', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/zipp/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.zipp._functools', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/zipp/_functools.py', - 'PYMODULE'), - ('setuptools._vendor.zipp.compat', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/zipp/compat/__init__.py', - 'PYMODULE'), - ('setuptools._vendor.zipp.compat.overlay', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/zipp/compat/overlay.py', - 'PYMODULE'), - ('setuptools._vendor.zipp.compat.py310', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/zipp/compat/py310.py', - 'PYMODULE'), - ('setuptools._vendor.zipp.compat.py313', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/zipp/compat/py313.py', - 'PYMODULE'), - ('setuptools._vendor.zipp.glob', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/_vendor/zipp/glob.py', - 'PYMODULE'), - ('setuptools.archive_util', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/archive_util.py', - 'PYMODULE'), - ('setuptools.command', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/command/__init__.py', - 'PYMODULE'), - ('setuptools.command._requirestxt', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/command/_requirestxt.py', - 'PYMODULE'), - ('setuptools.command.bdist_egg', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/command/bdist_egg.py', - 'PYMODULE'), - ('setuptools.command.bdist_wheel', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/command/bdist_wheel.py', - 'PYMODULE'), - ('setuptools.command.build', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/command/build.py', - 'PYMODULE'), - ('setuptools.command.egg_info', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/command/egg_info.py', - 'PYMODULE'), - ('setuptools.command.sdist', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/command/sdist.py', - 'PYMODULE'), - ('setuptools.command.setopt', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/command/setopt.py', - 'PYMODULE'), - ('setuptools.compat', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/compat/__init__.py', - 'PYMODULE'), - ('setuptools.compat.py310', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/compat/py310.py', - 'PYMODULE'), - ('setuptools.compat.py311', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/compat/py311.py', - 'PYMODULE'), - ('setuptools.compat.py39', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/compat/py39.py', - 'PYMODULE'), - ('setuptools.config', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/config/__init__.py', - 'PYMODULE'), - ('setuptools.config._apply_pyprojecttoml', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/config/_apply_pyprojecttoml.py', - 'PYMODULE'), - ('setuptools.config._validate_pyproject', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/config/_validate_pyproject/__init__.py', - 'PYMODULE'), - ('setuptools.config._validate_pyproject.error_reporting', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/config/_validate_pyproject/error_reporting.py', - 'PYMODULE'), - ('setuptools.config._validate_pyproject.extra_validations', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/config/_validate_pyproject/extra_validations.py', - 'PYMODULE'), - ('setuptools.config._validate_pyproject.fastjsonschema_exceptions', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py', - 'PYMODULE'), - ('setuptools.config._validate_pyproject.fastjsonschema_validations', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py', - 'PYMODULE'), - ('setuptools.config._validate_pyproject.formats', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/config/_validate_pyproject/formats.py', - 'PYMODULE'), - ('setuptools.config.expand', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/config/expand.py', - 'PYMODULE'), - ('setuptools.config.pyprojecttoml', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/config/pyprojecttoml.py', - 'PYMODULE'), - ('setuptools.config.setupcfg', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/config/setupcfg.py', - 'PYMODULE'), - ('setuptools.depends', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/depends.py', - 'PYMODULE'), - ('setuptools.discovery', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/discovery.py', - 'PYMODULE'), - ('setuptools.dist', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/dist.py', - 'PYMODULE'), - ('setuptools.errors', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/errors.py', - 'PYMODULE'), - ('setuptools.extension', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/extension.py', - 'PYMODULE'), - ('setuptools.glob', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/glob.py', - 'PYMODULE'), - ('setuptools.installer', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/installer.py', - 'PYMODULE'), - ('setuptools.logging', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/logging.py', - 'PYMODULE'), - ('setuptools.monkey', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/monkey.py', - 'PYMODULE'), - ('setuptools.msvc', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/msvc.py', - 'PYMODULE'), - ('setuptools.unicode_utils', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/unicode_utils.py', - 'PYMODULE'), - ('setuptools.version', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/version.py', - 'PYMODULE'), - ('setuptools.warnings', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/warnings.py', - 'PYMODULE'), - ('setuptools.wheel', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/wheel.py', - 'PYMODULE'), - ('setuptools.windows_support', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/setuptools/windows_support.py', - 'PYMODULE'), - ('shlex', '/usr/lib/python3.12/shlex.py', 'PYMODULE'), - ('shutil', '/usr/lib/python3.12/shutil.py', 'PYMODULE'), - ('signal', '/usr/lib/python3.12/signal.py', 'PYMODULE'), - ('site', '/usr/lib/python3.12/site.py', 'PYMODULE'), - ('sitecustomize', '/usr/lib/python3.12/sitecustomize.py', 'PYMODULE'), - ('socket', '/usr/lib/python3.12/socket.py', 'PYMODULE'), - ('socketserver', '/usr/lib/python3.12/socketserver.py', 'PYMODULE'), - ('ssl', '/usr/lib/python3.12/ssl.py', 'PYMODULE'), - ('statistics', '/usr/lib/python3.12/statistics.py', 'PYMODULE'), - ('string', '/usr/lib/python3.12/string.py', 'PYMODULE'), - ('stringprep', '/usr/lib/python3.12/stringprep.py', 'PYMODULE'), - ('subprocess', '/usr/lib/python3.12/subprocess.py', 'PYMODULE'), - ('sysconfig', '/usr/lib/python3.12/sysconfig.py', 'PYMODULE'), - ('tarfile', '/usr/lib/python3.12/tarfile.py', 'PYMODULE'), - ('tempfile', '/usr/lib/python3.12/tempfile.py', 'PYMODULE'), - ('textwrap', '/usr/lib/python3.12/textwrap.py', 'PYMODULE'), - ('threading', '/usr/lib/python3.12/threading.py', 'PYMODULE'), - ('tkinter', '/usr/lib/python3.12/tkinter/__init__.py', 'PYMODULE'), - ('tkinter.commondialog', - '/usr/lib/python3.12/tkinter/commondialog.py', - 'PYMODULE'), - ('tkinter.constants', '/usr/lib/python3.12/tkinter/constants.py', 'PYMODULE'), - ('tkinter.dialog', '/usr/lib/python3.12/tkinter/dialog.py', 'PYMODULE'), - ('tkinter.filedialog', - '/usr/lib/python3.12/tkinter/filedialog.py', - 'PYMODULE'), - ('tkinter.messagebox', - '/usr/lib/python3.12/tkinter/messagebox.py', - 'PYMODULE'), - ('tkinter.simpledialog', - '/usr/lib/python3.12/tkinter/simpledialog.py', - 'PYMODULE'), - ('tkinter.ttk', '/usr/lib/python3.12/tkinter/ttk.py', 'PYMODULE'), - ('token', '/usr/lib/python3.12/token.py', 'PYMODULE'), - ('tokenize', '/usr/lib/python3.12/tokenize.py', 'PYMODULE'), - ('tomllib', '/usr/lib/python3.12/tomllib/__init__.py', 'PYMODULE'), - ('tomllib._parser', '/usr/lib/python3.12/tomllib/_parser.py', 'PYMODULE'), - ('tomllib._re', '/usr/lib/python3.12/tomllib/_re.py', 'PYMODULE'), - ('tomllib._types', '/usr/lib/python3.12/tomllib/_types.py', 'PYMODULE'), - ('tracemalloc', '/usr/lib/python3.12/tracemalloc.py', 'PYMODULE'), - ('tty', '/usr/lib/python3.12/tty.py', 'PYMODULE'), - ('typing', '/usr/lib/python3.12/typing.py', 'PYMODULE'), - ('unittest', '/usr/lib/python3.12/unittest/__init__.py', 'PYMODULE'), - ('unittest._log', '/usr/lib/python3.12/unittest/_log.py', 'PYMODULE'), - ('unittest.async_case', - '/usr/lib/python3.12/unittest/async_case.py', - 'PYMODULE'), - ('unittest.case', '/usr/lib/python3.12/unittest/case.py', 'PYMODULE'), - ('unittest.loader', '/usr/lib/python3.12/unittest/loader.py', 'PYMODULE'), - ('unittest.main', '/usr/lib/python3.12/unittest/main.py', 'PYMODULE'), - ('unittest.mock', '/usr/lib/python3.12/unittest/mock.py', 'PYMODULE'), - ('unittest.result', '/usr/lib/python3.12/unittest/result.py', 'PYMODULE'), - ('unittest.runner', '/usr/lib/python3.12/unittest/runner.py', 'PYMODULE'), - ('unittest.signals', '/usr/lib/python3.12/unittest/signals.py', 'PYMODULE'), - ('unittest.suite', '/usr/lib/python3.12/unittest/suite.py', 'PYMODULE'), - ('unittest.util', '/usr/lib/python3.12/unittest/util.py', 'PYMODULE'), - ('urllib', '/usr/lib/python3.12/urllib/__init__.py', 'PYMODULE'), - ('urllib.error', '/usr/lib/python3.12/urllib/error.py', 'PYMODULE'), - ('urllib.parse', '/usr/lib/python3.12/urllib/parse.py', 'PYMODULE'), - ('urllib.request', '/usr/lib/python3.12/urllib/request.py', 'PYMODULE'), - ('urllib.response', '/usr/lib/python3.12/urllib/response.py', 'PYMODULE'), - ('urllib3', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/__init__.py', - 'PYMODULE'), - ('urllib3._base_connection', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/_base_connection.py', - 'PYMODULE'), - ('urllib3._collections', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/_collections.py', - 'PYMODULE'), - ('urllib3._request_methods', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/_request_methods.py', - 'PYMODULE'), - ('urllib3._version', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/_version.py', - 'PYMODULE'), - ('urllib3.connection', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/connection.py', - 'PYMODULE'), - ('urllib3.connectionpool', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/connectionpool.py', - 'PYMODULE'), - ('urllib3.contrib', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/contrib/__init__.py', - 'PYMODULE'), - ('urllib3.contrib.emscripten', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__init__.py', - 'PYMODULE'), - ('urllib3.contrib.emscripten.connection', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/connection.py', - 'PYMODULE'), - ('urllib3.contrib.emscripten.fetch', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/fetch.py', - 'PYMODULE'), - ('urllib3.contrib.emscripten.request', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/request.py', - 'PYMODULE'), - ('urllib3.contrib.emscripten.response', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/response.py', - 'PYMODULE'), - ('urllib3.contrib.pyopenssl', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/contrib/pyopenssl.py', - 'PYMODULE'), - ('urllib3.contrib.socks', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/contrib/socks.py', - 'PYMODULE'), - ('urllib3.exceptions', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/exceptions.py', - 'PYMODULE'), - ('urllib3.fields', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/fields.py', - 'PYMODULE'), - ('urllib3.filepost', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/filepost.py', - 'PYMODULE'), - ('urllib3.http2', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/http2/__init__.py', - 'PYMODULE'), - ('urllib3.http2.connection', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/http2/connection.py', - 'PYMODULE'), - ('urllib3.http2.probe', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/http2/probe.py', - 'PYMODULE'), - ('urllib3.poolmanager', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/poolmanager.py', - 'PYMODULE'), - ('urllib3.response', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/response.py', - 'PYMODULE'), - ('urllib3.util', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/__init__.py', - 'PYMODULE'), - ('urllib3.util.connection', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/connection.py', - 'PYMODULE'), - ('urllib3.util.proxy', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/proxy.py', - 'PYMODULE'), - ('urllib3.util.request', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/request.py', - 'PYMODULE'), - ('urllib3.util.response', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/response.py', - 'PYMODULE'), - ('urllib3.util.retry', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/retry.py', - 'PYMODULE'), - ('urllib3.util.ssl_', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/ssl_.py', - 'PYMODULE'), - ('urllib3.util.ssl_match_hostname', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/ssl_match_hostname.py', - 'PYMODULE'), - ('urllib3.util.ssltransport', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/ssltransport.py', - 'PYMODULE'), - ('urllib3.util.timeout', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/timeout.py', - 'PYMODULE'), - ('urllib3.util.url', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/url.py', - 'PYMODULE'), - ('urllib3.util.util', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/util.py', - 'PYMODULE'), - ('urllib3.util.wait', - '/home/borderban/Рабочий ' - 'стол/client-py/venv/lib/python3.12/site-packages/urllib3/util/wait.py', - 'PYMODULE'), - ('webbrowser', '/usr/lib/python3.12/webbrowser.py', 'PYMODULE'), - ('xml', '/usr/lib/python3.12/xml/__init__.py', 'PYMODULE'), - ('xml.parsers', '/usr/lib/python3.12/xml/parsers/__init__.py', 'PYMODULE'), - ('xml.parsers.expat', '/usr/lib/python3.12/xml/parsers/expat.py', 'PYMODULE'), - ('xml.sax', '/usr/lib/python3.12/xml/sax/__init__.py', 'PYMODULE'), - ('xml.sax._exceptions', - '/usr/lib/python3.12/xml/sax/_exceptions.py', - 'PYMODULE'), - ('xml.sax.expatreader', - '/usr/lib/python3.12/xml/sax/expatreader.py', - 'PYMODULE'), - ('xml.sax.handler', '/usr/lib/python3.12/xml/sax/handler.py', 'PYMODULE'), - ('xml.sax.saxutils', '/usr/lib/python3.12/xml/sax/saxutils.py', 'PYMODULE'), - ('xml.sax.xmlreader', '/usr/lib/python3.12/xml/sax/xmlreader.py', 'PYMODULE'), - ('xmlrpc', '/usr/lib/python3.12/xmlrpc/__init__.py', 'PYMODULE'), - ('xmlrpc.client', '/usr/lib/python3.12/xmlrpc/client.py', 'PYMODULE'), - ('zipfile', '/usr/lib/python3.12/zipfile/__init__.py', 'PYMODULE'), - ('zipfile._path', - '/usr/lib/python3.12/zipfile/_path/__init__.py', - 'PYMODULE'), - ('zipfile._path.glob', - '/usr/lib/python3.12/zipfile/_path/glob.py', - 'PYMODULE'), - ('zipimport', '/usr/lib/python3.12/zipimport.py', 'PYMODULE')]) diff --git a/build/FactorioSync/base_library.zip b/build/FactorioSync/base_library.zip deleted file mode 100644 index d2c4452..0000000 Binary files a/build/FactorioSync/base_library.zip and /dev/null differ diff --git a/build/FactorioSync/localpycs/pyimod01_archive.pyc b/build/FactorioSync/localpycs/pyimod01_archive.pyc deleted file mode 100644 index 217c111..0000000 Binary files a/build/FactorioSync/localpycs/pyimod01_archive.pyc and /dev/null differ diff --git a/build/FactorioSync/localpycs/pyimod02_importers.pyc b/build/FactorioSync/localpycs/pyimod02_importers.pyc deleted file mode 100644 index 5c87b88..0000000 Binary files a/build/FactorioSync/localpycs/pyimod02_importers.pyc and /dev/null differ diff --git a/build/FactorioSync/localpycs/pyimod03_ctypes.pyc b/build/FactorioSync/localpycs/pyimod03_ctypes.pyc deleted file mode 100644 index f58c229..0000000 Binary files a/build/FactorioSync/localpycs/pyimod03_ctypes.pyc and /dev/null differ diff --git a/build/FactorioSync/localpycs/struct.pyc b/build/FactorioSync/localpycs/struct.pyc deleted file mode 100644 index ddc45c8..0000000 Binary files a/build/FactorioSync/localpycs/struct.pyc and /dev/null differ diff --git a/build/FactorioSync/warn-FactorioSync.txt b/build/FactorioSync/warn-FactorioSync.txt deleted file mode 100644 index 51ec2ba..0000000 --- a/build/FactorioSync/warn-FactorioSync.txt +++ /dev/null @@ -1,62 +0,0 @@ - -This file lists modules PyInstaller was not able to find. This does not -necessarily mean these modules are required for running your program. Both -Python's standard library and 3rd-party Python packages often conditionally -import optional modules, some of which may be available only on certain -platforms. - -Types of import: -* top-level: imported at the top-level - look at these first -* conditional: imported within an if-statement -* delayed: imported within a function -* optional: imported within a try-except-statement - -IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for - tracking down the missing module yourself. Thanks! - -missing module named _winapi - imported by encodings (delayed, conditional, optional), shutil (conditional), ntpath (optional), subprocess (conditional), mimetypes (optional), multiprocessing.connection (optional), multiprocessing.spawn (delayed, conditional), multiprocessing.reduction (conditional), multiprocessing.shared_memory (conditional), multiprocessing.heap (conditional), multiprocessing.popen_spawn_win32 (top-level), asyncio.windows_events (top-level), asyncio.windows_utils (top-level) -missing module named msvcrt - imported by subprocess (optional), getpass (optional), multiprocessing.spawn (delayed, conditional), multiprocessing.popen_spawn_win32 (top-level), asyncio.windows_events (top-level), asyncio.windows_utils (top-level) -missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional), zipimport (top-level) -excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional), zipimport (top-level) -missing module named winreg - imported by importlib._bootstrap_external (conditional), platform (delayed, optional), mimetypes (optional), urllib.request (delayed, conditional, optional), requests.utils (delayed, conditional, optional), setuptools._distutils.compilers.C.msvc (top-level), setuptools.msvc (conditional) -missing module named nt - imported by shutil (conditional), importlib._bootstrap_external (conditional), ntpath (optional), os (delayed, conditional, optional), ctypes (delayed, conditional) -missing module named _scproxy - imported by urllib.request (conditional) -missing module named multiprocessing.BufferTooShort - imported by multiprocessing (top-level), multiprocessing.connection (top-level) -missing module named multiprocessing.AuthenticationError - imported by multiprocessing (top-level), multiprocessing.connection (top-level) -missing module named multiprocessing.get_context - imported by multiprocessing (top-level), multiprocessing.pool (top-level), multiprocessing.managers (top-level), multiprocessing.sharedctypes (top-level) -missing module named multiprocessing.TimeoutError - imported by multiprocessing (top-level), multiprocessing.pool (top-level) -missing module named multiprocessing.set_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level) -missing module named multiprocessing.get_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level) -missing module named pyimod02_importers - imported by /home/borderban/Рабочий стол/client-py/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgutil.py (delayed) -missing module named typing_extensions - imported by setuptools._distutils.util (conditional), setuptools._distutils.compilers.C.base (conditional), setuptools._distutils.sysconfig (conditional), packaging.version (conditional), setuptools._reqs (conditional), setuptools.warnings (conditional), setuptools._path (conditional), setuptools._distutils.dist (conditional), setuptools._distutils.cmd (conditional), setuptools._distutils.command.bdist (conditional), setuptools.config.expand (conditional), setuptools.config.setupcfg (conditional), setuptools.config._apply_pyprojecttoml (conditional), setuptools.config.pyprojecttoml (conditional), setuptools.config._validate_pyproject.formats (conditional), setuptools._vendor.packaging.version (conditional), setuptools.config._validate_pyproject.error_reporting (conditional), setuptools.dist (conditional), setuptools.command.bdist_egg (conditional), setuptools.compat.py311 (conditional), urllib3.util.retry (conditional), urllib3._collections (conditional), urllib3.util.ssltransport (conditional), urllib3.connectionpool (conditional), urllib3.poolmanager (conditional), urllib3.contrib.emscripten.fetch (conditional), charset_normalizer.md (conditional, optional), setuptools.msvc (conditional) -missing module named _overlapped - imported by asyncio.windows_events (top-level) -missing module named asyncio.DefaultEventLoopPolicy - imported by asyncio (delayed, conditional), asyncio.events (delayed, conditional) -missing module named _typeshed - imported by setuptools._distutils.dist (conditional), setuptools.command.bdist_egg (conditional), setuptools.glob (conditional), setuptools._vendor.wheel.wheelfile (conditional), setuptools.compat.py311 (conditional) -missing module named vms_lib - imported by platform (delayed, optional) -missing module named 'java.lang' - imported by platform (delayed, optional) -missing module named java - imported by platform (delayed) -missing module named _winreg - imported by platform (delayed, optional) -missing module named _wmi - imported by platform (optional) -missing module named usercustomize - imported by site (delayed, optional) -missing module named apport_python_hook - imported by sitecustomize (optional) -missing module named _manylinux - imported by packaging._manylinux (delayed, optional), setuptools._vendor.packaging._manylinux (delayed, optional) -missing module named setuptools._vendor.backports.zstd - imported by setuptools._vendor.backports (top-level), urllib3.util.request (conditional, optional), urllib3.response (conditional, optional) -missing module named importlib_resources - imported by setuptools._vendor.jaraco.text (optional) -missing module named trove_classifiers - imported by setuptools.config._validate_pyproject.formats (optional) -missing module named simplejson - imported by requests.compat (conditional, optional) -missing module named dummy_threading - imported by requests.cookies (optional) -missing module named compression - imported by urllib3.util.request (conditional, optional), urllib3.response (conditional, optional) -missing module named 'h2.events' - imported by urllib3.http2.connection (top-level) -missing module named 'h2.connection' - imported by urllib3.http2.connection (top-level) -missing module named h2 - imported by urllib3.http2.connection (top-level) -missing module named brotli - imported by urllib3.util.request (optional), urllib3.response (optional) -missing module named brotlicffi - imported by urllib3.util.request (optional), urllib3.response (optional) -missing module named socks - imported by urllib3.contrib.socks (optional) -missing module named cryptography - imported by urllib3.contrib.pyopenssl (top-level), requests (conditional, optional) -missing module named 'OpenSSL.crypto' - imported by urllib3.contrib.pyopenssl (delayed, conditional) -missing module named 'cryptography.x509' - imported by urllib3.contrib.pyopenssl (delayed, optional) -missing module named OpenSSL - imported by urllib3.contrib.pyopenssl (top-level) -missing module named chardet - imported by requests (optional) -missing module named 'pyodide.ffi' - imported by urllib3.contrib.emscripten.fetch (delayed, optional) -missing module named pyodide - imported by urllib3.contrib.emscripten.fetch (top-level) -missing module named js - imported by urllib3.contrib.emscripten.fetch (top-level) diff --git a/build/FactorioSync/xref-FactorioSync.html b/build/FactorioSync/xref-FactorioSync.html deleted file mode 100644 index bb409f3..0000000 --- a/build/FactorioSync/xref-FactorioSync.html +++ /dev/null @@ -1,19508 +0,0 @@ - - - - - modulegraph cross reference for client.py, pyi_rth__tkinter.py, pyi_rth_inspect.py, pyi_rth_multiprocessing.py, pyi_rth_pkgutil.py, pyi_rth_setuptools.py - - - -

modulegraph cross reference for client.py, pyi_rth__tkinter.py, pyi_rth_inspect.py, pyi_rth_multiprocessing.py, pyi_rth_pkgutil.py, pyi_rth_setuptools.py

- -
- - client.py -Script
-imports: - _collections_abc - • _weakrefset - • abc - • codecs - • collections - • collections.abc - • copyreg - • encodings - • encodings.aliases - • encodings.ascii - • encodings.base64_codec - • encodings.big5 - • encodings.big5hkscs - • encodings.bz2_codec - • encodings.charmap - • encodings.cp037 - • encodings.cp1006 - • encodings.cp1026 - • encodings.cp1125 - • encodings.cp1140 - • encodings.cp1250 - • encodings.cp1251 - • encodings.cp1252 - • encodings.cp1253 - • encodings.cp1254 - • encodings.cp1255 - • encodings.cp1256 - • encodings.cp1257 - • encodings.cp1258 - • encodings.cp273 - • encodings.cp424 - • encodings.cp437 - • encodings.cp500 - • encodings.cp720 - • encodings.cp737 - • encodings.cp775 - • encodings.cp850 - • encodings.cp852 - • encodings.cp855 - • encodings.cp856 - • encodings.cp857 - • encodings.cp858 - • encodings.cp860 - • encodings.cp861 - • encodings.cp862 - • encodings.cp863 - • encodings.cp864 - • encodings.cp865 - • encodings.cp866 - • encodings.cp869 - • encodings.cp874 - • encodings.cp875 - • encodings.cp932 - • encodings.cp949 - • encodings.cp950 - • encodings.euc_jis_2004 - • encodings.euc_jisx0213 - • encodings.euc_jp - • encodings.euc_kr - • encodings.gb18030 - • encodings.gb2312 - • encodings.gbk - • encodings.hex_codec - • encodings.hp_roman8 - • encodings.hz - • encodings.idna - • encodings.iso2022_jp - • encodings.iso2022_jp_1 - • encodings.iso2022_jp_2 - • encodings.iso2022_jp_2004 - • encodings.iso2022_jp_3 - • encodings.iso2022_jp_ext - • encodings.iso2022_kr - • encodings.iso8859_1 - • encodings.iso8859_10 - • encodings.iso8859_11 - • encodings.iso8859_13 - • encodings.iso8859_14 - • encodings.iso8859_15 - • encodings.iso8859_16 - • encodings.iso8859_2 - • encodings.iso8859_3 - • encodings.iso8859_4 - • encodings.iso8859_5 - • encodings.iso8859_6 - • encodings.iso8859_7 - • encodings.iso8859_8 - • encodings.iso8859_9 - • encodings.johab - • encodings.koi8_r - • encodings.koi8_t - • encodings.koi8_u - • encodings.kz1048 - • encodings.latin_1 - • encodings.mac_arabic - • encodings.mac_croatian - • encodings.mac_cyrillic - • encodings.mac_farsi - • encodings.mac_greek - • encodings.mac_iceland - • encodings.mac_latin2 - • encodings.mac_roman - • encodings.mac_romanian - • encodings.mac_turkish - • encodings.mbcs - • encodings.oem - • encodings.palmos - • encodings.ptcp154 - • encodings.punycode - • encodings.quopri_codec - • encodings.raw_unicode_escape - • encodings.rot_13 - • encodings.shift_jis - • encodings.shift_jis_2004 - • encodings.shift_jisx0213 - • encodings.tis_620 - • encodings.undefined - • encodings.unicode_escape - • encodings.utf_16 - • encodings.utf_16_be - • encodings.utf_16_le - • encodings.utf_32 - • encodings.utf_32_be - • encodings.utf_32_le - • encodings.utf_7 - • encodings.utf_8 - • encodings.utf_8_sig - • encodings.uu_codec - • encodings.zlib_codec - • enum - • functools - • genericpath - • hashlib - • heapq - • io - • json - • keyword - • linecache - • locale - • ntpath - • operator - • os - • pathlib - • posixpath - • pyi_rth__tkinter.py - • pyi_rth_inspect.py - • pyi_rth_multiprocessing.py - • pyi_rth_pkgutil.py - • pyi_rth_setuptools.py - • re - • re._casefix - • re._compiler - • re._constants - • re._parser - • reprlib - • requests - • sre_compile - • sre_constants - • sre_parse - • stat - • threading - • tkinter - • tkinter.filedialog - • tkinter.messagebox - • tkinter.ttk - • traceback - • types - • warnings - • weakref - -
- -
- -
- - pyi_rth__tkinter.py -Script
-imports: - os - • sys - -
-
-imported by: - client.py - -
- -
- -
- - pyi_rth_inspect.py -Script
-imports: - inspect - • os - • sys - • zipfile - -
-
-imported by: - client.py - -
- -
- -
- - pyi_rth_multiprocessing.py -Script
-imports: - multiprocessing - • multiprocessing.spawn - • subprocess - • sys - -
-
-imported by: - client.py - -
- -
- -
- - pyi_rth_pkgutil.py -Script
-imports: - pkgutil - • pyimod02_importers - -
-
-imported by: - client.py - -
- -
- -
- - pyi_rth_setuptools.py -Script
-imports: - _distutils_hack - • os - • setuptools - -
-
-imported by: - client.py - -
- -
- -
- - 'OpenSSL.crypto' -MissingModule
-imported by: - urllib3.contrib.pyopenssl - -
- -
- -
- - 'cryptography.x509' -MissingModule
-imported by: - urllib3.contrib.pyopenssl - -
- -
- -
- - 'h2.connection' -MissingModule
-imported by: - urllib3.http2.connection - -
- -
- -
- - 'h2.events' -MissingModule
-imported by: - urllib3.http2.connection - -
- -
- -
- - 'java.lang' -MissingModule
-imported by: - platform - -
- -
- -
- - 'pyodide.ffi' -MissingModule
-imported by: - urllib3.contrib.emscripten.fetch - -
- -
- -
- - 81d243bd2c585b0f4821__mypyc /home/borderban/Рабочий стол/client-py/venv/lib/python3.12/site-packages/81d243bd2c585b0f4821__mypyc.cpython-312-x86_64-linux-gnu.so
-imported by: - charset_normalizer - -
- -
- -
- - OpenSSL -MissingModule
-imported by: - urllib3.contrib.pyopenssl - -
- -
- -
- - __future__ -SourceModule
-imported by: - charset_normalizer - • charset_normalizer.api - • charset_normalizer.cd - • charset_normalizer.constant - • charset_normalizer.legacy - • charset_normalizer.md - • charset_normalizer.models - • charset_normalizer.utils - • charset_normalizer.version - • packaging._elffile - • packaging._manylinux - • packaging._musllinux - • packaging._parser - • packaging._tokenizer - • packaging.licenses - • packaging.licenses._spdx - • packaging.markers - • packaging.requirements - • packaging.specifiers - • packaging.tags - • packaging.utils - • packaging.version - • pydoc - • setuptools - • setuptools._core_metadata - • setuptools._distutils._modified - • setuptools._distutils.archive_util - • setuptools._distutils.cmd - • setuptools._distutils.command.bdist - • setuptools._distutils.command.build - • setuptools._distutils.command.build_ext - • setuptools._distutils.command.sdist - • setuptools._distutils.compat - • setuptools._distutils.compilers.C.base - • setuptools._distutils.compilers.C.msvc - • setuptools._distutils.core - • setuptools._distutils.dist - • setuptools._distutils.extension - • setuptools._distutils.fancy_getopt - • setuptools._distutils.filelist - • setuptools._distutils.spawn - • setuptools._distutils.sysconfig - • setuptools._distutils.util - • setuptools._path - • setuptools._reqs - • setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata._meta - • setuptools._vendor.importlib_metadata.compat.py39 - • setuptools._vendor.jaraco.context - • setuptools._vendor.jaraco.functools - • setuptools._vendor.packaging._elffile - • setuptools._vendor.packaging._manylinux - • setuptools._vendor.packaging._musllinux - • setuptools._vendor.packaging._parser - • setuptools._vendor.packaging._tokenizer - • setuptools._vendor.packaging.markers - • setuptools._vendor.packaging.requirements - • setuptools._vendor.packaging.specifiers - • setuptools._vendor.packaging.tags - • setuptools._vendor.packaging.utils - • setuptools._vendor.packaging.version - • setuptools._vendor.tomli._parser - • setuptools._vendor.tomli._re - • setuptools._vendor.wheel - • setuptools._vendor.wheel.macosx_libfile - • setuptools._vendor.wheel.wheelfile - • setuptools.command._requirestxt - • setuptools.command.bdist_egg - • setuptools.command.bdist_wheel - • setuptools.command.build - • setuptools.command.egg_info - • setuptools.command.sdist - • setuptools.compat.py311 - • setuptools.config._apply_pyprojecttoml - • setuptools.config._validate_pyproject.error_reporting - • setuptools.config._validate_pyproject.formats - • setuptools.config.expand - • setuptools.config.pyprojecttoml - • setuptools.config.setupcfg - • setuptools.depends - • setuptools.discovery - • setuptools.dist - • setuptools.errors - • setuptools.extension - • setuptools.glob - • setuptools.installer - • setuptools.monkey - • setuptools.msvc - • setuptools.warnings - • tomllib._parser - • tomllib._re - • urllib3 - • urllib3._base_connection - • urllib3._collections - • urllib3._request_methods - • urllib3.connection - • urllib3.connectionpool - • urllib3.contrib.emscripten - • urllib3.contrib.emscripten.connection - • urllib3.contrib.emscripten.fetch - • urllib3.contrib.emscripten.request - • urllib3.contrib.emscripten.response - • urllib3.contrib.pyopenssl - • urllib3.contrib.socks - • urllib3.exceptions - • urllib3.fields - • urllib3.filepost - • urllib3.http2 - • urllib3.http2.connection - • urllib3.http2.probe - • urllib3.poolmanager - • urllib3.response - • urllib3.util - • urllib3.util.connection - • urllib3.util.proxy - • urllib3.util.request - • urllib3.util.response - • urllib3.util.retry - • urllib3.util.ssl_ - • urllib3.util.ssl_match_hostname - • urllib3.util.ssltransport - • urllib3.util.timeout - • urllib3.util.url - • urllib3.util.util - • urllib3.util.wait - -
- -
- -
- - _abc (builtin module)
-imported by: - abc - -
- -
- -
- - _aix_support -SourceModule
-imports: - contextlib - • os - • subprocess - • sys - • sysconfig - -
-
-imported by: - sysconfig - -
- -
- -
- - _ast (builtin module)
-imported by: - ast - -
- -
- -
- - _asyncio /usr/lib/python3.12/lib-dynload/_asyncio.cpython-312-x86_64-linux-gnu.so
-imported by: - asyncio.events - • asyncio.futures - • asyncio.tasks - -
- -
- -
- - _bisect (builtin module)
-imported by: - bisect - -
- -
- -
- - _blake2 (builtin module)
-imported by: - hashlib - -
- -
- -
- - _bz2 /usr/lib/python3.12/lib-dynload/_bz2.cpython-312-x86_64-linux-gnu.so
-imported by: - bz2 - -
- -
- -
- - _codecs (builtin module)
-imported by: - codecs - -
- -
- -
- - _codecs_cn /usr/lib/python3.12/lib-dynload/_codecs_cn.cpython-312-x86_64-linux-gnu.so
-imported by: - encodings.gb18030 - • encodings.gb2312 - • encodings.gbk - • encodings.hz - -
- -
- -
- - _codecs_hk /usr/lib/python3.12/lib-dynload/_codecs_hk.cpython-312-x86_64-linux-gnu.so
-imported by: - encodings.big5hkscs - -
- -
- -
- - _codecs_iso2022 /usr/lib/python3.12/lib-dynload/_codecs_iso2022.cpython-312-x86_64-linux-gnu.so
-imported by: - encodings.iso2022_jp - • encodings.iso2022_jp_1 - • encodings.iso2022_jp_2 - • encodings.iso2022_jp_2004 - • encodings.iso2022_jp_3 - • encodings.iso2022_jp_ext - • encodings.iso2022_kr - -
- -
- -
- - _codecs_jp /usr/lib/python3.12/lib-dynload/_codecs_jp.cpython-312-x86_64-linux-gnu.so
-imported by: - encodings.cp932 - • encodings.euc_jis_2004 - • encodings.euc_jisx0213 - • encodings.euc_jp - • encodings.shift_jis - • encodings.shift_jis_2004 - • encodings.shift_jisx0213 - -
- -
- -
- - _codecs_kr /usr/lib/python3.12/lib-dynload/_codecs_kr.cpython-312-x86_64-linux-gnu.so
-imported by: - encodings.cp949 - • encodings.euc_kr - • encodings.johab - -
- -
- -
- - _codecs_tw /usr/lib/python3.12/lib-dynload/_codecs_tw.cpython-312-x86_64-linux-gnu.so
-imported by: - encodings.big5 - • encodings.cp950 - -
- -
- -
- - _collections (builtin module)
-imported by: - collections - • threading - -
- -
- -
- - _collections_abc -SourceModule
-imports: - abc - • sys - • warnings - -
-
-imported by: - client.py - • collections - • collections.abc - • contextlib - • locale - • os - • pathlib - • random - • types - • weakref - -
- -
- -
- - _compat_pickle -SourceModule
-imported by: - _pickle - • pickle - -
- -
- -
- - _compression -SourceModule
-imports: - io - • sys - -
-
-imported by: - bz2 - • gzip - • lzma - -
- -
- -
- - _contextvars /usr/lib/python3.12/lib-dynload/_contextvars.cpython-312-x86_64-linux-gnu.so
-imported by: - contextvars - -
- -
- -
- - _csv (builtin module)
-imported by: - csv - -
- -
- -
- - _ctypes /usr/lib/python3.12/lib-dynload/_ctypes.cpython-312-x86_64-linux-gnu.so
-imported by: - ctypes - -
- -
- -
- - _datetime (builtin module)
-imports: - _strptime - • time - -
-
-imported by: - datetime - -
- -
- -
- - _decimal /usr/lib/python3.12/lib-dynload/_decimal.cpython-312-x86_64-linux-gnu.so
-imported by: - decimal - -
- -
- -
- - _distutils_hack -Package
-imports: - importlib - • importlib.abc - • importlib.util - • os - • sys - • traceback - • warnings - -
-
-imported by: - _distutils_hack.override - • pyi_rth_setuptools.py - -
- -
- -
- - _distutils_hack.override -SourceModule
-imports: - _distutils_hack - -
-
-imported by: - setuptools - • setuptools.discovery - -
- -
- -
- - _frozen_importlib -ExcludedModule
-imported by: - importlib - • importlib.abc - • zipimport - -
- -
- -
- - _frozen_importlib_external -MissingModule
-imported by: - importlib - • importlib._bootstrap - • importlib.abc - • zipimport - -
- -
- -
- - _functools (builtin module)
-imported by: - functools - -
- -
- -
- - _hashlib /usr/lib/python3.12/lib-dynload/_hashlib.cpython-312-x86_64-linux-gnu.so
-imported by: - hashlib - • hmac - -
- -
- -
- - _heapq (builtin module)
-imported by: - heapq - -
- -
- -
- - _imp (builtin module)
-imported by: - importlib - • importlib._bootstrap_external - • importlib.util - • setuptools._distutils.compat.py39 - • sysconfig - • zipimport - -
- -
- -
- - _io (builtin module)
-imported by: - importlib._bootstrap_external - • io - • unittest.mock - • zipimport - -
- -
- -
- - _json /usr/lib/python3.12/lib-dynload/_json.cpython-312-x86_64-linux-gnu.so
-imports: - json.decoder - -
-
-imported by: - json.decoder - • json.encoder - • json.scanner - -
- -
- -
- - _locale (builtin module)
-imported by: - locale - -
- -
- -
- - _lzma /usr/lib/python3.12/lib-dynload/_lzma.cpython-312-x86_64-linux-gnu.so
-imported by: - lzma - -
- -
- -
- - _manylinux -MissingModule
-imported by: - packaging._manylinux - • setuptools._vendor.packaging._manylinux - -
- -
- -
- - _md5 (builtin module)
-imported by: - hashlib - -
- -
- -
- - _multibytecodec /usr/lib/python3.12/lib-dynload/_multibytecodec.cpython-312-x86_64-linux-gnu.so
-imported by: - charset_normalizer.utils - • encodings.big5 - • encodings.big5hkscs - • encodings.cp932 - • encodings.cp949 - • encodings.cp950 - • encodings.euc_jis_2004 - • encodings.euc_jisx0213 - • encodings.euc_jp - • encodings.euc_kr - • encodings.gb18030 - • encodings.gb2312 - • encodings.gbk - • encodings.hz - • encodings.iso2022_jp - • encodings.iso2022_jp_1 - • encodings.iso2022_jp_2 - • encodings.iso2022_jp_2004 - • encodings.iso2022_jp_3 - • encodings.iso2022_jp_ext - • encodings.iso2022_kr - • encodings.johab - • encodings.shift_jis - • encodings.shift_jis_2004 - • encodings.shift_jisx0213 - -
- -
- -
- - _multiprocessing /usr/lib/python3.12/lib-dynload/_multiprocessing.cpython-312-x86_64-linux-gnu.so
-imported by: - multiprocessing.connection - • multiprocessing.queues - • multiprocessing.resource_tracker - • multiprocessing.synchronize - -
- -
- -
- - _opcode (builtin module)
-imported by: - opcode - -
- -
- -
- - _operator (builtin module)
-imported by: - hmac - • operator - -
- -
- -
- - _overlapped -MissingModule
-imported by: - asyncio.windows_events - -
- -
- -
- - _pickle (builtin module)
-imports: - _compat_pickle - • codecs - • copyreg - -
-
-imported by: - pickle - -
- -
- -
- - _posixshmem /usr/lib/python3.12/lib-dynload/_posixshmem.cpython-312-x86_64-linux-gnu.so
-imported by: - multiprocessing.resource_tracker - • multiprocessing.shared_memory - -
- -
- -
- - _posixsubprocess (builtin module)
-imports: - gc - -
-
-imported by: - multiprocessing.util - • subprocess - -
- -
- -
- - _py_abc -SourceModule
-imports: - _weakrefset - -
-
-imported by: - abc - -
- -
- -
- - _pydatetime -SourceModule
-imports: - _strptime - • math - • operator - • sys - • time - • warnings - -
-
-imported by: - datetime - -
- -
- -
- - _pydecimal -SourceModule
-imports: - collections - • contextvars - • itertools - • locale - • math - • numbers - • re - • sys - -
-
-imported by: - decimal - -
- -
- -
- - _queue /usr/lib/python3.12/lib-dynload/_queue.cpython-312-x86_64-linux-gnu.so
-imported by: - queue - -
- -
- -
- - _random (builtin module)
-imported by: - random - -
- -
- -
- - _scproxy -MissingModule
-imported by: - urllib.request - -
- -
- -
- - _sha1 (builtin module)
-imported by: - hashlib - -
- -
- -
- - _sha2 (builtin module)
-imported by: - hashlib - • random - -
- -
- -
- - _sha3 (builtin module)
-imported by: - hashlib - -
- -
- -
- - _signal (builtin module)
-imported by: - signal - -
- -
- -
- - _sitebuiltins -SourceModule
-imports: - os - • pydoc - • sys - -
-
-imported by: - site - -
- -
- -
- - _socket (builtin module)
-imported by: - socket - -
- -
- -
- - _sre (builtin module)
-imports: - copy - • re - -
-
-imported by: - re - • re._compiler - • re._constants - -
- -
- -
- - _ssl /usr/lib/python3.12/lib-dynload/_ssl.cpython-312-x86_64-linux-gnu.so
-imports: - socket - -
-
-imported by: - ssl - -
- -
- -
- - _stat (builtin module)
-imported by: - stat - -
- -
- -
- - _statistics (builtin module)
-imported by: - statistics - -
- -
- -
- - _string (builtin module)
-imported by: - string - -
- -
- -
- - _strptime -SourceModule
-imports: - _thread - • calendar - • datetime - • locale - • re - • time - -
-
-imported by: - _datetime - • _pydatetime - • time - -
- -
- -
- - _struct (builtin module)
-imported by: - struct - -
- -
- -
- - _sysconfigdata__x86_64-linux-gnu -SourceModule
-imported by: - sysconfig - -
- -
- -
- - _thread (builtin module)
-imported by: - _strptime - • dataclasses - • functools - • reprlib - • tempfile - • threading - -
- -
- -
- - _threading_local -SourceModule
-imports: - contextlib - • threading - • weakref - -
-
-imported by: - threading - -
- -
- -
- - _tkinter /usr/lib/python3.12/lib-dynload/_tkinter.cpython-312-x86_64-linux-gnu.so
-imported by: - tkinter - -
- -
- -
- - _tokenize (builtin module)
-imported by: - tokenize - -
- -
- -
- - _tracemalloc (builtin module)
-imported by: - tracemalloc - -
- -
- -
- - _typeshed -MissingModule
-imported by: - setuptools._distutils.dist - • setuptools._vendor.wheel.wheelfile - • setuptools.command.bdist_egg - • setuptools.compat.py311 - • setuptools.glob - -
- -
- -
- - _typing (builtin module)
-imported by: - typing - -
- -
- -
- - _warnings (builtin module)
-imported by: - importlib._bootstrap_external - • warnings - • zipimport - -
- -
- -
- - _weakref (builtin module)
-imported by: - _weakrefset - • collections - • weakref - • xml.sax.expatreader - -
- -
- -
- - _weakrefset -SourceModule
-imports: - _weakref - • types - -
-
-imported by: - _py_abc - • client.py - • multiprocessing.process - • threading - • weakref - -
- -
- -
- - _winapi -MissingModule
-imported by: - asyncio.windows_events - • asyncio.windows_utils - • encodings - • mimetypes - • multiprocessing.connection - • multiprocessing.heap - • multiprocessing.popen_spawn_win32 - • multiprocessing.reduction - • multiprocessing.shared_memory - • multiprocessing.spawn - • ntpath - • shutil - • subprocess - -
- -
- -
- - _winreg -MissingModule
-imported by: - platform - -
- -
- -
- - _wmi -MissingModule
-imported by: - platform - -
- -
- -
- - abc -SourceModule
-imports: - _abc - • _py_abc - -
-
-imported by: - _collections_abc - • client.py - • contextlib - • dataclasses - • email._policybase - • functools - • importlib._abc - • importlib.abc - • importlib.metadata - • importlib.resources.abc - • inspect - • io - • multiprocessing.reduction - • numbers - • os - • packaging.specifiers - • selectors - • setuptools - • setuptools._distutils.cmd - • setuptools._vendor.importlib_metadata - • setuptools._vendor.packaging.specifiers - • setuptools.config.setupcfg - • typing - -
- -
- -
- - apport_python_hook -MissingModule
-imported by: - sitecustomize - -
- -
- -
- - argparse -SourceModule
-imports: - copy - • gettext - • os - • re - • shutil - • sys - • textwrap - • warnings - -
-
-imported by: - ast - • calendar - • dis - • gzip - • http.server - • inspect - • py_compile - • setuptools._vendor.backports.tarfile - • tarfile - • tokenize - • unittest.main - • zipfile - -
- -
- -
- - array (builtin module)
-imported by: - multiprocessing.dummy - • multiprocessing.managers - • multiprocessing.reduction - • socket - -
- -
- -
- - ast -SourceModule
-imports: - _ast - • argparse - • collections - • contextlib - • enum - • inspect - • re - • sys - • warnings - -
-
-imported by: - inspect - • packaging._parser - • setuptools._vendor.packaging._parser - • setuptools.config.expand - • traceback - -
- -
- -
- - asyncio -Package
-imports: - asyncio - • asyncio.DefaultEventLoopPolicy - • asyncio.base_events - • asyncio.base_futures - • asyncio.base_subprocess - • asyncio.base_tasks - • asyncio.constants - • asyncio.coroutines - • asyncio.events - • asyncio.exceptions - • asyncio.format_helpers - • asyncio.futures - • asyncio.locks - • asyncio.mixins - • asyncio.proactor_events - • asyncio.protocols - • asyncio.queues - • asyncio.runners - • asyncio.selector_events - • asyncio.sslproto - • asyncio.staggered - • asyncio.streams - • asyncio.subprocess - • asyncio.taskgroups - • asyncio.tasks - • asyncio.threads - • asyncio.timeouts - • asyncio.transports - • asyncio.trsock - • asyncio.unix_events - • asyncio.windows_events - • asyncio.windows_utils - • sys - -
-
-imported by: - asyncio - • asyncio.base_events - • asyncio.base_futures - • asyncio.base_subprocess - • asyncio.base_tasks - • asyncio.constants - • asyncio.coroutines - • asyncio.events - • asyncio.exceptions - • asyncio.format_helpers - • asyncio.futures - • asyncio.locks - • asyncio.log - • asyncio.mixins - • asyncio.proactor_events - • asyncio.protocols - • asyncio.queues - • asyncio.runners - • asyncio.selector_events - • asyncio.sslproto - • asyncio.staggered - • asyncio.streams - • asyncio.subprocess - • asyncio.taskgroups - • asyncio.tasks - • asyncio.threads - • asyncio.timeouts - • asyncio.transports - • asyncio.trsock - • asyncio.unix_events - • asyncio.windows_events - • asyncio.windows_utils - • unittest.async_case - • unittest.mock - -
- -
- -
- - asyncio.DefaultEventLoopPolicy -MissingModule
-imported by: - asyncio - • asyncio.events - -
- -
- -
- - asyncio.base_events -SourceModule
-imports: - asyncio - • asyncio.constants - • asyncio.coroutines - • asyncio.events - • asyncio.exceptions - • asyncio.futures - • asyncio.log - • asyncio.protocols - • asyncio.sslproto - • asyncio.staggered - • asyncio.tasks - • asyncio.timeouts - • asyncio.transports - • asyncio.trsock - • collections - • collections.abc - • concurrent.futures - • errno - • functools - • heapq - • itertools - • os - • socket - • ssl - • stat - • subprocess - • sys - • threading - • time - • traceback - • warnings - • weakref - -
-
-imported by: - asyncio - • asyncio.proactor_events - • asyncio.selector_events - • asyncio.unix_events - -
- -
- -
- - asyncio.base_futures -SourceModule
-imports: - asyncio - • asyncio.format_helpers - • reprlib - -
-
-imported by: - asyncio - • asyncio.base_tasks - • asyncio.futures - -
- -
- -
- - asyncio.base_subprocess -SourceModule
-imports: - asyncio - • asyncio.log - • asyncio.protocols - • asyncio.transports - • collections - • subprocess - • warnings - -
-
-imported by: - asyncio - • asyncio.unix_events - • asyncio.windows_events - -
- -
- -
- - asyncio.base_tasks -SourceModule
-imports: - asyncio - • asyncio.base_futures - • asyncio.coroutines - • linecache - • reprlib - • traceback - -
-
-imported by: - asyncio - • asyncio.tasks - -
- -
- -
- - asyncio.constants -SourceModule
-imports: - asyncio - • enum - -
-
-imported by: - asyncio - • asyncio.base_events - • asyncio.format_helpers - • asyncio.proactor_events - • asyncio.runners - • asyncio.selector_events - • asyncio.sslproto - • asyncio.unix_events - -
- -
- -
- - asyncio.coroutines -SourceModule
-imports: - asyncio - • collections.abc - • inspect - • os - • sys - • types - -
-
-imported by: - asyncio - • asyncio.base_events - • asyncio.base_tasks - • asyncio.runners - • asyncio.streams - • asyncio.tasks - • asyncio.unix_events - -
- -
- -
- - asyncio.events -SourceModule
-imports: - _asyncio - • asyncio - • asyncio.DefaultEventLoopPolicy - • asyncio.format_helpers - • contextvars - • os - • signal - • socket - • subprocess - • sys - • threading - • warnings - -
-
-imported by: - asyncio - • asyncio.base_events - • asyncio.futures - • asyncio.mixins - • asyncio.runners - • asyncio.selector_events - • asyncio.staggered - • asyncio.streams - • asyncio.subprocess - • asyncio.taskgroups - • asyncio.tasks - • asyncio.threads - • asyncio.timeouts - • asyncio.unix_events - • asyncio.windows_events - -
- -
- -
- - asyncio.exceptions -SourceModule
-imports: - asyncio - -
-
-imported by: - asyncio - • asyncio.base_events - • asyncio.futures - • asyncio.locks - • asyncio.proactor_events - • asyncio.runners - • asyncio.sslproto - • asyncio.staggered - • asyncio.streams - • asyncio.taskgroups - • asyncio.tasks - • asyncio.timeouts - • asyncio.unix_events - • asyncio.windows_events - -
- -
- -
- - asyncio.format_helpers -SourceModule
-imports: - asyncio - • asyncio.constants - • functools - • inspect - • reprlib - • sys - • traceback - -
-
-imported by: - asyncio - • asyncio.base_futures - • asyncio.events - • asyncio.futures - • asyncio.streams - -
- -
- -
- - asyncio.futures -SourceModule
-imports: - _asyncio - • asyncio - • asyncio.base_futures - • asyncio.events - • asyncio.exceptions - • asyncio.format_helpers - • concurrent.futures - • contextvars - • logging - • sys - • types - -
-
-imported by: - asyncio - • asyncio.base_events - • asyncio.proactor_events - • asyncio.selector_events - • asyncio.tasks - • asyncio.unix_events - • asyncio.windows_events - -
- -
- -
- - asyncio.locks -SourceModule
-imports: - asyncio - • asyncio.exceptions - • asyncio.mixins - • collections - • enum - -
-
-imported by: - asyncio - • asyncio.queues - • asyncio.staggered - -
- -
- -
- - asyncio.log -SourceModule
-imports: - asyncio - • logging - -
-
-imported by: - asyncio.base_events - • asyncio.base_subprocess - • asyncio.proactor_events - • asyncio.selector_events - • asyncio.sslproto - • asyncio.streams - • asyncio.subprocess - • asyncio.unix_events - • asyncio.windows_events - -
- -
- -
- - asyncio.mixins -SourceModule
-imports: - asyncio - • asyncio.events - • threading - -
-
-imported by: - asyncio - • asyncio.locks - • asyncio.queues - -
- -
- -
- - asyncio.proactor_events -SourceModule
-imports: - asyncio - • asyncio.base_events - • asyncio.constants - • asyncio.exceptions - • asyncio.futures - • asyncio.log - • asyncio.protocols - • asyncio.sslproto - • asyncio.transports - • asyncio.trsock - • collections - • io - • os - • signal - • socket - • threading - • warnings - -
-
-imported by: - asyncio - • asyncio.windows_events - -
- -
- -
- - asyncio.protocols -SourceModule
-imports: - asyncio - -
-
-imported by: - asyncio - • asyncio.base_events - • asyncio.base_subprocess - • asyncio.proactor_events - • asyncio.selector_events - • asyncio.sslproto - • asyncio.streams - • asyncio.subprocess - -
- -
- -
- - asyncio.queues -SourceModule
-imports: - asyncio - • asyncio.locks - • asyncio.mixins - • collections - • heapq - • types - -
-
-imported by: - asyncio - • asyncio.tasks - -
- -
- -
- - asyncio.runners -SourceModule
-imports: - asyncio - • asyncio.constants - • asyncio.coroutines - • asyncio.events - • asyncio.exceptions - • asyncio.tasks - • contextvars - • enum - • functools - • signal - • threading - -
-
-imported by: - asyncio - -
- -
- -
- - asyncio.selector_events -SourceModule
-imports: - asyncio - • asyncio.base_events - • asyncio.constants - • asyncio.events - • asyncio.futures - • asyncio.log - • asyncio.protocols - • asyncio.sslproto - • asyncio.transports - • asyncio.trsock - • collections - • errno - • functools - • itertools - • os - • selectors - • socket - • ssl - • warnings - • weakref - -
-
-imported by: - asyncio - • asyncio.unix_events - • asyncio.windows_events - -
- -
- -
- - asyncio.sslproto -SourceModule
-imports: - asyncio - • asyncio.constants - • asyncio.exceptions - • asyncio.log - • asyncio.protocols - • asyncio.transports - • collections - • enum - • ssl - • warnings - -
-
-imported by: - asyncio - • asyncio.base_events - • asyncio.proactor_events - • asyncio.selector_events - -
- -
- -
- - asyncio.staggered -SourceModule
-imports: - asyncio - • asyncio.events - • asyncio.exceptions - • asyncio.locks - • asyncio.tasks - • contextlib - • typing - -
-
-imported by: - asyncio - • asyncio.base_events - -
- -
- -
- - asyncio.streams -SourceModule
-imports: - asyncio - • asyncio.coroutines - • asyncio.events - • asyncio.exceptions - • asyncio.format_helpers - • asyncio.log - • asyncio.protocols - • asyncio.tasks - • collections - • socket - • sys - • warnings - • weakref - -
-
-imported by: - asyncio - • asyncio.subprocess - -
- -
- -
- - asyncio.subprocess -SourceModule
-imports: - asyncio - • asyncio.events - • asyncio.log - • asyncio.protocols - • asyncio.streams - • asyncio.tasks - • subprocess - -
-
-imported by: - asyncio - -
- -
- -
- - asyncio.taskgroups -SourceModule
-imports: - asyncio - • asyncio.events - • asyncio.exceptions - • asyncio.tasks - -
-
-imported by: - asyncio - -
- -
- -
- - asyncio.tasks -SourceModule
-imports: - _asyncio - • asyncio - • asyncio.base_tasks - • asyncio.coroutines - • asyncio.events - • asyncio.exceptions - • asyncio.futures - • asyncio.queues - • asyncio.timeouts - • concurrent.futures - • contextvars - • functools - • inspect - • itertools - • types - • warnings - • weakref - -
-
-imported by: - asyncio - • asyncio.base_events - • asyncio.runners - • asyncio.staggered - • asyncio.streams - • asyncio.subprocess - • asyncio.taskgroups - • asyncio.timeouts - • asyncio.unix_events - • asyncio.windows_events - -
- -
- -
- - asyncio.threads -SourceModule
-imports: - asyncio - • asyncio.events - • contextvars - • functools - -
-
-imported by: - asyncio - -
- -
- -
- - asyncio.timeouts -SourceModule
-imports: - asyncio - • asyncio.events - • asyncio.exceptions - • asyncio.tasks - • enum - • types - • typing - -
-
-imported by: - asyncio - • asyncio.base_events - • asyncio.tasks - -
- -
- -
- - asyncio.transports -SourceModule
-imports: - asyncio - -
-
-imported by: - asyncio - • asyncio.base_events - • asyncio.base_subprocess - • asyncio.proactor_events - • asyncio.selector_events - • asyncio.sslproto - • asyncio.unix_events - -
- -
- -
- - asyncio.trsock -SourceModule
-imports: - asyncio - • socket - -
-
-imported by: - asyncio - • asyncio.base_events - • asyncio.proactor_events - • asyncio.selector_events - -
- -
- -
- - asyncio.unix_events -SourceModule
-imports: - asyncio - • asyncio.base_events - • asyncio.base_subprocess - • asyncio.constants - • asyncio.coroutines - • asyncio.events - • asyncio.exceptions - • asyncio.futures - • asyncio.log - • asyncio.selector_events - • asyncio.tasks - • asyncio.transports - • errno - • io - • itertools - • os - • selectors - • signal - • socket - • stat - • subprocess - • sys - • threading - • warnings - -
-
-imported by: - asyncio - -
- -
- -
- - asyncio.windows_events -SourceModule
-imports: - _overlapped - • _winapi - • asyncio - • asyncio.base_subprocess - • asyncio.events - • asyncio.exceptions - • asyncio.futures - • asyncio.log - • asyncio.proactor_events - • asyncio.selector_events - • asyncio.tasks - • asyncio.windows_utils - • errno - • functools - • math - • msvcrt - • socket - • struct - • sys - • time - • weakref - -
-
-imported by: - asyncio - -
- -
- -
- - asyncio.windows_utils -SourceModule
-imports: - _winapi - • asyncio - • itertools - • msvcrt - • os - • subprocess - • sys - • tempfile - • warnings - -
-
-imported by: - asyncio - • asyncio.windows_events - -
- -
- -
- - atexit (builtin module)
-imported by: - certifi.core - • logging - • multiprocessing.util - • rlcompleter - • site - • weakref - -
- -
- -
- - backports -AliasNode
-imports: - backports.tarfile - • setuptools._vendor.backports - • setuptools._vendor.backports.zstd - -
-
-imported by: - setuptools._vendor.jaraco.context - • urllib3.response - • urllib3.util.request - -
- -
- -
- - backports.tarfile -AliasNode
-imports: - setuptools._vendor.backports.tarfile - -
-
-imported by: - backports - • setuptools._vendor.jaraco.context - -
- -
- -
- - base64 -SourceModule
-imports: - binascii - • getopt - • re - • struct - • sys - -
-
-imported by: - email._encoded_words - • email.base64mime - • email.encoders - • encodings.base64_codec - • http.server - • requests.auth - • secrets - • setuptools._vendor.wheel.wheelfile - • ssl - • urllib.request - • urllib3.util.request - • xmlrpc.client - -
- -
- -
- - binascii (builtin module)
-imported by: - base64 - • email._encoded_words - • email.base64mime - • email.contentmanager - • email.header - • email.message - • encodings.hex_codec - • encodings.uu_codec - • http.server - • quopri - • urllib3.filepost - • urllib3.util.ssl_ - • zipfile - -
- -
- -
- - bisect -SourceModule
-imports: - _bisect - -
-
-imported by: - charset_normalizer.utils - • idna.core - • idna.intranges - • multiprocessing.heap - • random - • setuptools._vendor.more_itertools.recipes - • statistics - • urllib.request - -
- -
- -
- - brotli -MissingModule
-imported by: - urllib3.response - • urllib3.util.request - -
- -
- -
- - brotlicffi -MissingModule
-imported by: - urllib3.response - • urllib3.util.request - -
- -
- -
- - builtins (builtin module)
-imported by: - bz2 - • codecs - • enum - • gettext - • gzip - • inspect - • locale - • lzma - • operator - • pydoc - • reprlib - • rlcompleter - • setuptools._vendor.backports.tarfile - • setuptools.config._validate_pyproject.formats - • site - • subprocess - • tarfile - • tokenize - • unittest.mock - • warnings - -
- -
- -
- - bz2 -SourceModule
-imports: - _bz2 - • _compression - • builtins - • io - • os - -
-
-imported by: - encodings.bz2_codec - • setuptools._vendor.backports.tarfile - • shutil - • tarfile - • zipfile - -
- -
- -
- - calendar -SourceModule
-imports: - argparse - • datetime - • enum - • itertools - • locale - • sys - • warnings - -
-
-imported by: - _strptime - • email._parseaddr - • http.cookiejar - • requests.cookies - • ssl - -
- -
- -
- - certifi -Package
-imports: - certifi.core - -
-
-imported by: - certifi.core - • requests.certs - -
- -
- -
- - certifi.core -SourceModule
-imports: - atexit - • certifi - • importlib.resources - • sys - -
-
-imported by: - certifi - -
- -
- -
- - chardet -MissingModule
-imported by: - requests - -
- -
- -
- - charset_normalizer -Package
-imports: - 81d243bd2c585b0f4821__mypyc - • __future__ - • charset_normalizer.api - • charset_normalizer.legacy - • charset_normalizer.models - • charset_normalizer.utils - • charset_normalizer.version - • logging - -
-
-imported by: - charset_normalizer.api - • charset_normalizer.cd - • charset_normalizer.constant - • charset_normalizer.legacy - • charset_normalizer.md - • charset_normalizer.models - • charset_normalizer.utils - • charset_normalizer.version - • requests - -
- -
- -
- - charset_normalizer.api -SourceModule
-imports: - __future__ - • charset_normalizer - • charset_normalizer.cd - • charset_normalizer.constant - • charset_normalizer.md - • charset_normalizer.models - • charset_normalizer.utils - • logging - • os - • typing - -
-
-imported by: - charset_normalizer - • charset_normalizer.legacy - -
- -
- -
- - charset_normalizer.cd /home/borderban/Рабочий стол/client-py/venv/lib/python3.12/site-packages/charset_normalizer/cd.cpython-312-x86_64-linux-gnu.so
-imports: - __future__ - • charset_normalizer - • charset_normalizer.constant - • charset_normalizer.md - • charset_normalizer.models - • charset_normalizer.utils - • codecs - • collections - • functools - • importlib - • typing - -
-
-imported by: - charset_normalizer.api - • charset_normalizer.models - -
- -
- -
- - charset_normalizer.constant -SourceModule
-imports: - __future__ - • charset_normalizer - • codecs - • encodings.aliases - • re - -
-
-imported by: - charset_normalizer.api - • charset_normalizer.cd - • charset_normalizer.legacy - • charset_normalizer.md - • charset_normalizer.models - • charset_normalizer.utils - -
- -
- -
- - charset_normalizer.legacy -SourceModule
-imports: - __future__ - • charset_normalizer - • charset_normalizer.api - • charset_normalizer.constant - • typing - • warnings - -
-
-imported by: - charset_normalizer - -
- -
- -
- - charset_normalizer.md /home/borderban/Рабочий стол/client-py/venv/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-x86_64-linux-gnu.so
-imports: - __future__ - • charset_normalizer - • charset_normalizer.constant - • charset_normalizer.utils - • functools - • logging - • sys - • typing - • typing_extensions - -
-
-imported by: - charset_normalizer.api - • charset_normalizer.cd - -
- -
- -
- - charset_normalizer.models -SourceModule
-imports: - __future__ - • charset_normalizer - • charset_normalizer.cd - • charset_normalizer.constant - • charset_normalizer.utils - • encodings.aliases - • json - • re - • typing - -
-
-imported by: - charset_normalizer - • charset_normalizer.api - • charset_normalizer.cd - -
- -
- -
- - charset_normalizer.utils -SourceModule
-imports: - __future__ - • _multibytecodec - • bisect - • charset_normalizer - • charset_normalizer.constant - • codecs - • encodings.aliases - • functools - • importlib - • logging - • re - • typing - • unicodedata - -
-
-imported by: - charset_normalizer - • charset_normalizer.api - • charset_normalizer.cd - • charset_normalizer.md - • charset_normalizer.models - -
- -
- -
- - charset_normalizer.version -SourceModule
-imports: - __future__ - • charset_normalizer - -
-
-imported by: - charset_normalizer - -
- -
- -
- - codecs -SourceModule
-imports: - _codecs - • builtins - • encodings - • sys - -
-
-imported by: - _pickle - • charset_normalizer.cd - • charset_normalizer.constant - • charset_normalizer.utils - • client.py - • encodings - • encodings.ascii - • encodings.base64_codec - • encodings.big5 - • encodings.big5hkscs - • encodings.bz2_codec - • encodings.charmap - • encodings.cp037 - • encodings.cp1006 - • encodings.cp1026 - • encodings.cp1125 - • encodings.cp1140 - • encodings.cp1250 - • encodings.cp1251 - • encodings.cp1252 - • encodings.cp1253 - • encodings.cp1254 - • encodings.cp1255 - • encodings.cp1256 - • encodings.cp1257 - • encodings.cp1258 - • encodings.cp273 - • encodings.cp424 - • encodings.cp437 - • encodings.cp500 - • encodings.cp720 - • encodings.cp737 - • encodings.cp775 - • encodings.cp850 - • encodings.cp852 - • encodings.cp855 - • encodings.cp856 - • encodings.cp857 - • encodings.cp858 - • encodings.cp860 - • encodings.cp861 - • encodings.cp862 - • encodings.cp863 - • encodings.cp864 - • encodings.cp865 - • encodings.cp866 - • encodings.cp869 - • encodings.cp874 - • encodings.cp875 - • encodings.cp932 - • encodings.cp949 - • encodings.cp950 - • encodings.euc_jis_2004 - • encodings.euc_jisx0213 - • encodings.euc_jp - • encodings.euc_kr - • encodings.gb18030 - • encodings.gb2312 - • encodings.gbk - • encodings.hex_codec - • encodings.hp_roman8 - • encodings.hz - • encodings.idna - • encodings.iso2022_jp - • encodings.iso2022_jp_1 - • encodings.iso2022_jp_2 - • encodings.iso2022_jp_2004 - • encodings.iso2022_jp_3 - • encodings.iso2022_jp_ext - • encodings.iso2022_kr - • encodings.iso8859_1 - • encodings.iso8859_10 - • encodings.iso8859_11 - • encodings.iso8859_13 - • encodings.iso8859_14 - • encodings.iso8859_15 - • encodings.iso8859_16 - • encodings.iso8859_2 - • encodings.iso8859_3 - • encodings.iso8859_4 - • encodings.iso8859_5 - • encodings.iso8859_6 - • encodings.iso8859_7 - • encodings.iso8859_8 - • encodings.iso8859_9 - • encodings.johab - • encodings.koi8_r - • encodings.koi8_t - • encodings.koi8_u - • encodings.kz1048 - • encodings.latin_1 - • encodings.mac_arabic - • encodings.mac_croatian - • encodings.mac_cyrillic - • encodings.mac_farsi - • encodings.mac_greek - • encodings.mac_iceland - • encodings.mac_latin2 - • encodings.mac_roman - • encodings.mac_romanian - • encodings.mac_turkish - • encodings.mbcs - • encodings.oem - • encodings.palmos - • encodings.ptcp154 - • encodings.punycode - • encodings.quopri_codec - • encodings.raw_unicode_escape - • encodings.rot_13 - • encodings.shift_jis - • encodings.shift_jis_2004 - • encodings.shift_jisx0213 - • encodings.tis_620 - • encodings.undefined - • encodings.unicode_escape - • encodings.utf_16 - • encodings.utf_16_be - • encodings.utf_16_le - • encodings.utf_32 - • encodings.utf_32_be - • encodings.utf_32_le - • encodings.utf_7 - • encodings.utf_8 - • encodings.utf_8_sig - • encodings.uu_codec - • encodings.zlib_codec - • json - • pickle - • requests.utils - • tokenize - • urllib3.filepost - • xml.sax.saxutils - -
- -
- -
- - collections -Package
-imports: - _collections - • _collections_abc - • _weakref - • copy - • heapq - • itertools - • keyword - • operator - • reprlib - • sys - -
-
-imported by: - _pydecimal - • ast - • asyncio.base_events - • asyncio.base_subprocess - • asyncio.locks - • asyncio.proactor_events - • asyncio.queues - • asyncio.selector_events - • asyncio.sslproto - • asyncio.streams - • charset_normalizer.cd - • client.py - • collections.abc - • concurrent.futures._base - • configparser - • contextlib - • difflib - • dis - • email.feedparser - • functools - • importlib.metadata - • importlib.metadata._collections - • importlib.resources.readers - • inspect - • multiprocessing.heap - • multiprocessing.pool - • multiprocessing.queues - • packaging._manylinux - • pkgutil - • platform - • pprint - • pydoc - • queue - • requests.compat - • requests.sessions - • requests.structures - • requests.utils - • selectors - • setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata._collections - • setuptools._vendor.importlib_metadata._itertools - • setuptools._vendor.more_itertools.more - • setuptools._vendor.more_itertools.recipes - • setuptools._vendor.packaging._manylinux - • setuptools._vendor.zipp._functools - • setuptools.command._requirestxt - • setuptools.config._validate_pyproject.extra_validations - • setuptools.config.setupcfg - • shlex - • shutil - • ssl - • statistics - • string - • threading - • tkinter - • tokenize - • typing - • unittest._log - • unittest.case - • unittest.util - • urllib.parse - • urllib3._collections - • urllib3.response - -
- -
- -
- - collections.abc -SourceModule
-imports: - _collections_abc - • collections - -
-
-imported by: - asyncio.base_events - • asyncio.coroutines - • client.py - • configparser - • http.client - • inspect - • logging - • requests.compat - • selectors - • setuptools - • setuptools._distutils._modified - • setuptools._distutils.cmd - • setuptools._distutils.command.bdist - • setuptools._distutils.command.build - • setuptools._distutils.command.build_ext - • setuptools._distutils.command.sdist - • setuptools._distutils.compat - • setuptools._distutils.compilers.C.base - • setuptools._distutils.compilers.C.msvc - • setuptools._distutils.core - • setuptools._distutils.dist - • setuptools._distutils.extension - • setuptools._distutils.fancy_getopt - • setuptools._distutils.filelist - • setuptools._distutils.spawn - • setuptools._distutils.util - • setuptools._reqs - • setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata._meta - • setuptools._vendor.jaraco.context - • setuptools._vendor.jaraco.functools - • setuptools._vendor.more_itertools.more - • setuptools._vendor.tomli._parser - • setuptools.command._requirestxt - • setuptools.command.bdist_egg - • setuptools.command.bdist_wheel - • setuptools.command.egg_info - • setuptools.command.sdist - • setuptools.config._apply_pyprojecttoml - • setuptools.config.expand - • setuptools.config.pyprojecttoml - • setuptools.config.setupcfg - • setuptools.discovery - • setuptools.dist - • setuptools.extension - • setuptools.glob - • setuptools.wheel - • tomllib._parser - • traceback - • tracemalloc - • typing - -
- -
- -
- - compression -MissingModule
-imported by: - urllib3.response - • urllib3.util.request - -
- -
- -
- - concurrent -Package
-imported by: - concurrent.futures - -
- -
- -
- - concurrent.futures -Package
-imports: - concurrent - • concurrent.futures._base - • concurrent.futures.process - • concurrent.futures.thread - -
-
-imported by: - asyncio.base_events - • asyncio.futures - • asyncio.tasks - • concurrent.futures._base - • concurrent.futures.process - • concurrent.futures.thread - • setuptools._distutils.command.build_ext - -
- -
- -
- - concurrent.futures._base -SourceModule
-imports: - collections - • concurrent.futures - • logging - • threading - • time - • types - -
-
-imported by: - concurrent.futures - • concurrent.futures.process - • concurrent.futures.thread - -
- -
- -
- - concurrent.futures.process -SourceModule
-imports: - concurrent.futures - • concurrent.futures._base - • functools - • itertools - • multiprocessing - • multiprocessing.connection - • multiprocessing.queues - • multiprocessing.synchronize - • os - • queue - • sys - • threading - • traceback - • weakref - -
-
-imported by: - concurrent.futures - -
- -
- -
- - concurrent.futures.thread -SourceModule
-imports: - concurrent.futures - • concurrent.futures._base - • itertools - • os - • queue - • threading - • types - • weakref - -
-
-imported by: - concurrent.futures - -
- -
- -
- - configparser -SourceModule
-imports: - collections - • collections.abc - • functools - • io - • itertools - • os - • re - • sys - • warnings - -
-
-imported by: - setuptools._distutils.dist - • setuptools.command.setopt - • setuptools.config.expand - • setuptools.dist - • setuptools.unicode_utils - -
- -
- -
- - contextlib -SourceModule
-imports: - _collections_abc - • abc - • collections - • functools - • os - • sys - • types - -
-
-imported by: - _aix_support - • _threading_local - • ast - • asyncio.staggered - • getpass - • glob - • http.server - • importlib.metadata - • importlib.resources._adapters - • importlib.resources._common - • packaging._manylinux - • packaging._tokenizer - • requests.utils - • setuptools._distutils.command.build_ext - • setuptools._distutils.command.check - • setuptools._distutils.compilers.C.msvc - • setuptools._distutils.dist - • setuptools._distutils.version - • setuptools._path - • setuptools._vendor.importlib_metadata - • setuptools._vendor.jaraco.context - • setuptools._vendor.more_itertools.more - • setuptools._vendor.more_itertools.recipes - • setuptools._vendor.packaging._manylinux - • setuptools._vendor.packaging._tokenizer - • setuptools.archive_util - • setuptools.command.sdist - • setuptools.config._validate_pyproject.error_reporting - • setuptools.config.pyprojecttoml - • setuptools.config.setupcfg - • setuptools.depends - • setuptools.msvc - • setuptools.wheel - • subprocess - • traceback - • typing - • unittest.case - • unittest.mock - • urllib.request - • urllib3.contrib.emscripten.response - • urllib3.response - • zipfile._path - -
- -
- -
- - contextvars -SourceModule
-imports: - _contextvars - -
-
-imported by: - _pydecimal - • asyncio.events - • asyncio.futures - • asyncio.runners - • asyncio.tasks - • asyncio.threads - • unittest.async_case - -
- -
- -
- - copy -SourceModule
-imports: - copyreg - • types - • weakref - -
-
-imported by: - _sre - • argparse - • collections - • dataclasses - • email.generator - • gettext - • http.cookiejar - • http.server - • requests.cookies - • setuptools._vendor.backports.tarfile - • tarfile - • weakref - • webbrowser - -
- -
- -
- - copyreg -SourceModule
-imports: - functools - • operator - -
-
-imported by: - _pickle - • client.py - • copy - • multiprocessing.reduction - • pickle - • re - • typing - -
- -
- -
- - cryptography -MissingModule
-imported by: - requests - • urllib3.contrib.pyopenssl - -
- -
- -
- - csv -SourceModule
-imports: - _csv - • io - • re - • types - -
-
-imported by: - importlib.metadata - • setuptools._vendor.importlib_metadata - • setuptools._vendor.wheel.wheelfile - -
- -
- -
- - ctypes -Package
-imports: - _ctypes - • ctypes._endian - • nt - • os - • struct - • sys - • types - -
-
-imported by: - ctypes._endian - • ctypes.wintypes - • multiprocessing.sharedctypes - • packaging._manylinux - • setuptools._vendor.packaging._manylinux - • setuptools._vendor.wheel.macosx_libfile - • setuptools.windows_support - -
- -
- -
- - ctypes._endian -SourceModule
-imports: - ctypes - • sys - -
-
-imported by: - ctypes - -
- -
- -
- - ctypes.wintypes -SourceModule
-imports: - ctypes - -
-
-imported by: - setuptools.windows_support - -
- -
- -
- - dataclasses -SourceModule
-imports: - _thread - • abc - • copy - • functools - • inspect - • itertools - • keyword - • re - • sys - • types - -
-
-imported by: - packaging._tokenizer - • pprint - • setuptools._vendor.packaging._tokenizer - • urllib3.contrib.emscripten.request - • urllib3.contrib.emscripten.response - -
- -
- -
- - datetime -SourceModule
-imports: - _datetime - • _pydatetime - • time - -
-
-imported by: - _strptime - • calendar - • email.utils - • http.cookiejar - • http.server - • requests.models - • requests.sessions - • setuptools._vendor.tomli._re - • setuptools.warnings - • tomllib._re - • urllib3.connection - • xmlrpc.client - -
- -
- -
- - decimal -SourceModule
-imports: - _decimal - • _pydecimal - -
-
-imported by: - fractions - • setuptools.config._validate_pyproject.fastjsonschema_validations - • statistics - • xmlrpc.client - -
- -
- -
- - difflib -SourceModule
-imports: - collections - • difflib - • heapq - • re - • types - -
-
-imported by: - difflib - • unittest.case - -
- -
- -
- - dis -SourceModule
-imports: - argparse - • collections - • io - • opcode - • sys - • types - -
-
-imported by: - inspect - • setuptools.depends - -
- -
- -
- - distutils -AliasNode
-imports: - setuptools._distutils - • setuptools._distutils.sysconfig - -
-
-imported by: - setuptools._distutils._log - • setuptools._distutils._modified - • setuptools._distutils.cmd - • setuptools._distutils.command - • setuptools._distutils.command.build_ext - • setuptools._distutils.command.sdist - • setuptools._distutils.core - • setuptools._distutils.debug - • setuptools._distutils.dir_util - • setuptools._distutils.dist - • setuptools._distutils.errors - • setuptools._distutils.extension - • setuptools._distutils.fancy_getopt - • setuptools._distutils.filelist - • setuptools._distutils.log - • setuptools._distutils.spawn - • setuptools._distutils.sysconfig - • setuptools._distutils.text_file - • setuptools._distutils.util - • setuptools._distutils.versionpredicate - • setuptools._shutil - • setuptools.command.bdist_egg - • setuptools.command.bdist_wheel - • setuptools.command.egg_info - • setuptools.command.sdist - • setuptools.command.setopt - • setuptools.discovery - • setuptools.errors - • setuptools.installer - • setuptools.wheel - -
- -
- -
- - dummy_threading -MissingModule
-imported by: - requests.cookies - -
- -
- -
- - email -Package
-imports: - email._header_value_parser - • email.charset - • email.errors - • email.header - • email.parser - -
-
-imported by: - email._encoded_words - • email._header_value_parser - • email._parseaddr - • email._policybase - • email.base64mime - • email.charset - • email.contentmanager - • email.encoders - • email.errors - • email.feedparser - • email.generator - • email.header - • email.headerregistry - • email.iterators - • email.message - • email.parser - • email.policy - • email.quoprimime - • email.utils - • importlib.metadata - • setuptools._core_metadata - • setuptools._distutils.dist - • setuptools._vendor.importlib_metadata - • setuptools.wheel - • urllib.request - • urllib3.util.retry - -
- -
- -
- - email._encoded_words -SourceModule
-imports: - base64 - • binascii - • email - • email.errors - • functools - • re - • string - -
-
-imported by: - email._header_value_parser - • email.message - -
- -
- -
- - email._header_value_parser -SourceModule
-imports: - email - • email._encoded_words - • email.errors - • email.utils - • operator - • re - • string - • sys - • urllib - -
-
-imported by: - email - • email.headerregistry - -
- -
- -
- - email._parseaddr -SourceModule
-imports: - calendar - • email - • time - -
-
-imported by: - email.utils - -
- -
- -
- - email._policybase -SourceModule
-imports: - abc - • email - • email.charset - • email.header - • email.utils - -
-
-imported by: - email.feedparser - • email.message - • email.parser - • email.policy - -
- -
- -
- - email.base64mime -SourceModule
-imports: - base64 - • binascii - • email - -
-
-imported by: - email.charset - • email.header - -
- -
- -
- - email.charset -SourceModule
-imports: - email - • email.base64mime - • email.encoders - • email.errors - • email.quoprimime - • functools - -
-
-imported by: - email - • email._policybase - • email.contentmanager - • email.header - • email.message - • email.utils - -
- -
- -
- - email.contentmanager -SourceModule
-imports: - binascii - • email - • email.charset - • email.errors - • email.message - • email.quoprimime - -
-
-imported by: - email.policy - -
- -
- -
- - email.encoders -SourceModule
-imports: - base64 - • email - • quopri - -
-
-imported by: - email.charset - -
- -
- -
- - email.errors -SourceModule
-imports: - email - -
-
-imported by: - email - • email._encoded_words - • email._header_value_parser - • email.charset - • email.contentmanager - • email.feedparser - • email.generator - • email.header - • email.headerregistry - • email.message - • urllib3.exceptions - • urllib3.util.response - -
- -
- -
- - email.feedparser -SourceModule
-imports: - collections - • email - • email._policybase - • email.errors - • email.message - • io - • re - -
-
-imported by: - email.parser - -
- -
- -
- - email.generator -SourceModule
-imports: - copy - • email - • email.errors - • email.utils - • io - • random - • re - • sys - • time - -
-
-imported by: - email.message - • setuptools.command.bdist_wheel - -
- -
- -
- - email.header -SourceModule
-imports: - binascii - • email - • email.base64mime - • email.charset - • email.errors - • email.quoprimime - • re - -
-
-imported by: - email - • email._policybase - -
- -
- -
- - email.headerregistry -SourceModule
-imports: - email - • email._header_value_parser - • email.errors - • email.utils - • types - -
-
-imported by: - email.policy - • setuptools.config._apply_pyprojecttoml - -
- -
- -
- - email.iterators -SourceModule
-imports: - email - • io - • sys - -
-
-imported by: - email.message - -
- -
- -
- - email.message -SourceModule
-imports: - binascii - • email - • email._encoded_words - • email._policybase - • email.charset - • email.errors - • email.generator - • email.iterators - • email.policy - • email.utils - • io - • quopri - • re - -
-
-imported by: - email.contentmanager - • email.feedparser - • email.policy - • http.client - • importlib.metadata._adapters - • pydoc - • setuptools._core_metadata - • setuptools._vendor.importlib_metadata._adapters - • setuptools.command.bdist_wheel - • setuptools.config._validate_pyproject.formats - -
- -
- -
- - email.parser -SourceModule
-imports: - email - • email._policybase - • email.feedparser - • io - -
-
-imported by: - email - • http.client - • urllib3.contrib.emscripten.fetch - -
- -
- -
- - email.policy -SourceModule
-imports: - email - • email._policybase - • email.contentmanager - • email.headerregistry - • email.message - • email.utils - • re - • sys - -
-
-imported by: - email.message - • setuptools._vendor.importlib_metadata._adapters - -
- -
- -
- - email.quoprimime -SourceModule
-imports: - email - • re - • string - -
-
-imported by: - email.charset - • email.contentmanager - • email.header - -
- -
- -
- - email.utils -SourceModule
-imports: - datetime - • email - • email._parseaddr - • email.charset - • os - • random - • re - • socket - • time - • urllib.parse - • warnings - -
-
-imported by: - email._header_value_parser - • email._policybase - • email.generator - • email.headerregistry - • email.message - • email.policy - • http.server - • urllib.request - • urllib3.fields - -
- -
- -
- - encodings -Package
-imports: - _winapi - • codecs - • encodings - • encodings.aliases - • encodings.ascii - • encodings.base64_codec - • encodings.big5 - • encodings.big5hkscs - • encodings.bz2_codec - • encodings.charmap - • encodings.cp037 - • encodings.cp1006 - • encodings.cp1026 - • encodings.cp1125 - • encodings.cp1140 - • encodings.cp1250 - • encodings.cp1251 - • encodings.cp1252 - • encodings.cp1253 - • encodings.cp1254 - • encodings.cp1255 - • encodings.cp1256 - • encodings.cp1257 - • encodings.cp1258 - • encodings.cp273 - • encodings.cp424 - • encodings.cp437 - • encodings.cp500 - • encodings.cp720 - • encodings.cp737 - • encodings.cp775 - • encodings.cp850 - • encodings.cp852 - • encodings.cp855 - • encodings.cp856 - • encodings.cp857 - • encodings.cp858 - • encodings.cp860 - • encodings.cp861 - • encodings.cp862 - • encodings.cp863 - • encodings.cp864 - • encodings.cp865 - • encodings.cp866 - • encodings.cp869 - • encodings.cp874 - • encodings.cp875 - • encodings.cp932 - • encodings.cp949 - • encodings.cp950 - • encodings.euc_jis_2004 - • encodings.euc_jisx0213 - • encodings.euc_jp - • encodings.euc_kr - • encodings.gb18030 - • encodings.gb2312 - • encodings.gbk - • encodings.hex_codec - • encodings.hp_roman8 - • encodings.hz - • encodings.idna - • encodings.iso2022_jp - • encodings.iso2022_jp_1 - • encodings.iso2022_jp_2 - • encodings.iso2022_jp_2004 - • encodings.iso2022_jp_3 - • encodings.iso2022_jp_ext - • encodings.iso2022_kr - • encodings.iso8859_1 - • encodings.iso8859_10 - • encodings.iso8859_11 - • encodings.iso8859_13 - • encodings.iso8859_14 - • encodings.iso8859_15 - • encodings.iso8859_16 - • encodings.iso8859_2 - • encodings.iso8859_3 - • encodings.iso8859_4 - • encodings.iso8859_5 - • encodings.iso8859_6 - • encodings.iso8859_7 - • encodings.iso8859_8 - • encodings.iso8859_9 - • encodings.johab - • encodings.koi8_r - • encodings.koi8_t - • encodings.koi8_u - • encodings.kz1048 - • encodings.latin_1 - • encodings.mac_arabic - • encodings.mac_croatian - • encodings.mac_cyrillic - • encodings.mac_farsi - • encodings.mac_greek - • encodings.mac_iceland - • encodings.mac_latin2 - • encodings.mac_roman - • encodings.mac_romanian - • encodings.mac_turkish - • encodings.mbcs - • encodings.oem - • encodings.palmos - • encodings.ptcp154 - • encodings.punycode - • encodings.quopri_codec - • encodings.raw_unicode_escape - • encodings.rot_13 - • encodings.shift_jis - • encodings.shift_jis_2004 - • encodings.shift_jisx0213 - • encodings.tis_620 - • encodings.undefined - • encodings.unicode_escape - • encodings.utf_16 - • encodings.utf_16_be - • encodings.utf_16_le - • encodings.utf_32 - • encodings.utf_32_be - • encodings.utf_32_le - • encodings.utf_7 - • encodings.utf_8 - • encodings.utf_8_sig - • encodings.uu_codec - • encodings.zlib_codec - • sys - -
-
-imported by: - client.py - • codecs - • encodings - • encodings.aliases - • encodings.ascii - • encodings.base64_codec - • encodings.big5 - • encodings.big5hkscs - • encodings.bz2_codec - • encodings.charmap - • encodings.cp037 - • encodings.cp1006 - • encodings.cp1026 - • encodings.cp1125 - • encodings.cp1140 - • encodings.cp1250 - • encodings.cp1251 - • encodings.cp1252 - • encodings.cp1253 - • encodings.cp1254 - • encodings.cp1255 - • encodings.cp1256 - • encodings.cp1257 - • encodings.cp1258 - • encodings.cp273 - • encodings.cp424 - • encodings.cp437 - • encodings.cp500 - • encodings.cp720 - • encodings.cp737 - • encodings.cp775 - • encodings.cp850 - • encodings.cp852 - • encodings.cp855 - • encodings.cp856 - • encodings.cp857 - • encodings.cp858 - • encodings.cp860 - • encodings.cp861 - • encodings.cp862 - • encodings.cp863 - • encodings.cp864 - • encodings.cp865 - • encodings.cp866 - • encodings.cp869 - • encodings.cp874 - • encodings.cp875 - • encodings.cp932 - • encodings.cp949 - • encodings.cp950 - • encodings.euc_jis_2004 - • encodings.euc_jisx0213 - • encodings.euc_jp - • encodings.euc_kr - • encodings.gb18030 - • encodings.gb2312 - • encodings.gbk - • encodings.hex_codec - • encodings.hp_roman8 - • encodings.hz - • encodings.idna - • encodings.iso2022_jp - • encodings.iso2022_jp_1 - • encodings.iso2022_jp_2 - • encodings.iso2022_jp_2004 - • encodings.iso2022_jp_3 - • encodings.iso2022_jp_ext - • encodings.iso2022_kr - • encodings.iso8859_1 - • encodings.iso8859_10 - • encodings.iso8859_11 - • encodings.iso8859_13 - • encodings.iso8859_14 - • encodings.iso8859_15 - • encodings.iso8859_16 - • encodings.iso8859_2 - • encodings.iso8859_3 - • encodings.iso8859_4 - • encodings.iso8859_5 - • encodings.iso8859_6 - • encodings.iso8859_7 - • encodings.iso8859_8 - • encodings.iso8859_9 - • encodings.johab - • encodings.koi8_r - • encodings.koi8_t - • encodings.koi8_u - • encodings.kz1048 - • encodings.latin_1 - • encodings.mac_arabic - • encodings.mac_croatian - • encodings.mac_cyrillic - • encodings.mac_farsi - • encodings.mac_greek - • encodings.mac_iceland - • encodings.mac_latin2 - • encodings.mac_roman - • encodings.mac_romanian - • encodings.mac_turkish - • encodings.mbcs - • encodings.oem - • encodings.palmos - • encodings.ptcp154 - • encodings.punycode - • encodings.quopri_codec - • encodings.raw_unicode_escape - • encodings.rot_13 - • encodings.shift_jis - • encodings.shift_jis_2004 - • encodings.shift_jisx0213 - • encodings.tis_620 - • encodings.undefined - • encodings.unicode_escape - • encodings.utf_16 - • encodings.utf_16_be - • encodings.utf_16_le - • encodings.utf_32 - • encodings.utf_32_be - • encodings.utf_32_le - • encodings.utf_7 - • encodings.utf_8 - • encodings.utf_8_sig - • encodings.uu_codec - • encodings.zlib_codec - • locale - -
- -
- -
- - encodings.aliases -SourceModule
-imports: - encodings - -
-
-imported by: - charset_normalizer.constant - • charset_normalizer.models - • charset_normalizer.utils - • client.py - • encodings - • locale - -
- -
- -
- - encodings.ascii -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.base64_codec -SourceModule
-imports: - base64 - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.big5 -SourceModule
-imports: - _codecs_tw - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.big5hkscs -SourceModule
-imports: - _codecs_hk - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.bz2_codec -SourceModule
-imports: - bz2 - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.charmap -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp037 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp1006 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp1026 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp1125 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp1140 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp1250 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp1251 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp1252 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp1253 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp1254 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp1255 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp1256 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp1257 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp1258 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp273 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp424 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp437 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp500 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp720 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp737 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp775 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp850 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp852 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp855 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp856 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp857 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp858 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp860 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp861 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp862 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp863 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp864 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp865 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp866 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp869 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp874 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp875 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp932 -SourceModule
-imports: - _codecs_jp - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp949 -SourceModule
-imports: - _codecs_kr - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.cp950 -SourceModule
-imports: - _codecs_tw - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.euc_jis_2004 -SourceModule
-imports: - _codecs_jp - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.euc_jisx0213 -SourceModule
-imports: - _codecs_jp - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.euc_jp -SourceModule
-imports: - _codecs_jp - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.euc_kr -SourceModule
-imports: - _codecs_kr - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.gb18030 -SourceModule
-imports: - _codecs_cn - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.gb2312 -SourceModule
-imports: - _codecs_cn - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.gbk -SourceModule
-imports: - _codecs_cn - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.hex_codec -SourceModule
-imports: - binascii - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.hp_roman8 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.hz -SourceModule
-imports: - _codecs_cn - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.idna -SourceModule
-imports: - codecs - • encodings - • re - • stringprep - • unicodedata - -
-
-imported by: - client.py - • encodings - • requests.models - -
- -
- -
- - encodings.iso2022_jp -SourceModule
-imports: - _codecs_iso2022 - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.iso2022_jp_1 -SourceModule
-imports: - _codecs_iso2022 - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.iso2022_jp_2 -SourceModule
-imports: - _codecs_iso2022 - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.iso2022_jp_2004 -SourceModule
-imports: - _codecs_iso2022 - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.iso2022_jp_3 -SourceModule
-imports: - _codecs_iso2022 - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.iso2022_jp_ext -SourceModule
-imports: - _codecs_iso2022 - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.iso2022_kr -SourceModule
-imports: - _codecs_iso2022 - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.iso8859_1 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.iso8859_10 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.iso8859_11 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.iso8859_13 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.iso8859_14 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.iso8859_15 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.iso8859_16 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.iso8859_2 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.iso8859_3 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.iso8859_4 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.iso8859_5 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.iso8859_6 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.iso8859_7 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.iso8859_8 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.iso8859_9 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.johab -SourceModule
-imports: - _codecs_kr - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.koi8_r -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.koi8_t -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.koi8_u -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.kz1048 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.latin_1 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.mac_arabic -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.mac_croatian -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.mac_cyrillic -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.mac_farsi -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.mac_greek -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.mac_iceland -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.mac_latin2 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.mac_roman -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.mac_romanian -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.mac_turkish -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.mbcs -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.oem -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.palmos -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.ptcp154 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.punycode -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.quopri_codec -SourceModule
-imports: - codecs - • encodings - • io - • quopri - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.raw_unicode_escape -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.rot_13 -SourceModule
-imports: - codecs - • encodings - • sys - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.shift_jis -SourceModule
-imports: - _codecs_jp - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.shift_jis_2004 -SourceModule
-imports: - _codecs_jp - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.shift_jisx0213 -SourceModule
-imports: - _codecs_jp - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.tis_620 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.undefined -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.unicode_escape -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.utf_16 -SourceModule
-imports: - codecs - • encodings - • sys - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.utf_16_be -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.utf_16_le -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.utf_32 -SourceModule
-imports: - codecs - • encodings - • sys - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.utf_32_be -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.utf_32_le -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.utf_7 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.utf_8 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.utf_8_sig -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.uu_codec -SourceModule
-imports: - binascii - • codecs - • encodings - • io - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - encodings.zlib_codec -SourceModule
-imports: - codecs - • encodings - • zlib - -
-
-imported by: - client.py - • encodings - -
- -
- -
- - enum -SourceModule
-imports: - builtins - • functools - • operator - • sys - • types - • warnings - -
-
-imported by: - ast - • asyncio.constants - • asyncio.locks - • asyncio.runners - • asyncio.sslproto - • asyncio.timeouts - • calendar - • client.py - • http - • inspect - • packaging._elffile - • py_compile - • re - • setuptools._vendor.packaging._elffile - • signal - • socket - • ssl - • tkinter - • urllib3._collections - • urllib3.util.request - • urllib3.util.timeout - -
- -
- -
- - errno (builtin module)
-imported by: - asyncio.base_events - • asyncio.selector_events - • asyncio.unix_events - • asyncio.windows_events - • gettext - • gzip - • http.client - • multiprocessing.connection - • multiprocessing.forkserver - • multiprocessing.queues - • multiprocessing.shared_memory - • pathlib - • setuptools._distutils.file_util - • setuptools._vendor.jaraco.context - • shutil - • socket - • ssl - • subprocess - • tempfile - • urllib3.connectionpool - • xmlrpc.client - -
- -
- -
- - fcntl (builtin module)
-imported by: - subprocess - -
- -
- -
- - fnmatch -SourceModule
-imports: - functools - • os - • posixpath - • re - -
-
-imported by: - glob - • pathlib - • setuptools._distutils.filelist - • setuptools.discovery - • setuptools.glob - • shutil - • tkinter.filedialog - • tracemalloc - • unittest.loader - • urllib.request - -
- -
- -
- - fractions -SourceModule
-imports: - decimal - • functools - • math - • numbers - • operator - • re - • sys - -
-
-imported by: - statistics - -
- -
- -
- - ftplib -SourceModule
-imports: - netrc - • re - • socket - • ssl - • sys - -
-
-imported by: - urllib.request - -
- -
- -
- - functools -SourceModule
-imports: - _functools - • _thread - • abc - • collections - • reprlib - • types - • typing - • weakref - -
-
-imported by: - asyncio.base_events - • asyncio.format_helpers - • asyncio.runners - • asyncio.selector_events - • asyncio.tasks - • asyncio.threads - • asyncio.windows_events - • charset_normalizer.cd - • charset_normalizer.md - • charset_normalizer.utils - • client.py - • concurrent.futures.process - • configparser - • contextlib - • copyreg - • dataclasses - • email._encoded_words - • email.charset - • enum - • fnmatch - • fractions - • importlib.metadata - • importlib.metadata._adapters - • importlib.metadata._functools - • importlib.resources._common - • importlib.resources._legacy - • inspect - • ipaddress - • linecache - • locale - • multiprocessing.reduction - • multiprocessing.shared_memory - • operator - • packaging._manylinux - • packaging._musllinux - • packaging.version - • pathlib - • pickle - • pkgutil - • platform - • re - • setuptools - • setuptools._discovery - • setuptools._distutils._modified - • setuptools._distutils.compat.py39 - • setuptools._distutils.dir_util - • setuptools._distutils.filelist - • setuptools._distutils.sysconfig - • setuptools._distutils.util - • setuptools._entry_points - • setuptools._reqs - • setuptools._static - • setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata._functools - • setuptools._vendor.importlib_metadata._typing - • setuptools._vendor.jaraco.context - • setuptools._vendor.jaraco.functools - • setuptools._vendor.jaraco.text - • setuptools._vendor.more_itertools.more - • setuptools._vendor.more_itertools.recipes - • setuptools._vendor.packaging._manylinux - • setuptools._vendor.packaging._musllinux - • setuptools._vendor.packaging.version - • setuptools._vendor.tomli._re - • setuptools._vendor.zipp - • setuptools._vendor.zipp._functools - • setuptools._vendor.zipp.compat.py313 - • setuptools.command.egg_info - • setuptools.config - • setuptools.config._apply_pyprojecttoml - • setuptools.config._validate_pyproject - • setuptools.config.pyprojecttoml - • setuptools.config.setupcfg - • setuptools.dist - • setuptools.extension - • setuptools.wheel - • statistics - • tempfile - • threading - • tokenize - • tomllib._re - • tracemalloc - • types - • typing - • unittest.case - • unittest.loader - • unittest.mock - • unittest.result - • unittest.signals - • urllib.parse - • urllib3.poolmanager - • urllib3.util.wait - -
- -
- -
- - gc (builtin module)
-imports: - time - -
-
-imported by: - _posixsubprocess - • weakref - -
- -
- -
- - genericpath -SourceModule
-imports: - os - • stat - -
-
-imported by: - client.py - • ntpath - • posixpath - -
- -
- -
- - getopt -SourceModule
-imports: - gettext - • os - • sys - -
-
-imported by: - base64 - • mimetypes - • pydoc - • quopri - • setuptools._distutils.fancy_getopt - • webbrowser - -
- -
- -
- - getpass -SourceModule
-imports: - contextlib - • io - • msvcrt - • os - • pwd - • sys - • termios - • warnings - -
-
-imported by: - urllib.request - -
- -
- -
- - gettext -SourceModule
-imports: - builtins - • copy - • errno - • locale - • operator - • os - • re - • struct - • sys - • warnings - -
-
-imported by: - argparse - • getopt - -
- -
- -
- - glob -SourceModule
-imports: - contextlib - • fnmatch - • itertools - • os - • re - • stat - • sys - -
-
-imported by: - setuptools._distutils.command.sdist - • setuptools.command.bdist_wheel - • setuptools.config.expand - • setuptools.discovery - • setuptools.dist - • setuptools.installer - -
- -
- -
- - grp (builtin module)
-imported by: - pathlib - • setuptools._distutils.archive_util - • setuptools._vendor.backports.tarfile - • shutil - • subprocess - • tarfile - -
- -
- -
- - gzip -SourceModule
-imports: - _compression - • argparse - • builtins - • errno - • io - • os - • struct - • sys - • time - • warnings - • zlib - -
-
-imported by: - setuptools._vendor.backports.tarfile - • tarfile - • xmlrpc.client - -
- -
- -
- - h2 -MissingModule
-imported by: - urllib3.http2.connection - -
- -
- -
- - hashlib -SourceModule
-imports: - _blake2 - • _hashlib - • _md5 - • _sha1 - • _sha2 - • _sha3 - • logging - -
-
-imported by: - client.py - • hmac - • random - • requests.auth - • setuptools._vendor.wheel.wheelfile - • urllib.request - • urllib3.util.ssl_ - -
- -
- -
- - heapq -SourceModule
-imports: - _heapq - -
-
-imported by: - asyncio.base_events - • asyncio.queues - • client.py - • collections - • difflib - • queue - • setuptools._vendor.more_itertools.more - • setuptools._vendor.more_itertools.recipes - -
- -
- -
- - hmac -SourceModule
-imports: - _hashlib - • _operator - • hashlib - • warnings - -
-
-imported by: - multiprocessing.connection - • secrets - • urllib3.util.ssl_ - -
- -
- -
- - html -Package
-imports: - html.entities - • re - -
-
-imported by: - html.entities - • http.server - -
- -
- -
- - html.entities -SourceModule
-imports: - html - -
-
-imported by: - html - -
- -
- -
- - http -Package
-imports: - enum - -
-
-imported by: - http.client - • http.cookiejar - • http.cookies - • http.server - • requests.compat - -
- -
- -
- - http.client -SourceModule
-imports: - collections.abc - • email.message - • email.parser - • errno - • http - • io - • re - • socket - • ssl - • sys - • urllib.parse - -
-
-imported by: - http.cookiejar - • http.server - • urllib.request - • urllib3.connection - • urllib3.contrib.emscripten.connection - • urllib3.contrib.emscripten.response - • urllib3.exceptions - • urllib3.response - • urllib3.util.response - • xmlrpc.client - -
- -
- -
- - http.cookiejar -SourceModule
-imports: - calendar - • copy - • datetime - • http - • http.client - • io - • logging - • os - • re - • threading - • time - • traceback - • urllib.parse - • urllib.request - • warnings - -
-
-imported by: - requests.compat - • urllib.request - -
- -
- -
- - http.cookies -SourceModule
-imports: - http - • re - • string - • time - • types - -
-
-imported by: - requests.compat - -
- -
- -
- - http.server -SourceModule
-imports: - argparse - • base64 - • binascii - • contextlib - • copy - • datetime - • email.utils - • html - • http - • http.client - • io - • itertools - • mimetypes - • os - • posixpath - • pwd - • select - • shutil - • socket - • socketserver - • subprocess - • sys - • time - • urllib.parse - -
-
-imported by: - pydoc - -
- -
- -
- - idna -Package
-imports: - idna - • idna.core - • idna.idnadata - • idna.intranges - • idna.package_data - -
-
-imported by: - idna - • idna.core - • idna.idnadata - • idna.intranges - • idna.package_data - • idna.uts46data - • requests.models - • urllib3.contrib.pyopenssl - • urllib3.util.url - -
- -
- -
- - idna.core -SourceModule
-imports: - bisect - • idna - • idna.idnadata - • idna.intranges - • idna.uts46data - • re - • typing - • unicodedata - -
-
-imported by: - idna - -
- -
- -
- - idna.idnadata -SourceModule
-imports: - idna - -
-
-imported by: - idna - • idna.core - -
- -
- -
- - idna.intranges -SourceModule
-imports: - bisect - • idna - • typing - -
-
-imported by: - idna - • idna.core - -
- -
- -
- - idna.package_data -SourceModule
-imports: - idna - -
-
-imported by: - idna - -
- -
- -
- - idna.uts46data -SourceModule
-imports: - idna - • typing - -
-
-imported by: - idna.core - -
- -
- -
- - importlib -Package
-imports: - _frozen_importlib - • _frozen_importlib_external - • _imp - • importlib - • importlib._bootstrap - • importlib._bootstrap_external - • sys - • warnings - -
-
-imported by: - _distutils_hack - • charset_normalizer.cd - • charset_normalizer.utils - • importlib - • importlib._abc - • importlib._bootstrap - • importlib._bootstrap_external - • importlib.abc - • importlib.machinery - • importlib.metadata - • importlib.readers - • importlib.resources - • importlib.resources._common - • importlib.util - • inspect - • pkgutil - • requests.compat - • setuptools._distutils - • setuptools._vendor.importlib_metadata - • setuptools._vendor.zipp.compat.overlay - • setuptools.config.expand - -
- -
- -
- - importlib._abc -SourceModule
-imports: - abc - • importlib - • importlib._bootstrap - -
-
-imported by: - importlib.abc - • importlib.util - -
- -
- -
- - importlib._bootstrap -SourceModule
-imports: - _frozen_importlib_external - • importlib - -
-
-imported by: - importlib - • importlib._abc - • importlib.machinery - • importlib.util - • pydoc - -
- -
- -
- - importlib._bootstrap_external -SourceModule
-imports: - _imp - • _io - • _warnings - • importlib - • importlib.metadata - • importlib.readers - • marshal - • nt - • posix - • sys - • tokenize - • winreg - -
-
-imported by: - importlib - • importlib.abc - • importlib.machinery - • importlib.util - • py_compile - • pydoc - -
- -
- -
- - importlib.abc -SourceModule
-imports: - _frozen_importlib - • _frozen_importlib_external - • abc - • importlib - • importlib._abc - • importlib._bootstrap_external - • importlib.machinery - • importlib.resources - • importlib.resources.abc - • warnings - -
-
-imported by: - _distutils_hack - • importlib.metadata - • setuptools._vendor.importlib_metadata - -
- -
- -
- - importlib.machinery -SourceModule
-imports: - importlib - • importlib._bootstrap - • importlib._bootstrap_external - -
-
-imported by: - importlib.abc - • inspect - • packaging.tags - • pkgutil - • py_compile - • pydoc - • runpy - • setuptools._imp - • setuptools._vendor.packaging.tags - • setuptools.config.expand - -
- -
- -
- - importlib.metadata -Package
-imports: - abc - • collections - • contextlib - • csv - • email - • functools - • importlib - • importlib.abc - • importlib.metadata - • importlib.metadata._adapters - • importlib.metadata._collections - • importlib.metadata._functools - • importlib.metadata._itertools - • importlib.metadata._meta - • inspect - • itertools - • operator - • os - • pathlib - • posixpath - • re - • sys - • textwrap - • typing - • warnings - • zipfile - -
-
-imported by: - importlib._bootstrap_external - • importlib.metadata - • importlib.metadata._adapters - • importlib.metadata._collections - • importlib.metadata._functools - • importlib.metadata._itertools - • importlib.metadata._meta - • importlib.metadata._text - • setuptools._importlib - • urllib3.http2 - -
- -
- -
- - importlib.metadata._adapters -SourceModule
-imports: - email.message - • functools - • importlib.metadata - • importlib.metadata._text - • re - • textwrap - • warnings - -
-
-imported by: - importlib.metadata - -
- -
- -
- - importlib.metadata._collections -SourceModule
-imports: - collections - • importlib.metadata - -
-
-imported by: - importlib.metadata - -
- -
- -
- - importlib.metadata._functools -SourceModule
-imports: - functools - • importlib.metadata - • types - -
-
-imported by: - importlib.metadata - • importlib.metadata._text - -
- -
- -
- - importlib.metadata._itertools -SourceModule
-imports: - importlib.metadata - • itertools - -
-
-imported by: - importlib.metadata - -
- -
- -
- - importlib.metadata._meta -SourceModule
-imports: - importlib.metadata - • typing - -
-
-imported by: - importlib.metadata - -
- -
- -
- - importlib.metadata._text -SourceModule
-imports: - importlib.metadata - • importlib.metadata._functools - • re - -
-
-imported by: - importlib.metadata._adapters - -
- -
- -
- - importlib.readers -SourceModule
-imports: - importlib - • importlib.resources.readers - -
-
-imported by: - importlib._bootstrap_external - • zipimport - -
- -
- -
- - importlib.resources -Package
-imports: - importlib - • importlib.resources - • importlib.resources._common - • importlib.resources._legacy - • importlib.resources.abc - -
-
-imported by: - certifi.core - • importlib.abc - • importlib.resources - • importlib.resources._adapters - • importlib.resources._common - • importlib.resources._itertools - • importlib.resources._legacy - • importlib.resources.abc - • importlib.resources.readers - • setuptools._importlib - • setuptools._vendor.jaraco.text - • urllib3.contrib.emscripten.fetch - -
- -
- -
- - importlib.resources._adapters -SourceModule
-imports: - contextlib - • importlib.resources - • importlib.resources.abc - • io - -
-
-imported by: - importlib.resources._common - -
- -
- -
- - importlib.resources._common -SourceModule
-imports: - contextlib - • functools - • importlib - • importlib.resources - • importlib.resources._adapters - • importlib.resources.abc - • inspect - • itertools - • os - • pathlib - • tempfile - • types - • typing - • warnings - -
-
-imported by: - importlib.resources - • importlib.resources._legacy - -
- -
- -
- - importlib.resources._itertools -SourceModule
-imports: - importlib.resources - -
-
-imported by: - importlib.resources.readers - -
- -
- -
- - importlib.resources._legacy -SourceModule
-imports: - functools - • importlib.resources - • importlib.resources._common - • os - • pathlib - • types - • typing - • warnings - -
-
-imported by: - importlib.resources - -
- -
- -
- - importlib.resources.abc -SourceModule
-imports: - abc - • importlib.resources - • io - • itertools - • os - • pathlib - • typing - -
-
-imported by: - importlib.abc - • importlib.resources - • importlib.resources._adapters - • importlib.resources._common - • importlib.resources.readers - -
- -
- -
- - importlib.resources.readers -SourceModule
-imports: - collections - • importlib.resources - • importlib.resources._itertools - • importlib.resources.abc - • itertools - • operator - • pathlib - • zipfile - -
-
-imported by: - importlib.readers - -
- -
- -
- - importlib.util -SourceModule
-imports: - _imp - • importlib - • importlib._abc - • importlib._bootstrap - • importlib._bootstrap_external - • sys - • threading - • types - -
-
-imported by: - _distutils_hack - • pkgutil - • py_compile - • pydoc - • runpy - • setuptools._distutils.util - • setuptools._imp - • zipfile - -
- -
- -
- - importlib_metadata -AliasNode
-imports: - setuptools._vendor.importlib_metadata - -
-
-imported by: - setuptools._importlib - -
- -
- -
- - importlib_resources -MissingModule
-imported by: - setuptools._vendor.jaraco.text - -
- -
- -
- - inspect -SourceModule
-imports: - abc - • argparse - • ast - • builtins - • collections - • collections.abc - • dis - • enum - • functools - • importlib - • importlib.machinery - • itertools - • keyword - • linecache - • operator - • os - • re - • sys - • token - • tokenize - • types - -
-
-imported by: - ast - • asyncio.coroutines - • asyncio.format_helpers - • asyncio.tasks - • dataclasses - • importlib.metadata - • importlib.resources._common - • pkgutil - • pydoc - • pyi_rth_inspect.py - • rlcompleter - • setuptools._vendor.importlib_metadata - • setuptools._vendor.jaraco.functools - • setuptools.config._apply_pyprojecttoml - • setuptools.config._validate_pyproject.extra_validations - • setuptools.discovery - • setuptools.logging - • setuptools.monkey - • setuptools.warnings - • typing - • unittest.async_case - • unittest.mock - -
- -
- -
- - io -SourceModule
-imports: - _io - • abc - -
-
-imported by: - _compression - • asyncio.proactor_events - • asyncio.unix_events - • bz2 - • client.py - • configparser - • csv - • dis - • email.feedparser - • email.generator - • email.iterators - • email.message - • email.parser - • encodings.quopri_codec - • encodings.uu_codec - • getpass - • gzip - • http.client - • http.cookiejar - • http.server - • importlib.resources._adapters - • importlib.resources.abc - • logging - • lzma - • multiprocessing.connection - • multiprocessing.popen_forkserver - • multiprocessing.popen_spawn_posix - • multiprocessing.reduction - • os - • pathlib - • pickle - • pprint - • pydoc - • quopri - • requests.compat - • requests.models - • requests.utils - • runpy - • setuptools._vendor.backports.tarfile - • setuptools._vendor.wheel.macosx_libfile - • setuptools._vendor.wheel.wheelfile - • setuptools._vendor.zipp - • setuptools._vendor.zipp.compat.py310 - • setuptools.command._requirestxt - • setuptools.config._validate_pyproject.error_reporting - • setuptools.dist - • shlex - • site - • socket - • socketserver - • subprocess - • tarfile - • tempfile - • tokenize - • unittest.mock - • unittest.result - • urllib.error - • urllib.request - • urllib3.contrib.emscripten.fetch - • urllib3.contrib.emscripten.response - • urllib3.contrib.pyopenssl - • urllib3.filepost - • urllib3.response - • urllib3.util.request - • urllib3.util.ssltransport - • xml.sax - • xml.sax.saxutils - • xmlrpc.client - • zipfile - • zipfile._path - -
- -
- -
- - ipaddress -SourceModule
-imports: - functools - • re - -
-
-imported by: - urllib.parse - • urllib.request - • urllib3.util.ssl_match_hostname - -
- -
- -
- - itertools (builtin module)
-imported by: - _pydecimal - • asyncio.base_events - • asyncio.selector_events - • asyncio.tasks - • asyncio.unix_events - • asyncio.windows_utils - • calendar - • collections - • concurrent.futures.process - • concurrent.futures.thread - • configparser - • dataclasses - • glob - • http.server - • importlib.metadata - • importlib.metadata._itertools - • importlib.resources._common - • importlib.resources.abc - • importlib.resources.readers - • inspect - • multiprocessing.connection - • multiprocessing.pool - • multiprocessing.process - • multiprocessing.util - • packaging.specifiers - • pickle - • platform - • random - • reprlib - • setuptools._distutils.command.sdist - • setuptools._distutils.compat.py39 - • setuptools._distutils.compilers.C.msvc - • setuptools._distutils.dir_util - • setuptools._entry_points - • setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata._itertools - • setuptools._vendor.jaraco.functools - • setuptools._vendor.jaraco.text - • setuptools._vendor.more_itertools.more - • setuptools._vendor.more_itertools.recipes - • setuptools._vendor.packaging.specifiers - • setuptools._vendor.zipp - • setuptools.command._requirestxt - • setuptools.command.sdist - • setuptools.config._apply_pyprojecttoml - • setuptools.config._validate_pyproject.extra_validations - • setuptools.config._validate_pyproject.formats - • setuptools.config.expand - • setuptools.discovery - • setuptools.dist - • setuptools.installer - • setuptools.msvc - • setuptools.wheel - • statistics - • threading - • tokenize - • traceback - • urllib3.util.retry - • weakref - • zipfile._path - -
- -
- -
- - jaraco -AliasNode
-imports: - setuptools._vendor.jaraco - -
-
-imported by: - setuptools._vendor.jaraco.context - • setuptools._vendor.jaraco.functools - • setuptools._vendor.jaraco.text - -
- -
- -
- - java -MissingModule
-imported by: - platform - -
- -
- -
- - js -MissingModule
-imported by: - urllib3.contrib.emscripten.fetch - -
- -
- -
- - json -Package
-imports: - codecs - • json.decoder - • json.encoder - • json.scanner - -
-
-imported by: - charset_normalizer.models - • client.py - • json.decoder - • json.encoder - • json.scanner - • requests.compat - • setuptools._vendor.importlib_metadata - • setuptools.config._validate_pyproject.error_reporting - • setuptools.msvc - • urllib3._request_methods - • urllib3.contrib.emscripten.fetch - • urllib3.contrib.emscripten.response - • urllib3.response - -
- -
- -
- - json.decoder -SourceModule
-imports: - _json - • json - • json.scanner - • re - -
-
-imported by: - _json - • json - -
- -
- -
- - json.encoder -SourceModule
-imports: - _json - • json - • re - -
-
-imported by: - json - -
- -
- -
- - json.scanner -SourceModule
-imports: - _json - • json - • re - -
-
-imported by: - json - • json.decoder - -
- -
- -
- - keyword -SourceModule
-imported by: - client.py - • collections - • dataclasses - • inspect - • rlcompleter - • setuptools.config._validate_pyproject.formats - -
- -
- -
- - linecache -SourceModule
-imports: - functools - • os - • sys - • tokenize - -
-
-imported by: - asyncio.base_tasks - • client.py - • inspect - • traceback - • tracemalloc - • warnings - -
- -
- -
- - locale -SourceModule
-imports: - _collections_abc - • _locale - • builtins - • encodings - • encodings.aliases - • functools - • os - • re - • sys - • warnings - -
-
-imported by: - _pydecimal - • _strptime - • calendar - • client.py - • gettext - • subprocess - • tkinter.filedialog - -
- -
- -
- - logging -Package
-imports: - atexit - • collections.abc - • io - • os - • pickle - • re - • string - • sys - • threading - • time - • traceback - • types - • warnings - • weakref - -
-
-imported by: - asyncio.futures - • asyncio.log - • charset_normalizer - • charset_normalizer.api - • charset_normalizer.md - • charset_normalizer.utils - • concurrent.futures._base - • hashlib - • http.cookiejar - • multiprocessing.util - • packaging.tags - • requests - • setuptools._distutils._log - • setuptools._distutils.cmd - • setuptools._distutils.dist - • setuptools._distutils.log - • setuptools._vendor.packaging.tags - • setuptools._vendor.wheel.wheelfile - • setuptools.config._apply_pyprojecttoml - • setuptools.config._validate_pyproject.error_reporting - • setuptools.config._validate_pyproject.formats - • setuptools.config.pyprojecttoml - • setuptools.logging - • unittest._log - • urllib3 - • urllib3.connection - • urllib3.connectionpool - • urllib3.contrib.emscripten.response - • urllib3.contrib.pyopenssl - • urllib3.http2.connection - • urllib3.poolmanager - • urllib3.response - • urllib3.util.retry - -
- -
- -
- - lzma -SourceModule
-imports: - _compression - • _lzma - • builtins - • io - • os - -
-
-imported by: - setuptools._vendor.backports.tarfile - • shutil - • tarfile - • zipfile - -
- -
- -
- - marshal (builtin module)
-imported by: - importlib._bootstrap_external - • pkgutil - • setuptools.command.bdist_egg - • setuptools.depends - • zipimport - -
- -
- -
- - math (builtin module)
-imported by: - _pydatetime - • _pydecimal - • asyncio.windows_events - • fractions - • random - • selectors - • setuptools._vendor.more_itertools.more - • setuptools._vendor.more_itertools.recipes - • statistics - • urllib.parse - -
- -
- -
- - mimetypes -SourceModule
-imports: - _winapi - • getopt - • os - • posixpath - • sys - • urllib.parse - • winreg - -
-
-imported by: - http.server - • urllib.request - • urllib3.fields - -
- -
- -
- - mmap /usr/lib/python3.12/lib-dynload/mmap.cpython-312-x86_64-linux-gnu.so
-imported by: - multiprocessing.heap - • multiprocessing.shared_memory - -
- -
- -
- - more_itertools -AliasNode
-imports: - setuptools._vendor.more_itertools - -
-
-imported by: - setuptools._distutils.compilers.C.base - • setuptools._entry_points - • setuptools._itertools - • setuptools._path - • setuptools._vendor.jaraco.functools - • setuptools.config.expand - • setuptools.config.pyprojecttoml - • setuptools.dist - • setuptools.msvc - -
- -
- -
- - msvcrt -MissingModule
-imported by: - asyncio.windows_events - • asyncio.windows_utils - • getpass - • multiprocessing.popen_spawn_win32 - • multiprocessing.spawn - • subprocess - -
- -
- -
- - multiprocessing -Package
-imports: - multiprocessing - • multiprocessing.AuthenticationError - • multiprocessing.BufferTooShort - • multiprocessing.TimeoutError - • multiprocessing.connection - • multiprocessing.context - • multiprocessing.forkserver - • multiprocessing.get_context - • multiprocessing.get_start_method - • multiprocessing.pool - • multiprocessing.process - • multiprocessing.reduction - • multiprocessing.resource_sharer - • multiprocessing.resource_tracker - • multiprocessing.set_start_method - • multiprocessing.shared_memory - • multiprocessing.spawn - • multiprocessing.util - • sys - -
-
-imported by: - concurrent.futures.process - • multiprocessing - • multiprocessing.connection - • multiprocessing.context - • multiprocessing.dummy - • multiprocessing.forkserver - • multiprocessing.heap - • multiprocessing.managers - • multiprocessing.pool - • multiprocessing.popen_fork - • multiprocessing.popen_forkserver - • multiprocessing.popen_spawn_posix - • multiprocessing.popen_spawn_win32 - • multiprocessing.process - • multiprocessing.queues - • multiprocessing.reduction - • multiprocessing.resource_sharer - • multiprocessing.resource_tracker - • multiprocessing.shared_memory - • multiprocessing.sharedctypes - • multiprocessing.spawn - • multiprocessing.synchronize - • multiprocessing.util - • pyi_rth_multiprocessing.py - -
- -
- -
- - multiprocessing.AuthenticationError -MissingModule
-imported by: - multiprocessing - • multiprocessing.connection - -
- -
- -
- - multiprocessing.BufferTooShort -MissingModule
-imported by: - multiprocessing - • multiprocessing.connection - -
- -
- -
- - multiprocessing.TimeoutError -MissingModule
-imported by: - multiprocessing - • multiprocessing.pool - -
- -
- -
- - multiprocessing.connection -SourceModule
-imports: - _multiprocessing - • _winapi - • errno - • hmac - • io - • itertools - • multiprocessing - • multiprocessing.AuthenticationError - • multiprocessing.BufferTooShort - • multiprocessing.context - • multiprocessing.resource_sharer - • multiprocessing.util - • os - • selectors - • socket - • struct - • sys - • tempfile - • time - • xmlrpc.client - -
-
-imported by: - concurrent.futures.process - • multiprocessing - • multiprocessing.context - • multiprocessing.forkserver - • multiprocessing.managers - • multiprocessing.pool - • multiprocessing.popen_fork - • multiprocessing.popen_forkserver - • multiprocessing.process - • multiprocessing.queues - • multiprocessing.resource_sharer - -
- -
- -
- - multiprocessing.context -SourceModule
-imports: - multiprocessing - • multiprocessing.connection - • multiprocessing.forkserver - • multiprocessing.managers - • multiprocessing.pool - • multiprocessing.popen_fork - • multiprocessing.popen_forkserver - • multiprocessing.popen_spawn_posix - • multiprocessing.popen_spawn_win32 - • multiprocessing.process - • multiprocessing.queues - • multiprocessing.reduction - • multiprocessing.sharedctypes - • multiprocessing.spawn - • multiprocessing.synchronize - • multiprocessing.util - • os - • sys - • threading - -
-
-imported by: - multiprocessing - • multiprocessing.connection - • multiprocessing.forkserver - • multiprocessing.heap - • multiprocessing.managers - • multiprocessing.popen_forkserver - • multiprocessing.popen_spawn_posix - • multiprocessing.popen_spawn_win32 - • multiprocessing.process - • multiprocessing.queues - • multiprocessing.reduction - • multiprocessing.resource_sharer - • multiprocessing.sharedctypes - • multiprocessing.spawn - • multiprocessing.synchronize - -
- -
- -
- - multiprocessing.dummy -Package
-imports: - array - • multiprocessing - • multiprocessing.dummy.connection - • multiprocessing.pool - • queue - • sys - • threading - • weakref - -
-
-imported by: - multiprocessing.dummy.connection - • multiprocessing.pool - -
- -
- -
- - multiprocessing.dummy.connection -SourceModule
-imports: - multiprocessing.dummy - • queue - -
-
-imported by: - multiprocessing.dummy - -
- -
- -
- - multiprocessing.forkserver -SourceModule
-imports: - errno - • multiprocessing - • multiprocessing.connection - • multiprocessing.context - • multiprocessing.process - • multiprocessing.resource_tracker - • multiprocessing.spawn - • multiprocessing.util - • os - • selectors - • signal - • socket - • struct - • sys - • threading - • warnings - -
-
-imported by: - multiprocessing - • multiprocessing.context - • multiprocessing.popen_forkserver - • multiprocessing.util - -
- -
- -
- - multiprocessing.get_context -MissingModule
-imported by: - multiprocessing - • multiprocessing.managers - • multiprocessing.pool - • multiprocessing.sharedctypes - -
- -
- -
- - multiprocessing.get_start_method -MissingModule
-imported by: - multiprocessing - • multiprocessing.spawn - -
- -
- -
- - multiprocessing.heap -SourceModule
-imports: - _winapi - • bisect - • collections - • mmap - • multiprocessing - • multiprocessing.context - • multiprocessing.util - • os - • sys - • tempfile - • threading - -
-
-imported by: - multiprocessing.sharedctypes - • multiprocessing.synchronize - -
- -
- -
- - multiprocessing.managers -SourceModule
-imports: - array - • multiprocessing - • multiprocessing.connection - • multiprocessing.context - • multiprocessing.get_context - • multiprocessing.pool - • multiprocessing.process - • multiprocessing.resource_tracker - • multiprocessing.shared_memory - • multiprocessing.util - • os - • queue - • signal - • sys - • threading - • time - • traceback - • types - -
-
-imported by: - multiprocessing.context - -
- -
- -
- - multiprocessing.pool -SourceModule
-imports: - collections - • itertools - • multiprocessing - • multiprocessing.TimeoutError - • multiprocessing.connection - • multiprocessing.dummy - • multiprocessing.get_context - • multiprocessing.util - • os - • queue - • threading - • time - • traceback - • types - • warnings - -
-
-imported by: - multiprocessing - • multiprocessing.context - • multiprocessing.dummy - • multiprocessing.managers - -
- -
- -
- - multiprocessing.popen_fork -SourceModule
-imports: - multiprocessing - • multiprocessing.connection - • multiprocessing.util - • os - • signal - -
-
-imported by: - multiprocessing.context - • multiprocessing.popen_forkserver - • multiprocessing.popen_spawn_posix - -
- -
- -
- - multiprocessing.popen_forkserver -SourceModule
-imports: - io - • multiprocessing - • multiprocessing.connection - • multiprocessing.context - • multiprocessing.forkserver - • multiprocessing.popen_fork - • multiprocessing.spawn - • multiprocessing.util - • os - -
-
-imported by: - multiprocessing.context - -
- -
- -
- - multiprocessing.popen_spawn_posix -SourceModule
-imports: - io - • multiprocessing - • multiprocessing.context - • multiprocessing.popen_fork - • multiprocessing.resource_tracker - • multiprocessing.spawn - • multiprocessing.util - • os - -
-
-imported by: - multiprocessing.context - -
- -
- -
- - multiprocessing.popen_spawn_win32 -SourceModule
-imports: - _winapi - • msvcrt - • multiprocessing - • multiprocessing.context - • multiprocessing.spawn - • multiprocessing.util - • os - • signal - • sys - -
-
-imported by: - multiprocessing.context - -
- -
- -
- - multiprocessing.process -SourceModule
-imports: - _weakrefset - • itertools - • multiprocessing - • multiprocessing.connection - • multiprocessing.context - • multiprocessing.util - • os - • signal - • sys - • threading - • traceback - -
-
-imported by: - multiprocessing - • multiprocessing.context - • multiprocessing.forkserver - • multiprocessing.managers - • multiprocessing.resource_sharer - • multiprocessing.spawn - • multiprocessing.synchronize - • multiprocessing.util - -
- -
- -
- - multiprocessing.queues -SourceModule
-imports: - _multiprocessing - • collections - • errno - • multiprocessing - • multiprocessing.connection - • multiprocessing.context - • multiprocessing.synchronize - • multiprocessing.util - • os - • queue - • sys - • threading - • time - • traceback - • types - • weakref - -
-
-imported by: - concurrent.futures.process - • multiprocessing.context - -
- -
- -
- - multiprocessing.reduction -SourceModule
-imports: - _winapi - • abc - • array - • copyreg - • functools - • io - • multiprocessing - • multiprocessing.context - • multiprocessing.resource_sharer - • os - • pickle - • socket - • sys - -
-
-imported by: - multiprocessing - • multiprocessing.context - -
- -
- -
- - multiprocessing.resource_sharer -SourceModule
-imports: - multiprocessing - • multiprocessing.connection - • multiprocessing.context - • multiprocessing.process - • multiprocessing.util - • os - • signal - • socket - • sys - • threading - -
-
-imported by: - multiprocessing - • multiprocessing.connection - • multiprocessing.reduction - -
- -
- -
- - multiprocessing.resource_tracker -SourceModule
-imports: - _multiprocessing - • _posixshmem - • multiprocessing - • multiprocessing.spawn - • multiprocessing.util - • os - • signal - • sys - • threading - • warnings - -
-
-imported by: - multiprocessing - • multiprocessing.forkserver - • multiprocessing.managers - • multiprocessing.popen_spawn_posix - • multiprocessing.shared_memory - • multiprocessing.spawn - • multiprocessing.synchronize - • multiprocessing.util - -
- -
- -
- - multiprocessing.set_start_method -MissingModule
-imported by: - multiprocessing - • multiprocessing.spawn - -
- -
- -
- - multiprocessing.shared_memory -SourceModule
-imports: - _posixshmem - • _winapi - • errno - • functools - • mmap - • multiprocessing - • multiprocessing.resource_tracker - • os - • secrets - • struct - • types - -
-
-imported by: - multiprocessing - • multiprocessing.managers - -
- -
- -
- - multiprocessing.sharedctypes -SourceModule
-imports: - ctypes - • multiprocessing - • multiprocessing.context - • multiprocessing.get_context - • multiprocessing.heap - • weakref - -
-
-imported by: - multiprocessing.context - -
- -
- -
- - multiprocessing.spawn -SourceModule
-imports: - _winapi - • msvcrt - • multiprocessing - • multiprocessing.context - • multiprocessing.get_start_method - • multiprocessing.process - • multiprocessing.resource_tracker - • multiprocessing.set_start_method - • multiprocessing.util - • os - • runpy - • sys - • types - -
-
-imported by: - multiprocessing - • multiprocessing.context - • multiprocessing.forkserver - • multiprocessing.popen_forkserver - • multiprocessing.popen_spawn_posix - • multiprocessing.popen_spawn_win32 - • multiprocessing.resource_tracker - • pyi_rth_multiprocessing.py - -
- -
- -
- - multiprocessing.synchronize -SourceModule
-imports: - _multiprocessing - • multiprocessing - • multiprocessing.context - • multiprocessing.heap - • multiprocessing.process - • multiprocessing.resource_tracker - • multiprocessing.util - • struct - • sys - • tempfile - • threading - • time - -
-
-imported by: - concurrent.futures.process - • multiprocessing.context - • multiprocessing.queues - -
- -
- -
- - multiprocessing.util -SourceModule
-imports: - _posixsubprocess - • atexit - • itertools - • logging - • multiprocessing - • multiprocessing.forkserver - • multiprocessing.process - • multiprocessing.resource_tracker - • os - • shutil - • subprocess - • sys - • tempfile - • threading - • traceback - • weakref - -
-
-imported by: - multiprocessing - • multiprocessing.connection - • multiprocessing.context - • multiprocessing.forkserver - • multiprocessing.heap - • multiprocessing.managers - • multiprocessing.pool - • multiprocessing.popen_fork - • multiprocessing.popen_forkserver - • multiprocessing.popen_spawn_posix - • multiprocessing.popen_spawn_win32 - • multiprocessing.process - • multiprocessing.queues - • multiprocessing.resource_sharer - • multiprocessing.resource_tracker - • multiprocessing.spawn - • multiprocessing.synchronize - -
- -
- -
- - netrc -SourceModule
-imports: - os - • pwd - • stat - -
-
-imported by: - ftplib - • requests.utils - -
- -
- -
- - nt -MissingModule
-imported by: - ctypes - • importlib._bootstrap_external - • ntpath - • os - • shutil - -
- -
- -
- - ntpath -SourceModule
-imports: - _winapi - • genericpath - • nt - • os - • re - • stat - • sys - -
-
-imported by: - client.py - • os - • pathlib - -
- -
- -
- - nturl2path -SourceModule
-imports: - string - • urllib.parse - -
-
-imported by: - urllib.request - -
- -
- -
- - numbers -SourceModule
-imports: - abc - -
-
-imported by: - _pydecimal - • fractions - • setuptools.dist - • statistics - -
- -
- -
- - opcode -SourceModule
-imports: - _opcode - -
-
-imported by: - dis - -
- -
- -
- - operator -SourceModule
-imports: - _operator - • builtins - • functools - -
-
-imported by: - _pydatetime - • client.py - • collections - • copyreg - • email._header_value_parser - • enum - • fractions - • gettext - • importlib.metadata - • importlib.resources.readers - • inspect - • packaging.markers - • random - • setuptools._discovery - • setuptools._distutils.versionpredicate - • setuptools._entry_points - • setuptools._vendor.importlib_metadata - • setuptools._vendor.jaraco.context - • setuptools._vendor.jaraco.functools - • setuptools._vendor.more_itertools.more - • setuptools._vendor.more_itertools.recipes - • setuptools._vendor.packaging.markers - • statistics - • typing - -
- -
- -
- - os -SourceModule
-imports: - _collections_abc - • abc - • io - • nt - • ntpath - • os.path - • posix - • posixpath - • stat - • subprocess - • sys - • warnings - -
-
-imported by: - _aix_support - • _distutils_hack - • _sitebuiltins - • argparse - • asyncio.base_events - • asyncio.coroutines - • asyncio.events - • asyncio.proactor_events - • asyncio.selector_events - • asyncio.unix_events - • asyncio.windows_utils - • bz2 - • charset_normalizer.api - • client.py - • concurrent.futures.process - • concurrent.futures.thread - • configparser - • contextlib - • ctypes - • email.utils - • fnmatch - • genericpath - • getopt - • getpass - • gettext - • glob - • gzip - • http.cookiejar - • http.server - • importlib.metadata - • importlib.resources._common - • importlib.resources._legacy - • importlib.resources.abc - • inspect - • linecache - • locale - • logging - • lzma - • mimetypes - • multiprocessing.connection - • multiprocessing.context - • multiprocessing.forkserver - • multiprocessing.heap - • multiprocessing.managers - • multiprocessing.pool - • multiprocessing.popen_fork - • multiprocessing.popen_forkserver - • multiprocessing.popen_spawn_posix - • multiprocessing.popen_spawn_win32 - • multiprocessing.process - • multiprocessing.queues - • multiprocessing.reduction - • multiprocessing.resource_sharer - • multiprocessing.resource_tracker - • multiprocessing.shared_memory - • multiprocessing.spawn - • multiprocessing.util - • netrc - • ntpath - • os.path - • packaging._elffile - • packaging._manylinux - • packaging.markers - • pathlib - • pkgutil - • platform - • posixpath - • py_compile - • pydoc - • pyi_rth__tkinter.py - • pyi_rth_inspect.py - • pyi_rth_setuptools.py - • random - • requests.auth - • requests.sessions - • requests.utils - • runpy - • setuptools - • setuptools._core_metadata - • setuptools._distutils.archive_util - • setuptools._distutils.cmd - • setuptools._distutils.command.bdist - • setuptools._distutils.command.build - • setuptools._distutils.command.build_ext - • setuptools._distutils.command.sdist - • setuptools._distutils.compilers.C.base - • setuptools._distutils.compilers.C.msvc - • setuptools._distutils.core - • setuptools._distutils.debug - • setuptools._distutils.dir_util - • setuptools._distutils.dist - • setuptools._distutils.extension - • setuptools._distutils.file_util - • setuptools._distutils.filelist - • setuptools._distutils.spawn - • setuptools._distutils.sysconfig - • setuptools._distutils.util - • setuptools._imp - • setuptools._path - • setuptools._shutil - • setuptools._vendor.backports.tarfile - • setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata._meta - • setuptools._vendor.importlib_metadata.compat.py311 - • setuptools._vendor.jaraco.context - • setuptools._vendor.packaging._elffile - • setuptools._vendor.packaging._manylinux - • setuptools._vendor.packaging.markers - • setuptools._vendor.wheel.macosx_libfile - • setuptools._vendor.zipp.glob - • setuptools.archive_util - • setuptools.command.bdist_egg - • setuptools.command.bdist_wheel - • setuptools.command.egg_info - • setuptools.command.sdist - • setuptools.command.setopt - • setuptools.config._apply_pyprojecttoml - • setuptools.config._validate_pyproject.error_reporting - • setuptools.config._validate_pyproject.formats - • setuptools.config.expand - • setuptools.config.pyprojecttoml - • setuptools.config.setupcfg - • setuptools.discovery - • setuptools.dist - • setuptools.glob - • setuptools.installer - • setuptools.msvc - • setuptools.warnings - • setuptools.wheel - • shlex - • shutil - • site - • socket - • socketserver - • ssl - • subprocess - • sysconfig - • tarfile - • tempfile - • threading - • tkinter - • tkinter.filedialog - • unittest.loader - • unittest.main - • urllib.request - • urllib3.connection - • urllib3.contrib.emscripten.connection - • urllib3.filepost - • urllib3.util.ssl_ - • webbrowser - • xml.sax - • xml.sax.saxutils - • zipfile - -
- -
- -
- - os.path -AliasNode
-imports: - os - • posixpath - -
-
-imported by: - os - • pkgutil - • py_compile - • requests.adapters - • setuptools._distutils._modified - • setuptools._distutils.file_util - • setuptools._vendor.wheel.wheelfile - • setuptools.msvc - • sysconfig - • tracemalloc - • unittest.util - -
- -
- -
- - packaging -Package
-imports: - packaging - • packaging._manylinux - • packaging._musllinux - -
-
-imported by: - packaging - • packaging._elffile - • packaging._manylinux - • packaging._musllinux - • packaging._parser - • packaging._structures - • packaging._tokenizer - • packaging.licenses - • packaging.markers - • packaging.requirements - • packaging.specifiers - • packaging.tags - • packaging.utils - • packaging.version - • setuptools._normalization - • setuptools.command.bdist_wheel - • setuptools.command.egg_info - • setuptools.config._validate_pyproject.formats - -
- -
- -
- - packaging._elffile -SourceModule
-imports: - __future__ - • enum - • os - • packaging - • struct - • typing - -
-
-imported by: - packaging._manylinux - • packaging._musllinux - -
- -
- -
- - packaging._manylinux -SourceModule
-imports: - __future__ - • _manylinux - • collections - • contextlib - • ctypes - • functools - • os - • packaging - • packaging._elffile - • re - • sys - • typing - • warnings - -
-
-imported by: - packaging - • packaging.tags - -
- -
- -
- - packaging._musllinux -SourceModule
-imports: - __future__ - • functools - • packaging - • packaging._elffile - • re - • subprocess - • sys - • sysconfig - • typing - -
-
-imported by: - packaging - • packaging.tags - -
- -
- -
- - packaging._parser -SourceModule
-imports: - __future__ - • ast - • packaging - • packaging._tokenizer - • typing - -
-
-imported by: - packaging.markers - • packaging.requirements - -
- -
- -
- - packaging._structures -SourceModule
-imports: - packaging - • typing - -
-
-imported by: - packaging.version - -
- -
- -
- - packaging._tokenizer -SourceModule
-imports: - __future__ - • contextlib - • dataclasses - • packaging - • packaging.specifiers - • re - • typing - -
-
-imported by: - packaging._parser - • packaging.markers - • packaging.requirements - -
- -
- -
- - packaging.licenses -Package
-imports: - __future__ - • packaging - • packaging.licenses._spdx - • re - • typing - -
-
-imported by: - packaging.licenses._spdx - • setuptools._normalization - • setuptools.config._validate_pyproject.formats - -
- -
- -
- - packaging.licenses._spdx -SourceModule
-imports: - __future__ - • packaging.licenses - • typing - -
-
-imported by: - packaging.licenses - -
- -
- -
- - packaging.markers -SourceModule
-imports: - __future__ - • operator - • os - • packaging - • packaging._parser - • packaging._tokenizer - • packaging.specifiers - • packaging.utils - • platform - • sys - • typing - -
-
-imported by: - packaging.requirements - • setuptools._core_metadata - • setuptools.config.setupcfg - • setuptools.dist - -
- -
- -
- - packaging.requirements -SourceModule
-imports: - __future__ - • packaging - • packaging._parser - • packaging._tokenizer - • packaging.markers - • packaging.specifiers - • packaging.utils - • typing - -
-
-imported by: - setuptools._core_metadata - • setuptools._discovery - • setuptools._reqs - • setuptools.command._requirestxt - • setuptools.command.egg_info - • setuptools.config._validate_pyproject.formats - • setuptools.config.setupcfg - • setuptools.installer - • setuptools.wheel - -
- -
- -
- - packaging.specifiers -SourceModule
-imports: - __future__ - • abc - • itertools - • packaging - • packaging.utils - • packaging.version - • re - • typing - -
-
-imported by: - packaging._tokenizer - • packaging.markers - • packaging.requirements - • setuptools._static - • setuptools.dist - -
- -
- -
- - packaging.tags -SourceModule
-imports: - __future__ - • importlib.machinery - • logging - • packaging - • packaging._manylinux - • packaging._musllinux - • platform - • re - • struct - • subprocess - • sys - • sysconfig - • typing - -
-
-imported by: - packaging.utils - • setuptools.command.bdist_wheel - • setuptools.wheel - -
- -
- -
- - packaging.utils -SourceModule
-imports: - __future__ - • packaging - • packaging.tags - • packaging.version - • re - • typing - -
-
-imported by: - packaging.markers - • packaging.requirements - • packaging.specifiers - • setuptools._core_metadata - • setuptools._distutils.dist - • setuptools.installer - • setuptools.wheel - -
- -
- -
- - packaging.version -SourceModule
-imports: - __future__ - • functools - • packaging - • packaging._structures - • re - • sys - • typing - • typing_extensions - • warnings - -
-
-imported by: - packaging.specifiers - • packaging.utils - • setuptools._core_metadata - • setuptools.command.bdist_wheel - • setuptools.command.egg_info - • setuptools.config.setupcfg - • setuptools.depends - • setuptools.dist - • setuptools.wheel - -
- -
- -
- - pathlib -SourceModule
-imports: - _collections_abc - • errno - • fnmatch - • functools - • grp - • io - • ntpath - • os - • posixpath - • pwd - • re - • stat - • sys - • urllib.parse - • warnings - -
-
-imported by: - client.py - • importlib.metadata - • importlib.resources._common - • importlib.resources._legacy - • importlib.resources.abc - • importlib.resources.readers - • setuptools._distutils.compilers.C.base - • setuptools._distutils.dir_util - • setuptools._distutils.dist - • setuptools._distutils.sysconfig - • setuptools._distutils.util - • setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata.compat.py311 - • setuptools._vendor.zipp - • setuptools.config.expand - • setuptools.discovery - • setuptools.dist - • zipfile._path - -
- -
- -
- - pickle -SourceModule
-imports: - _compat_pickle - • _pickle - • codecs - • copyreg - • functools - • io - • itertools - • pprint - • re - • struct - • sys - • types - -
-
-imported by: - logging - • multiprocessing.reduction - • tracemalloc - -
- -
- -
- - pkgutil -SourceModule
-imports: - collections - • functools - • importlib - • importlib.machinery - • importlib.util - • inspect - • marshal - • os - • os.path - • re - • sys - • types - • warnings - • zipimport - -
-
-imported by: - pydoc - • pyi_rth_pkgutil.py - • runpy - • unittest.mock - -
- -
- -
- - platform -SourceModule
-imports: - 'java.lang' - • _winreg - • _wmi - • collections - • functools - • itertools - • java - • os - • re - • socket - • struct - • subprocess - • sys - • vms_lib - • winreg - -
-
-imported by: - packaging.markers - • packaging.tags - • pydoc - • setuptools._distutils.compat.py39 - • setuptools._distutils.spawn - • setuptools._vendor.importlib_metadata._compat - • setuptools._vendor.jaraco.context - • setuptools._vendor.packaging.markers - • setuptools._vendor.packaging.tags - • setuptools.monkey - • setuptools.msvc - • setuptools.windows_support - -
- -
- -
- - posix (builtin module)
-imports: - resource - -
-
-imported by: - importlib._bootstrap_external - • os - • posixpath - • shutil - -
- -
- -
- - posixpath -SourceModule
-imports: - genericpath - • os - • posix - • pwd - • re - • stat - • sys - -
-
-imported by: - client.py - • fnmatch - • http.server - • importlib.metadata - • mimetypes - • os - • os.path - • pathlib - • setuptools._vendor.importlib_metadata - • setuptools._vendor.zipp - • setuptools.archive_util - • setuptools.wheel - • zipfile._path - -
- -
- -
- - pprint -SourceModule
-imports: - collections - • dataclasses - • io - • re - • sys - • types - -
-
-imported by: - pickle - • setuptools._distutils.dist - • sysconfig - • unittest.case - • unittest.mock - -
- -
- -
- - pwd (builtin module)
-imported by: - getpass - • http.server - • netrc - • pathlib - • posixpath - • setuptools._distutils.archive_util - • setuptools._distutils.util - • setuptools._vendor.backports.tarfile - • shutil - • subprocess - • tarfile - -
- -
- -
- - py_compile -SourceModule
-imports: - argparse - • enum - • importlib._bootstrap_external - • importlib.machinery - • importlib.util - • os - • os.path - • sys - • traceback - -
-
-imported by: - setuptools._distutils.util - • zipfile - -
- -
- -
- - pydoc -SourceModule
-imports: - __future__ - • builtins - • collections - • email.message - • getopt - • http.server - • importlib._bootstrap - • importlib._bootstrap_external - • importlib.machinery - • importlib.util - • inspect - • io - • os - • pkgutil - • platform - • pydoc_data.topics - • re - • reprlib - • select - • subprocess - • sys - • sysconfig - • tempfile - • textwrap - • threading - • time - • tokenize - • traceback - • tty - • urllib.parse - • warnings - • webbrowser - -
-
-imported by: - _sitebuiltins - -
- -
- -
- - pydoc_data -Package
-imported by: - pydoc_data.topics - -
- -
- -
- - pydoc_data.topics -SourceModule
-imports: - pydoc_data - -
-
-imported by: - pydoc - -
- -
- -
- - pyexpat (builtin module)
-imported by: - xml.parsers.expat - -
- -
- -
- - pyimod02_importers -MissingModule
-imported by: - pyi_rth_pkgutil.py - -
- -
- -
- - pyodide -MissingModule
-imported by: - urllib3.contrib.emscripten.fetch - -
- -
- -
- - queue -SourceModule
-imports: - _queue - • collections - • heapq - • threading - • time - • types - -
-
-imported by: - concurrent.futures.process - • concurrent.futures.thread - • multiprocessing.dummy - • multiprocessing.dummy.connection - • multiprocessing.managers - • multiprocessing.pool - • multiprocessing.queues - • setuptools._vendor.more_itertools.more - • urllib3.connectionpool - -
- -
- -
- - quopri -SourceModule
-imports: - binascii - • getopt - • io - • sys - -
-
-imported by: - email.encoders - • email.message - • encodings.quopri_codec - -
- -
- -
- - random -SourceModule
-imports: - _collections_abc - • _random - • _sha2 - • bisect - • hashlib - • itertools - • math - • operator - • os - • statistics - • time - • warnings - -
-
-imported by: - email.generator - • email.utils - • secrets - • setuptools._vendor.more_itertools.more - • setuptools._vendor.more_itertools.recipes - • statistics - • tempfile - • urllib3.util.retry - -
- -
- -
- - re -Package
-imports: - _sre - • copyreg - • enum - • functools - • re - • re._compiler - • re._constants - • re._parser - • warnings - -
-
-imported by: - _pydecimal - • _sre - • _strptime - • argparse - • ast - • base64 - • charset_normalizer.constant - • charset_normalizer.models - • charset_normalizer.utils - • client.py - • configparser - • csv - • dataclasses - • difflib - • email._encoded_words - • email._header_value_parser - • email.feedparser - • email.generator - • email.header - • email.message - • email.policy - • email.quoprimime - • email.utils - • encodings.idna - • fnmatch - • fractions - • ftplib - • gettext - • glob - • html - • http.client - • http.cookiejar - • http.cookies - • idna.core - • importlib.metadata - • importlib.metadata._adapters - • importlib.metadata._text - • inspect - • ipaddress - • json.decoder - • json.encoder - • json.scanner - • locale - • logging - • ntpath - • packaging._manylinux - • packaging._musllinux - • packaging._tokenizer - • packaging.licenses - • packaging.specifiers - • packaging.tags - • packaging.utils - • packaging.version - • pathlib - • pickle - • pkgutil - • platform - • posixpath - • pprint - • pydoc - • re - • re._casefix - • re._compiler - • re._constants - • re._parser - • requests._internal_utils - • requests.auth - • requests.utils - • rlcompleter - • setuptools._distutils.cmd - • setuptools._distutils.command.build_ext - • setuptools._distutils.compilers.C.base - • setuptools._distutils.dist - • setuptools._distutils.fancy_getopt - • setuptools._distutils.filelist - • setuptools._distutils.sysconfig - • setuptools._distutils.util - • setuptools._distutils.version - • setuptools._distutils.versionpredicate - • setuptools._normalization - • setuptools._vendor.backports.tarfile - • setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata._adapters - • setuptools._vendor.importlib_metadata._text - • setuptools._vendor.jaraco.text - • setuptools._vendor.packaging._manylinux - • setuptools._vendor.packaging._musllinux - • setuptools._vendor.packaging._tokenizer - • setuptools._vendor.packaging.specifiers - • setuptools._vendor.packaging.tags - • setuptools._vendor.packaging.utils - • setuptools._vendor.packaging.version - • setuptools._vendor.tomli._re - • setuptools._vendor.wheel.wheelfile - • setuptools._vendor.zipp - • setuptools._vendor.zipp.glob - • setuptools.command.bdist_egg - • setuptools.command.bdist_wheel - • setuptools.command.egg_info - • setuptools.command.sdist - • setuptools.config._validate_pyproject.error_reporting - • setuptools.config._validate_pyproject.fastjsonschema_exceptions - • setuptools.config._validate_pyproject.fastjsonschema_validations - • setuptools.config._validate_pyproject.formats - • setuptools.dist - • setuptools.extension - • setuptools.glob - • setuptools.wheel - • shlex - • sre_compile - • sre_constants - • sre_parse - • string - • sysconfig - • tarfile - • textwrap - • tkinter - • tokenize - • tomllib._re - • typing - • unittest.case - • unittest.loader - • urllib.parse - • urllib.request - • urllib3.connection - • urllib3.http2.connection - • urllib3.util.retry - • urllib3.util.ssl_match_hostname - • urllib3.util.url - • warnings - • zipfile._path - • zipfile._path.glob - -
- -
- -
- - re._casefix -SourceModule
-imports: - re - -
-
-imported by: - client.py - • re._compiler - -
- -
- -
- - re._compiler -SourceModule
-imports: - _sre - • re - • re._casefix - • re._constants - • re._parser - • sys - -
-
-imported by: - client.py - • re - • sre_compile - -
- -
- -
- - re._constants -SourceModule
-imports: - _sre - • re - -
-
-imported by: - client.py - • re - • re._compiler - • re._parser - • sre_constants - -
- -
- -
- - re._parser -SourceModule
-imports: - re - • re._constants - • unicodedata - • warnings - -
-
-imported by: - client.py - • re - • re._compiler - • sre_parse - -
- -
- -
- - readline /usr/lib/python3.12/lib-dynload/readline.cpython-312-x86_64-linux-gnu.so
-imported by: - rlcompleter - • site - -
- -
- -
- - reprlib -SourceModule
-imports: - _thread - • builtins - • itertools - -
-
-imported by: - asyncio.base_futures - • asyncio.base_tasks - • asyncio.format_helpers - • client.py - • collections - • functools - • pydoc - -
- -
- -
- - requests -Package
-imports: - chardet - • charset_normalizer - • cryptography - • logging - • requests - • requests.__version__ - • requests.api - • requests.certs - • requests.exceptions - • requests.models - • requests.packages - • requests.sessions - • requests.status_codes - • requests.utils - • ssl - • urllib3 - • urllib3.contrib - • urllib3.contrib.pyopenssl - • urllib3.exceptions - • warnings - -
-
-imported by: - client.py - • requests - • requests.__version__ - • requests._internal_utils - • requests.adapters - • requests.api - • requests.auth - • requests.certs - • requests.compat - • requests.cookies - • requests.exceptions - • requests.hooks - • requests.models - • requests.packages - • requests.sessions - • requests.status_codes - • requests.structures - • requests.utils - -
- -
- -
- - requests.__version__ -SourceModule
-imports: - requests - -
-
-imported by: - requests - • requests.utils - -
- -
- -
- - requests._internal_utils -SourceModule
-imports: - re - • requests - • requests.compat - -
-
-imported by: - requests.auth - • requests.cookies - • requests.models - • requests.sessions - • requests.utils - -
- -
- -
- - requests.adapters -SourceModule
-imports: - os.path - • requests - • requests.auth - • requests.compat - • requests.cookies - • requests.exceptions - • requests.models - • requests.structures - • requests.utils - • socket - • typing - • urllib3.contrib.socks - • urllib3.exceptions - • urllib3.poolmanager - • urllib3.util - • urllib3.util.retry - • warnings - -
-
-imported by: - requests.sessions - -
- -
- -
- - requests.api -SourceModule
-imports: - requests - • requests.sessions - -
-
-imported by: - requests - -
- -
- -
- - requests.auth -SourceModule
-imports: - base64 - • hashlib - • os - • re - • requests - • requests._internal_utils - • requests.compat - • requests.cookies - • requests.utils - • threading - • time - • warnings - -
-
-imported by: - requests.adapters - • requests.models - • requests.sessions - -
- -
- -
- - requests.certs -SourceModule
-imports: - certifi - • requests - -
-
-imported by: - requests - • requests.utils - -
- -
- -
- - requests.compat -SourceModule
-imports: - collections - • collections.abc - • http - • http.cookiejar - • http.cookies - • importlib - • io - • json - • requests - • simplejson - • sys - • urllib.parse - • urllib.request - • urllib3 - -
-
-imported by: - requests._internal_utils - • requests.adapters - • requests.auth - • requests.cookies - • requests.exceptions - • requests.models - • requests.packages - • requests.sessions - • requests.structures - • requests.utils - -
- -
- -
- - requests.cookies -SourceModule
-imports: - calendar - • copy - • dummy_threading - • requests - • requests._internal_utils - • requests.compat - • threading - • time - -
-
-imported by: - requests.adapters - • requests.auth - • requests.models - • requests.sessions - • requests.utils - -
- -
- -
- - requests.exceptions -SourceModule
-imports: - requests - • requests.compat - • urllib3.exceptions - -
-
-imported by: - requests - • requests.adapters - • requests.models - • requests.sessions - • requests.utils - -
- -
- -
- - requests.hooks -SourceModule
-imports: - requests - -
-
-imported by: - requests.models - • requests.sessions - -
- -
- -
- - requests.models -SourceModule
-imports: - datetime - • encodings.idna - • idna - • io - • requests - • requests._internal_utils - • requests.auth - • requests.compat - • requests.cookies - • requests.exceptions - • requests.hooks - • requests.status_codes - • requests.structures - • requests.utils - • urllib3.exceptions - • urllib3.fields - • urllib3.filepost - • urllib3.util - -
-
-imported by: - requests - • requests.adapters - • requests.sessions - -
- -
- -
- - requests.packages -SourceModule
-imports: - requests - • requests.compat - • sys - -
-
-imported by: - requests - -
- -
- -
- - requests.sessions -SourceModule
-imports: - collections - • datetime - • os - • requests - • requests._internal_utils - • requests.adapters - • requests.auth - • requests.compat - • requests.cookies - • requests.exceptions - • requests.hooks - • requests.models - • requests.status_codes - • requests.structures - • requests.utils - • sys - • time - -
-
-imported by: - requests - • requests.api - -
- -
- -
- - requests.status_codes -SourceModule
-imports: - requests - • requests.structures - -
-
-imported by: - requests - • requests.models - • requests.sessions - -
- -
- -
- - requests.structures -SourceModule
-imports: - collections - • requests - • requests.compat - -
-
-imported by: - requests.adapters - • requests.models - • requests.sessions - • requests.status_codes - • requests.utils - -
- -
- -
- - requests.utils -SourceModule
-imports: - codecs - • collections - • contextlib - • io - • netrc - • os - • re - • requests - • requests.__version__ - • requests._internal_utils - • requests.certs - • requests.compat - • requests.cookies - • requests.exceptions - • requests.structures - • socket - • struct - • sys - • tempfile - • urllib3.util - • warnings - • winreg - • zipfile - -
-
-imported by: - requests - • requests.adapters - • requests.auth - • requests.models - • requests.sessions - -
- -
- -
- - resource /usr/lib/python3.12/lib-dynload/resource.cpython-312-x86_64-linux-gnu.so
-imported by: - posix - -
- -
- -
- - rlcompleter -SourceModule
-imports: - atexit - • builtins - • inspect - • keyword - • re - • readline - -
-
-imported by: - site - -
- -
- -
- - runpy -SourceModule
-imports: - importlib.machinery - • importlib.util - • io - • os - • pkgutil - • sys - • warnings - -
-
-imported by: - multiprocessing.spawn - -
- -
- -
- - secrets -SourceModule
-imports: - base64 - • hmac - • random - -
-
-imported by: - multiprocessing.shared_memory - -
- -
- -
- - select (builtin module)
-imported by: - http.server - • pydoc - • selectors - • subprocess - • urllib3.util.wait - -
- -
- -
- - selectors -SourceModule
-imports: - abc - • collections - • collections.abc - • math - • select - • sys - -
-
-imported by: - asyncio.selector_events - • asyncio.unix_events - • multiprocessing.connection - • multiprocessing.forkserver - • socket - • socketserver - • subprocess - -
- -
- -
- - setuptools -Package
-imports: - __future__ - • _distutils_hack.override - • abc - • collections.abc - • functools - • os - • setuptools - • setuptools._core_metadata - • setuptools._distutils.command.build_ext - • setuptools._distutils.core - • setuptools._entry_points - • setuptools._imp - • setuptools._normalization - • setuptools._reqs - • setuptools._shutil - • setuptools.command - • setuptools.depends - • setuptools.discovery - • setuptools.dist - • setuptools.extension - • setuptools.logging - • setuptools.monkey - • setuptools.msvc - • setuptools.version - • setuptools.warnings - • setuptools.windows_support - • sys - • syslog - • typing - -
-
-imported by: - pyi_rth_setuptools.py - • setuptools - • setuptools._core_metadata - • setuptools._discovery - • setuptools._distutils - • setuptools._entry_points - • setuptools._imp - • setuptools._importlib - • setuptools._itertools - • setuptools._normalization - • setuptools._path - • setuptools._reqs - • setuptools._shutil - • setuptools._static - • setuptools._vendor - • setuptools.archive_util - • setuptools.command - • setuptools.command._requirestxt - • setuptools.command.bdist_egg - • setuptools.command.bdist_wheel - • setuptools.command.egg_info - • setuptools.command.setopt - • setuptools.compat - • setuptools.config - • setuptools.config._apply_pyprojecttoml - • setuptools.config.expand - • setuptools.config.setupcfg - • setuptools.depends - • setuptools.discovery - • setuptools.dist - • setuptools.errors - • setuptools.extension - • setuptools.glob - • setuptools.installer - • setuptools.logging - • setuptools.monkey - • setuptools.msvc - • setuptools.unicode_utils - • setuptools.version - • setuptools.warnings - • setuptools.wheel - • setuptools.windows_support - -
- -
- -
- - setuptools._core_metadata -SourceModule
-imports: - __future__ - • email - • email.message - • os - • packaging.markers - • packaging.requirements - • packaging.utils - • packaging.version - • setuptools - • setuptools._distutils.util - • setuptools._normalization - • setuptools._reqs - • setuptools._static - • setuptools.warnings - • stat - • tempfile - • textwrap - -
-
-imported by: - setuptools - • setuptools.command.bdist_wheel - • setuptools.monkey - -
- -
- -
- - setuptools._discovery -SourceModule
-imports: - functools - • operator - • packaging.requirements - • setuptools - -
-
-imported by: - setuptools.wheel - -
- -
- -
- - setuptools._distutils -Package
-imports: - importlib - • setuptools - • setuptools._distutils - • setuptools._distutils.archive_util - • setuptools._distutils.file_util - • setuptools._distutils.version - • sys - -
-
-imported by: - distutils - • setuptools._distutils - • setuptools._distutils._log - • setuptools._distutils._modified - • setuptools._distutils._msvccompiler - • setuptools._distutils.archive_util - • setuptools._distutils.ccompiler - • setuptools._distutils.cmd - • setuptools._distutils.command - • setuptools._distutils.compat - • setuptools._distutils.compilers - • setuptools._distutils.core - • setuptools._distutils.debug - • setuptools._distutils.dir_util - • setuptools._distutils.dist - • setuptools._distutils.errors - • setuptools._distutils.extension - • setuptools._distutils.fancy_getopt - • setuptools._distutils.file_util - • setuptools._distutils.filelist - • setuptools._distutils.spawn - • setuptools._distutils.sysconfig - • setuptools._distutils.text_file - • setuptools._distutils.util - • setuptools._distutils.version - • setuptools._distutils.versionpredicate - -
- -
- -
- - setuptools._distutils._log -SourceModule
-imports: - distutils - • logging - • setuptools._distutils - -
-
-imported by: - setuptools._distutils.archive_util - • setuptools._distutils.cmd - • setuptools._distutils.command.build_ext - • setuptools._distutils.command.sdist - • setuptools._distutils.compilers.C.base - • setuptools._distutils.compilers.C.msvc - • setuptools._distutils.dir_util - • setuptools._distutils.dist - • setuptools._distutils.file_util - • setuptools._distutils.filelist - • setuptools._distutils.log - • setuptools._distutils.spawn - • setuptools._distutils.util - -
- -
- -
- - setuptools._distutils._modified -SourceModule
-imports: - __future__ - • collections.abc - • distutils - • functools - • os.path - • setuptools._distutils - • setuptools._distutils.compat.py39 - • setuptools._distutils.errors - • setuptools._vendor.jaraco.functools - • typing - -
-
-imported by: - setuptools._distutils.cmd - • setuptools._distutils.command.build_ext - • setuptools._distutils.compilers.C.base - • setuptools._distutils.file_util - • setuptools._distutils.util - -
- -
- -
- - setuptools._distutils._msvccompiler -SourceModule
-imports: - setuptools._distutils - • setuptools._distutils.compilers.C - • setuptools._distutils.compilers.C.msvc - • warnings - -
-
-imported by: - setuptools._distutils.command.build_ext - -
- -
- -
- - setuptools._distutils.archive_util -SourceModule
-imports: - __future__ - • grp - • os - • pwd - • setuptools._distutils - • setuptools._distutils._log - • setuptools._distutils.dir_util - • setuptools._distutils.errors - • setuptools._distutils.spawn - • tarfile - • typing - • zipfile - -
-
-imported by: - setuptools._distutils - • setuptools._distutils.cmd - • setuptools._distutils.command.sdist - -
- -
- -
- - setuptools._distutils.ccompiler -SourceModule
-imports: - setuptools._distutils - • setuptools._distutils.compat.numpy - • setuptools._distutils.compilers.C - • setuptools._distutils.compilers.C.base - • setuptools._distutils.compilers.C.errors - -
-
-imported by: - setuptools._distutils.command.build - • setuptools._distutils.command.build_ext - • setuptools._distutils.sysconfig - -
- -
- -
- - setuptools._distutils.cmd -SourceModule
-imports: - __future__ - • abc - • collections.abc - • distutils - • logging - • os - • re - • setuptools._distutils - • setuptools._distutils._log - • setuptools._distutils._modified - • setuptools._distutils.archive_util - • setuptools._distutils.debug - • setuptools._distutils.dir_util - • setuptools._distutils.dist - • setuptools._distutils.errors - • setuptools._distutils.fancy_getopt - • setuptools._distutils.file_util - • setuptools._distutils.spawn - • setuptools._distutils.util - • sys - • typing - • typing_extensions - -
-
-imported by: - setuptools._distutils.core - • setuptools._distutils.dist - • setuptools.dist - -
- -
- -
- - setuptools._distutils.command -Package
-imports: - distutils - • setuptools._distutils - -
-
-imported by: - setuptools._distutils.command.bdist - • setuptools._distutils.command.build - • setuptools._distutils.command.build_ext - • setuptools._distutils.command.check - • setuptools._distutils.command.sdist - • setuptools._distutils.dist - • setuptools.dist - -
- -
- -
- - setuptools._distutils.command.bdist -SourceModule
-imports: - __future__ - • collections.abc - • os - • setuptools._distutils.command - • setuptools._distutils.core - • setuptools._distutils.errors - • setuptools._distutils.fancy_getopt - • setuptools._distutils.util - • typing - • typing_extensions - • warnings - -
-
-imported by: - setuptools.command - -
- -
- -
- - setuptools._distutils.command.build -SourceModule
-imports: - __future__ - • collections.abc - • os - • setuptools._distutils.ccompiler - • setuptools._distutils.command - • setuptools._distutils.core - • setuptools._distutils.errors - • setuptools._distutils.util - • sys - • sysconfig - • typing - -
-
-imported by: - setuptools.command.build - -
- -
- -
- - setuptools._distutils.command.build_ext -SourceModule
-imports: - __future__ - • collections.abc - • concurrent.futures - • contextlib - • distutils - • os - • re - • setuptools._distutils._log - • setuptools._distutils._modified - • setuptools._distutils._msvccompiler - • setuptools._distutils.ccompiler - • setuptools._distutils.command - • setuptools._distutils.core - • setuptools._distutils.errors - • setuptools._distutils.extension - • setuptools._distutils.sysconfig - • setuptools._distutils.util - • site - • sys - • typing - -
-
-imported by: - setuptools - -
- -
- -
- - setuptools._distutils.command.check -SourceModule
-imports: - contextlib - • setuptools._distutils.command - • setuptools._distutils.core - • setuptools._distutils.errors - • typing - -
-
-imported by: - distutils.command.check - -
- -
- -
- - setuptools._distutils.command.sdist -SourceModule
-imports: - __future__ - • collections.abc - • distutils - • glob - • itertools - • os - • setuptools._distutils._log - • setuptools._distutils.archive_util - • setuptools._distutils.command - • setuptools._distutils.core - • setuptools._distutils.dir_util - • setuptools._distutils.errors - • setuptools._distutils.fancy_getopt - • setuptools._distutils.file_util - • setuptools._distutils.filelist - • setuptools._distutils.text_file - • setuptools._distutils.util - • sys - • typing - -
-
-imported by: - setuptools.command.sdist - -
- -
- -
- - setuptools._distutils.compat -Package
-imports: - __future__ - • collections.abc - • setuptools._distutils - • typing - -
-
-imported by: - setuptools._distutils.compat.numpy - • setuptools._distutils.compat.py39 - • setuptools._distutils.sysconfig - -
- -
- -
- - setuptools._distutils.compat.numpy -SourceModule
-imports: - setuptools._distutils.compat - • setuptools._distutils.compilers.C.base - -
-
-imported by: - setuptools._distutils.ccompiler - -
- -
- -
- - setuptools._distutils.compat.py39 -SourceModule
-imports: - _imp - • functools - • itertools - • platform - • setuptools._distutils.compat - • sys - -
-
-imported by: - setuptools._distutils._modified - • setuptools._distutils.sysconfig - -
- -
- -
- - setuptools._distutils.compilers -NamespacePackage
-imports: - setuptools._distutils - -
-
-imported by: - setuptools._distutils.compilers.C - -
- -
- -
- - setuptools._distutils.compilers.C -NamespacePackage
-imports: - setuptools._distutils.compilers - • setuptools._distutils.compilers.C - • setuptools._distutils.compilers.C.msvc - -
-
-imported by: - setuptools._distutils._msvccompiler - • setuptools._distutils.ccompiler - • setuptools._distutils.compilers.C - • setuptools._distutils.compilers.C.base - • setuptools._distutils.compilers.C.errors - • setuptools._distutils.compilers.C.msvc - -
- -
- -
- - setuptools._distutils.compilers.C.base -SourceModule
-imports: - __future__ - • collections.abc - • more_itertools - • os - • pathlib - • re - • setuptools._distutils._log - • setuptools._distutils._modified - • setuptools._distutils.compilers.C - • setuptools._distutils.compilers.C.errors - • setuptools._distutils.debug - • setuptools._distutils.dir_util - • setuptools._distutils.errors - • setuptools._distutils.fancy_getopt - • setuptools._distutils.file_util - • setuptools._distutils.spawn - • setuptools._distutils.util - • sys - • tempfile - • typing - • typing_extensions - • warnings - -
-
-imported by: - setuptools._distutils.ccompiler - • setuptools._distutils.compat.numpy - • setuptools._distutils.compilers.C.msvc - -
- -
- -
- - setuptools._distutils.compilers.C.errors -SourceModule
-imports: - setuptools._distutils.compilers.C - -
-
-imported by: - setuptools._distutils.ccompiler - • setuptools._distutils.compilers.C.base - • setuptools._distutils.compilers.C.msvc - • setuptools._distutils.errors - -
- -
- -
- - setuptools._distutils.compilers.C.msvc -SourceModule
-imports: - __future__ - • collections.abc - • contextlib - • itertools - • os - • setuptools._distutils._log - • setuptools._distutils.compilers.C - • setuptools._distutils.compilers.C.base - • setuptools._distutils.compilers.C.errors - • setuptools._distutils.errors - • setuptools._distutils.util - • subprocess - • unittest.mock - • warnings - • winreg - -
-
-imported by: - setuptools._distutils._msvccompiler - • setuptools._distutils.compilers.C - -
- -
- -
- - setuptools._distutils.core -SourceModule
-imports: - __future__ - • collections.abc - • distutils - • os - • setuptools._distutils - • setuptools._distutils.cmd - • setuptools._distutils.debug - • setuptools._distutils.dist - • setuptools._distutils.errors - • setuptools._distutils.extension - • sys - • tokenize - -
-
-imported by: - setuptools - • setuptools._distutils.command.bdist - • setuptools._distutils.command.build - • setuptools._distutils.command.build_ext - • setuptools._distutils.command.check - • setuptools._distutils.command.sdist - • setuptools._distutils.dist - • setuptools.dist - • setuptools.extension - -
- -
- -
- - setuptools._distutils.debug -SourceModule
-imports: - distutils - • os - • setuptools._distutils - -
-
-imported by: - setuptools._distutils.cmd - • setuptools._distutils.compilers.C.base - • setuptools._distutils.core - • setuptools._distutils.dist - • setuptools._distutils.filelist - • setuptools._distutils.spawn - • setuptools.dist - -
- -
- -
- - setuptools._distutils.dir_util -SourceModule
-imports: - distutils - • functools - • itertools - • os - • pathlib - • setuptools._distutils - • setuptools._distutils._log - • setuptools._distutils.errors - • setuptools._distutils.file_util - -
-
-imported by: - setuptools._distutils.archive_util - • setuptools._distutils.cmd - • setuptools._distutils.command.sdist - • setuptools._distutils.compilers.C.base - • setuptools.command.bdist_egg - -
- -
- -
- - setuptools._distutils.dist -SourceModule
-imports: - __future__ - • _typeshed - • collections.abc - • configparser - • contextlib - • distutils - • email - • logging - • os - • packaging.utils - • pathlib - • pprint - • re - • setuptools._distutils - • setuptools._distutils._log - • setuptools._distutils.cmd - • setuptools._distutils.command - • setuptools._distutils.core - • setuptools._distutils.debug - • setuptools._distutils.errors - • setuptools._distutils.fancy_getopt - • setuptools._distutils.util - • setuptools._distutils.versionpredicate - • sys - • typing - • typing_extensions - • warnings - -
-
-imported by: - setuptools._distutils.cmd - • setuptools._distutils.core - • setuptools.config._apply_pyprojecttoml - • setuptools.config.setupcfg - • setuptools.dist - -
- -
- -
- - setuptools._distutils.errors -SourceModule
-imports: - distutils - • setuptools._distutils - • setuptools._distutils.compilers.C.errors - -
-
-imported by: - setuptools._distutils._modified - • setuptools._distutils.archive_util - • setuptools._distutils.cmd - • setuptools._distutils.command.bdist - • setuptools._distutils.command.build - • setuptools._distutils.command.build_ext - • setuptools._distutils.command.check - • setuptools._distutils.command.sdist - • setuptools._distutils.compilers.C.base - • setuptools._distutils.compilers.C.msvc - • setuptools._distutils.core - • setuptools._distutils.dir_util - • setuptools._distutils.dist - • setuptools._distutils.fancy_getopt - • setuptools._distutils.file_util - • setuptools._distutils.filelist - • setuptools._distutils.spawn - • setuptools._distutils.sysconfig - • setuptools._distutils.util - • setuptools.archive_util - • setuptools.command.egg_info - • setuptools.command.setopt - • setuptools.config.expand - • setuptools.dist - • setuptools.errors - • setuptools.extension - • setuptools.installer - • setuptools.msvc - -
- -
- -
- - setuptools._distutils.extension -SourceModule
-imports: - __future__ - • collections.abc - • distutils - • os - • setuptools._distutils - • setuptools._distutils.sysconfig - • setuptools._distutils.text_file - • setuptools._distutils.util - • warnings - -
-
-imported by: - setuptools._distutils.command.build_ext - • setuptools._distutils.core - • setuptools.extension - -
- -
- -
- - setuptools._distutils.fancy_getopt -SourceModule
-imports: - __future__ - • collections.abc - • distutils - • getopt - • re - • setuptools._distutils - • setuptools._distutils.errors - • string - • sys - • typing - -
-
-imported by: - setuptools._distutils.cmd - • setuptools._distutils.command.bdist - • setuptools._distutils.command.sdist - • setuptools._distutils.compilers.C.base - • setuptools._distutils.dist - • setuptools.dist - -
- -
- -
- - setuptools._distutils.file_util -SourceModule
-imports: - errno - • os - • os.path - • setuptools._distutils - • setuptools._distutils._log - • setuptools._distutils._modified - • setuptools._distutils.errors - • stat - -
-
-imported by: - setuptools._distutils - • setuptools._distutils.cmd - • setuptools._distutils.command.sdist - • setuptools._distutils.compilers.C.base - • setuptools._distutils.dir_util - -
- -
- -
- - setuptools._distutils.filelist -SourceModule
-imports: - __future__ - • collections.abc - • distutils - • fnmatch - • functools - • os - • re - • setuptools._distutils - • setuptools._distutils._log - • setuptools._distutils.debug - • setuptools._distutils.errors - • setuptools._distutils.util - • typing - -
-
-imported by: - setuptools._distutils.command.sdist - • setuptools.command.egg_info - • setuptools.monkey - -
- -
- -
- - setuptools._distutils.log -SourceModule
-imports: - distutils - • logging - • setuptools._distutils._log - • warnings - -
-
-imported by: - setuptools._shutil - • setuptools.command.bdist_egg - • setuptools.command.bdist_wheel - • setuptools.command.egg_info - • setuptools.command.sdist - • setuptools.command.setopt - • setuptools.discovery - • setuptools.dist - • setuptools.installer - • setuptools.logging - • setuptools.wheel - -
- -
- -
- - setuptools._distutils.spawn -SourceModule
-imports: - __future__ - • collections.abc - • distutils - • os - • platform - • setuptools._distutils - • setuptools._distutils._log - • setuptools._distutils.debug - • setuptools._distutils.errors - • setuptools._distutils.util - • shutil - • subprocess - • sys - • typing - • warnings - -
-
-imported by: - setuptools._distutils.archive_util - • setuptools._distutils.cmd - • setuptools._distutils.compilers.C.base - • setuptools._distutils.util - -
- -
- -
- - setuptools._distutils.sysconfig -SourceModule
-imports: - __future__ - • distutils - • functools - • os - • pathlib - • re - • setuptools._distutils - • setuptools._distutils.ccompiler - • setuptools._distutils.compat - • setuptools._distutils.compat.py39 - • setuptools._distutils.errors - • setuptools._distutils.text_file - • setuptools._distutils.util - • setuptools._vendor.jaraco.functools - • sys - • sysconfig - • typing - • typing_extensions - • warnings - -
-
-imported by: - distutils - • setuptools._distutils.command.build_ext - • setuptools._distutils.extension - • setuptools._distutils.util - -
- -
- -
- - setuptools._distutils.text_file -SourceModule
-imports: - distutils - • setuptools._distutils - • sys - -
-
-imported by: - setuptools._distutils.command.sdist - • setuptools._distutils.extension - • setuptools._distutils.sysconfig - -
- -
- -
- - setuptools._distutils.util -SourceModule
-imports: - __future__ - • collections.abc - • distutils - • functools - • importlib.util - • os - • pathlib - • pwd - • py_compile - • re - • setuptools._distutils - • setuptools._distutils._log - • setuptools._distutils._modified - • setuptools._distutils.errors - • setuptools._distutils.spawn - • setuptools._distutils.sysconfig - • setuptools._vendor.jaraco.functools - • string - • subprocess - • sys - • sysconfig - • tempfile - • typing - • typing_extensions - • warnings - -
-
-imported by: - distutils.util - • setuptools._core_metadata - • setuptools._distutils.cmd - • setuptools._distutils.command.bdist - • setuptools._distutils.command.build - • setuptools._distutils.command.build_ext - • setuptools._distutils.command.sdist - • setuptools._distutils.compilers.C.base - • setuptools._distutils.compilers.C.msvc - • setuptools._distutils.dist - • setuptools._distutils.extension - • setuptools._distutils.filelist - • setuptools._distutils.spawn - • setuptools._distutils.sysconfig - • setuptools.command.egg_info - • setuptools.command.setopt - • setuptools.discovery - • setuptools.dist - • setuptools.wheel - -
- -
- -
- - setuptools._distutils.version -SourceModule
-imports: - contextlib - • re - • setuptools._distutils - • warnings - -
-
-imported by: - setuptools._distutils - • setuptools._distutils.versionpredicate - -
- -
- -
- - setuptools._distutils.versionpredicate -SourceModule
-imports: - distutils - • operator - • re - • setuptools._distutils - • setuptools._distutils.version - -
-
-imported by: - setuptools._distutils.dist - -
- -
- -
- - setuptools._entry_points -SourceModule
-imports: - functools - • itertools - • more_itertools - • operator - • setuptools - • setuptools._importlib - • setuptools._itertools - • setuptools._vendor.jaraco.functools - • setuptools._vendor.jaraco.text - • setuptools.errors - -
-
-imported by: - setuptools - • setuptools.command.egg_info - • setuptools.dist - -
- -
- -
- - setuptools._imp -SourceModule
-imports: - importlib.machinery - • importlib.util - • os - • setuptools - • tokenize - -
-
-imported by: - setuptools - • setuptools.depends - -
- -
- -
- - setuptools._importlib -SourceModule
-imports: - importlib.metadata - • importlib.resources - • importlib_metadata - • setuptools - • sys - -
-
-imported by: - setuptools._entry_points - • setuptools.command.egg_info - • setuptools.command.sdist - • setuptools.config._apply_pyprojecttoml - • setuptools.dist - • setuptools.installer - • setuptools.version - • setuptools.wheel - -
- -
- -
- - setuptools._itertools -SourceModule
-imports: - more_itertools - • setuptools - -
-
-imported by: - setuptools._entry_points - -
- -
- -
- - setuptools._normalization -SourceModule
-imports: - packaging - • packaging.licenses - • re - • setuptools - • typing - -
-
-imported by: - setuptools - • setuptools._core_metadata - • setuptools.command.bdist_wheel - • setuptools.command.egg_info - • setuptools.dist - -
- -
- -
- - setuptools._path -SourceModule
-imports: - __future__ - • contextlib - • more_itertools - • os - • setuptools - • sys - • typing - • typing_extensions - -
-
-imported by: - setuptools.archive_util - • setuptools.command.bdist_egg - • setuptools.config._apply_pyprojecttoml - • setuptools.config.expand - • setuptools.config.pyprojecttoml - • setuptools.config.setupcfg - • setuptools.discovery - • setuptools.dist - • setuptools.extension - • setuptools.msvc - -
- -
- -
- - setuptools._reqs -SourceModule
-imports: - __future__ - • collections.abc - • functools - • packaging.requirements - • setuptools - • setuptools._vendor.jaraco.text - • typing - • typing_extensions - -
-
-imported by: - setuptools - • setuptools._core_metadata - • setuptools.command._requirestxt - • setuptools.dist - • setuptools.installer - -
- -
- -
- - setuptools._shutil -SourceModule
-imports: - distutils - • os - • setuptools - • setuptools._distutils.log - • setuptools.compat - • setuptools.compat.py311 - • stat - • typing - -
-
-imported by: - setuptools - • setuptools.command.bdist_wheel - -
- -
- -
- - setuptools._static -SourceModule
-imports: - functools - • packaging.specifiers - • setuptools - • setuptools.warnings - • typing - -
-
-imported by: - setuptools._core_metadata - • setuptools.config._apply_pyprojecttoml - • setuptools.config.expand - • setuptools.config.setupcfg - • setuptools.dist - -
- -
- -
- - setuptools._vendor -NamespacePackage
-imports: - setuptools - -
-
-imported by: - setuptools._vendor.backports - • setuptools._vendor.importlib_metadata - • setuptools._vendor.jaraco - • setuptools._vendor.more_itertools - • setuptools._vendor.packaging - • setuptools._vendor.tomli - • setuptools._vendor.wheel - • setuptools._vendor.zipp - -
- -
- -
- - setuptools._vendor.backports -Package
-imports: - setuptools._vendor - -
-
-imported by: - backports - • setuptools._vendor.backports.tarfile - -
- -
- -
- - setuptools._vendor.backports.tarfile -Package
-imports: - argparse - • builtins - • bz2 - • copy - • grp - • gzip - • io - • lzma - • os - • pwd - • re - • setuptools._vendor.backports - • setuptools._vendor.backports.tarfile.compat.py38 - • shutil - • stat - • struct - • sys - • time - • warnings - • zlib - -
-
-imported by: - backports.tarfile - • setuptools._vendor.backports.tarfile.compat - -
- -
- -
- - setuptools._vendor.backports.tarfile.compat -Package
-imports: - setuptools._vendor.backports.tarfile - -
-
-imported by: - setuptools._vendor.backports.tarfile.compat.py38 - -
- -
- -
- - setuptools._vendor.backports.tarfile.compat.py38 -SourceModule
-imports: - setuptools._vendor.backports.tarfile.compat - • sys - -
-
-imported by: - setuptools._vendor.backports.tarfile - -
- -
- -
- - setuptools._vendor.backports.zstd -MissingModule
-imported by: - backports - • urllib3.response - • urllib3.util.request - -
- -
- -
- - setuptools._vendor.importlib_metadata -Package
-imports: - __future__ - • abc - • collections - • collections.abc - • contextlib - • csv - • email - • functools - • importlib - • importlib.abc - • inspect - • itertools - • json - • operator - • os - • pathlib - • posixpath - • re - • setuptools._vendor - • setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata._adapters - • setuptools._vendor.importlib_metadata._collections - • setuptools._vendor.importlib_metadata._compat - • setuptools._vendor.importlib_metadata._functools - • setuptools._vendor.importlib_metadata._itertools - • setuptools._vendor.importlib_metadata._meta - • setuptools._vendor.importlib_metadata._typing - • setuptools._vendor.importlib_metadata.compat - • setuptools._vendor.importlib_metadata.compat.py311 - • setuptools._vendor.importlib_metadata.compat.py39 - • setuptools._vendor.zipp.compat.overlay - • sys - • textwrap - • types - • typing - -
-
-imported by: - importlib_metadata - • setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata._adapters - • setuptools._vendor.importlib_metadata._collections - • setuptools._vendor.importlib_metadata._compat - • setuptools._vendor.importlib_metadata._functools - • setuptools._vendor.importlib_metadata._itertools - • setuptools._vendor.importlib_metadata._meta - • setuptools._vendor.importlib_metadata._text - • setuptools._vendor.importlib_metadata._typing - • setuptools._vendor.importlib_metadata.compat - • setuptools._vendor.importlib_metadata.compat.py39 - -
- -
- -
- - setuptools._vendor.importlib_metadata._adapters -SourceModule
-imports: - email.message - • email.policy - • re - • setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata._text - • textwrap - -
-
-imported by: - setuptools._vendor.importlib_metadata - -
- -
- -
- - setuptools._vendor.importlib_metadata._collections -SourceModule
-imports: - collections - • setuptools._vendor.importlib_metadata - • typing - -
-
-imported by: - setuptools._vendor.importlib_metadata - -
- -
- -
- - setuptools._vendor.importlib_metadata._compat -SourceModule
-imports: - platform - • setuptools._vendor.importlib_metadata - • sys - -
-
-imported by: - setuptools._vendor.importlib_metadata - -
- -
- -
- - setuptools._vendor.importlib_metadata._functools -SourceModule
-imports: - functools - • setuptools._vendor.importlib_metadata - • types - • typing - -
-
-imported by: - setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata._text - -
- -
- -
- - setuptools._vendor.importlib_metadata._itertools -SourceModule
-imports: - collections - • itertools - • setuptools._vendor.importlib_metadata - -
-
-imported by: - setuptools._vendor.importlib_metadata - -
- -
- -
- - setuptools._vendor.importlib_metadata._meta -SourceModule
-imports: - __future__ - • collections.abc - • os - • setuptools._vendor.importlib_metadata - • typing - -
-
-imported by: - setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata._typing - -
- -
- -
- - setuptools._vendor.importlib_metadata._text -SourceModule
-imports: - re - • setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata._functools - -
-
-imported by: - setuptools._vendor.importlib_metadata._adapters - -
- -
- -
- - setuptools._vendor.importlib_metadata._typing -SourceModule
-imports: - functools - • setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata._meta - • typing - -
-
-imported by: - setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata.compat.py39 - -
- -
- -
- - setuptools._vendor.importlib_metadata.compat -Package
-imports: - setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata.compat.py311 - • setuptools._vendor.importlib_metadata.compat.py39 - -
-
-imported by: - setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata.compat.py311 - • setuptools._vendor.importlib_metadata.compat.py39 - -
- -
- -
- - setuptools._vendor.importlib_metadata.compat.py311 -SourceModule
-imports: - os - • pathlib - • setuptools._vendor.importlib_metadata.compat - • sys - • types - -
-
-imported by: - setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata.compat - -
- -
- -
- - setuptools._vendor.importlib_metadata.compat.py39 -SourceModule
-imports: - __future__ - • setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata._typing - • setuptools._vendor.importlib_metadata.compat - • typing - -
-
-imported by: - setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata.compat - -
- -
- -
- - setuptools._vendor.jaraco -NamespacePackage
-imports: - setuptools._vendor - -
-
-imported by: - jaraco - • setuptools._vendor.jaraco.text - -
- -
- -
- - setuptools._vendor.jaraco.context -Package
-imports: - __future__ - • backports - • backports.tarfile - • collections.abc - • contextlib - • errno - • functools - • jaraco - • operator - • os - • platform - • shutil - • stat - • subprocess - • sys - • tarfile - • tempfile - • urllib.request - -
-
-imported by: - setuptools._vendor.jaraco.text - -
- -
- -
- - setuptools._vendor.jaraco.functools -Package
-imports: - __future__ - • collections.abc - • functools - • inspect - • itertools - • jaraco - • more_itertools - • operator - • time - • types - • typing - • warnings - -
-
-imported by: - setuptools._distutils._modified - • setuptools._distutils.sysconfig - • setuptools._distutils.util - • setuptools._entry_points - • setuptools._vendor.jaraco.text - -
- -
- -
- - setuptools._vendor.jaraco.text -Package
-imports: - functools - • importlib.resources - • importlib_resources - • itertools - • jaraco - • re - • setuptools._vendor.jaraco - • setuptools._vendor.jaraco.context - • setuptools._vendor.jaraco.functools - • textwrap - • typing - -
-
-imported by: - jaraco.text - • setuptools._entry_points - • setuptools._reqs - • setuptools.command._requirestxt - -
- -
- -
- - setuptools._vendor.more_itertools -Package
-imports: - setuptools._vendor - • setuptools._vendor.more_itertools.more - • setuptools._vendor.more_itertools.recipes - -
-
-imported by: - more_itertools - • setuptools._vendor.more_itertools.more - • setuptools._vendor.more_itertools.recipes - -
- -
- -
- - setuptools._vendor.more_itertools.more -SourceModule
-imports: - collections - • collections.abc - • contextlib - • functools - • heapq - • itertools - • math - • operator - • queue - • random - • setuptools._vendor.more_itertools - • setuptools._vendor.more_itertools.recipes - • sys - • time - • warnings - -
-
-imported by: - setuptools._vendor.more_itertools - -
- -
- -
- - setuptools._vendor.more_itertools.recipes -SourceModule
-imports: - bisect - • collections - • contextlib - • functools - • heapq - • itertools - • math - • operator - • random - • setuptools._vendor.more_itertools - • sys - -
-
-imported by: - setuptools._vendor.more_itertools - • setuptools._vendor.more_itertools.more - -
- -
- -
- - setuptools._vendor.packaging -Package
-imports: - setuptools._vendor - • setuptools._vendor.packaging - • setuptools._vendor.packaging._manylinux - • setuptools._vendor.packaging._musllinux - • setuptools._vendor.packaging.requirements - -
-
-imported by: - setuptools._vendor.packaging - • setuptools._vendor.packaging._elffile - • setuptools._vendor.packaging._manylinux - • setuptools._vendor.packaging._musllinux - • setuptools._vendor.packaging._parser - • setuptools._vendor.packaging._structures - • setuptools._vendor.packaging._tokenizer - • setuptools._vendor.packaging.markers - • setuptools._vendor.packaging.requirements - • setuptools._vendor.packaging.specifiers - • setuptools._vendor.packaging.tags - • setuptools._vendor.packaging.utils - • setuptools._vendor.packaging.version - • setuptools.config._validate_pyproject.formats - -
- -
- -
- - setuptools._vendor.packaging._elffile -SourceModule
-imports: - __future__ - • enum - • os - • setuptools._vendor.packaging - • struct - • typing - -
-
-imported by: - setuptools._vendor.packaging._manylinux - • setuptools._vendor.packaging._musllinux - -
- -
- -
- - setuptools._vendor.packaging._manylinux -SourceModule
-imports: - __future__ - • _manylinux - • collections - • contextlib - • ctypes - • functools - • os - • re - • setuptools._vendor.packaging - • setuptools._vendor.packaging._elffile - • sys - • typing - • warnings - -
-
-imported by: - setuptools._vendor.packaging - • setuptools._vendor.packaging.tags - -
- -
- -
- - setuptools._vendor.packaging._musllinux -SourceModule
-imports: - __future__ - • functools - • re - • setuptools._vendor.packaging - • setuptools._vendor.packaging._elffile - • subprocess - • sys - • sysconfig - • typing - -
-
-imported by: - setuptools._vendor.packaging - • setuptools._vendor.packaging.tags - -
- -
- -
- - setuptools._vendor.packaging._parser -SourceModule
-imports: - __future__ - • ast - • setuptools._vendor.packaging - • setuptools._vendor.packaging._tokenizer - • typing - -
-
-imported by: - setuptools._vendor.packaging.markers - • setuptools._vendor.packaging.requirements - -
- -
- -
- - setuptools._vendor.packaging._structures -SourceModule
-imports: - setuptools._vendor.packaging - • typing - -
-
-imported by: - setuptools._vendor.packaging.version - -
- -
- -
- - setuptools._vendor.packaging._tokenizer -SourceModule
-imports: - __future__ - • contextlib - • dataclasses - • re - • setuptools._vendor.packaging - • setuptools._vendor.packaging.specifiers - • typing - -
-
-imported by: - setuptools._vendor.packaging._parser - • setuptools._vendor.packaging.markers - • setuptools._vendor.packaging.requirements - -
- -
- -
- - setuptools._vendor.packaging.markers -SourceModule
-imports: - __future__ - • operator - • os - • platform - • setuptools._vendor.packaging - • setuptools._vendor.packaging._parser - • setuptools._vendor.packaging._tokenizer - • setuptools._vendor.packaging.specifiers - • setuptools._vendor.packaging.utils - • sys - • typing - -
-
-imported by: - setuptools._vendor.packaging.requirements - -
- -
- -
- - setuptools._vendor.packaging.requirements -SourceModule
-imports: - __future__ - • setuptools._vendor.packaging - • setuptools._vendor.packaging._parser - • setuptools._vendor.packaging._tokenizer - • setuptools._vendor.packaging.markers - • setuptools._vendor.packaging.specifiers - • setuptools._vendor.packaging.utils - • typing - -
-
-imported by: - setuptools._vendor.packaging - • setuptools.config._validate_pyproject.formats - -
- -
- -
- - setuptools._vendor.packaging.specifiers -SourceModule
-imports: - __future__ - • abc - • itertools - • re - • setuptools._vendor.packaging - • setuptools._vendor.packaging.utils - • setuptools._vendor.packaging.version - • typing - -
-
-imported by: - setuptools._vendor.packaging._tokenizer - • setuptools._vendor.packaging.markers - • setuptools._vendor.packaging.requirements - -
- -
- -
- - setuptools._vendor.packaging.tags -SourceModule
-imports: - __future__ - • importlib.machinery - • logging - • platform - • re - • setuptools._vendor.packaging - • setuptools._vendor.packaging._manylinux - • setuptools._vendor.packaging._musllinux - • struct - • subprocess - • sys - • sysconfig - • typing - -
-
-imported by: - setuptools._vendor.packaging.utils - -
- -
- -
- - setuptools._vendor.packaging.utils -SourceModule
-imports: - __future__ - • re - • setuptools._vendor.packaging - • setuptools._vendor.packaging.tags - • setuptools._vendor.packaging.version - • typing - -
-
-imported by: - setuptools._vendor.packaging.markers - • setuptools._vendor.packaging.requirements - • setuptools._vendor.packaging.specifiers - -
- -
- -
- - setuptools._vendor.packaging.version -SourceModule
-imports: - __future__ - • functools - • re - • setuptools._vendor.packaging - • setuptools._vendor.packaging._structures - • sys - • typing - • typing_extensions - • warnings - -
-
-imported by: - setuptools._vendor.packaging.specifiers - • setuptools._vendor.packaging.utils - -
- -
- -
- - setuptools._vendor.tomli -Package
-imports: - setuptools._vendor - • setuptools._vendor.tomli._parser - -
-
-imported by: - setuptools._vendor.tomli._parser - • setuptools._vendor.tomli._re - • setuptools._vendor.tomli._types - • tomli - -
- -
- -
- - setuptools._vendor.tomli._parser -SourceModule
-imports: - __future__ - • collections.abc - • setuptools._vendor.tomli - • setuptools._vendor.tomli._re - • setuptools._vendor.tomli._types - • sys - • types - • typing - • warnings - -
-
-imported by: - setuptools._vendor.tomli - -
- -
- -
- - setuptools._vendor.tomli._re -SourceModule
-imports: - __future__ - • datetime - • functools - • re - • setuptools._vendor.tomli - • setuptools._vendor.tomli._types - • typing - -
-
-imported by: - setuptools._vendor.tomli._parser - -
- -
- -
- - setuptools._vendor.tomli._types -SourceModule
-imports: - setuptools._vendor.tomli - • typing - -
-
-imported by: - setuptools._vendor.tomli._parser - • setuptools._vendor.tomli._re - -
- -
- -
- - setuptools._vendor.wheel -Package
-imports: - __future__ - • setuptools._vendor - -
-
-imported by: - wheel - -
- -
- -
- - setuptools._vendor.wheel.macosx_libfile -SourceModule
-imports: - __future__ - • ctypes - • io - • os - • sys - • typing - • wheel - -
-
-imported by: - setuptools.command.bdist_wheel - -
- -
- -
- - setuptools._vendor.wheel.wheelfile -SourceModule
-imports: - __future__ - • _typeshed - • base64 - • csv - • hashlib - • io - • logging - • os.path - • re - • stat - • time - • typing - • wheel - • zipfile - -
-
-imported by: - setuptools.command.bdist_wheel - -
- -
- -
- - setuptools._vendor.zipp -Package
-imports: - functools - • io - • itertools - • pathlib - • posixpath - • re - • setuptools._vendor - • setuptools._vendor.zipp._functools - • setuptools._vendor.zipp.compat.py310 - • setuptools._vendor.zipp.glob - • stat - • sys - • zipfile - -
-
-imported by: - setuptools._vendor.zipp._functools - • setuptools._vendor.zipp.compat - • setuptools._vendor.zipp.glob - • zipp - -
- -
- -
- - setuptools._vendor.zipp._functools -SourceModule
-imports: - collections - • functools - • setuptools._vendor.zipp - -
-
-imported by: - setuptools._vendor.zipp - -
- -
- -
- - setuptools._vendor.zipp.compat -Package
-imports: - setuptools._vendor.zipp - • zipp - -
-
-imported by: - setuptools._vendor.zipp.compat.overlay - • setuptools._vendor.zipp.compat.py310 - • setuptools._vendor.zipp.compat.py313 - -
- -
- -
- - setuptools._vendor.zipp.compat.overlay -SourceModule
-imports: - importlib - • setuptools._vendor.zipp.compat - • sys - • types - • zipp - -
-
-imported by: - setuptools._vendor.importlib_metadata - -
- -
- -
- - setuptools._vendor.zipp.compat.py310 -SourceModule
-imports: - io - • setuptools._vendor.zipp.compat - • sys - -
-
-imported by: - setuptools._vendor.zipp - -
- -
- -
- - setuptools._vendor.zipp.compat.py313 -SourceModule
-imports: - functools - • setuptools._vendor.zipp.compat - • sys - -
-
-imported by: - setuptools._vendor.zipp.glob - -
- -
- -
- - setuptools._vendor.zipp.glob -SourceModule
-imports: - os - • re - • setuptools._vendor.zipp - • setuptools._vendor.zipp.compat.py313 - -
-
-imported by: - setuptools._vendor.zipp - -
- -
- -
- - setuptools.archive_util -SourceModule
-imports: - contextlib - • os - • posixpath - • setuptools - • setuptools._distutils.errors - • setuptools._path - • shutil - • tarfile - • zipfile - -
-
-imported by: - setuptools.wheel - -
- -
- -
- - setuptools.command -Package
-imports: - setuptools - • setuptools._distutils.command.bdist - • setuptools.command - • setuptools.command._requirestxt - • setuptools.command.bdist_egg - • sys - -
-
-imported by: - setuptools - • setuptools.command - • setuptools.command._requirestxt - • setuptools.command.bdist_egg - • setuptools.command.bdist_wheel - • setuptools.command.build - • setuptools.command.egg_info - • setuptools.command.sdist - • setuptools.command.setopt - • setuptools.dist - -
- -
- -
- - setuptools.command._requirestxt -SourceModule
-imports: - __future__ - • collections - • collections.abc - • io - • itertools - • packaging.requirements - • setuptools - • setuptools._reqs - • setuptools._vendor.jaraco.text - • setuptools.command - • typing - -
-
-imported by: - setuptools.command - • setuptools.command.egg_info - -
- -
- -
- - setuptools.command.bdist_egg -SourceModule
-imports: - __future__ - • _typeshed - • collections.abc - • distutils - • marshal - • os - • re - • setuptools - • setuptools._distutils.dir_util - • setuptools._distutils.log - • setuptools._path - • setuptools.command - • setuptools.extension - • sys - • sysconfig - • textwrap - • types - • typing - • typing_extensions - • zipfile - -
-
-imported by: - setuptools.command - • setuptools.command.egg_info - -
- -
- -
- - setuptools.command.bdist_wheel -SourceModule
-imports: - __future__ - • collections.abc - • distutils - • email.generator - • email.message - • glob - • os - • packaging - • packaging.tags - • packaging.version - • re - • setuptools - • setuptools._core_metadata - • setuptools._distutils.log - • setuptools._normalization - • setuptools._shutil - • setuptools._vendor.wheel.macosx_libfile - • setuptools._vendor.wheel.wheelfile - • setuptools.command - • setuptools.command.egg_info - • setuptools.warnings - • shutil - • struct - • sys - • sysconfig - • typing - • warnings - • zipfile - -
-
-imported by: - setuptools.dist - -
- -
- -
- - setuptools.command.build -SourceModule
-imports: - __future__ - • setuptools._distutils.command.build - • setuptools.command - • setuptools.dist - • typing - -
-
-imported by: - setuptools.command.sdist - -
- -
- -
- - setuptools.command.egg_info -SourceModule
-imports: - __future__ - • collections.abc - • distutils - • functools - • os - • packaging - • packaging.requirements - • packaging.version - • re - • setuptools - • setuptools._distutils.errors - • setuptools._distutils.filelist - • setuptools._distutils.log - • setuptools._distutils.util - • setuptools._entry_points - • setuptools._importlib - • setuptools._normalization - • setuptools.command - • setuptools.command._requirestxt - • setuptools.command.bdist_egg - • setuptools.command.sdist - • setuptools.command.setopt - • setuptools.glob - • setuptools.unicode_utils - • setuptools.warnings - • sys - • time - -
-
-imported by: - setuptools.command.bdist_wheel - • setuptools.wheel - -
- -
- -
- - setuptools.command.sdist -SourceModule
-imports: - __future__ - • collections.abc - • contextlib - • distutils - • itertools - • os - • re - • setuptools._distutils.command.sdist - • setuptools._distutils.log - • setuptools._importlib - • setuptools.command - • setuptools.command.build - • setuptools.dist - • typing - -
-
-imported by: - setuptools.command.egg_info - -
- -
- -
- - setuptools.command.setopt -SourceModule
-imports: - configparser - • distutils - • os - • setuptools - • setuptools._distutils.errors - • setuptools._distutils.log - • setuptools._distutils.util - • setuptools.command - • setuptools.unicode_utils - -
-
-imported by: - setuptools.command.egg_info - -
- -
- -
- - setuptools.compat -Package
-imports: - setuptools - • setuptools.compat.py311 - • setuptools.compat.py39 - -
-
-imported by: - setuptools._shutil - • setuptools.compat.py310 - • setuptools.compat.py311 - • setuptools.compat.py39 - • setuptools.msvc - • setuptools.unicode_utils - -
- -
- -
- - setuptools.compat.py310 -SourceModule
-imports: - setuptools.compat - • sys - • tomli - • tomllib - -
-
-imported by: - setuptools.config.pyprojecttoml - • setuptools.msvc - -
- -
- -
- - setuptools.compat.py311 -SourceModule
-imports: - __future__ - • _typeshed - • setuptools.compat - • shutil - • sys - • typing - • typing_extensions - -
-
-imported by: - setuptools._shutil - • setuptools.compat - -
- -
- -
- - setuptools.compat.py39 -SourceModule
-imports: - setuptools.compat - • sys - -
-
-imported by: - setuptools.compat - • setuptools.unicode_utils - -
- -
- -
- - setuptools.config -Package
-imports: - functools - • setuptools - • setuptools.config - • setuptools.config._validate_pyproject - • setuptools.config.expand - • setuptools.config.pyprojecttoml - • setuptools.config.setupcfg - • setuptools.warnings - • typing - -
-
-imported by: - setuptools.config - • setuptools.config._apply_pyprojecttoml - • setuptools.config._validate_pyproject - • setuptools.config.expand - • setuptools.config.pyprojecttoml - • setuptools.config.setupcfg - • setuptools.dist - -
- -
- -
- - setuptools.config._apply_pyprojecttoml -SourceModule
-imports: - __future__ - • collections.abc - • email.headerregistry - • functools - • inspect - • itertools - • logging - • os - • setuptools - • setuptools._distutils.dist - • setuptools._importlib - • setuptools._path - • setuptools._static - • setuptools.config - • setuptools.config.expand - • setuptools.dist - • setuptools.errors - • setuptools.extension - • setuptools.warnings - • types - • typing - • typing_extensions - -
-
-imported by: - setuptools.config.pyprojecttoml - -
- -
- -
- - setuptools.config._validate_pyproject -Package
-imports: - functools - • setuptools.config - • setuptools.config._validate_pyproject - • setuptools.config._validate_pyproject.error_reporting - • setuptools.config._validate_pyproject.extra_validations - • setuptools.config._validate_pyproject.fastjsonschema_exceptions - • setuptools.config._validate_pyproject.fastjsonschema_validations - • setuptools.config._validate_pyproject.formats - • typing - -
-
-imported by: - setuptools.config - • setuptools.config._validate_pyproject - • setuptools.config._validate_pyproject.error_reporting - • setuptools.config._validate_pyproject.extra_validations - • setuptools.config._validate_pyproject.fastjsonschema_exceptions - • setuptools.config._validate_pyproject.fastjsonschema_validations - • setuptools.config._validate_pyproject.formats - • setuptools.config.pyprojecttoml - -
- -
- -
- - setuptools.config._validate_pyproject.error_reporting -SourceModule
-imports: - __future__ - • contextlib - • io - • json - • logging - • os - • re - • setuptools.config._validate_pyproject - • setuptools.config._validate_pyproject.fastjsonschema_exceptions - • sys - • textwrap - • typing - • typing_extensions - -
-
-imported by: - setuptools.config._validate_pyproject - • setuptools.config._validate_pyproject.extra_validations - -
- -
- -
- - setuptools.config._validate_pyproject.extra_validations -SourceModule
-imports: - collections - • inspect - • itertools - • setuptools.config._validate_pyproject - • setuptools.config._validate_pyproject.error_reporting - • typing - -
-
-imported by: - setuptools.config._validate_pyproject - -
- -
- -
- - setuptools.config._validate_pyproject.fastjsonschema_exceptions -SourceModule
-imports: - re - • setuptools.config._validate_pyproject - -
-
-imported by: - setuptools.config._validate_pyproject - • setuptools.config._validate_pyproject.error_reporting - • setuptools.config._validate_pyproject.fastjsonschema_validations - -
- -
- -
- - setuptools.config._validate_pyproject.fastjsonschema_validations -SourceModule
-imports: - decimal - • re - • setuptools.config._validate_pyproject - • setuptools.config._validate_pyproject.fastjsonschema_exceptions - -
-
-imported by: - setuptools.config._validate_pyproject - -
- -
- -
- - setuptools.config._validate_pyproject.formats -SourceModule
-imports: - __future__ - • builtins - • email.message - • itertools - • keyword - • logging - • os - • packaging - • packaging.licenses - • packaging.requirements - • re - • setuptools._vendor.packaging - • setuptools._vendor.packaging.requirements - • setuptools.config._validate_pyproject - • ssl - • string - • trove_classifiers - • typing - • typing_extensions - • urllib.parse - • urllib.request - -
-
-imported by: - setuptools.config._validate_pyproject - -
- -
- -
- - setuptools.config.expand -SourceModule
-imports: - __future__ - • ast - • collections.abc - • configparser - • glob - • importlib - • importlib.machinery - • itertools - • more_itertools - • os - • pathlib - • setuptools - • setuptools._distutils.errors - • setuptools._path - • setuptools._static - • setuptools.config - • setuptools.discovery - • setuptools.dist - • setuptools.warnings - • sys - • types - • typing - • typing_extensions - -
-
-imported by: - setuptools.config - • setuptools.config._apply_pyprojecttoml - • setuptools.config.pyprojecttoml - • setuptools.config.setupcfg - -
- -
- -
- - setuptools.config.pyprojecttoml -SourceModule
-imports: - __future__ - • collections.abc - • contextlib - • functools - • logging - • more_itertools - • os - • setuptools._path - • setuptools.compat.py310 - • setuptools.config - • setuptools.config._apply_pyprojecttoml - • setuptools.config._validate_pyproject - • setuptools.config.expand - • setuptools.dist - • setuptools.errors - • setuptools.warnings - • types - • typing - • typing_extensions - -
-
-imported by: - setuptools.config - • setuptools.dist - -
- -
- -
- - setuptools.config.setupcfg -SourceModule
-imports: - __future__ - • abc - • collections - • collections.abc - • contextlib - • functools - • os - • packaging.markers - • packaging.requirements - • packaging.version - • setuptools - • setuptools._distutils.dist - • setuptools._path - • setuptools._static - • setuptools.config - • setuptools.config.expand - • setuptools.dist - • setuptools.errors - • setuptools.warnings - • typing - • typing_extensions - -
-
-imported by: - setuptools.config - • setuptools.dist - -
- -
- -
- - setuptools.depends -SourceModule
-imports: - __future__ - • contextlib - • dis - • marshal - • packaging.version - • setuptools - • setuptools._imp - • sys - • types - • typing - -
-
-imported by: - setuptools - -
- -
- -
- - setuptools.discovery -SourceModule
-imports: - __future__ - • _distutils_hack.override - • collections.abc - • distutils - • fnmatch - • glob - • inspect - • itertools - • os - • pathlib - • setuptools - • setuptools._distutils.log - • setuptools._distutils.util - • setuptools._path - • setuptools.errors - • typing - -
-
-imported by: - setuptools - • setuptools.config.expand - • setuptools.dist - -
- -
- -
- - setuptools.dist -SourceModule
-imports: - __future__ - • collections.abc - • configparser - • functools - • glob - • io - • itertools - • more_itertools - • numbers - • os - • packaging.markers - • packaging.specifiers - • packaging.version - • pathlib - • re - • setuptools - • setuptools._distutils.cmd - • setuptools._distutils.command - • setuptools._distutils.core - • setuptools._distutils.debug - • setuptools._distutils.dist - • setuptools._distutils.errors - • setuptools._distutils.fancy_getopt - • setuptools._distutils.log - • setuptools._distutils.util - • setuptools._entry_points - • setuptools._importlib - • setuptools._normalization - • setuptools._path - • setuptools._reqs - • setuptools._static - • setuptools.command - • setuptools.command.bdist_wheel - • setuptools.config - • setuptools.config.pyprojecttoml - • setuptools.config.setupcfg - • setuptools.discovery - • setuptools.errors - • setuptools.installer - • setuptools.monkey - • setuptools.warnings - • setuptools.windows_support - • shlex - • sys - • typing - • typing_extensions - -
-
-imported by: - setuptools - • setuptools.command.build - • setuptools.command.sdist - • setuptools.config._apply_pyprojecttoml - • setuptools.config.expand - • setuptools.config.pyprojecttoml - • setuptools.config.setupcfg - -
- -
- -
- - setuptools.errors -SourceModule
-imports: - __future__ - • distutils - • setuptools - • setuptools._distutils.errors - -
-
-imported by: - setuptools._entry_points - • setuptools.config._apply_pyprojecttoml - • setuptools.config.pyprojecttoml - • setuptools.config.setupcfg - • setuptools.discovery - • setuptools.dist - -
- -
- -
- - setuptools.extension -SourceModule
-imports: - __future__ - • collections.abc - • functools - • re - • setuptools - • setuptools._distutils.core - • setuptools._distutils.errors - • setuptools._distutils.extension - • setuptools._path - • setuptools.monkey - • typing - -
-
-imported by: - setuptools - • setuptools.command.bdist_egg - • setuptools.config._apply_pyprojecttoml - -
- -
- -
- - setuptools.glob -SourceModule
-imports: - __future__ - • _typeshed - • collections.abc - • fnmatch - • os - • re - • setuptools - • typing - -
-
-imported by: - setuptools.command.egg_info - -
- -
- -
- - setuptools.installer -SourceModule
-imports: - __future__ - • distutils - • glob - • itertools - • os - • packaging.requirements - • packaging.utils - • setuptools - • setuptools._distutils.errors - • setuptools._distutils.log - • setuptools._importlib - • setuptools._reqs - • setuptools.warnings - • setuptools.wheel - • subprocess - • sys - • tempfile - -
-
-imported by: - setuptools.dist - -
- -
- -
- - setuptools.logging -SourceModule
-imports: - inspect - • logging - • setuptools - • setuptools._distutils.log - • setuptools.monkey - • sys - -
-
-imported by: - setuptools - -
- -
- -
- - setuptools.monkey -SourceModule
-imports: - __future__ - • inspect - • platform - • setuptools - • setuptools._core_metadata - • setuptools._distutils.filelist - • sys - • types - • typing - -
-
-imported by: - setuptools - • setuptools.dist - • setuptools.extension - • setuptools.logging - -
- -
- -
- - setuptools.msvc -SourceModule
-imports: - __future__ - • contextlib - • itertools - • json - • more_itertools - • os - • os.path - • platform - • setuptools - • setuptools._distutils.errors - • setuptools._path - • setuptools.compat - • setuptools.compat.py310 - • typing - • typing_extensions - • winreg - -
-
-imported by: - setuptools - -
- -
- -
- - setuptools.unicode_utils -SourceModule
-imports: - configparser - • setuptools - • setuptools.compat - • setuptools.compat.py39 - • setuptools.warnings - • sys - • unicodedata - -
-
-imported by: - setuptools.command.egg_info - • setuptools.command.setopt - • setuptools.wheel - -
- -
- -
- - setuptools.version -SourceModule
-imports: - setuptools - • setuptools._importlib - -
-
-imported by: - setuptools - -
- -
- -
- - setuptools.warnings -SourceModule
-imports: - __future__ - • datetime - • inspect - • os - • setuptools - • textwrap - • typing - • typing_extensions - • warnings - -
-
-imported by: - setuptools - • setuptools._core_metadata - • setuptools._static - • setuptools.command.bdist_wheel - • setuptools.command.egg_info - • setuptools.config - • setuptools.config._apply_pyprojecttoml - • setuptools.config.expand - • setuptools.config.pyprojecttoml - • setuptools.config.setupcfg - • setuptools.dist - • setuptools.installer - • setuptools.unicode_utils - -
- -
- -
- - setuptools.wheel -SourceModule
-imports: - collections.abc - • contextlib - • distutils - • email - • functools - • itertools - • os - • packaging.requirements - • packaging.tags - • packaging.utils - • packaging.version - • posixpath - • re - • setuptools - • setuptools._discovery - • setuptools._distutils.log - • setuptools._distutils.util - • setuptools._importlib - • setuptools.archive_util - • setuptools.command.egg_info - • setuptools.unicode_utils - • zipfile - -
-
-imported by: - setuptools.installer - -
- -
- -
- - setuptools.windows_support -SourceModule
-imports: - ctypes - • ctypes.wintypes - • platform - • setuptools - -
-
-imported by: - setuptools - • setuptools.dist - -
- -
- -
- - shlex -SourceModule
-imports: - collections - • io - • os - • re - • sys - -
-
-imported by: - setuptools.dist - • webbrowser - -
- -
- -
- - shutil -SourceModule
-imports: - _winapi - • bz2 - • collections - • errno - • fnmatch - • grp - • lzma - • nt - • os - • posix - • pwd - • stat - • sys - • tarfile - • warnings - • zipfile - • zlib - -
-
-imported by: - argparse - • http.server - • multiprocessing.util - • setuptools._distutils.spawn - • setuptools._vendor.backports.tarfile - • setuptools._vendor.jaraco.context - • setuptools.archive_util - • setuptools.command.bdist_wheel - • setuptools.compat.py311 - • tarfile - • tempfile - • webbrowser - • zipfile - -
- -
- -
- - signal -SourceModule
-imports: - _signal - • enum - -
-
-imported by: - asyncio.events - • asyncio.proactor_events - • asyncio.runners - • asyncio.unix_events - • multiprocessing.forkserver - • multiprocessing.managers - • multiprocessing.popen_fork - • multiprocessing.popen_spawn_win32 - • multiprocessing.process - • multiprocessing.resource_sharer - • multiprocessing.resource_tracker - • subprocess - • unittest.signals - -
- -
- -
- - simplejson -MissingModule
-imported by: - requests.compat - -
- -
- -
- - site -SourceModule
-imports: - _sitebuiltins - • atexit - • builtins - • io - • os - • readline - • rlcompleter - • sitecustomize - • stat - • sys - • textwrap - • traceback - • usercustomize - -
-
-imported by: - setuptools._distutils.command.build_ext - -
- -
- -
- - sitecustomize -SourceModule
-imports: - apport_python_hook - -
-
-imported by: - site - -
- -
- -
- - socket -SourceModule
-imports: - _socket - • array - • enum - • errno - • io - • os - • selectors - • sys - -
-
-imported by: - _ssl - • asyncio.base_events - • asyncio.events - • asyncio.proactor_events - • asyncio.selector_events - • asyncio.streams - • asyncio.trsock - • asyncio.unix_events - • asyncio.windows_events - • email.utils - • ftplib - • http.client - • http.server - • multiprocessing.connection - • multiprocessing.forkserver - • multiprocessing.reduction - • multiprocessing.resource_sharer - • platform - • requests.adapters - • requests.utils - • socketserver - • ssl - • urllib.request - • urllib3.connection - • urllib3.connectionpool - • urllib3.contrib.pyopenssl - • urllib3.contrib.socks - • urllib3.exceptions - • urllib3.response - • urllib3.util.connection - • urllib3.util.ssl_ - • urllib3.util.ssltransport - • urllib3.util.timeout - • urllib3.util.wait - -
- -
- -
- - socketserver -SourceModule
-imports: - io - • os - • selectors - • socket - • sys - • threading - • time - • traceback - -
-
-imported by: - http.server - -
- -
- -
- - socks -MissingModule
-imported by: - urllib3.contrib.socks - -
- -
- -
- - sre_compile -SourceModule
-imports: - re - • re._compiler - • warnings - -
-
-imported by: - client.py - -
- -
- -
- - sre_constants -SourceModule
-imports: - re - • re._constants - • warnings - -
-
-imported by: - client.py - -
- -
- -
- - sre_parse -SourceModule
-imports: - re - • re._parser - • warnings - -
-
-imported by: - client.py - -
- -
- -
- - ssl -SourceModule
-imports: - _ssl - • base64 - • calendar - • collections - • enum - • errno - • os - • socket - • sys - • time - • warnings - -
-
-imported by: - asyncio.base_events - • asyncio.selector_events - • asyncio.sslproto - • ftplib - • http.client - • requests - • setuptools.config._validate_pyproject.formats - • urllib.request - • urllib3 - • urllib3._base_connection - • urllib3.connection - • urllib3.connectionpool - • urllib3.contrib.pyopenssl - • urllib3.contrib.socks - • urllib3.poolmanager - • urllib3.util.ssl_ - • urllib3.util.ssltransport - -
- -
- -
- - stat -SourceModule
-imports: - _stat - -
-
-imported by: - asyncio.base_events - • asyncio.unix_events - • client.py - • genericpath - • glob - • netrc - • ntpath - • os - • pathlib - • posixpath - • setuptools._core_metadata - • setuptools._distutils.file_util - • setuptools._shutil - • setuptools._vendor.backports.tarfile - • setuptools._vendor.jaraco.context - • setuptools._vendor.wheel.wheelfile - • setuptools._vendor.zipp - • shutil - • site - • tarfile - • tempfile - • zipfile - -
- -
- -
- - statistics -SourceModule
-imports: - _statistics - • bisect - • collections - • decimal - • fractions - • functools - • itertools - • math - • numbers - • operator - • random - • sys - -
-
-imported by: - random - -
- -
- -
- - string -SourceModule
-imports: - _string - • collections - • re - -
-
-imported by: - email._encoded_words - • email._header_value_parser - • email.quoprimime - • http.cookies - • logging - • nturl2path - • setuptools._distutils.fancy_getopt - • setuptools._distutils.util - • setuptools.config._validate_pyproject.formats - • tomllib._parser - • urllib.request - -
- -
- -
- - stringprep -SourceModule
-imports: - unicodedata - -
-
-imported by: - encodings.idna - -
- -
- -
- - struct -SourceModule
-imports: - _struct - -
-
-imported by: - asyncio.windows_events - • base64 - • ctypes - • gettext - • gzip - • multiprocessing.connection - • multiprocessing.forkserver - • multiprocessing.shared_memory - • multiprocessing.synchronize - • packaging._elffile - • packaging.tags - • pickle - • platform - • requests.utils - • setuptools._vendor.backports.tarfile - • setuptools._vendor.packaging._elffile - • setuptools._vendor.packaging.tags - • setuptools.command.bdist_wheel - • tarfile - • zipfile - -
- -
- -
- - subprocess -SourceModule
-imports: - _posixsubprocess - • _winapi - • builtins - • contextlib - • errno - • fcntl - • grp - • io - • locale - • msvcrt - • os - • pwd - • select - • selectors - • signal - • sys - • threading - • time - • types - • warnings - -
-
-imported by: - _aix_support - • asyncio.base_events - • asyncio.base_subprocess - • asyncio.events - • asyncio.subprocess - • asyncio.unix_events - • asyncio.windows_utils - • http.server - • multiprocessing.util - • os - • packaging._musllinux - • packaging.tags - • platform - • pydoc - • pyi_rth_multiprocessing.py - • setuptools._distutils.compilers.C.msvc - • setuptools._distutils.spawn - • setuptools._distutils.util - • setuptools._vendor.jaraco.context - • setuptools._vendor.packaging._musllinux - • setuptools._vendor.packaging.tags - • setuptools.installer - • webbrowser - -
- -
- -
- - sys (builtin module)
-imported by: - _aix_support - • _collections_abc - • _compression - • _distutils_hack - • _pydatetime - • _pydecimal - • _sitebuiltins - • argparse - • ast - • asyncio - • asyncio.base_events - • asyncio.coroutines - • asyncio.events - • asyncio.format_helpers - • asyncio.futures - • asyncio.streams - • asyncio.unix_events - • asyncio.windows_events - • asyncio.windows_utils - • base64 - • calendar - • certifi.core - • charset_normalizer.md - • codecs - • collections - • concurrent.futures.process - • configparser - • contextlib - • ctypes - • ctypes._endian - • dataclasses - • dis - • email._header_value_parser - • email.generator - • email.iterators - • email.policy - • encodings - • encodings.rot_13 - • encodings.utf_16 - • encodings.utf_32 - • enum - • fractions - • ftplib - • getopt - • getpass - • gettext - • glob - • gzip - • http.client - • http.server - • importlib - • importlib._bootstrap_external - • importlib.metadata - • importlib.util - • inspect - • linecache - • locale - • logging - • mimetypes - • multiprocessing - • multiprocessing.connection - • multiprocessing.context - • multiprocessing.dummy - • multiprocessing.forkserver - • multiprocessing.heap - • multiprocessing.managers - • multiprocessing.popen_spawn_win32 - • multiprocessing.process - • multiprocessing.queues - • multiprocessing.reduction - • multiprocessing.resource_sharer - • multiprocessing.resource_tracker - • multiprocessing.spawn - • multiprocessing.synchronize - • multiprocessing.util - • ntpath - • os - • packaging._manylinux - • packaging._musllinux - • packaging.markers - • packaging.tags - • packaging.version - • pathlib - • pickle - • pkgutil - • platform - • posixpath - • pprint - • py_compile - • pydoc - • pyi_rth__tkinter.py - • pyi_rth_inspect.py - • pyi_rth_multiprocessing.py - • quopri - • re._compiler - • requests.compat - • requests.packages - • requests.sessions - • requests.utils - • runpy - • selectors - • setuptools - • setuptools._distutils - • setuptools._distutils.cmd - • setuptools._distutils.command.build - • setuptools._distutils.command.build_ext - • setuptools._distutils.command.sdist - • setuptools._distutils.compat.py39 - • setuptools._distutils.compilers.C.base - • setuptools._distutils.core - • setuptools._distutils.dist - • setuptools._distutils.fancy_getopt - • setuptools._distutils.spawn - • setuptools._distutils.sysconfig - • setuptools._distutils.text_file - • setuptools._distutils.util - • setuptools._importlib - • setuptools._path - • setuptools._vendor.backports.tarfile - • setuptools._vendor.backports.tarfile.compat.py38 - • setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata._compat - • setuptools._vendor.importlib_metadata.compat.py311 - • setuptools._vendor.jaraco.context - • setuptools._vendor.more_itertools.more - • setuptools._vendor.more_itertools.recipes - • setuptools._vendor.packaging._manylinux - • setuptools._vendor.packaging._musllinux - • setuptools._vendor.packaging.markers - • setuptools._vendor.packaging.tags - • setuptools._vendor.packaging.version - • setuptools._vendor.tomli._parser - • setuptools._vendor.wheel.macosx_libfile - • setuptools._vendor.zipp - • setuptools._vendor.zipp.compat.overlay - • setuptools._vendor.zipp.compat.py310 - • setuptools._vendor.zipp.compat.py313 - • setuptools.command - • setuptools.command.bdist_egg - • setuptools.command.bdist_wheel - • setuptools.command.egg_info - • setuptools.compat.py310 - • setuptools.compat.py311 - • setuptools.compat.py39 - • setuptools.config._validate_pyproject.error_reporting - • setuptools.config.expand - • setuptools.depends - • setuptools.dist - • setuptools.installer - • setuptools.logging - • setuptools.monkey - • setuptools.unicode_utils - • shlex - • shutil - • site - • socket - • socketserver - • ssl - • statistics - • subprocess - • sysconfig - • tarfile - • tempfile - • threading - • tkinter - • tokenize - • traceback - • types - • typing - • unittest.case - • unittest.loader - • unittest.main - • unittest.mock - • unittest.result - • unittest.runner - • unittest.suite - • urllib.request - • urllib3 - • urllib3.connection - • urllib3.connectionpool - • urllib3.response - • urllib3.util.request - • urllib3.util.ssl_ - • warnings - • weakref - • webbrowser - • xml.parsers.expat - • xml.sax - • xml.sax.saxutils - • xmlrpc.client - • zipfile - • zipimport - -
- -
- -
- - sysconfig -SourceModule
-imports: - _aix_support - • _imp - • _sysconfigdata__x86_64-linux-gnu - • os - • os.path - • pprint - • re - • sys - • threading - • types - • warnings - -
-
-imported by: - _aix_support - • packaging._musllinux - • packaging.tags - • pydoc - • setuptools._distutils.command.build - • setuptools._distutils.sysconfig - • setuptools._distutils.util - • setuptools._vendor.packaging._musllinux - • setuptools._vendor.packaging.tags - • setuptools.command.bdist_egg - • setuptools.command.bdist_wheel - -
- -
- -
- - syslog (builtin module)
-imported by: - setuptools - -
- -
- -
- - tarfile -SourceModule
-imports: - argparse - • builtins - • bz2 - • copy - • grp - • gzip - • io - • lzma - • os - • pwd - • re - • shutil - • stat - • struct - • sys - • time - • warnings - • zlib - -
-
-imported by: - setuptools._distutils.archive_util - • setuptools._vendor.jaraco.context - • setuptools.archive_util - • shutil - -
- -
- -
- - tempfile -SourceModule
-imports: - _thread - • errno - • functools - • io - • os - • random - • shutil - • stat - • sys - • types - • warnings - • weakref - -
-
-imported by: - asyncio.windows_utils - • importlib.resources._common - • multiprocessing.connection - • multiprocessing.heap - • multiprocessing.synchronize - • multiprocessing.util - • pydoc - • requests.utils - • setuptools._core_metadata - • setuptools._distutils.compilers.C.base - • setuptools._distutils.util - • setuptools._vendor.jaraco.context - • setuptools.installer - • urllib.request - • urllib.response - -
- -
- -
- - termios /usr/lib/python3.12/lib-dynload/termios.cpython-312-x86_64-linux-gnu.so
-imported by: - getpass - • tty - -
- -
- -
- - textwrap -SourceModule
-imports: - re - -
-
-imported by: - argparse - • importlib.metadata - • importlib.metadata._adapters - • pydoc - • setuptools._core_metadata - • setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata._adapters - • setuptools._vendor.jaraco.text - • setuptools.command.bdist_egg - • setuptools.config._validate_pyproject.error_reporting - • setuptools.warnings - • site - • traceback - -
- -
- -
- - threading -SourceModule
-imports: - _collections - • _thread - • _threading_local - • _weakrefset - • collections - • functools - • itertools - • os - • sys - • time - • traceback - • warnings - -
-
-imported by: - _threading_local - • asyncio.base_events - • asyncio.events - • asyncio.mixins - • asyncio.proactor_events - • asyncio.runners - • asyncio.unix_events - • client.py - • concurrent.futures._base - • concurrent.futures.process - • concurrent.futures.thread - • http.cookiejar - • importlib.util - • logging - • multiprocessing.context - • multiprocessing.dummy - • multiprocessing.forkserver - • multiprocessing.heap - • multiprocessing.managers - • multiprocessing.pool - • multiprocessing.process - • multiprocessing.queues - • multiprocessing.resource_sharer - • multiprocessing.resource_tracker - • multiprocessing.synchronize - • multiprocessing.util - • pydoc - • queue - • requests.auth - • requests.cookies - • socketserver - • subprocess - • sysconfig - • unittest.mock - • urllib3._collections - • urllib3.connection - • urllib3.http2.connection - • urllib3.http2.probe - • webbrowser - • zipfile - -
- -
- -
- - time (builtin module)
-imports: - _strptime - -
-
-imported by: - _datetime - • _pydatetime - • _strptime - • asyncio.base_events - • asyncio.windows_events - • concurrent.futures._base - • datetime - • email._parseaddr - • email.generator - • email.utils - • gc - • gzip - • http.cookiejar - • http.cookies - • http.server - • logging - • multiprocessing.connection - • multiprocessing.managers - • multiprocessing.pool - • multiprocessing.queues - • multiprocessing.synchronize - • pydoc - • queue - • random - • requests.auth - • requests.cookies - • requests.sessions - • setuptools._vendor.backports.tarfile - • setuptools._vendor.jaraco.functools - • setuptools._vendor.more_itertools.more - • setuptools._vendor.wheel.wheelfile - • setuptools.command.egg_info - • socketserver - • ssl - • subprocess - • tarfile - • threading - • unittest.case - • unittest.runner - • urllib.request - • urllib3.util.retry - • urllib3.util.timeout - • xmlrpc.client - • zipfile - • zipimport - -
- -
- -
- - tkinter -Package
-imports: - _tkinter - • collections - • enum - • os - • re - • sys - • tkinter.commondialog - • tkinter.constants - • tkinter.filedialog - • tkinter.messagebox - • tkinter.ttk - • traceback - • types - -
-
-imported by: - client.py - • tkinter.commondialog - • tkinter.constants - • tkinter.dialog - • tkinter.filedialog - • tkinter.messagebox - • tkinter.simpledialog - • tkinter.ttk - -
- -
- -
- - tkinter.commondialog -SourceModule
-imports: - tkinter - -
-
-imported by: - tkinter - • tkinter.filedialog - • tkinter.messagebox - -
- -
- -
- - tkinter.constants -SourceModule
-imports: - tkinter - -
-
-imported by: - tkinter - -
- -
- -
- - tkinter.dialog -SourceModule
-imports: - tkinter - -
-
-imported by: - tkinter.filedialog - -
- -
- -
- - tkinter.filedialog -SourceModule
-imports: - fnmatch - • locale - • os - • tkinter - • tkinter.commondialog - • tkinter.dialog - • tkinter.simpledialog - -
-
-imported by: - client.py - • tkinter - -
- -
- -
- - tkinter.messagebox -SourceModule
-imports: - tkinter - • tkinter.commondialog - -
-
-imported by: - client.py - • tkinter - • tkinter.simpledialog - -
- -
- -
- - tkinter.simpledialog -SourceModule
-imports: - tkinter - • tkinter.messagebox - -
-
-imported by: - tkinter.filedialog - -
- -
- -
- - tkinter.ttk -SourceModule
-imports: - tkinter - -
-
-imported by: - client.py - • tkinter - -
- -
- -
- - token -SourceModule
-imported by: - inspect - • tokenize - -
- -
- -
- - tokenize -SourceModule
-imports: - _tokenize - • argparse - • builtins - • codecs - • collections - • functools - • io - • itertools - • re - • sys - • token - -
-
-imported by: - importlib._bootstrap_external - • inspect - • linecache - • pydoc - • setuptools._distutils.core - • setuptools._imp - -
- -
- -
- - tomli -AliasNode
-imports: - setuptools._vendor.tomli - -
-
-imported by: - setuptools.compat.py310 - -
- -
- -
- - tomllib -Package
-imports: - tomllib._parser - -
-
-imported by: - setuptools.compat.py310 - • tomllib._parser - • tomllib._re - • tomllib._types - -
- -
- -
- - tomllib._parser -SourceModule
-imports: - __future__ - • collections.abc - • string - • tomllib - • tomllib._re - • tomllib._types - • types - • typing - -
-
-imported by: - tomllib - -
- -
- -
- - tomllib._re -SourceModule
-imports: - __future__ - • datetime - • functools - • re - • tomllib - • tomllib._types - • typing - -
-
-imported by: - tomllib._parser - -
- -
- -
- - tomllib._types -SourceModule
-imports: - tomllib - • typing - -
-
-imported by: - tomllib._parser - • tomllib._re - -
- -
- -
- - traceback -SourceModule
-imports: - ast - • collections.abc - • contextlib - • itertools - • linecache - • sys - • textwrap - • unicodedata - -
-
-imported by: - _distutils_hack - • asyncio.base_events - • asyncio.base_tasks - • asyncio.format_helpers - • client.py - • concurrent.futures.process - • http.cookiejar - • logging - • multiprocessing.managers - • multiprocessing.pool - • multiprocessing.process - • multiprocessing.queues - • multiprocessing.util - • py_compile - • pydoc - • site - • socketserver - • threading - • tkinter - • unittest.case - • unittest.loader - • unittest.result - • warnings - -
- -
- -
- - tracemalloc -SourceModule
-imports: - _tracemalloc - • collections.abc - • fnmatch - • functools - • linecache - • os.path - • pickle - -
-
-imported by: - warnings - -
- -
- -
- - trove_classifiers -MissingModule
-imported by: - setuptools.config._validate_pyproject.formats - -
- -
- -
- - tty -SourceModule
-imports: - termios - -
-
-imported by: - pydoc - -
- -
- -
- - types -SourceModule
-imports: - _collections_abc - • functools - • sys - -
-
-imported by: - _weakrefset - • asyncio.coroutines - • asyncio.futures - • asyncio.queues - • asyncio.tasks - • asyncio.timeouts - • client.py - • concurrent.futures._base - • concurrent.futures.thread - • contextlib - • copy - • csv - • ctypes - • dataclasses - • difflib - • dis - • email.headerregistry - • enum - • functools - • http.cookies - • importlib.metadata._functools - • importlib.resources._common - • importlib.resources._legacy - • importlib.util - • inspect - • logging - • multiprocessing.managers - • multiprocessing.pool - • multiprocessing.queues - • multiprocessing.shared_memory - • multiprocessing.spawn - • pickle - • pkgutil - • pprint - • queue - • setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata._functools - • setuptools._vendor.importlib_metadata.compat.py311 - • setuptools._vendor.jaraco.functools - • setuptools._vendor.tomli._parser - • setuptools._vendor.zipp.compat.overlay - • setuptools.command.bdist_egg - • setuptools.config._apply_pyprojecttoml - • setuptools.config.expand - • setuptools.config.pyprojecttoml - • setuptools.depends - • setuptools.monkey - • subprocess - • sysconfig - • tempfile - • tkinter - • tomllib._parser - • typing - • unittest.case - • unittest.loader - • unittest.mock - • urllib.parse - • urllib3.connectionpool - • urllib3.http2.connection - • urllib3.poolmanager - • urllib3.util.retry - • urllib3.util.util - -
- -
- -
- - typing -SourceModule
-imports: - _typing - • abc - • collections - • collections.abc - • contextlib - • copyreg - • functools - • inspect - • operator - • re - • sys - • types - • warnings - -
-
-imported by: - asyncio.staggered - • asyncio.timeouts - • charset_normalizer.api - • charset_normalizer.cd - • charset_normalizer.legacy - • charset_normalizer.md - • charset_normalizer.models - • charset_normalizer.utils - • functools - • idna.core - • idna.intranges - • idna.uts46data - • importlib.metadata - • importlib.metadata._meta - • importlib.resources._common - • importlib.resources._legacy - • importlib.resources.abc - • packaging._elffile - • packaging._manylinux - • packaging._musllinux - • packaging._parser - • packaging._structures - • packaging._tokenizer - • packaging.licenses - • packaging.licenses._spdx - • packaging.markers - • packaging.requirements - • packaging.specifiers - • packaging.tags - • packaging.utils - • packaging.version - • requests.adapters - • setuptools - • setuptools._distutils._modified - • setuptools._distutils.archive_util - • setuptools._distutils.cmd - • setuptools._distutils.command.bdist - • setuptools._distutils.command.build - • setuptools._distutils.command.build_ext - • setuptools._distutils.command.check - • setuptools._distutils.command.sdist - • setuptools._distutils.compat - • setuptools._distutils.compilers.C.base - • setuptools._distutils.dist - • setuptools._distutils.fancy_getopt - • setuptools._distutils.filelist - • setuptools._distutils.spawn - • setuptools._distutils.sysconfig - • setuptools._distutils.util - • setuptools._normalization - • setuptools._path - • setuptools._reqs - • setuptools._shutil - • setuptools._static - • setuptools._vendor.importlib_metadata - • setuptools._vendor.importlib_metadata._collections - • setuptools._vendor.importlib_metadata._functools - • setuptools._vendor.importlib_metadata._meta - • setuptools._vendor.importlib_metadata._typing - • setuptools._vendor.importlib_metadata.compat.py39 - • setuptools._vendor.jaraco.functools - • setuptools._vendor.jaraco.text - • setuptools._vendor.packaging._elffile - • setuptools._vendor.packaging._manylinux - • setuptools._vendor.packaging._musllinux - • setuptools._vendor.packaging._parser - • setuptools._vendor.packaging._structures - • setuptools._vendor.packaging._tokenizer - • setuptools._vendor.packaging.markers - • setuptools._vendor.packaging.requirements - • setuptools._vendor.packaging.specifiers - • setuptools._vendor.packaging.tags - • setuptools._vendor.packaging.utils - • setuptools._vendor.packaging.version - • setuptools._vendor.tomli._parser - • setuptools._vendor.tomli._re - • setuptools._vendor.tomli._types - • setuptools._vendor.wheel.macosx_libfile - • setuptools._vendor.wheel.wheelfile - • setuptools.command._requirestxt - • setuptools.command.bdist_egg - • setuptools.command.bdist_wheel - • setuptools.command.build - • setuptools.command.sdist - • setuptools.compat.py311 - • setuptools.config - • setuptools.config._apply_pyprojecttoml - • setuptools.config._validate_pyproject - • setuptools.config._validate_pyproject.error_reporting - • setuptools.config._validate_pyproject.extra_validations - • setuptools.config._validate_pyproject.formats - • setuptools.config.expand - • setuptools.config.pyprojecttoml - • setuptools.config.setupcfg - • setuptools.depends - • setuptools.discovery - • setuptools.dist - • setuptools.extension - • setuptools.glob - • setuptools.monkey - • setuptools.msvc - • setuptools.warnings - • tomllib._parser - • tomllib._re - • tomllib._types - • urllib3 - • urllib3._base_connection - • urllib3._collections - • urllib3._request_methods - • urllib3._version - • urllib3.connection - • urllib3.connectionpool - • urllib3.contrib.emscripten.connection - • urllib3.contrib.emscripten.fetch - • urllib3.contrib.emscripten.response - • urllib3.contrib.pyopenssl - • urllib3.contrib.socks - • urllib3.exceptions - • urllib3.fields - • urllib3.filepost - • urllib3.http2 - • urllib3.http2.connection - • urllib3.poolmanager - • urllib3.response - • urllib3.util.connection - • urllib3.util.proxy - • urllib3.util.request - • urllib3.util.retry - • urllib3.util.ssl_ - • urllib3.util.ssl_match_hostname - • urllib3.util.ssltransport - • urllib3.util.timeout - • urllib3.util.url - • urllib3.util.util - -
- -
- -
- - typing_extensions -MissingModule
-imported by: - charset_normalizer.md - • packaging.version - • setuptools._distutils.cmd - • setuptools._distutils.command.bdist - • setuptools._distutils.compilers.C.base - • setuptools._distutils.dist - • setuptools._distutils.sysconfig - • setuptools._distutils.util - • setuptools._path - • setuptools._reqs - • setuptools._vendor.packaging.version - • setuptools.command.bdist_egg - • setuptools.compat.py311 - • setuptools.config._apply_pyprojecttoml - • setuptools.config._validate_pyproject.error_reporting - • setuptools.config._validate_pyproject.formats - • setuptools.config.expand - • setuptools.config.pyprojecttoml - • setuptools.config.setupcfg - • setuptools.dist - • setuptools.msvc - • setuptools.warnings - • urllib3._collections - • urllib3.connectionpool - • urllib3.contrib.emscripten.fetch - • urllib3.poolmanager - • urllib3.util.retry - • urllib3.util.ssltransport - -
- -
- -
- - unicodedata (builtin module)
-imported by: - charset_normalizer.utils - • encodings.idna - • idna.core - • re._parser - • setuptools.unicode_utils - • stringprep - • traceback - • urllib.parse - -
- -
- -
- - unittest -Package
-imports: - unittest - • unittest.async_case - • unittest.case - • unittest.loader - • unittest.main - • unittest.result - • unittest.runner - • unittest.signals - • unittest.suite - • unittest.util - -
-
-imported by: - unittest - • unittest._log - • unittest.async_case - • unittest.case - • unittest.loader - • unittest.main - • unittest.mock - • unittest.result - • unittest.runner - • unittest.signals - • unittest.suite - • unittest.util - -
- -
- -
- - unittest._log -SourceModule
-imports: - collections - • logging - • unittest - • unittest.case - -
-
-imported by: - unittest.case - -
- -
- -
- - unittest.async_case -SourceModule
-imports: - asyncio - • contextvars - • inspect - • unittest - • unittest.case - • warnings - -
-
-imported by: - unittest - -
- -
- -
- - unittest.case -SourceModule
-imports: - collections - • contextlib - • difflib - • functools - • pprint - • re - • sys - • time - • traceback - • types - • unittest - • unittest._log - • unittest.result - • unittest.util - • warnings - -
-
-imported by: - unittest - • unittest._log - • unittest.async_case - • unittest.loader - • unittest.runner - • unittest.suite - -
- -
- -
- - unittest.loader -SourceModule
-imports: - fnmatch - • functools - • os - • re - • sys - • traceback - • types - • unittest - • unittest.case - • unittest.suite - • unittest.util - • warnings - -
-
-imported by: - unittest - • unittest.main - -
- -
- -
- - unittest.main -SourceModule
-imports: - argparse - • os - • sys - • unittest - • unittest.loader - • unittest.runner - • unittest.signals - • warnings - -
-
-imported by: - unittest - -
- -
- -
- - unittest.mock -SourceModule
-imports: - _io - • asyncio - • builtins - • contextlib - • functools - • inspect - • io - • pkgutil - • pprint - • sys - • threading - • types - • unittest - • unittest.util - -
-
-imported by: - setuptools._distutils.compilers.C.msvc - -
- -
- -
- - unittest.result -SourceModule
-imports: - functools - • io - • sys - • traceback - • unittest - • unittest.util - -
-
-imported by: - unittest - • unittest.case - • unittest.runner - -
- -
- -
- - unittest.runner -SourceModule
-imports: - sys - • time - • unittest - • unittest.case - • unittest.result - • unittest.signals - • warnings - -
-
-imported by: - unittest - • unittest.main - -
- -
- -
- - unittest.signals -SourceModule
-imports: - functools - • signal - • unittest - • weakref - -
-
-imported by: - unittest - • unittest.main - • unittest.runner - -
- -
- -
- - unittest.suite -SourceModule
-imports: - sys - • unittest - • unittest.case - • unittest.util - -
-
-imported by: - unittest - • unittest.loader - -
- -
- -
- - unittest.util -SourceModule
-imports: - collections - • os.path - • unittest - -
-
-imported by: - unittest - • unittest.case - • unittest.loader - • unittest.mock - • unittest.result - • unittest.suite - -
- -
- -
- - urllib -Package
-imported by: - email._header_value_parser - • urllib.error - • urllib.parse - • urllib.request - • urllib.response - -
- -
- -
- - urllib.error -SourceModule
-imports: - io - • urllib - • urllib.response - -
-
-imported by: - urllib.request - -
- -
- -
- - urllib.parse -SourceModule
-imports: - collections - • functools - • ipaddress - • math - • re - • types - • unicodedata - • urllib - • warnings - -
-
-imported by: - email.utils - • http.client - • http.cookiejar - • http.server - • mimetypes - • nturl2path - • pathlib - • pydoc - • requests.compat - • setuptools.config._validate_pyproject.formats - • urllib.request - • urllib3._request_methods - • urllib3.poolmanager - • xml.sax.saxutils - • xmlrpc.client - -
- -
- -
- - urllib.request -SourceModule
-imports: - _scproxy - • base64 - • bisect - • contextlib - • email - • email.utils - • fnmatch - • ftplib - • getpass - • hashlib - • http.client - • http.cookiejar - • io - • ipaddress - • mimetypes - • nturl2path - • os - • re - • socket - • ssl - • string - • sys - • tempfile - • time - • urllib - • urllib.error - • urllib.parse - • urllib.response - • warnings - • winreg - -
-
-imported by: - http.cookiejar - • requests.compat - • setuptools._vendor.jaraco.context - • setuptools.config._validate_pyproject.formats - • xml.sax.saxutils - -
- -
- -
- - urllib.response -SourceModule
-imports: - tempfile - • urllib - -
-
-imported by: - urllib.error - • urllib.request - -
- -
- -
- - urllib3 -Package
-imports: - __future__ - • logging - • ssl - • sys - • typing - • urllib3 - • urllib3._base_connection - • urllib3._collections - • urllib3._version - • urllib3.connectionpool - • urllib3.contrib.emscripten - • urllib3.exceptions - • urllib3.filepost - • urllib3.poolmanager - • urllib3.response - • urllib3.util.request - • urllib3.util.retry - • urllib3.util.timeout - • warnings - -
-
-imported by: - requests - • requests.compat - • urllib3 - • urllib3._base_connection - • urllib3._collections - • urllib3._request_methods - • urllib3._version - • urllib3.connection - • urllib3.connectionpool - • urllib3.contrib - • urllib3.contrib.pyopenssl - • urllib3.exceptions - • urllib3.fields - • urllib3.filepost - • urllib3.http2 - • urllib3.poolmanager - • urllib3.response - • urllib3.util - -
- -
- -
- - urllib3._base_connection -SourceModule
-imports: - __future__ - • ssl - • typing - • urllib3 - • urllib3.response - • urllib3.util.connection - • urllib3.util.timeout - • urllib3.util.url - -
-
-imported by: - urllib3 - • urllib3._request_methods - • urllib3.connection - • urllib3.connectionpool - • urllib3.contrib.emscripten.connection - • urllib3.contrib.emscripten.request - • urllib3.contrib.emscripten.response - • urllib3.http2.connection - • urllib3.response - • urllib3.util.connection - -
- -
- -
- - urllib3._collections -SourceModule
-imports: - __future__ - • collections - • enum - • threading - • typing - • typing_extensions - • urllib3 - -
-
-imported by: - urllib3 - • urllib3._request_methods - • urllib3.connection - • urllib3.connectionpool - • urllib3.http2.connection - • urllib3.poolmanager - • urllib3.response - -
- -
- -
- - urllib3._request_methods -SourceModule
-imports: - __future__ - • json - • typing - • urllib.parse - • urllib3 - • urllib3._base_connection - • urllib3._collections - • urllib3.filepost - • urllib3.response - -
-
-imported by: - urllib3.connectionpool - • urllib3.poolmanager - -
- -
- -
- - urllib3._version -SourceModule
-imports: - typing - • urllib3 - -
-
-imported by: - urllib3 - • urllib3.connection - -
- -
- -
- - urllib3.connection -SourceModule
-imports: - __future__ - • datetime - • http.client - • logging - • os - • re - • socket - • ssl - • sys - • threading - • typing - • urllib3 - • urllib3._base_connection - • urllib3._collections - • urllib3._version - • urllib3.exceptions - • urllib3.http2 - • urllib3.http2.probe - • urllib3.response - • urllib3.util - • urllib3.util.connection - • urllib3.util.request - • urllib3.util.response - • urllib3.util.ssl_ - • urllib3.util.ssl_match_hostname - • urllib3.util.ssltransport - • urllib3.util.timeout - • urllib3.util.url - • urllib3.util.util - • urllib3.util.wait - • warnings - -
-
-imported by: - urllib3.connectionpool - • urllib3.contrib.emscripten - • urllib3.contrib.emscripten.connection - • urllib3.contrib.socks - • urllib3.exceptions - • urllib3.http2 - • urllib3.http2.connection - • urllib3.poolmanager - • urllib3.response - • urllib3.util.proxy - -
- -
- -
- - urllib3.connectionpool -SourceModule
-imports: - __future__ - • errno - • logging - • queue - • socket - • ssl - • sys - • types - • typing - • typing_extensions - • urllib3 - • urllib3._base_connection - • urllib3._collections - • urllib3._request_methods - • urllib3.connection - • urllib3.exceptions - • urllib3.response - • urllib3.util.connection - • urllib3.util.proxy - • urllib3.util.request - • urllib3.util.retry - • urllib3.util.ssl_match_hostname - • urllib3.util.timeout - • urllib3.util.url - • urllib3.util.util - • warnings - • weakref - -
-
-imported by: - urllib3 - • urllib3.contrib.emscripten - • urllib3.contrib.socks - • urllib3.exceptions - • urllib3.http2 - • urllib3.poolmanager - • urllib3.response - • urllib3.util.retry - -
- -
- -
- - urllib3.contrib -Package
-imports: - urllib3 - • urllib3.contrib.pyopenssl - -
-
-imported by: - requests - • urllib3.contrib.emscripten - • urllib3.contrib.pyopenssl - • urllib3.contrib.socks - -
- -
- -
- - urllib3.contrib.emscripten -Package
-imports: - __future__ - • urllib3.connection - • urllib3.connectionpool - • urllib3.contrib - • urllib3.contrib.emscripten.connection - -
-
-imported by: - urllib3 - • urllib3.contrib.emscripten.connection - • urllib3.contrib.emscripten.fetch - • urllib3.contrib.emscripten.request - • urllib3.contrib.emscripten.response - -
- -
- -
- - urllib3.contrib.emscripten.connection -SourceModule
-imports: - __future__ - • http.client - • os - • typing - • urllib3._base_connection - • urllib3.connection - • urllib3.contrib.emscripten - • urllib3.contrib.emscripten.fetch - • urllib3.contrib.emscripten.request - • urllib3.contrib.emscripten.response - • urllib3.exceptions - • urllib3.response - • urllib3.util.connection - • urllib3.util.timeout - • urllib3.util.url - -
-
-imported by: - urllib3.contrib.emscripten - -
- -
- -
- - urllib3.contrib.emscripten.fetch -SourceModule
-imports: - 'pyodide.ffi' - • __future__ - • email.parser - • importlib.resources - • io - • js - • json - • pyodide - • typing - • typing_extensions - • urllib3.contrib.emscripten - • urllib3.contrib.emscripten.request - • urllib3.contrib.emscripten.response - -
-
-imported by: - urllib3.contrib.emscripten.connection - • urllib3.contrib.emscripten.response - -
- -
- -
- - urllib3.contrib.emscripten.request -SourceModule
-imports: - __future__ - • dataclasses - • urllib3._base_connection - • urllib3.contrib.emscripten - -
-
-imported by: - urllib3.contrib.emscripten.connection - • urllib3.contrib.emscripten.fetch - • urllib3.contrib.emscripten.response - -
- -
- -
- - urllib3.contrib.emscripten.response -SourceModule
-imports: - __future__ - • contextlib - • dataclasses - • http.client - • io - • json - • logging - • typing - • urllib3._base_connection - • urllib3.contrib.emscripten - • urllib3.contrib.emscripten.fetch - • urllib3.contrib.emscripten.request - • urllib3.exceptions - • urllib3.response - • urllib3.util.retry - -
-
-imported by: - urllib3.contrib.emscripten.connection - • urllib3.contrib.emscripten.fetch - -
- -
- -
- - urllib3.contrib.pyopenssl -SourceModule
-imports: - 'OpenSSL.crypto' - • 'cryptography.x509' - • OpenSSL - • __future__ - • cryptography - • idna - • io - • logging - • socket - • ssl - • typing - • urllib3 - • urllib3.contrib - • urllib3.util - -
-
-imported by: - requests - • urllib3.contrib - -
- -
- -
- - urllib3.contrib.socks -SourceModule
-imports: - __future__ - • socket - • socks - • ssl - • typing - • urllib3.connection - • urllib3.connectionpool - • urllib3.contrib - • urllib3.exceptions - • urllib3.poolmanager - • urllib3.util.url - • warnings - -
-
-imported by: - requests.adapters - -
- -
- -
- - urllib3.exceptions -SourceModule
-imports: - __future__ - • email.errors - • http.client - • socket - • typing - • urllib3 - • urllib3.connection - • urllib3.connectionpool - • urllib3.response - • urllib3.util.retry - • warnings - -
-
-imported by: - requests - • requests.adapters - • requests.exceptions - • requests.models - • urllib3 - • urllib3.connection - • urllib3.connectionpool - • urllib3.contrib.emscripten.connection - • urllib3.contrib.emscripten.response - • urllib3.contrib.socks - • urllib3.http2.connection - • urllib3.poolmanager - • urllib3.response - • urllib3.util.connection - • urllib3.util.request - • urllib3.util.response - • urllib3.util.retry - • urllib3.util.ssl_ - • urllib3.util.ssltransport - • urllib3.util.timeout - • urllib3.util.url - -
- -
- -
- - urllib3.fields -SourceModule
-imports: - __future__ - • email.utils - • mimetypes - • typing - • urllib3 - • warnings - -
-
-imported by: - requests.models - • urllib3.filepost - -
- -
- -
- - urllib3.filepost -SourceModule
-imports: - __future__ - • binascii - • codecs - • io - • os - • typing - • urllib3 - • urllib3.fields - -
-
-imported by: - requests.models - • urllib3 - • urllib3._request_methods - -
- -
- -
- - urllib3.http2 -Package
-imports: - __future__ - • importlib.metadata - • typing - • urllib3 - • urllib3.connection - • urllib3.connectionpool - • urllib3.http2.connection - • urllib3.http2.probe - • urllib3.util - • urllib3.util.ssl_ - -
-
-imported by: - urllib3.connection - • urllib3.http2.connection - • urllib3.http2.probe - -
- -
- -
- - urllib3.http2.connection -SourceModule
-imports: - 'h2.connection' - • 'h2.events' - • __future__ - • h2 - • logging - • re - • threading - • types - • typing - • urllib3._base_connection - • urllib3._collections - • urllib3.connection - • urllib3.exceptions - • urllib3.http2 - • urllib3.response - -
-
-imported by: - urllib3.http2 - -
- -
- -
- - urllib3.http2.probe -SourceModule
-imports: - __future__ - • threading - • urllib3.http2 - -
-
-imported by: - urllib3.connection - • urllib3.http2 - -
- -
- -
- - urllib3.poolmanager -SourceModule
-imports: - __future__ - • functools - • logging - • ssl - • types - • typing - • typing_extensions - • urllib.parse - • urllib3 - • urllib3._collections - • urllib3._request_methods - • urllib3.connection - • urllib3.connectionpool - • urllib3.exceptions - • urllib3.response - • urllib3.util.connection - • urllib3.util.proxy - • urllib3.util.retry - • urllib3.util.timeout - • urllib3.util.url - • warnings - -
-
-imported by: - requests.adapters - • urllib3 - • urllib3.contrib.socks - -
- -
- -
- - urllib3.response -SourceModule
-imports: - __future__ - • backports - • brotli - • brotlicffi - • collections - • compression - • contextlib - • http.client - • io - • json - • logging - • setuptools._vendor.backports.zstd - • socket - • sys - • typing - • urllib3 - • urllib3._base_connection - • urllib3._collections - • urllib3.connection - • urllib3.connectionpool - • urllib3.exceptions - • urllib3.util - • urllib3.util.response - • urllib3.util.retry - • warnings - • zlib - -
-
-imported by: - urllib3 - • urllib3._base_connection - • urllib3._request_methods - • urllib3.connection - • urllib3.connectionpool - • urllib3.contrib.emscripten.connection - • urllib3.contrib.emscripten.response - • urllib3.exceptions - • urllib3.http2.connection - • urllib3.poolmanager - • urllib3.util.retry - -
- -
- -
- - urllib3.util -Package
-imports: - __future__ - • urllib3 - • urllib3.util.connection - • urllib3.util.request - • urllib3.util.response - • urllib3.util.retry - • urllib3.util.ssl_ - • urllib3.util.timeout - • urllib3.util.url - • urllib3.util.wait - -
-
-imported by: - requests.adapters - • requests.models - • requests.utils - • urllib3.connection - • urllib3.contrib.pyopenssl - • urllib3.http2 - • urllib3.response - • urllib3.util.connection - • urllib3.util.proxy - • urllib3.util.request - • urllib3.util.response - • urllib3.util.retry - • urllib3.util.ssl_ - • urllib3.util.ssl_match_hostname - • urllib3.util.ssltransport - • urllib3.util.timeout - • urllib3.util.url - • urllib3.util.util - • urllib3.util.wait - -
- -
- -
- - urllib3.util.connection -SourceModule
-imports: - __future__ - • socket - • typing - • urllib3._base_connection - • urllib3.exceptions - • urllib3.util - • urllib3.util.timeout - -
-
-imported by: - urllib3._base_connection - • urllib3.connection - • urllib3.connectionpool - • urllib3.contrib.emscripten.connection - • urllib3.poolmanager - • urllib3.util - -
- -
- -
- - urllib3.util.proxy -SourceModule
-imports: - __future__ - • typing - • urllib3.connection - • urllib3.util - • urllib3.util.url - -
-
-imported by: - urllib3.connectionpool - • urllib3.poolmanager - -
- -
- -
- - urllib3.util.request -SourceModule
-imports: - __future__ - • backports - • base64 - • brotli - • brotlicffi - • compression - • enum - • io - • setuptools._vendor.backports.zstd - • sys - • typing - • urllib3.exceptions - • urllib3.util - • urllib3.util.util - -
-
-imported by: - urllib3 - • urllib3.connection - • urllib3.connectionpool - • urllib3.util - -
- -
- -
- - urllib3.util.response -SourceModule
-imports: - __future__ - • email.errors - • http.client - • urllib3.exceptions - • urllib3.util - -
-
-imported by: - urllib3.connection - • urllib3.response - • urllib3.util - -
- -
- -
- - urllib3.util.retry -SourceModule
-imports: - __future__ - • email - • itertools - • logging - • random - • re - • time - • types - • typing - • typing_extensions - • urllib3.connectionpool - • urllib3.exceptions - • urllib3.response - • urllib3.util - • urllib3.util.util - -
-
-imported by: - requests.adapters - • urllib3 - • urllib3.connectionpool - • urllib3.contrib.emscripten.response - • urllib3.exceptions - • urllib3.poolmanager - • urllib3.response - • urllib3.util - -
- -
- -
- - urllib3.util.ssl_ -SourceModule
-imports: - __future__ - • binascii - • hashlib - • hmac - • os - • socket - • ssl - • sys - • typing - • urllib3.exceptions - • urllib3.util - • urllib3.util.ssltransport - • urllib3.util.url - • warnings - -
-
-imported by: - urllib3.connection - • urllib3.http2 - • urllib3.util - • urllib3.util.ssl_match_hostname - • urllib3.util.ssltransport - -
- -
- -
- - urllib3.util.ssl_match_hostname -SourceModule
-imports: - __future__ - • ipaddress - • re - • typing - • urllib3.util - • urllib3.util.ssl_ - -
-
-imported by: - urllib3.connection - • urllib3.connectionpool - -
- -
- -
- - urllib3.util.ssltransport -SourceModule
-imports: - __future__ - • io - • socket - • ssl - • typing - • typing_extensions - • urllib3.exceptions - • urllib3.util - • urllib3.util.ssl_ - -
-
-imported by: - urllib3.connection - • urllib3.util.ssl_ - -
- -
- -
- - urllib3.util.timeout -SourceModule
-imports: - __future__ - • enum - • socket - • time - • typing - • urllib3.exceptions - • urllib3.util - -
-
-imported by: - urllib3 - • urllib3._base_connection - • urllib3.connection - • urllib3.connectionpool - • urllib3.contrib.emscripten.connection - • urllib3.poolmanager - • urllib3.util - • urllib3.util.connection - -
- -
- -
- - urllib3.util.url -SourceModule
-imports: - __future__ - • idna - • re - • typing - • urllib3.exceptions - • urllib3.util - • urllib3.util.util - -
-
-imported by: - urllib3._base_connection - • urllib3.connection - • urllib3.connectionpool - • urllib3.contrib.emscripten.connection - • urllib3.contrib.socks - • urllib3.poolmanager - • urllib3.util - • urllib3.util.proxy - • urllib3.util.ssl_ - -
- -
- -
- - urllib3.util.util -SourceModule
-imports: - __future__ - • types - • typing - • urllib3.util - -
-
-imported by: - urllib3.connection - • urllib3.connectionpool - • urllib3.util.request - • urllib3.util.retry - • urllib3.util.url - -
- -
- -
- - urllib3.util.wait -SourceModule
-imports: - __future__ - • functools - • select - • socket - • urllib3.util - -
-
-imported by: - urllib3.connection - • urllib3.util - -
- -
- -
- - usercustomize -MissingModule
-imported by: - site - -
- -
- -
- - vms_lib -MissingModule
-imported by: - platform - -
- -
- -
- - warnings -SourceModule
-imports: - _warnings - • builtins - • linecache - • re - • sys - • traceback - • tracemalloc - -
-
-imported by: - _collections_abc - • _distutils_hack - • _pydatetime - • argparse - • ast - • asyncio.base_events - • asyncio.base_subprocess - • asyncio.events - • asyncio.proactor_events - • asyncio.selector_events - • asyncio.sslproto - • asyncio.streams - • asyncio.tasks - • asyncio.unix_events - • asyncio.windows_utils - • calendar - • charset_normalizer.legacy - • client.py - • configparser - • email.utils - • enum - • getpass - • gettext - • gzip - • hmac - • http.cookiejar - • importlib - • importlib.abc - • importlib.metadata - • importlib.metadata._adapters - • importlib.resources._common - • importlib.resources._legacy - • locale - • logging - • multiprocessing.forkserver - • multiprocessing.pool - • multiprocessing.resource_tracker - • os - • packaging._manylinux - • packaging.version - • pathlib - • pkgutil - • pydoc - • random - • re - • re._parser - • requests - • requests.adapters - • requests.auth - • requests.utils - • runpy - • setuptools._distutils._msvccompiler - • setuptools._distutils.command.bdist - • setuptools._distutils.compilers.C.base - • setuptools._distutils.compilers.C.msvc - • setuptools._distutils.dist - • setuptools._distutils.extension - • setuptools._distutils.log - • setuptools._distutils.spawn - • setuptools._distutils.sysconfig - • setuptools._distutils.util - • setuptools._distutils.version - • setuptools._vendor.backports.tarfile - • setuptools._vendor.jaraco.functools - • setuptools._vendor.more_itertools.more - • setuptools._vendor.packaging._manylinux - • setuptools._vendor.packaging.version - • setuptools._vendor.tomli._parser - • setuptools.command.bdist_wheel - • setuptools.warnings - • shutil - • sre_compile - • sre_constants - • sre_parse - • ssl - • subprocess - • sysconfig - • tarfile - • tempfile - • threading - • typing - • unittest.async_case - • unittest.case - • unittest.loader - • unittest.main - • unittest.runner - • urllib.parse - • urllib.request - • urllib3 - • urllib3.connection - • urllib3.connectionpool - • urllib3.contrib.socks - • urllib3.exceptions - • urllib3.fields - • urllib3.poolmanager - • urllib3.response - • urllib3.util.ssl_ - • webbrowser - • zipfile - -
- -
- -
- - weakref -SourceModule
-imports: - _collections_abc - • _weakref - • _weakrefset - • atexit - • copy - • gc - • itertools - • sys - -
-
-imported by: - _threading_local - • asyncio.base_events - • asyncio.selector_events - • asyncio.streams - • asyncio.tasks - • asyncio.windows_events - • client.py - • concurrent.futures.process - • concurrent.futures.thread - • copy - • functools - • logging - • multiprocessing.dummy - • multiprocessing.queues - • multiprocessing.sharedctypes - • multiprocessing.util - • tempfile - • unittest.signals - • urllib3.connectionpool - • xml.sax.expatreader - -
- -
- -
- - webbrowser -SourceModule
-imports: - copy - • getopt - • os - • shlex - • shutil - • subprocess - • sys - • threading - • warnings - -
-
-imported by: - pydoc - -
- -
- -
- - wheel -AliasNode
-imports: - setuptools._vendor.wheel - -
-
-imported by: - setuptools._vendor.wheel.macosx_libfile - • setuptools._vendor.wheel.wheelfile - -
- -
- -
- - winreg -MissingModule
-imported by: - importlib._bootstrap_external - • mimetypes - • platform - • requests.utils - • setuptools._distutils.compilers.C.msvc - • setuptools.msvc - • urllib.request - -
- -
- -
- - xml -Package
-imports: - xml.sax.expatreader - • xml.sax.xmlreader - -
-
-imported by: - xml.parsers - • xml.sax - -
- -
- -
- - xml.parsers -Package
-imports: - xml - • xml.parsers.expat - -
-
-imported by: - xml.parsers.expat - • xml.sax.expatreader - • xmlrpc.client - -
- -
- -
- - xml.parsers.expat -SourceModule
-imports: - pyexpat - • sys - • xml.parsers - -
-
-imported by: - xml.parsers - • xml.sax.expatreader - • xmlrpc.client - -
- -
- -
- - xml.sax -Package
-imports: - io - • os - • sys - • xml - • xml.sax - • xml.sax._exceptions - • xml.sax.expatreader - • xml.sax.handler - • xml.sax.saxutils - • xml.sax.xmlreader - -
-
-imported by: - xml.sax - • xml.sax._exceptions - • xml.sax.expatreader - • xml.sax.handler - • xml.sax.saxutils - • xml.sax.xmlreader - -
- -
- -
- - xml.sax._exceptions -SourceModule
-imports: - xml.sax - -
-
-imported by: - xml.sax - • xml.sax.expatreader - • xml.sax.xmlreader - -
- -
- -
- - xml.sax.expatreader -SourceModule
-imports: - _weakref - • weakref - • xml.parsers - • xml.parsers.expat - • xml.sax - • xml.sax._exceptions - • xml.sax.handler - • xml.sax.saxutils - • xml.sax.xmlreader - -
-
-imported by: - xml - • xml.sax - -
- -
- -
- - xml.sax.handler -SourceModule
-imports: - xml.sax - -
-
-imported by: - xml.sax - • xml.sax.expatreader - • xml.sax.saxutils - • xml.sax.xmlreader - -
- -
- -
- - xml.sax.saxutils -SourceModule
-imports: - codecs - • io - • os - • sys - • urllib.parse - • urllib.request - • xml.sax - • xml.sax.handler - • xml.sax.xmlreader - -
-
-imported by: - xml.sax - • xml.sax.expatreader - • xml.sax.xmlreader - -
- -
- -
- - xml.sax.xmlreader -SourceModule
-imports: - xml.sax - • xml.sax._exceptions - • xml.sax.handler - • xml.sax.saxutils - -
-
-imported by: - xml - • xml.sax - • xml.sax.expatreader - • xml.sax.saxutils - -
- -
- -
- - xmlrpc -Package
-imported by: - xmlrpc.client - -
- -
- -
- - xmlrpc.client -SourceModule
-imports: - base64 - • datetime - • decimal - • errno - • gzip - • http.client - • io - • sys - • time - • urllib.parse - • xml.parsers - • xml.parsers.expat - • xmlrpc - -
-
-imported by: - multiprocessing.connection - -
- -
- -
- - zipfile -Package
-imports: - argparse - • binascii - • bz2 - • importlib.util - • io - • lzma - • os - • py_compile - • shutil - • stat - • struct - • sys - • threading - • time - • warnings - • zipfile._path - • zlib - -
-
-imported by: - importlib.metadata - • importlib.resources.readers - • pyi_rth_inspect.py - • requests.utils - • setuptools._distutils.archive_util - • setuptools._vendor.wheel.wheelfile - • setuptools._vendor.zipp - • setuptools.archive_util - • setuptools.command.bdist_egg - • setuptools.command.bdist_wheel - • setuptools.wheel - • shutil - • zipfile._path - -
- -
- -
- - zipfile._path -Package
-imports: - contextlib - • io - • itertools - • pathlib - • posixpath - • re - • zipfile - • zipfile._path.glob - -
-
-imported by: - zipfile - • zipfile._path.glob - -
- -
- -
- - zipfile._path.glob -SourceModule
-imports: - re - • zipfile._path - -
-
-imported by: - zipfile._path - -
- -
- -
- - zipimport -SourceModule
-imports: - _frozen_importlib - • _frozen_importlib_external - • _imp - • _io - • _warnings - • importlib.readers - • marshal - • sys - • time - • zlib - -
-
-imported by: - pkgutil - -
- -
- -
- - zipp -AliasNode
-imports: - setuptools._vendor.zipp - -
-
-imported by: - setuptools._vendor.zipp.compat - • setuptools._vendor.zipp.compat.overlay - -
- -
- -
- - zlib (builtin module)
-imported by: - encodings.zlib_codec - • gzip - • setuptools._vendor.backports.tarfile - • shutil - • tarfile - • urllib3.response - • zipfile - • zipimport - -
- -
- - - diff --git a/dist/FactorioSync b/dist/FactorioSync deleted file mode 100755 index ea638a5..0000000 Binary files a/dist/FactorioSync and /dev/null differ diff --git a/venv/bin/Activate.ps1 b/venv/bin/Activate.ps1 deleted file mode 100644 index b49d77b..0000000 --- a/venv/bin/Activate.ps1 +++ /dev/null @@ -1,247 +0,0 @@ -<# -.Synopsis -Activate a Python virtual environment for the current PowerShell session. - -.Description -Pushes the python executable for a virtual environment to the front of the -$Env:PATH environment variable and sets the prompt to signify that you are -in a Python virtual environment. Makes use of the command line switches as -well as the `pyvenv.cfg` file values present in the virtual environment. - -.Parameter VenvDir -Path to the directory that contains the virtual environment to activate. The -default value for this is the parent of the directory that the Activate.ps1 -script is located within. - -.Parameter Prompt -The prompt prefix to display when this virtual environment is activated. By -default, this prompt is the name of the virtual environment folder (VenvDir) -surrounded by parentheses and followed by a single space (ie. '(.venv) '). - -.Example -Activate.ps1 -Activates the Python virtual environment that contains the Activate.ps1 script. - -.Example -Activate.ps1 -Verbose -Activates the Python virtual environment that contains the Activate.ps1 script, -and shows extra information about the activation as it executes. - -.Example -Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv -Activates the Python virtual environment located in the specified location. - -.Example -Activate.ps1 -Prompt "MyPython" -Activates the Python virtual environment that contains the Activate.ps1 script, -and prefixes the current prompt with the specified string (surrounded in -parentheses) while the virtual environment is active. - -.Notes -On Windows, it may be required to enable this Activate.ps1 script by setting the -execution policy for the user. You can do this by issuing the following PowerShell -command: - -PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser - -For more information on Execution Policies: -https://go.microsoft.com/fwlink/?LinkID=135170 - -#> -Param( - [Parameter(Mandatory = $false)] - [String] - $VenvDir, - [Parameter(Mandatory = $false)] - [String] - $Prompt -) - -<# Function declarations --------------------------------------------------- #> - -<# -.Synopsis -Remove all shell session elements added by the Activate script, including the -addition of the virtual environment's Python executable from the beginning of -the PATH variable. - -.Parameter NonDestructive -If present, do not remove this function from the global namespace for the -session. - -#> -function global:deactivate ([switch]$NonDestructive) { - # Revert to original values - - # The prior prompt: - if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { - Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt - Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT - } - - # The prior PYTHONHOME: - if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { - Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME - Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME - } - - # The prior PATH: - if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { - Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH - Remove-Item -Path Env:_OLD_VIRTUAL_PATH - } - - # Just remove the VIRTUAL_ENV altogether: - if (Test-Path -Path Env:VIRTUAL_ENV) { - Remove-Item -Path env:VIRTUAL_ENV - } - - # Just remove VIRTUAL_ENV_PROMPT altogether. - if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { - Remove-Item -Path env:VIRTUAL_ENV_PROMPT - } - - # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: - if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { - Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force - } - - # Leave deactivate function in the global namespace if requested: - if (-not $NonDestructive) { - Remove-Item -Path function:deactivate - } -} - -<# -.Description -Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the -given folder, and returns them in a map. - -For each line in the pyvenv.cfg file, if that line can be parsed into exactly -two strings separated by `=` (with any amount of whitespace surrounding the =) -then it is considered a `key = value` line. The left hand string is the key, -the right hand is the value. - -If the value starts with a `'` or a `"` then the first and last character is -stripped from the value before being captured. - -.Parameter ConfigDir -Path to the directory that contains the `pyvenv.cfg` file. -#> -function Get-PyVenvConfig( - [String] - $ConfigDir -) { - Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" - - # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). - $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue - - # An empty map will be returned if no config file is found. - $pyvenvConfig = @{ } - - if ($pyvenvConfigPath) { - - Write-Verbose "File exists, parse `key = value` lines" - $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath - - $pyvenvConfigContent | ForEach-Object { - $keyval = $PSItem -split "\s*=\s*", 2 - if ($keyval[0] -and $keyval[1]) { - $val = $keyval[1] - - # Remove extraneous quotations around a string value. - if ("'""".Contains($val.Substring(0, 1))) { - $val = $val.Substring(1, $val.Length - 2) - } - - $pyvenvConfig[$keyval[0]] = $val - Write-Verbose "Adding Key: '$($keyval[0])'='$val'" - } - } - } - return $pyvenvConfig -} - - -<# Begin Activate script --------------------------------------------------- #> - -# Determine the containing directory of this script -$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition -$VenvExecDir = Get-Item -Path $VenvExecPath - -Write-Verbose "Activation script is located in path: '$VenvExecPath'" -Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" -Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" - -# Set values required in priority: CmdLine, ConfigFile, Default -# First, get the location of the virtual environment, it might not be -# VenvExecDir if specified on the command line. -if ($VenvDir) { - Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" -} -else { - Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." - $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") - Write-Verbose "VenvDir=$VenvDir" -} - -# Next, read the `pyvenv.cfg` file to determine any required value such -# as `prompt`. -$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir - -# Next, set the prompt from the command line, or the config file, or -# just use the name of the virtual environment folder. -if ($Prompt) { - Write-Verbose "Prompt specified as argument, using '$Prompt'" -} -else { - Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" - if ($pyvenvCfg -and $pyvenvCfg['prompt']) { - Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" - $Prompt = $pyvenvCfg['prompt']; - } - else { - Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)" - Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" - $Prompt = Split-Path -Path $venvDir -Leaf - } -} - -Write-Verbose "Prompt = '$Prompt'" -Write-Verbose "VenvDir='$VenvDir'" - -# Deactivate any currently active virtual environment, but leave the -# deactivate function in place. -deactivate -nondestructive - -# Now set the environment variable VIRTUAL_ENV, used by many tools to determine -# that there is an activated venv. -$env:VIRTUAL_ENV = $VenvDir - -if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { - - Write-Verbose "Setting prompt to '$Prompt'" - - # Set the prompt to include the env name - # Make sure _OLD_VIRTUAL_PROMPT is global - function global:_OLD_VIRTUAL_PROMPT { "" } - Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT - New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt - - function global:prompt { - Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " - _OLD_VIRTUAL_PROMPT - } - $env:VIRTUAL_ENV_PROMPT = $Prompt -} - -# Clear PYTHONHOME -if (Test-Path -Path Env:PYTHONHOME) { - Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME - Remove-Item -Path Env:PYTHONHOME -} - -# Add the venv to the PATH -Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH -$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/venv/bin/activate b/venv/bin/activate deleted file mode 100644 index 5f6f1c3..0000000 --- a/venv/bin/activate +++ /dev/null @@ -1,70 +0,0 @@ -# This file must be used with "source bin/activate" *from bash* -# You cannot run it directly - -deactivate () { - # reset old environment variables - if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then - PATH="${_OLD_VIRTUAL_PATH:-}" - export PATH - unset _OLD_VIRTUAL_PATH - fi - if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then - PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" - export PYTHONHOME - unset _OLD_VIRTUAL_PYTHONHOME - fi - - # Call hash to forget past commands. Without forgetting - # past commands the $PATH changes we made may not be respected - hash -r 2> /dev/null - - if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then - PS1="${_OLD_VIRTUAL_PS1:-}" - export PS1 - unset _OLD_VIRTUAL_PS1 - fi - - unset VIRTUAL_ENV - unset VIRTUAL_ENV_PROMPT - if [ ! "${1:-}" = "nondestructive" ] ; then - # Self destruct! - unset -f deactivate - fi -} - -# unset irrelevant variables -deactivate nondestructive - -# on Windows, a path can contain colons and backslashes and has to be converted: -if [ "${OSTYPE:-}" = "cygwin" ] || [ "${OSTYPE:-}" = "msys" ] ; then - # transform D:\path\to\venv to /d/path/to/venv on MSYS - # and to /cygdrive/d/path/to/venv on Cygwin - export VIRTUAL_ENV=$(cygpath '/home/borderban/Рабочий стол/client-py/venv') -else - # use the path as-is - export VIRTUAL_ENV='/home/borderban/Рабочий стол/client-py/venv' -fi - -_OLD_VIRTUAL_PATH="$PATH" -PATH="$VIRTUAL_ENV/"bin":$PATH" -export PATH - -# unset PYTHONHOME if set -# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) -# could use `if (set -u; : $PYTHONHOME) ;` in bash -if [ -n "${PYTHONHOME:-}" ] ; then - _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" - unset PYTHONHOME -fi - -if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then - _OLD_VIRTUAL_PS1="${PS1:-}" - PS1='(venv) '"${PS1:-}" - export PS1 - VIRTUAL_ENV_PROMPT='(venv) ' - export VIRTUAL_ENV_PROMPT -fi - -# Call hash to forget past commands. Without forgetting -# past commands the $PATH changes we made may not be respected -hash -r 2> /dev/null diff --git a/venv/bin/activate.csh b/venv/bin/activate.csh deleted file mode 100644 index be4817e..0000000 --- a/venv/bin/activate.csh +++ /dev/null @@ -1,27 +0,0 @@ -# This file must be used with "source bin/activate.csh" *from csh*. -# You cannot run it directly. - -# Created by Davide Di Blasi . -# Ported to Python 3.3 venv by Andrew Svetlov - -alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate' - -# Unset irrelevant variables. -deactivate nondestructive - -setenv VIRTUAL_ENV '/home/borderban/Рабочий стол/client-py/venv' - -set _OLD_VIRTUAL_PATH="$PATH" -setenv PATH "$VIRTUAL_ENV/"bin":$PATH" - - -set _OLD_VIRTUAL_PROMPT="$prompt" - -if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then - set prompt = '(venv) '"$prompt" - setenv VIRTUAL_ENV_PROMPT '(venv) ' -endif - -alias pydoc python -m pydoc - -rehash diff --git a/venv/bin/activate.fish b/venv/bin/activate.fish deleted file mode 100644 index b8844c3..0000000 --- a/venv/bin/activate.fish +++ /dev/null @@ -1,69 +0,0 @@ -# This file must be used with "source /bin/activate.fish" *from fish* -# (https://fishshell.com/). You cannot run it directly. - -function deactivate -d "Exit virtual environment and return to normal shell environment" - # reset old environment variables - if test -n "$_OLD_VIRTUAL_PATH" - set -gx PATH $_OLD_VIRTUAL_PATH - set -e _OLD_VIRTUAL_PATH - end - if test -n "$_OLD_VIRTUAL_PYTHONHOME" - set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME - set -e _OLD_VIRTUAL_PYTHONHOME - end - - if test -n "$_OLD_FISH_PROMPT_OVERRIDE" - set -e _OLD_FISH_PROMPT_OVERRIDE - # prevents error when using nested fish instances (Issue #93858) - if functions -q _old_fish_prompt - functions -e fish_prompt - functions -c _old_fish_prompt fish_prompt - functions -e _old_fish_prompt - end - end - - set -e VIRTUAL_ENV - set -e VIRTUAL_ENV_PROMPT - if test "$argv[1]" != "nondestructive" - # Self-destruct! - functions -e deactivate - end -end - -# Unset irrelevant variables. -deactivate nondestructive - -set -gx VIRTUAL_ENV '/home/borderban/Рабочий стол/client-py/venv' - -set -gx _OLD_VIRTUAL_PATH $PATH -set -gx PATH "$VIRTUAL_ENV/"bin $PATH - -# Unset PYTHONHOME if set. -if set -q PYTHONHOME - set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME - set -e PYTHONHOME -end - -if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" - # fish uses a function instead of an env var to generate the prompt. - - # Save the current fish_prompt function as the function _old_fish_prompt. - functions -c fish_prompt _old_fish_prompt - - # With the original prompt function renamed, we can override with our own. - function fish_prompt - # Save the return status of the last command. - set -l old_status $status - - # Output the venv prompt; color taken from the blue of the Python logo. - printf "%s%s%s" (set_color 4B8BBE) '(venv) ' (set_color normal) - - # Restore the return status of the previous command. - echo "exit $old_status" | . - # Output the original/"old" prompt. - _old_fish_prompt - end - - set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" - set -gx VIRTUAL_ENV_PROMPT '(venv) ' -end diff --git a/venv/bin/autopep8 b/venv/bin/autopep8 deleted file mode 100755 index 69bbf73..0000000 --- a/venv/bin/autopep8 +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -import sys -from autopep8 import main -if __name__ == '__main__': - sys.argv[0] = sys.argv[0].removesuffix('.exe') - sys.exit(main()) diff --git a/venv/bin/black b/venv/bin/black deleted file mode 100755 index f56f00a..0000000 --- a/venv/bin/black +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -import sys -from black import patched_main -if __name__ == '__main__': - sys.argv[0] = sys.argv[0].removesuffix('.exe') - sys.exit(patched_main()) diff --git a/venv/bin/blackd b/venv/bin/blackd deleted file mode 100755 index 1095a39..0000000 --- a/venv/bin/blackd +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -import sys -from blackd import patched_main -if __name__ == '__main__': - sys.argv[0] = sys.argv[0].removesuffix('.exe') - sys.exit(patched_main()) diff --git a/venv/bin/flake8 b/venv/bin/flake8 deleted file mode 100755 index ba3b4de..0000000 --- a/venv/bin/flake8 +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -import sys -from flake8.main.cli import main -if __name__ == '__main__': - sys.argv[0] = sys.argv[0].removesuffix('.exe') - sys.exit(main()) diff --git a/venv/bin/get_gprof b/venv/bin/get_gprof deleted file mode 100755 index f3c5d81..0000000 --- a/venv/bin/get_gprof +++ /dev/null @@ -1,75 +0,0 @@ -#!/home/borderban/Рабочий стол/client-py/venv/bin/python3 -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE -''' -build profile graph for the given instance - -running: - $ get_gprof - -executes: - gprof2dot -f pstats .prof | dot -Tpng -o .call.png - -where: - are arguments for gprof2dot, such as "-n 5 -e 5" - is code to create the instance to profile - is the class of the instance (i.e. type(instance)) - -For example: - $ get_gprof -n 5 -e 1 "import numpy; numpy.array([1,2])" - -will create 'ndarray.call.png' with the profile graph for numpy.array([1,2]), -where '-n 5' eliminates nodes below 5% threshold, similarly '-e 1' eliminates -edges below 1% threshold -''' - -if __name__ == "__main__": - import sys - if len(sys.argv) < 2: - print ("Please provide an object instance (e.g. 'import math; math.pi')") - sys.exit() - # grab args for gprof2dot - args = sys.argv[1:-1] - args = ' '.join(args) - # last arg builds the object - obj = sys.argv[-1] - obj = obj.split(';') - # multi-line prep for generating an instance - for line in obj[:-1]: - exec(line) - # one-line generation of an instance - try: - obj = eval(obj[-1]) - except Exception: - print ("Error processing object instance") - sys.exit() - - # get object 'name' - objtype = type(obj) - name = getattr(objtype, '__name__', getattr(objtype, '__class__', objtype)) - - # profile dumping an object - import dill - import os - import cProfile - #name = os.path.splitext(os.path.basename(__file__))[0] - cProfile.run("dill.dumps(obj)", filename="%s.prof" % name) - msg = "gprof2dot -f pstats %s %s.prof | dot -Tpng -o %s.call.png" % (args, name, name) - try: - res = os.system(msg) - except Exception: - print ("Please verify install of 'gprof2dot' to view profile graphs") - if res: - print ("Please verify install of 'gprof2dot' to view profile graphs") - - # get stats - f_prof = "%s.prof" % name - import pstats - stats = pstats.Stats(f_prof, stream=sys.stdout) - stats.strip_dirs().sort_stats('cumtime') - stats.print_stats(20) #XXX: save to file instead of print top 20? - os.remove(f_prof) diff --git a/venv/bin/get_objgraph b/venv/bin/get_objgraph deleted file mode 100755 index 23dc3a6..0000000 --- a/venv/bin/get_objgraph +++ /dev/null @@ -1,54 +0,0 @@ -#!/home/borderban/Рабочий стол/client-py/venv/bin/python3 -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE -""" -display the reference paths for objects in ``dill.types`` or a .pkl file - -Notes: - the generated image is useful in showing the pointer references in - objects that are or can be pickled. Any object in ``dill.objects`` - listed in ``dill.load_types(picklable=True, unpicklable=True)`` works. - -Examples:: - - $ get_objgraph ArrayType - Image generated as ArrayType.png -""" - -import dill as pickle -#pickle.debug.trace(True) -#import pickle - -# get all objects for testing -from dill import load_types -load_types(pickleable=True,unpickleable=True) -from dill import objects - -if __name__ == "__main__": - import sys - if len(sys.argv) != 2: - print ("Please provide exactly one file or type name (e.g. 'IntType')") - msg = "\n" - for objtype in list(objects.keys())[:40]: - msg += objtype + ', ' - print (msg + "...") - else: - objtype = str(sys.argv[-1]) - try: - obj = objects[objtype] - except KeyError: - obj = pickle.load(open(objtype,'rb')) - import os - objtype = os.path.splitext(objtype)[0] - try: - import objgraph - objgraph.show_refs(obj, filename=objtype+'.png') - except ImportError: - print ("Please install 'objgraph' to view object graphs") - - -# EOF diff --git a/venv/bin/isort b/venv/bin/isort deleted file mode 100755 index 3bb44f6..0000000 --- a/venv/bin/isort +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -import sys -from isort.main import main -if __name__ == '__main__': - sys.argv[0] = sys.argv[0].removesuffix('.exe') - sys.exit(main()) diff --git a/venv/bin/isort-identify-imports b/venv/bin/isort-identify-imports deleted file mode 100755 index 9ba8146..0000000 --- a/venv/bin/isort-identify-imports +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -import sys -from isort.main import identify_imports_main -if __name__ == '__main__': - sys.argv[0] = sys.argv[0].removesuffix('.exe') - sys.exit(identify_imports_main()) diff --git a/venv/bin/normalizer b/venv/bin/normalizer deleted file mode 100755 index 1ccadd0..0000000 --- a/venv/bin/normalizer +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -import sys -from charset_normalizer.cli import cli_detect -if __name__ == '__main__': - sys.argv[0] = sys.argv[0].removesuffix('.exe') - sys.exit(cli_detect()) diff --git a/venv/bin/pip b/venv/bin/pip deleted file mode 100755 index 50dc07f..0000000 --- a/venv/bin/pip +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/pip3 b/venv/bin/pip3 deleted file mode 100755 index 50dc07f..0000000 --- a/venv/bin/pip3 +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/pip3.12 b/venv/bin/pip3.12 deleted file mode 100755 index 50dc07f..0000000 --- a/venv/bin/pip3.12 +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/pycodestyle b/venv/bin/pycodestyle deleted file mode 100755 index 7999c96..0000000 --- a/venv/bin/pycodestyle +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -import sys -from pycodestyle import _main -if __name__ == '__main__': - sys.argv[0] = sys.argv[0].removesuffix('.exe') - sys.exit(_main()) diff --git a/venv/bin/pydocstyle b/venv/bin/pydocstyle deleted file mode 100755 index 5468781..0000000 --- a/venv/bin/pydocstyle +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -import sys -from pydocstyle.cli import main -if __name__ == '__main__': - sys.argv[0] = sys.argv[0].removesuffix('.exe') - sys.exit(main()) diff --git a/venv/bin/pyflakes b/venv/bin/pyflakes deleted file mode 100755 index 4d7b1ed..0000000 --- a/venv/bin/pyflakes +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -import sys -from pyflakes.api import main -if __name__ == '__main__': - sys.argv[0] = sys.argv[0].removesuffix('.exe') - sys.exit(main()) diff --git a/venv/bin/pyi-archive_viewer b/venv/bin/pyi-archive_viewer deleted file mode 100755 index 4bfb6be..0000000 --- a/venv/bin/pyi-archive_viewer +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -import sys -from PyInstaller.utils.cliutils.archive_viewer import run -if __name__ == '__main__': - sys.argv[0] = sys.argv[0].removesuffix('.exe') - sys.exit(run()) diff --git a/venv/bin/pyi-bindepend b/venv/bin/pyi-bindepend deleted file mode 100755 index 3cfdc99..0000000 --- a/venv/bin/pyi-bindepend +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -import sys -from PyInstaller.utils.cliutils.bindepend import run -if __name__ == '__main__': - sys.argv[0] = sys.argv[0].removesuffix('.exe') - sys.exit(run()) diff --git a/venv/bin/pyi-grab_version b/venv/bin/pyi-grab_version deleted file mode 100755 index a97d2b8..0000000 --- a/venv/bin/pyi-grab_version +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -import sys -from PyInstaller.utils.cliutils.grab_version import run -if __name__ == '__main__': - sys.argv[0] = sys.argv[0].removesuffix('.exe') - sys.exit(run()) diff --git a/venv/bin/pyi-makespec b/venv/bin/pyi-makespec deleted file mode 100755 index 3e72788..0000000 --- a/venv/bin/pyi-makespec +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -import sys -from PyInstaller.utils.cliutils.makespec import run -if __name__ == '__main__': - sys.argv[0] = sys.argv[0].removesuffix('.exe') - sys.exit(run()) diff --git a/venv/bin/pyi-set_version b/venv/bin/pyi-set_version deleted file mode 100755 index 7489d74..0000000 --- a/venv/bin/pyi-set_version +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -import sys -from PyInstaller.utils.cliutils.set_version import run -if __name__ == '__main__': - sys.argv[0] = sys.argv[0].removesuffix('.exe') - sys.exit(run()) diff --git a/venv/bin/pyinstaller b/venv/bin/pyinstaller deleted file mode 100755 index 4fd964e..0000000 --- a/venv/bin/pyinstaller +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -import sys -from PyInstaller.__main__ import _console_script_run -if __name__ == '__main__': - sys.argv[0] = sys.argv[0].removesuffix('.exe') - sys.exit(_console_script_run()) diff --git a/venv/bin/pylint b/venv/bin/pylint deleted file mode 100755 index 11c09c8..0000000 --- a/venv/bin/pylint +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -import sys -from pylint import run_pylint -if __name__ == '__main__': - sys.argv[0] = sys.argv[0].removesuffix('.exe') - sys.exit(run_pylint()) diff --git a/venv/bin/pylint-config b/venv/bin/pylint-config deleted file mode 100755 index 8abc510..0000000 --- a/venv/bin/pylint-config +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -import sys -from pylint import _run_pylint_config -if __name__ == '__main__': - sys.argv[0] = sys.argv[0].removesuffix('.exe') - sys.exit(_run_pylint_config()) diff --git a/venv/bin/pylsp b/venv/bin/pylsp deleted file mode 100755 index a35a507..0000000 --- a/venv/bin/pylsp +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -import sys -from pylsp.__main__ import main -if __name__ == '__main__': - sys.argv[0] = sys.argv[0].removesuffix('.exe') - sys.exit(main()) diff --git a/venv/bin/pyreverse b/venv/bin/pyreverse deleted file mode 100755 index a10b2c7..0000000 --- a/venv/bin/pyreverse +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -import sys -from pylint import run_pyreverse -if __name__ == '__main__': - sys.argv[0] = sys.argv[0].removesuffix('.exe') - sys.exit(run_pyreverse()) diff --git a/venv/bin/python b/venv/bin/python deleted file mode 120000 index b8a0adb..0000000 --- a/venv/bin/python +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/venv/bin/python3 b/venv/bin/python3 deleted file mode 120000 index ae65fda..0000000 --- a/venv/bin/python3 +++ /dev/null @@ -1 +0,0 @@ -/usr/bin/python3 \ No newline at end of file diff --git a/venv/bin/python3.12 b/venv/bin/python3.12 deleted file mode 120000 index b8a0adb..0000000 --- a/venv/bin/python3.12 +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/venv/bin/symilar b/venv/bin/symilar deleted file mode 100755 index 4b09d9c..0000000 --- a/venv/bin/symilar +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -import sys -from pylint import run_symilar -if __name__ == '__main__': - sys.argv[0] = sys.argv[0].removesuffix('.exe') - sys.exit(run_symilar()) diff --git a/venv/bin/undill b/venv/bin/undill deleted file mode 100755 index 40b41ac..0000000 --- a/venv/bin/undill +++ /dev/null @@ -1,22 +0,0 @@ -#!/home/borderban/Рабочий стол/client-py/venv/bin/python3 -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE -""" -unpickle the contents of a pickled object file - -Examples:: - - $ undill hello.pkl - ['hello', 'world'] -""" - -if __name__ == '__main__': - import sys - import dill - for file in sys.argv[1:]: - print (dill.load(open(file,'rb'))) - diff --git a/venv/bin/yapf b/venv/bin/yapf deleted file mode 100755 index 38304ff..0000000 --- a/venv/bin/yapf +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -import sys -from yapf import run_main -if __name__ == '__main__': - sys.argv[0] = sys.argv[0].removesuffix('.exe') - sys.exit(run_main()) diff --git a/venv/bin/yapf-diff b/venv/bin/yapf-diff deleted file mode 100755 index 13548b8..0000000 --- a/venv/bin/yapf-diff +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -'''exec' "/home/borderban/Рабочий стол/client-py/venv/bin/python3" "$0" "$@" -' ''' -import sys -from yapf_third_party.yapf_diff.yapf_diff import main -if __name__ == '__main__': - sys.argv[0] = sys.argv[0].removesuffix('.exe') - sys.exit(main()) diff --git a/venv/lib/python3.12/site-packages/30fcd23745efe32ce681__mypyc.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/30fcd23745efe32ce681__mypyc.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index ca1cc57..0000000 Binary files a/venv/lib/python3.12/site-packages/30fcd23745efe32ce681__mypyc.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/81d243bd2c585b0f4821__mypyc.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/81d243bd2c585b0f4821__mypyc.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 83590cf..0000000 Binary files a/venv/lib/python3.12/site-packages/81d243bd2c585b0f4821__mypyc.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/__init__.py b/venv/lib/python3.12/site-packages/PyInstaller/__init__.py deleted file mode 100755 index a99f94e..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/__init__.py +++ /dev/null @@ -1,44 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -__all__ = ('HOMEPATH', 'PLATFORM', '__version__', 'DEFAULT_DISTPATH', 'DEFAULT_SPECPATH', 'DEFAULT_WORKPATH') - -import os - -from PyInstaller import compat - -# Note: Keep this variable as plain string so it could be updated automatically when doing a release. -__version__ = '6.19.0' - -# Absolute path of this package's directory. Save this early so all submodules can use the absolute path. This is -# required for example if the current directory changes prior to loading the hooks. -PACKAGEPATH = os.path.abspath(os.path.dirname(__file__)) - -HOMEPATH = os.path.dirname(PACKAGEPATH) - -# Default values of paths where to put files created by PyInstaller. If changing these, do not forget to update the -# help text for corresponding command-line options, defined in build_main. - -# Where to put created .spec file. -DEFAULT_SPECPATH = os.getcwd() -# Where to put the final frozen application. -DEFAULT_DISTPATH = os.path.join(os.getcwd(), 'dist') -# Where to put all the temporary files; .log, .pyz, etc. -DEFAULT_WORKPATH = os.path.join(os.getcwd(), 'build') - -PLATFORM = compat.system + '-' + compat.architecture -# Include machine name in path to bootloader for some machines (e.g., 'arm'). Explicitly avoid doing this on macOS, -# where we keep universal2 bootloaders in Darwin-64bit folder regardless of whether we are on x86_64 or arm64. -if compat.machine and not compat.is_darwin: - PLATFORM += '-' + compat.machine -# Similarly, disambiguate musl Linux from glibc Linux. -if compat.is_musl: - PLATFORM += '-musl' diff --git a/venv/lib/python3.12/site-packages/PyInstaller/__main__.py b/venv/lib/python3.12/site-packages/PyInstaller/__main__.py deleted file mode 100755 index f36090b..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/__main__.py +++ /dev/null @@ -1,321 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Main command-line interface to PyInstaller. -""" -from __future__ import annotations - -import argparse -import os -import platform -import sys -import pathlib -from collections import defaultdict - -from PyInstaller import __version__ -from PyInstaller import log as logging -# Note: do not import anything else until compat.check_requirements function is run! -from PyInstaller import compat - -try: - from argcomplete import autocomplete -except ImportError: - - def autocomplete(parser): - return None - - -logger = logging.getLogger(__name__) - -# Taken from https://stackoverflow.com/a/22157136 to format args more flexibly: any help text which beings with ``R|`` -# will have all newlines preserved; the help text will be line wrapped. See -# https://docs.python.org/3/library/argparse.html#formatter-class. - - -# This is used by the ``--debug`` option. -class _SmartFormatter(argparse.HelpFormatter): - def _split_lines(self, text, width): - if text.startswith('R|'): - # The underlying implementation of ``RawTextHelpFormatter._split_lines`` invokes this; mimic it. - return text[2:].splitlines() - else: - # Invoke the usual formatter. - return super()._split_lines(text, width) - - -def run_makespec(filenames, **opts): - # Split pathex by using the path separator - temppaths = opts['pathex'][:] - pathex = opts['pathex'] = [] - for p in temppaths: - pathex.extend(p.split(os.pathsep)) - - import PyInstaller.building.makespec - - spec_file = PyInstaller.building.makespec.main(filenames, **opts) - logger.info('wrote %s' % spec_file) - return spec_file - - -def run_build(pyi_config, spec_file, **kwargs): - import PyInstaller.building.build_main - PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs) - - -def __add_options(parser): - parser.add_argument( - '-v', - '--version', - action='version', - version=__version__, - help='Show program version info and exit.', - ) - - -class _PyiArgumentParser(argparse.ArgumentParser): - def __init__(self, *args, **kwargs): - self._pyi_action_groups = defaultdict(list) - super().__init__(*args, **kwargs) - - def _add_options(self, __add_options: callable, name: str = ""): - """ - Mutate self with the given callable, storing any new actions added in a named group - """ - n_actions_before = len(getattr(self, "_actions", [])) - __add_options(self) # preserves old behavior - new_actions = getattr(self, "_actions", [])[n_actions_before:] - self._pyi_action_groups[name].extend(new_actions) - - def _option_name(self, action): - """ - Get the option name(s) associated with an action - - For options that define both short and long names, this function will - return the long names joined by "/" - """ - longnames = [name for name in action.option_strings if name.startswith("--")] - if longnames: - name = "/".join(longnames) - else: - name = action.option_strings[0] - return name - - def _forbid_options(self, args: argparse.Namespace, group: str, errmsg: str = ""): - """Forbid options from a named action group""" - options = defaultdict(str) - for action in self._pyi_action_groups[group]: - dest = action.dest - name = self._option_name(action) - if getattr(args, dest) is not self.get_default(dest): - if dest in options: - options[dest] += "/" - options[dest] += name - - # if any options from the forbidden group are not the default values, - # the user must have passed them in, so issue an error report - if options: - sep = "\n " - bad = sep.join(options.values()) - if errmsg: - errmsg = "\n" + errmsg - raise SystemExit(f"ERROR: option(s) not allowed:{sep}{bad}{errmsg}") - - -def generate_parser() -> _PyiArgumentParser: - """ - Build an argparse parser for PyInstaller's main CLI. - """ - - import PyInstaller.building.build_main - import PyInstaller.building.makespec - import PyInstaller.log - - parser = _PyiArgumentParser(formatter_class=_SmartFormatter) - parser.prog = "pyinstaller" - - parser._add_options(__add_options) - parser._add_options(PyInstaller.building.makespec.__add_options, name="makespec") - parser._add_options(PyInstaller.building.build_main.__add_options, name="build_main") - parser._add_options(PyInstaller.log.__add_options, name="log") - - parser.add_argument( - 'filenames', - metavar='scriptname', - nargs='+', - help="Name of scriptfiles to be processed or exactly one .spec file. If a .spec file is specified, most " - "options are unnecessary and are ignored.", - ) - - return parser - - -def run(pyi_args: list | None = None, pyi_config: dict | None = None): - """ - pyi_args allows running PyInstaller programmatically without a subprocess - pyi_config allows checking configuration once when running multiple tests - """ - compat.check_requirements() - check_unsafe_privileges() - - import PyInstaller.log - - old_sys_argv = sys.argv - try: - parser = generate_parser() - autocomplete(parser) - if pyi_args is None: - pyi_args = sys.argv[1:] - try: - index = pyi_args.index("--") - except ValueError: - index = len(pyi_args) - args = parser.parse_args(pyi_args[:index]) - spec_args = pyi_args[index + 1:] - PyInstaller.log.__process_options(parser, args) - - # Print PyInstaller version, Python version, and platform as the first line to stdout. This helps us identify - # PyInstaller, Python, and platform version when users report issues. - try: - from _pyinstaller_hooks_contrib import __version__ as contrib_hooks_version - except Exception: - contrib_hooks_version = 'unknown' - - logger.info('PyInstaller: %s, contrib hooks: %s', __version__, contrib_hooks_version) - logger.info('Python: %s%s', platform.python_version(), " (conda)" if compat.is_conda else "") - logger.info('Platform: %s', platform.platform()) - logger.info('Python environment: %s', sys.prefix) - - # Skip creating .spec when .spec file is supplied. - if args.filenames[0].endswith('.spec'): - parser._forbid_options( - args, group="makespec", errmsg="makespec options not valid when a .spec file is given" - ) - spec_file = args.filenames[0] - else: - # Ensure that the given script files exist, before trying to generate the .spec file. - # This prevents us from overwriting an existing (and customized) .spec file if user makes a typo in the - # .spec file's suffix when trying to build it, for example, `pyinstaller program.cpes` (see #8276). - # It also prevents creation of a .spec file when `pyinstaller program.py` is accidentally ran from a - # directory that does not contain the script (for example, due to failing to change the directory prior - # to running the command). - for filename in args.filenames: - if not os.path.isfile(filename): - raise SystemExit(f"ERROR: Script file {filename!r} does not exist.") - spec_file = run_makespec(**vars(args)) - - sys.argv = [spec_file, *spec_args] - run_build(pyi_config, spec_file, **vars(args)) - - except KeyboardInterrupt: - raise SystemExit("Aborted by user request.") - except RecursionError: - from PyInstaller import _recursion_too_deep_message - _recursion_too_deep_message.raise_with_msg() - finally: - sys.argv = old_sys_argv - - -def _console_script_run(): - # Python prepends the main script's parent directory to sys.path. When PyInstaller is ran via the usual - # `pyinstaller` CLI entry point, this directory is $pythonprefix/bin which should not be in sys.path. - if os.path.basename(sys.path[0]) in ("bin", "Scripts"): - sys.path.pop(0) - run() - - -def check_unsafe_privileges(): - """ - Forbid dangerous usage of PyInstaller with escalated privileges - """ - if compat.is_win and not compat.is_win_wine: - # Discourage (with the intention to eventually block) people using *run as admin* with PyInstaller. - # There are 4 cases, block case 3 but be careful not to also block case 2. - # 1. User has no admin access: TokenElevationTypeDefault - # 2. User is an admin/UAC disabled (common on CI/VMs): TokenElevationTypeDefault - # 3. User has used *run as administrator* to elevate: TokenElevationTypeFull - # 4. User can escalate but hasn't: TokenElevationTypeLimited - # https://techcommunity.microsoft.com/t5/windows-blog-archive/how-to-determine-if-a-user-is-a-member-of-the-administrators/ba-p/228476 - import ctypes - - advapi32 = ctypes.CDLL("Advapi32.dll") - kernel32 = ctypes.CDLL("kernel32.dll") - - kernel32.GetCurrentProcess.restype = ctypes.c_void_p - process = kernel32.GetCurrentProcess() - - token = ctypes.c_void_p() - try: - TOKEN_QUERY = 8 - assert advapi32.OpenProcessToken(ctypes.c_void_p(process), TOKEN_QUERY, ctypes.byref(token)) - - elevation_type = ctypes.c_int() - TokenElevationType = 18 - assert advapi32.GetTokenInformation( - token, TokenElevationType, ctypes.byref(elevation_type), ctypes.sizeof(elevation_type), - ctypes.byref(ctypes.c_int()) - ) - finally: - kernel32.CloseHandle(token) - - if elevation_type.value == 2: # TokenElevationTypeFull - logger.log( - logging.DEPRECATION, - "Running PyInstaller as admin is not necessary nor sensible. Run PyInstaller from a non-administrator " - "terminal. PyInstaller 7.0 will block this." - ) - - elif compat.is_darwin or compat.is_linux: - # Discourage (with the intention to eventually block) people using *sudo* with PyInstaller. - # Again there are 4 cases, block only case 4. - # 1. Non-root: os.getuid() != 0 - # 2. Logged in as root (usually a VM): os.getlogin() == "root", os.getuid() == 0 - # 3. No named users (e.g. most Docker containers): os.getlogin() fails - # 4. Regular user using escalation: os.getlogin() != "root", os.getuid() == 0 - try: - user = os.getlogin() - except OSError: - user = "" - if os.getuid() == 0 and user and user != "root": - logger.log( - logging.DEPRECATION, - "Running PyInstaller as root is not necessary nor sensible. Do not use PyInstaller with sudo. " - "PyInstaller 7.0 will block this." - ) - - if compat.is_win: - # Do not let people run PyInstaller from admin cmd's default working directory (C:\Windows\system32) - cwd = pathlib.Path.cwd() - - try: - win_dir = compat.win32api.GetWindowsDirectory() - except Exception: - win_dir = None - win_dir = None if win_dir is None else pathlib.Path(win_dir).resolve() - - inside_win_dir = cwd == win_dir or win_dir in cwd.parents - - # The only exception to the above is if user's home directory is also located under %WINDIR%, which happens - # when PyInstaller is ran under SYSTEM user. - if inside_win_dir: - home_dir = pathlib.Path.home().resolve() - if cwd == home_dir or home_dir in cwd.parents: - inside_win_dir = False - - if inside_win_dir: - raise SystemExit( - f"ERROR: Do not run pyinstaller from {cwd}. cd to where your code is and run pyinstaller from there. " - "Hint: You can open a terminal where your code is by going to the parent folder in Windows file " - "explorer and typing cmd into the address bar." - ) - - -if __name__ == '__main__': - run() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 70307e6..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/__main__.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/__main__.cpython-312.pyc deleted file mode 100644 index 4a42084..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/__main__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/_recursion_too_deep_message.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/_recursion_too_deep_message.cpython-312.pyc deleted file mode 100644 index 2578dbd..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/_recursion_too_deep_message.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/_shared_with_waf.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/_shared_with_waf.cpython-312.pyc deleted file mode 100644 index b62d431..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/_shared_with_waf.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/compat.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/compat.cpython-312.pyc deleted file mode 100644 index ff7bafb..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/compat.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/config.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/config.cpython-312.pyc deleted file mode 100644 index 4056ec8..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/config.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/configure.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/configure.cpython-312.pyc deleted file mode 100644 index 35aedbe..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/configure.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/exceptions.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index 3652573..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/exceptions.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/log.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/log.cpython-312.pyc deleted file mode 100644 index d445998..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/__pycache__/log.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/_recursion_too_deep_message.py b/venv/lib/python3.12/site-packages/PyInstaller/_recursion_too_deep_message.py deleted file mode 100755 index e62c20d..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/_recursion_too_deep_message.py +++ /dev/null @@ -1,45 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -msg = """ -============================================================= -A RecursionError (maximum recursion depth exceeded) occurred. -For working around please follow these instructions -============================================================= - -1. In your program's .spec file add this line near the top:: - - import sys ; sys.setrecursionlimit(sys.getrecursionlimit() * 5) - -2. Build your program by running PyInstaller with the .spec file as - argument:: - - pyinstaller myprog.spec - -3. If this fails, you most probably hit an endless recursion in - PyInstaller. Please try to track this down as far as possible, - create a minimal example so we can reproduce and open an issue at - https://github.com/pyinstaller/pyinstaller/issues following the - instructions in the issue template. Many thanks. - -Explanation: Python's stack-limit is a safety-belt against endless recursion, -eating up memory. PyInstaller imports modules recursively. If the structure -how modules are imported within your program is awkward, this leads to the -nesting being too deep and hitting Python's stack-limit. - -With the default recursion limit (1000), the recursion error occurs at about -115 nested imported, with limit 2000 at about 240, with limit 5000 at about -660. -""" - - -def raise_with_msg(): - raise SystemExit(msg) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/_shared_with_waf.py b/venv/lib/python3.12/site-packages/PyInstaller/_shared_with_waf.py deleted file mode 100755 index ed2615c..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/_shared_with_waf.py +++ /dev/null @@ -1,92 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Code to be shared by PyInstaller and the bootloader/wscript file. - -This code must not assume that either PyInstaller or any of its dependencies installed. I.e., the only imports allowed -in here are standard library ones. Within reason, it is preferable that this file should still run under Python 2.7 as -many compiler docker images still have only Python 2 installed. -""" - -import platform -import re - - -def _pyi_machine(machine, system): - # type: (str, str) -> str - """ - Choose an intentionally simplified architecture identifier to be used in the bootloader's directory name. - - Args: - machine: - The output of ``platform.machine()`` or any known architecture alias or shorthand that may be used by a - C compiler. - system: - The output of ``platform.system()`` on the target machine. - Returns: - Either a string tag or, on platforms that don't need an architecture tag, ``None``. - - Ideally, we would just use ``platform.machine()`` directly, but that makes cross-compiling the bootloader almost - impossible, because you need to know at compile time exactly what ``platform.machine()`` will be at run time, based - only on the machine name alias or shorthand reported by the C compiler at the build time. Rather, use a loose - differentiation, and trust that anyone mixing armv6l with armv6h knows what they are doing. - """ - # See the corresponding tests in tests/unit/test_compat.py for examples. - - if platform.machine() == "sw_64" or platform.machine() == "loongarch64": - # This explicitly inhibits cross compiling the bootloader for or on SunWay and LoongArch machine. - return platform.machine() - - if system == "Windows": - if machine.lower().startswith("arm"): - return "arm" - else: - return "intel" - - if system == "SunOS": - if machine.lower() in ("x86_64", "x86", "i86pc"): - return "intel" - else: - return "sparc" - - if system != "Linux": - # No architecture specifier for anything par Linux. - # - macOS is on two 64 bit architectures, but they are merged into one "universal2" bootloader. - # - BSD supports a wide range of architectures, but according to PyPI's download statistics, every one of our - # BSD users are on x86_64. This may change in the distant future. - return - - if machine.startswith(("arm", "aarch")): - # ARM has a huge number of similar and aliased sub-versions, such as armv5, armv6l armv8h, aarch64. - return "arm" - if machine in ("thumb"): - # Reported by waf/gcc when Thumb instruction set is enabled on 32-bit ARM. The platform.machine() returns "arm" - # regardless of the instruction set. - return "arm" - if machine in ("x86_64", "x64", "x86"): - return "intel" - if re.fullmatch("i[1-6]86", machine): - return "intel" - if machine.startswith(("ppc", "powerpc")): - # PowerPC comes in 64 vs 32 bit and little vs big endian variants. - return "ppc" - if machine in ("mips64", "mips"): - return "mips" - if machine.startswith("riscv"): - return "riscv" - # Machines with no known aliases :) - if machine in ("s390x",): - return machine - - # Unknown architectures are allowed by default, but will all be placed under one directory. In theory, trying to - # have multiple unknown architectures in one copy of PyInstaller will not work, but that should be sufficiently - # unlikely to ever happen. - return "unknown" diff --git a/venv/lib/python3.12/site-packages/PyInstaller/archive/__init__.py b/venv/lib/python3.12/site-packages/PyInstaller/archive/__init__.py deleted file mode 100755 index a7501ae..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/archive/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__author__ = 'martin' diff --git a/venv/lib/python3.12/site-packages/PyInstaller/archive/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/archive/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 1778db1..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/archive/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/archive/__pycache__/pyz_crypto.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/archive/__pycache__/pyz_crypto.cpython-312.pyc deleted file mode 100644 index 9628518..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/archive/__pycache__/pyz_crypto.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/archive/__pycache__/readers.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/archive/__pycache__/readers.cpython-312.pyc deleted file mode 100644 index 422da4a..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/archive/__pycache__/readers.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/archive/__pycache__/writers.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/archive/__pycache__/writers.cpython-312.pyc deleted file mode 100644 index 38ae1c6..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/archive/__pycache__/writers.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/archive/pyz_crypto.py b/venv/lib/python3.12/site-packages/PyInstaller/archive/pyz_crypto.py deleted file mode 100755 index a16905f..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/archive/pyz_crypto.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -class PyiBlockCipher: - def __init__(self, key=None): - from PyInstaller.exceptions import RemovedCipherFeatureError - raise RemovedCipherFeatureError("Please remove cipher and block_cipher parameters from your spec file.") diff --git a/venv/lib/python3.12/site-packages/PyInstaller/archive/readers.py b/venv/lib/python3.12/site-packages/PyInstaller/archive/readers.py deleted file mode 100755 index 3ddc160..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/archive/readers.py +++ /dev/null @@ -1,238 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Python-based CArchive (PKG) reader implementation. Used only in the archive_viewer utility. -""" - -import os -import struct - -from PyInstaller.loader.pyimod01_archive import ZlibArchiveReader, ArchiveReadError - - -class NotAnArchiveError(TypeError): - pass - - -# Type codes for CArchive TOC entries -PKG_ITEM_BINARY = 'b' # binary -PKG_ITEM_DEPENDENCY = 'd' # runtime option -PKG_ITEM_PYZ = 'z' # zlib (pyz) - frozen Python code -PKG_ITEM_ZIPFILE = 'Z' # zlib (pyz) - frozen Python code -PKG_ITEM_PYPACKAGE = 'M' # Python package (__init__.py) -PKG_ITEM_PYMODULE = 'm' # Python module -PKG_ITEM_PYSOURCE = 's' # Python script (v3) -PKG_ITEM_DATA = 'x' # data -PKG_ITEM_RUNTIME_OPTION = 'o' # runtime option -PKG_ITEM_SPLASH = 'l' # splash resources - - -class CArchiveReader: - """ - Reader for PyInstaller's CArchive (PKG) archive. - """ - - # Cookie - holds some information for the bootloader. C struct format definition. '!' at the beginning means network - # byte order. C struct looks like: - # - # typedef struct _archive_cookie - # { - # char magic[8]; - # uint32_t pkg_length; - # uint32_t toc_offset; - # uint32_t toc_length; - # uint32_t python_version; - # char python_libname[64]; - # } ARCHIVE_COOKIE; - # - _COOKIE_MAGIC_PATTERN = b'MEI\014\013\012\013\016' - - _COOKIE_FORMAT = '!8sIIII64s' - _COOKIE_LENGTH = struct.calcsize(_COOKIE_FORMAT) - - # TOC entry: - # - # typedef struct _toc_entry - # { - # uint32_t entry_length; - # uint32_t offset; - # uint32_t length; - # uint32_t uncompressed_length; - # unsigned char compression_flag; - # char typecode; - # char name[1]; /* Variable-length name, padded to multiple of 16 */ - # } TOC_ENTRY; - # - _TOC_ENTRY_FORMAT = '!IIIIBc' - _TOC_ENTRY_LENGTH = struct.calcsize(_TOC_ENTRY_FORMAT) - - def __init__(self, filename): - self._filename = filename - self._start_offset = 0 - self._end_offset = 0 - self._toc_offset = 0 - self._toc_length = 0 - - self.toc = {} - self.options = [] - - # Load TOC - with open(self._filename, "rb") as fp: - # Find cookie MAGIC pattern - cookie_start_offset = self._find_magic_pattern(fp, self._COOKIE_MAGIC_PATTERN) - if cookie_start_offset == -1: - raise ArchiveReadError("Could not find COOKIE magic pattern!") - - # Read the whole cookie - fp.seek(cookie_start_offset, os.SEEK_SET) - cookie_data = fp.read(self._COOKIE_LENGTH) - - magic, archive_length, toc_offset, toc_length, pyvers, pylib_name = \ - struct.unpack(self._COOKIE_FORMAT, cookie_data) - - # Compute start and end offset of the the archive - self._end_offset = cookie_start_offset + self._COOKIE_LENGTH - self._start_offset = self._end_offset - archive_length - - # Verify that Python shared library name is set - if not pylib_name: - raise ArchiveReadError("Python shared library name not set in the archive!") - - # Read whole toc - fp.seek(self._start_offset + toc_offset) - toc_data = fp.read(toc_length) - - self.toc, self.options = self._parse_toc(toc_data) - - @staticmethod - def _find_magic_pattern(fp, magic_pattern): - # Start at the end of file, and scan back-to-start - fp.seek(0, os.SEEK_END) - end_pos = fp.tell() - - # Scan from back - SEARCH_CHUNK_SIZE = 8192 - magic_offset = -1 - while end_pos >= len(magic_pattern): - start_pos = max(end_pos - SEARCH_CHUNK_SIZE, 0) - chunk_size = end_pos - start_pos - # Is the remaining chunk large enough to hold the pattern? - if chunk_size < len(magic_pattern): - break - # Read and scan the chunk - fp.seek(start_pos, os.SEEK_SET) - buf = fp.read(chunk_size) - pos = buf.rfind(magic_pattern) - if pos != -1: - magic_offset = start_pos + pos - break - # Adjust search location for next chunk; ensure proper overlap - end_pos = start_pos + len(magic_pattern) - 1 - - return magic_offset - - @classmethod - def _parse_toc(cls, data): - options = [] - toc = {} - cur_pos = 0 - while cur_pos < len(data): - # Read and parse the fixed-size TOC entry header - entry_length, entry_offset, data_length, uncompressed_length, compression_flag, typecode = \ - struct.unpack(cls._TOC_ENTRY_FORMAT, data[cur_pos:(cur_pos + cls._TOC_ENTRY_LENGTH)]) - cur_pos += cls._TOC_ENTRY_LENGTH - # Read variable-length name - name_length = entry_length - cls._TOC_ENTRY_LENGTH - name, *_ = struct.unpack(f'{name_length}s', data[cur_pos:(cur_pos + name_length)]) - cur_pos += name_length - # Name string may contain up to 15 bytes of padding - name = name.rstrip(b'\0').decode('utf-8') - - typecode = typecode.decode('ascii') - - # The TOC should not contain duplicates, except for OPTION entries. Therefore, keep those - # in a separate list. With options, the rest of the entries do not make sense, anyway. - if typecode == 'o': - options.append(name) - else: - toc[name] = (entry_offset, data_length, uncompressed_length, compression_flag, typecode) - - return toc, options - - def extract(self, name): - """ - Extract data for the given entry name. - """ - - entry = self.toc.get(name) - if entry is None: - raise KeyError(f"No entry named {name!r} found in the archive!") - - entry_offset, data_length, uncompressed_length, compression_flag, typecode = entry - with open(self._filename, "rb") as fp: - fp.seek(self._start_offset + entry_offset, os.SEEK_SET) - data = fp.read(data_length) - - if compression_flag: - import zlib - data = zlib.decompress(data) - - return data - - def raw_pkg_data(self): - """ - Extract complete PKG/CArchive archive from the parent file (executable). - """ - total_length = self._end_offset - self._start_offset - with open(self._filename, "rb") as fp: - fp.seek(self._start_offset, os.SEEK_SET) - return fp.read(total_length) - - def open_embedded_archive(self, name): - """ - Open new archive reader for the embedded archive. - """ - - entry = self.toc.get(name) - if entry is None: - raise KeyError(f"No entry named {name!r} found in the archive!") - - entry_offset, data_length, uncompressed_length, compression_flag, typecode = entry - - if typecode == PKG_ITEM_PYZ: - # Open as embedded archive, without extraction. - return ZlibArchiveReader(self._filename, self._start_offset + entry_offset) - elif typecode == PKG_ITEM_ZIPFILE: - raise NotAnArchiveError("Zipfile archives not supported yet!") - else: - raise NotAnArchiveError(f"Entry {name!r} is not a supported embedded archive!") - - -def pkg_archive_contents(filename, recursive=True): - """ - List the contents of the PKG / CArchive. If `recursive` flag is set (the default), the contents of the embedded PYZ - archive is included as well. - - Used by the tests. - """ - - contents = [] - - pkg_archive = CArchiveReader(filename) - for name, toc_entry in pkg_archive.toc.items(): - *_, typecode = toc_entry - contents.append(name) - if typecode == PKG_ITEM_PYZ and recursive: - pyz_archive = pkg_archive.open_embedded_archive(name) - for name in pyz_archive.toc.keys(): - contents.append(name) - - return contents diff --git a/venv/lib/python3.12/site-packages/PyInstaller/archive/writers.py b/venv/lib/python3.12/site-packages/PyInstaller/archive/writers.py deleted file mode 100755 index e854e5e..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/archive/writers.py +++ /dev/null @@ -1,458 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Utilities to create data structures for embedding Python modules and additional files into the executable. -""" - -import marshal -import os -import shutil -import struct -import sys -import zlib - -from PyInstaller.building.utils import get_code_object, replace_filename_in_code_object -from PyInstaller.compat import BYTECODE_MAGIC, is_win, strict_collect_mode -from PyInstaller.loader.pyimod01_archive import PYZ_ITEM_MODULE, PYZ_ITEM_NSPKG, PYZ_ITEM_PKG - - -class ZlibArchiveWriter: - """ - Writer for PyInstaller's PYZ (ZlibArchive) archive. The archive is used to store collected byte-compiled Python - modules, as individually-compressed entries. - """ - _PYZ_MAGIC_PATTERN = b'PYZ\0' - _HEADER_LENGTH = 12 + 5 - _COMPRESSION_LEVEL = 6 # zlib compression level - - def __init__(self, filename, entries, code_dict=None): - """ - filename - Target filename of the archive. - entries - An iterable containing entries in the form of tuples: (name, src_path, typecode), where `name` is the name - under which the resource is stored (e.g., python module name, without suffix), `src_path` is name of the - file from which the resource is read, and `typecode` is the Analysis-level TOC typecode (`PYMODULE`). - code_dict - Optional code dictionary containing code objects for analyzed/collected python modules. - """ - code_dict = code_dict or {} - - with open(filename, "wb") as fp: - # Reserve space for the header. - fp.write(b'\0' * self._HEADER_LENGTH) - - # Write entries' data and collect TOC entries - toc = [] - for entry in entries: - toc_entry = self._write_entry(fp, entry, code_dict) - toc.append(toc_entry) - - # Write TOC - toc_offset = fp.tell() - toc_data = marshal.dumps(toc) - fp.write(toc_data) - - # Write header: - # - PYZ magic pattern (4 bytes) - # - python bytecode magic pattern (4 bytes) - # - TOC offset (32-bit int, 4 bytes) - # - 4 unused bytes - fp.seek(0, os.SEEK_SET) - - fp.write(self._PYZ_MAGIC_PATTERN) - fp.write(BYTECODE_MAGIC) - fp.write(struct.pack('!i', toc_offset)) - - @classmethod - def _write_entry(cls, fp, entry, code_dict): - name, src_path, typecode = entry - assert typecode in {'PYMODULE', 'PYMODULE-1', 'PYMODULE-2'} - - if src_path in {'-', None}: - # PEP-420 namespace package; these do not have code objects, but we still need an entry in PYZ to inform our - # run-time module finder/loader of the package's existence. So create a TOC entry for 0-byte data blob, - # and write no data. - return (name, (PYZ_ITEM_NSPKG, fp.tell(), 0)) - - code_object = code_dict[name] - - src_basename, _ = os.path.splitext(os.path.basename(src_path)) - if src_basename == '__init__': - typecode = PYZ_ITEM_PKG - co_filename = os.path.join(*name.split('.'), '__init__.py') - else: - typecode = PYZ_ITEM_MODULE - co_filename = os.path.join(*name.split('.')) + '.py' - - # Replace co_filename on code object with anonymized version without absolute path to the module. - code_object = replace_filename_in_code_object(code_object, co_filename) - - # Serialize - data = marshal.dumps(code_object) - - # First compress, then encrypt. - obj = zlib.compress(data, cls._COMPRESSION_LEVEL) - - # Create TOC entry - toc_entry = (name, (typecode, fp.tell(), len(obj))) - - # Write data blob - fp.write(obj) - - return toc_entry - - -class CArchiveWriter: - """ - Writer for PyInstaller's CArchive (PKG) archive. - - This archive contains all files that are bundled within an executable; a PYZ (ZlibArchive), DLLs, Python C - extensions, and other data files that are bundled in onefile mode. - - The archive can be read from either C (bootloader code at application's run-time) or Python (for debug purposes). - """ - _COOKIE_MAGIC_PATTERN = b'MEI\014\013\012\013\016' - - # For cookie and TOC entry structure, see `PyInstaller.archive.readers.CArchiveReader`. - _COOKIE_FORMAT = '!8sIIII64s' - _COOKIE_LENGTH = struct.calcsize(_COOKIE_FORMAT) - - _TOC_ENTRY_FORMAT = '!IIIIBc' - _TOC_ENTRY_LENGTH = struct.calcsize(_TOC_ENTRY_FORMAT) - - _COMPRESSION_LEVEL = 9 # zlib compression level - - def __init__(self, filename, entries, pylib_name): - """ - filename - Target filename of the archive. - entries - An iterable containing entries in the form of tuples: (dest_name, src_name, compress, typecode), where - `dest_name` is the name under which the resource is stored in the archive (and name under which it is - extracted at runtime), `src_name` is name of the file from which the resouce is read, `compress` is a - boolean compression flag, and `typecode` is the Analysis-level TOC typecode. - pylib_name - Name of the python shared library. - """ - self._collected_names = set() # Track collected names for strict package mode. - - with open(filename, "wb") as fp: - # Write entries' data and collect TOC entries - toc = [] - for entry in entries: - toc_entry = self._write_entry(fp, entry) - toc.append(toc_entry) - - # Write TOC - toc_offset = fp.tell() - toc_data = self._serialize_toc(toc) - toc_length = len(toc_data) - - fp.write(toc_data) - - # Write cookie - archive_length = toc_offset + toc_length + self._COOKIE_LENGTH - pyvers = sys.version_info[0] * 100 + sys.version_info[1] - cookie_data = struct.pack( - self._COOKIE_FORMAT, - self._COOKIE_MAGIC_PATTERN, - archive_length, - toc_offset, - toc_length, - pyvers, - pylib_name.encode('ascii'), - ) - - fp.write(cookie_data) - - def _write_entry(self, fp, entry): - dest_name, src_name, compress, typecode = entry - - # Write OPTION entries as-is, without normalizing them. This also exempts them from duplication check, - # allowing them to be specified multiple times. - if typecode == 'o': - return self._write_blob(fp, b"", dest_name, typecode) - - # Ensure forward slashes in paths are on Windows converted to back slashes '\\', as on Windows the bootloader - # works only with back slashes. - dest_name = os.path.normpath(dest_name) - if is_win and os.path.sep == '/': - # When building under MSYS, the above path normalization uses Unix-style separators, so replace them - # manually. - dest_name = dest_name.replace(os.path.sep, '\\') - - # For symbolic link entries, also ensure that the symlink target path (stored in src_name) is using - # Windows-style back slash separators. - if typecode == 'n': - src_name = src_name.replace(os.path.sep, '\\') - - # Strict pack/collect mode: keep track of the destination names, and raise an error if we try to add a duplicate - # (a file with same destination name, subject to OS case normalization rules). - if strict_collect_mode: - normalized_dest = None - if typecode in {'s', 's1', 's2', 'm', 'M'}: - # Exempt python source scripts and modules from the check. - pass - else: - # Everything else; normalize the case - normalized_dest = os.path.normcase(dest_name) - # Check for existing entry, if applicable - if normalized_dest: - if normalized_dest in self._collected_names: - raise ValueError( - f"Attempting to collect a duplicated file into CArchive: {normalized_dest} (type: {typecode})" - ) - self._collected_names.add(normalized_dest) - - if typecode == 'd': - # Dependency; merge src_name (= reference path prefix) and dest_name (= name) into single-string format that - # is parsed by bootloader. - return self._write_blob(fp, b"", f"{src_name}:{dest_name}", typecode) - elif typecode in {'s', 's1', 's2'}: - # If it is a source code file, compile it to a code object and marshal the object, so it can be unmarshalled - # by the bootloader. For that, we need to know target optimization level, which is stored in typecode. - optim_level = {'s': 0, 's1': 1, 's2': 2}[typecode] - code = get_code_object(dest_name, src_name, optimize=optim_level) - # Construct new `co_filename` by taking destination name, and replace its suffix with the one from the code - # object's co_filename; this should cover all of the following cases: - # - run-time hook script: the source name has a suffix (that is also present in `co_filename` produced by - # `get_code_object`), destination name has no suffix. - # - entry-point script with a suffix: both source name and destination name have the same suffix (and the - # same suffix is also in `co_filename` produced by `get_code_object`) - # - entry-point script without a suffix: neither source name nor destination name have a suffix, but - # `get_code_object` adds a .py suffix to `co_filename` to mitigate potential issues with POSIX - # executables and `traceback` module; we want to preserve this behavior. - co_filename = os.path.splitext(dest_name)[0] + os.path.splitext(code.co_filename)[1] - code = replace_filename_in_code_object(code, co_filename) - return self._write_blob(fp, marshal.dumps(code), dest_name, 's', compress=compress) - elif typecode in ('m', 'M'): - # Read the PYC file. We do not perform compilation here (in contrast to script files in the above branch), - # so typecode does not contain optimization level information. - with open(src_name, "rb") as in_fp: - data = in_fp.read() - assert data[:4] == BYTECODE_MAGIC - # Skip the PYC header, load the code object. - code = marshal.loads(data[16:]) - co_filename = dest_name + '.py' # Use dest name with added .py suffix. - code = replace_filename_in_code_object(code, co_filename) - # These module entries are loaded and executed within the bootloader, which requires only the code - # object, without the PYC header. - return self._write_blob(fp, marshal.dumps(code), dest_name, typecode, compress=compress) - elif typecode == 'n': - # Symbolic link; store target name (as NULL-terminated string) - data = src_name.encode('utf-8') + b'\x00' - return self._write_blob(fp, data, dest_name, typecode, compress=compress) - else: - return self._write_file(fp, src_name, dest_name, typecode, compress=compress) - - def _write_blob(self, out_fp, blob: bytes, dest_name, typecode, compress=False): - """ - Write the binary contents (**blob**) of a small file to the archive and return the corresponding CArchive TOC - entry. - """ - data_offset = out_fp.tell() - data_length = len(blob) - if compress: - blob = zlib.compress(blob, level=self._COMPRESSION_LEVEL) - out_fp.write(blob) - - return (data_offset, len(blob), data_length, int(compress), typecode, dest_name) - - def _write_file(self, out_fp, src_name, dest_name, typecode, compress=False): - """ - Stream copy a large file into the archive and return the corresponding CArchive TOC entry. - """ - data_offset = out_fp.tell() - data_length = os.stat(src_name).st_size - with open(src_name, 'rb') as in_fp: - if compress: - tmp_buffer = bytearray(16 * 1024) - compressor = zlib.compressobj(self._COMPRESSION_LEVEL) - while True: - num_read = in_fp.readinto(tmp_buffer) - if not num_read: - break - out_fp.write(compressor.compress(tmp_buffer[:num_read])) - out_fp.write(compressor.flush()) - else: - shutil.copyfileobj(in_fp, out_fp) - - return (data_offset, out_fp.tell() - data_offset, data_length, int(compress), typecode, dest_name) - - @classmethod - def _serialize_toc(cls, toc): - serialized_toc = [] - for toc_entry in toc: - data_offset, compressed_length, data_length, compress, typecode, name = toc_entry - - # Encode names as UTF-8. This should be safe as standard python modules only contain ASCII-characters (and - # standard shared libraries should have the same), and thus the C-code still can handle this correctly. - name = name.encode('utf-8') - name_length = len(name) + 1 # Add 1 for string-terminating zero byte. - - # Ensure TOC entries are aligned on 16-byte boundary, so they can be read by bootloader (C code) on - # platforms with strict data alignment requirements (for example linux on `armhf`/`armv7`, such as 32-bit - # Debian Buster on Raspberry Pi). - entry_length = cls._TOC_ENTRY_LENGTH + name_length - if entry_length % 16 != 0: - padding_length = 16 - (entry_length % 16) - name_length += padding_length - - # Serialize - serialized_entry = struct.pack( - cls._TOC_ENTRY_FORMAT + f"{name_length}s", # "Ns" format automatically pads the string with zero bytes. - cls._TOC_ENTRY_LENGTH + name_length, - data_offset, - compressed_length, - data_length, - compress, - typecode.encode('ascii'), - name, - ) - serialized_toc.append(serialized_entry) - - return b''.join(serialized_toc) - - -class SplashWriter: - """ - Writer for the splash screen resources archive. - - The resulting archive is added as an entry into the CArchive with the typecode PKG_ITEM_SPLASH. - """ - # This struct describes the splash resources as it will be in an buffer inside the bootloader. All necessary parts - # are bundled, the *_len and *_offset fields describe the data beyond this header definition. - # Whereas script and image fields are binary data, the requirements fields describe an array of strings. Each string - # is null-terminated in order to easily iterate over this list from within C. - # - # typedef struct _splash_data_header - # { - # char tcl_shared_library_name[32]; - # char tk_shared_library_name[32]; - # char tcl_module_directory_name[16]; - # char tk_module_directory_name[16]; - # - # uint32_t script_len; - # uint32_t script_offset; - # - # uint32_t image_len; - # uint32_t image_offset; - # - # uint32_t requirements_len; - # uint32_t requirements_offset; - # } SPLASH_DATA_HEADER; - # - _HEADER_FORMAT = '!32s 32s 16s 16s II II II' - _HEADER_LENGTH = struct.calcsize(_HEADER_FORMAT) - - # The created archive is compressed by the CArchive, so no need to compress the data here. - - def __init__( - self, - filename, - requirements_list, - tcl_shared_library_name, - tk_shared_library_name, - tcl_module_directory_name, - tk_module_directory_name, - image, - script, - ): - """ - Writer for splash screen resources that are bundled into the CArchive as a single archive/entry. - - :param filename: The filename of the archive to create - :param requirements_list: List of filenames for the requirements array - :param str tcl_shared_library_name: Basename of the Tcl shared library - :param str tk_shared_library_name: Basename of the Tk shared library - :param str tcl_module_directory_name: Basename of the Tcl module directory (e.g., tcl/) - :param str tk_module_directory_name: Basename of the Tk module directory (e.g., tk/) - :param Union[str, bytes] image: Image like object - :param str script: The tcl/tk script to execute to create the screen. - """ - - # Ensure forward slashes in dependency names are on Windows converted to back slashes '\\', as on Windows the - # bootloader works only with back slashes. - def _normalize_filename(filename): - filename = os.path.normpath(filename) - if is_win and os.path.sep == '/': - # When building under MSYS, the above path normalization uses Unix-style separators, so replace them - # manually. - filename = filename.replace(os.path.sep, '\\') - return filename - - requirements_list = [_normalize_filename(name) for name in requirements_list] - - with open(filename, "wb") as fp: - # Reserve space for the header. - fp.write(b'\0' * self._HEADER_LENGTH) - - # Serialize the requirements list. This list (more an array) contains the names of all files the bootloader - # needs to extract before the splash screen can be started. The implementation terminates every name with a - # null-byte, that keeps the list short memory wise and makes it iterable from C. - requirements_len = 0 - requirements_offset = fp.tell() - for name in requirements_list: - name = name.encode('utf-8') + b'\0' - fp.write(name) - requirements_len += len(name) - - # Write splash script - script_offset = fp.tell() - script_len = len(script) - fp.write(script.encode("utf-8")) - - # Write splash image. If image is a bytes buffer, it is written directly into the archive. Otherwise, it - # is assumed to be a path and the file is copied into the archive. - image_offset = fp.tell() - if isinstance(image, bytes): - # Image was converted by PIL/Pillow and is already in buffer - image_len = len(image) - fp.write(image) - else: - # Read image into buffer - with open(image, 'rb') as image_fp: - image_data = image_fp.read() - image_len = len(image_data) - fp.write(image_data) - del image_data - - # The following strings are written to 16-character fields with zero-padding, which means that we need to - # ensure that their length is strictly below 16 characters (if it were exactly 16, the field would have no - # terminating NULL character!). - def _encode_str(value, field_name, limit): - enc_value = value.encode("utf-8") - if len(enc_value) >= limit: - raise ValueError( - f"Length of the encoded field {field_name!r} ({len(enc_value)}) is greater or equal to the " - f"limit of {limit} characters!" - ) - - return enc_value - - # Write header - header_data = struct.pack( - self._HEADER_FORMAT, - _encode_str(tcl_shared_library_name, 'tcl_shared_library_name', 32), - _encode_str(tk_shared_library_name, 'tk_shared_library_name', 32), - _encode_str(tcl_module_directory_name, 'tcl_module_directory_name', 16), - _encode_str(tk_module_directory_name, 'tk_module_directory_name', 16), - script_len, - script_offset, - image_len, - image_offset, - requirements_len, - requirements_offset, - ) - - fp.seek(0, os.SEEK_SET) - fp.write(header_data) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/bootloader/Linux-64bit-intel/run b/venv/lib/python3.12/site-packages/PyInstaller/bootloader/Linux-64bit-intel/run deleted file mode 100755 index 24b1aef..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/bootloader/Linux-64bit-intel/run and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/bootloader/Linux-64bit-intel/run_d b/venv/lib/python3.12/site-packages/PyInstaller/bootloader/Linux-64bit-intel/run_d deleted file mode 100755 index d3c2c91..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/bootloader/Linux-64bit-intel/run_d and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/building/__init__.py b/venv/lib/python3.12/site-packages/PyInstaller/building/__init__.py deleted file mode 100755 index 792d600..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/building/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# diff --git a/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 0894e3e..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/api.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/api.cpython-312.pyc deleted file mode 100644 index 93361a2..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/api.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/build_main.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/build_main.cpython-312.pyc deleted file mode 100644 index 325db0f..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/build_main.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/datastruct.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/datastruct.cpython-312.pyc deleted file mode 100644 index 7ffd21c..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/datastruct.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/icon.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/icon.cpython-312.pyc deleted file mode 100644 index 079e4c0..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/icon.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/makespec.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/makespec.cpython-312.pyc deleted file mode 100644 index 2772f89..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/makespec.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/osx.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/osx.cpython-312.pyc deleted file mode 100644 index c0d19df..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/osx.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/splash.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/splash.cpython-312.pyc deleted file mode 100644 index 390b804..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/splash.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/splash_templates.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/splash_templates.cpython-312.pyc deleted file mode 100644 index d3c7fde..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/splash_templates.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/templates.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/templates.cpython-312.pyc deleted file mode 100644 index f5d6209..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/templates.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index 7797d7b..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/building/__pycache__/utils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/building/api.py b/venv/lib/python3.12/site-packages/PyInstaller/building/api.py deleted file mode 100755 index becea2c..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/building/api.py +++ /dev/null @@ -1,1334 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -This module contains classes that are available for the .spec files. - -Spec file is generated by PyInstaller. The generated code from .spec file -is a way how PyInstaller does the dependency analysis and creates executable. -""" - -import os -import subprocess -import sys -import time -import pathlib -import shutil -from operator import itemgetter - -from PyInstaller import HOMEPATH, PLATFORM -from PyInstaller import log as logging -from PyInstaller.archive.writers import CArchiveWriter, ZlibArchiveWriter -from PyInstaller.building.datastruct import Target, _check_guts_eq, normalize_pyz_toc, normalize_toc -from PyInstaller.building.utils import ( - _check_guts_toc, _make_clean_directory, _rmtree, process_collected_binary, get_code_object, compile_pymodule -) -from PyInstaller.building.splash import Splash # argument type validation in EXE -from PyInstaller.compat import is_cygwin, is_darwin, is_linux, is_win, strict_collect_mode, is_nogil, is_aix -from PyInstaller.depend import bindepend -from PyInstaller.depend.analysis import get_bootstrap_modules -import PyInstaller.utils.misc as miscutils - -logger = logging.getLogger(__name__) - -if is_win: - from PyInstaller.utils.win32 import (icon, versioninfo, winmanifest, winresource, winutils) - -if is_darwin: - import PyInstaller.utils.osx as osxutils - - -class PYZ(Target): - """ - Creates a zlib-based PYZ archive that contains byte-compiled pure Python modules. - """ - def __init__(self, *tocs, **kwargs): - """ - tocs - One or more TOC (Table of Contents) lists, usually an `Analysis.pure`. - - kwargs - Possible keyword arguments: - - name - A filename for the .pyz. Normally not needed, as the generated name will do fine. - """ - if kwargs.get("cipher"): - from PyInstaller.exceptions import RemovedCipherFeatureError - raise RemovedCipherFeatureError( - "Please remove the 'cipher' arguments to PYZ() and Analysis() in your spec file." - ) - - from PyInstaller.config import CONF - - super().__init__() - - name = kwargs.get('name', None) - - self.name = name - if name is None: - self.name = os.path.splitext(self.tocfilename)[0] + '.pyz' - - # PyInstaller bootstrapping modules. - bootstrap_dependencies = get_bootstrap_modules() - - # Compile the python modules that are part of bootstrap dependencies, so that they can be collected into the - # CArchive/PKG and imported by the bootstrap script. - self.dependencies = [] - workpath = os.path.join(CONF['workpath'], 'localpycs') - for name, src_path, typecode in bootstrap_dependencies: - if typecode == 'PYMODULE': - # Compile pymodule and include the compiled .pyc file. - pyc_path = compile_pymodule( - name, - src_path, - workpath, - # Never optimize bootstrap dependencies! - optimize=0, - code_cache=None, - ) - self.dependencies.append((name, pyc_path, typecode)) - else: - # Include as is (extensions). - self.dependencies.append((name, src_path, typecode)) - - # Merge input TOC(s) and their code object dictionaries (if available). Skip the bootstrap modules, which will - # be passed on to CArchive/PKG. - bootstrap_module_names = set(name for name, _, typecode in self.dependencies if typecode == 'PYMODULE') - self.toc = [] - self.code_dict = {} - for toc in tocs: - # Check if code cache association exists for the given TOC list - code_cache = CONF['code_cache'].get(id(toc)) - if code_cache is not None: - self.code_dict.update(code_cache) - - for entry in toc: - name, _, typecode = entry - # PYZ expects only PYMODULE entries (python code objects). - assert typecode in {'PYMODULE', 'PYMODULE-1', 'PYMODULE-2'}, f"Invalid entry passed to PYZ: {entry}!" - # Module required during bootstrap; skip to avoid collecting a duplicate. - if name in bootstrap_module_names: - continue - self.toc.append(entry) - - # Normalize TOC - self.toc = normalize_pyz_toc(self.toc) - - # Alphabetically sort the TOC to enable reproducible builds. - self.toc.sort() - - self.__postinit__() - - _GUTS = ( - # input parameters - ('name', _check_guts_eq), - ('toc', _check_guts_toc), - # no calculated/analysed values - ) - - def assemble(self): - logger.info("Building PYZ (ZlibArchive) %s", self.name) - - # Ensure code objects are available for all modules we are about to collect. - # NOTE: PEP-420 namespace packages (marked by src_path being set to '-') do not have code objects. - # NOTE: `self.toc` is already sorted by names. - archive_toc = [] - for entry in self.toc: - name, src_path, typecode = entry - if src_path not in {'-', None} and name not in self.code_dict: - # The code object is not available from the ModuleGraph's cache; re-create it. - optim_level = {'PYMODULE': 0, 'PYMODULE-1': 1, 'PYMODULE-2': 2}[typecode] - try: - self.code_dict[name] = get_code_object(name, src_path, optimize=optim_level) - except SyntaxError: - # The module was likely written for different Python version; exclude it - continue - archive_toc.append(entry) - - # Create the archive - ZlibArchiveWriter(self.name, archive_toc, code_dict=self.code_dict) - logger.info("Building PYZ (ZlibArchive) %s completed successfully.", self.name) - - -class PKG(Target): - """ - Creates a CArchive. CArchive is the data structure that is embedded into the executable. This data structure allows - to include various read-only data in a single-file deployment. - """ - xformdict = { - # PYMODULE entries are already byte-compiled, so we do not need to encode optimization level in the low-level - # typecodes. PYSOURCE entries are byte-compiled by the underlying writer, so we need to pass the optimization - # level via low-level typecodes. - 'PYMODULE': 'm', - 'PYMODULE-1': 'm', - 'PYMODULE-2': 'm', - 'PYSOURCE': 's', - 'PYSOURCE-1': 's1', - 'PYSOURCE-2': 's2', - 'EXTENSION': 'b', - 'PYZ': 'z', - 'PKG': 'a', - 'DATA': 'x', - 'BINARY': 'b', - 'ZIPFILE': 'Z', - 'EXECUTABLE': 'b', - 'DEPENDENCY': 'd', - 'SPLASH': 'l', - 'SYMLINK': 'n', - } - - def __init__( - self, - toc, - python_lib_name, - name=None, - cdict=None, - exclude_binaries=False, - strip_binaries=False, - upx_binaries=False, - upx_exclude=None, - target_arch=None, - codesign_identity=None, - entitlements_file=None - ): - """ - toc - A TOC (Table of Contents) list. - python_lib_name - Name of the python shared library to store in PKG. Required by bootloader. - name - An optional filename for the PKG. - cdict - Dictionary that specifies compression by typecode. For Example, PYZ is left uncompressed so that it - can be accessed inside the PKG. The default uses sensible values. If zlib is not available, no - compression is used. - exclude_binaries - If True, EXTENSIONs and BINARYs will be left out of the PKG, and forwarded to its container (usually - a COLLECT). - strip_binaries - If True, use 'strip' command to reduce the size of binary files. - upx_binaries - """ - super().__init__() - - self.toc = normalize_toc(toc) # Ensure guts contain normalized TOC - self.python_lib_name = python_lib_name - self.cdict = cdict - self.name = name - if name is None: - self.name = os.path.splitext(self.tocfilename)[0] + '.pkg' - self.exclude_binaries = exclude_binaries - self.strip_binaries = strip_binaries - self.upx_binaries = upx_binaries - self.upx_exclude = upx_exclude or [] - self.target_arch = target_arch - self.codesign_identity = codesign_identity - self.entitlements_file = entitlements_file - - # This dict tells PyInstaller what items embedded in the executable should be compressed. - if self.cdict is None: - self.cdict = { - 'EXTENSION': COMPRESSED, - 'DATA': COMPRESSED, - 'BINARY': COMPRESSED, - 'EXECUTABLE': COMPRESSED, - 'PYSOURCE': COMPRESSED, - 'PYMODULE': COMPRESSED, - 'SPLASH': COMPRESSED, - # Do not compress PYZ as a whole, as it contains individually-compressed modules. - 'PYZ': UNCOMPRESSED, - # Do not compress target names in symbolic links. - 'SYMLINK': UNCOMPRESSED, - } - - self.__postinit__() - - _GUTS = ( # input parameters - ('name', _check_guts_eq), - ('cdict', _check_guts_eq), - ('toc', _check_guts_toc), # list unchanged and no newer files - ('python_lib_name', _check_guts_eq), - ('exclude_binaries', _check_guts_eq), - ('strip_binaries', _check_guts_eq), - ('upx_binaries', _check_guts_eq), - ('upx_exclude', _check_guts_eq), - ('target_arch', _check_guts_eq), - ('codesign_identity', _check_guts_eq), - ('entitlements_file', _check_guts_eq), - # no calculated/analysed values - ) - - def assemble(self): - logger.info("Building PKG (CArchive) %s", os.path.basename(self.name)) - - pkg_file = pathlib.Path(self.name).resolve() # Used to detect attempts at PKG feeding itself - - bootstrap_toc = [] # TOC containing bootstrap scripts and modules, which must not be sorted. - archive_toc = [] # TOC containing all other elements. Sorted to enable reproducible builds. - - for dest_name, src_name, typecode in self.toc: - # Ensure that the source file exists, if necessary. Skip the check for OPTION entries, where 'src_name' is - # None. Also skip DEPENDENCY entries due to special contents of 'dest_name' and/or 'src_name'. Same for the - # SYMLINK entries, where 'src_name' is relative target name for symbolic link. - if typecode not in {'OPTION', 'DEPENDENCY', 'SYMLINK'}: - if not os.path.exists(src_name): - if strict_collect_mode: - raise ValueError(f"Non-existent resource {src_name}, meant to be collected as {dest_name}!") - else: - logger.warning( - "Ignoring non-existent resource %s, meant to be collected as %s", src_name, dest_name - ) - continue - - # Detect attempt at collecting PKG into itself, as it results in and endless feeding loop and exhaustion - # of all available storage space. - if pathlib.Path(src_name).resolve() == pkg_file: - raise ValueError(f"Trying to collect PKG file {src_name} into itself!") - - if typecode in ('BINARY', 'EXTENSION'): - if self.exclude_binaries: - # This is onedir-specific codepath - the EXE and consequently PKG should not be passed the Analysis' - # `datas` and `binaries` TOCs (unless the user messes up the .spec file). However, EXTENSION entries - # might still slip in via `PYZ.dependencies`, which are merged by EXE into its TOC and passed on to - # PKG here. Such entries need to be passed to the parent container (the COLLECT) via - # `PKG.dependencies`. - # - # This codepath formerly performed such pass-through only for EXTENSION entries, but in order to - # keep code simple, we now also do it for BINARY entries. In a sane world, we do not expect to - # encounter them here; but if they do happen to pass through here and we pass them on, the - # container's TOC de-duplication should take care of them (same as with EXTENSION ones, really). - self.dependencies.append((dest_name, src_name, typecode)) - else: - # This is onefile-specific codepath. The binaries (both EXTENSION and BINARY entries) need to be - # processed using `process_collected_binary` helper. - src_name = process_collected_binary( - src_name, - dest_name, - use_strip=self.strip_binaries, - use_upx=self.upx_binaries, - upx_exclude=self.upx_exclude, - target_arch=self.target_arch, - codesign_identity=self.codesign_identity, - entitlements_file=self.entitlements_file, - strict_arch_validation=(typecode == 'EXTENSION'), - ) - archive_toc.append((dest_name, src_name, self.cdict.get(typecode, False), self.xformdict[typecode])) - elif typecode in ('DATA', 'ZIPFILE'): - # Same logic as above for BINARY and EXTENSION; if `exclude_binaries` is set, we are in onedir mode; - # we should exclude DATA (and ZIPFILE) entries and instead pass them on via PKG's `dependencies`. This - # prevents a onedir application from becoming a broken onefile one if user accidentally passes datas - # and binaries TOCs to EXE instead of COLLECT. - if self.exclude_binaries: - self.dependencies.append((dest_name, src_name, typecode)) - else: - if typecode == 'DATA' and os.access(src_name, os.X_OK): - # DATA with executable bit set (e.g., shell script); turn into binary so that executable bit is - # restored on the extracted file. - carchive_typecode = 'b' - else: - carchive_typecode = self.xformdict[typecode] - archive_toc.append((dest_name, src_name, self.cdict.get(typecode, False), carchive_typecode)) - elif typecode == 'OPTION': - archive_toc.append((dest_name, '', False, 'o')) - elif typecode in {'PYSOURCE', 'PYSOURCE-1', 'PYSOURCE-2', 'PYMODULE', 'PYMODULE-1', 'PYMODULE-2'}: - # Collect python script and modules in a TOC that will not be sorted. - bootstrap_toc.append((dest_name, src_name, self.cdict.get(typecode, False), self.xformdict[typecode])) - elif typecode == 'PYZ': - # Override PYZ name in the PKG archive into PYZ.pyz, regardless of what the original name was. The - # bootloader looks for PYZ via the typecode and implicitly expects a single entry, so the name does - # not matter. However, having a fixed name matters if we want reproducibility in scenarios where - # multiple builds are performed within the same process (for example, on our CI). - archive_toc.append(('PYZ.pyz', src_name, self.cdict.get(typecode, False), self.xformdict[typecode])) - else: - # PKG, DEPENDENCY, SPLASH, SYMLINK - archive_toc.append((dest_name, src_name, self.cdict.get(typecode, False), self.xformdict[typecode])) - - # Sort content alphabetically by type and name to enable reproducible builds. - archive_toc.sort(key=itemgetter(3, 0)) - # Do *not* sort modules and scripts, as their order is important. - # TODO: Think about having all modules first and then all scripts. - CArchiveWriter(self.name, bootstrap_toc + archive_toc, pylib_name=self.python_lib_name) - - logger.info("Building PKG (CArchive) %s completed successfully.", os.path.basename(self.name)) - - -class EXE(Target): - """ - Creates the final executable of the frozen app. This bundles all necessary files together. - """ - def __init__(self, *args, **kwargs): - """ - args - One or more arguments that are either an instance of `Target` or an iterable representing TOC list. - kwargs - Possible keyword arguments: - - bootloader_ignore_signals - Non-Windows only. If True, the bootloader process will ignore all ignorable signals. If False (default), - it will forward all signals to the child process. Useful in situations where for example a supervisor - process signals both the bootloader and the child (e.g., via a process group) to avoid signalling the - child twice. - console - On Windows or macOS governs whether to use the console executable or the windowed executable. Always - True on Linux/Unix (always console executable - it does not matter there). - hide_console - Windows only. In console-enabled executable, hide or minimize the console window if the program owns the - console window (i.e., was not launched from existing console window). Depending on the setting, the - console is hidden/mininized either early in the bootloader execution ('hide-early', 'minimize-early') or - late in the bootloader execution ('hide-late', 'minimize-late'). The early option takes place as soon as - the PKG archive is found. In onefile builds, the late option takes place after application has unpacked - itself and before it launches the child process. In onedir builds, the late option takes place before - starting the embedded python interpreter. - disable_windowed_traceback - Disable traceback dump of unhandled exception in windowed (noconsole) mode (Windows and macOS only), - and instead display a message that this feature is disabled. - debug - Setting to True gives you progress messages from the executable (for console=False there will be - annoying MessageBoxes on Windows). - name - The filename for the executable. On Windows suffix '.exe' is appended. - exclude_binaries - Forwarded to the PKG the EXE builds. - icon - Windows and macOS only. icon='myicon.ico' to use an icon file or icon='notepad.exe,0' to grab an icon - resource. Defaults to use PyInstaller's console or windowed icon. Use icon=`NONE` to not add any icon. - version - Windows only. version='myversion.txt'. Use grab_version.py to get a version resource from an executable - and then edit the output to create your own. (The syntax of version resources is so arcane that I would - not attempt to write one from scratch). - uac_admin - Windows only. Setting to True creates a Manifest with will request elevation upon application start. - uac_uiaccess - Windows only. Setting to True allows an elevated application to work with Remote Desktop. - argv_emulation - macOS only. Enables argv emulation in macOS .app bundles (i.e., windowed bootloader). If enabled, the - initial open document/URL Apple Events are intercepted by bootloader and converted into sys.argv. - target_arch - macOS only. Used to explicitly specify the target architecture; either single-arch ('x86_64' or 'arm64') - or 'universal2'. Used in checks that the collected binaries contain the requires arch slice(s) and/or - to convert fat binaries into thin ones as necessary. If not specified (default), a single-arch build - corresponding to running architecture is assumed. - codesign_identity - macOS only. Use the provided identity to sign collected binaries and the generated executable. If - signing identity is not provided, ad-hoc signing is performed. - entitlements_file - macOS only. Optional path to entitlements file to use with code signing of collected binaries - (--entitlements option to codesign utility). - contents_directory - Onedir mode only. Specifies the name of the directory where all files par the executable will be placed. - Setting the name to '.' (or '' or None) re-enables old onedir layout without contents directory. - """ - from PyInstaller.config import CONF - - super().__init__() - - # Available options for EXE in .spec files. - self.exclude_binaries = kwargs.get('exclude_binaries', False) - self.bootloader_ignore_signals = kwargs.get('bootloader_ignore_signals', False) - self.console = kwargs.get('console', True) - self.hide_console = kwargs.get('hide_console', None) - self.disable_windowed_traceback = kwargs.get('disable_windowed_traceback', False) - self.debug = kwargs.get('debug', False) - self.name = kwargs.get('name', None) - self.icon = kwargs.get('icon', None) - self.versrsrc = kwargs.get('version', None) - self.manifest = kwargs.get('manifest', None) - self.resources = kwargs.get('resources', []) - self.strip = kwargs.get('strip', False) - self.upx_exclude = kwargs.get("upx_exclude", []) - self.runtime_tmpdir = kwargs.get('runtime_tmpdir', None) - self.contents_directory = kwargs.get("contents_directory", "_internal") - # If ``append_pkg`` is false, the archive will not be appended to the exe, but copied beside it. - self.append_pkg = kwargs.get('append_pkg', True) - - # On Windows allows the exe to request admin privileges. - self.uac_admin = kwargs.get('uac_admin', False) - self.uac_uiaccess = kwargs.get('uac_uiaccess', False) - - # macOS argv emulation - self.argv_emulation = kwargs.get('argv_emulation', False) - - # Target architecture (macOS only) - self.target_arch = kwargs.get('target_arch', None) - if is_darwin: - if self.target_arch is None: - import platform - self.target_arch = platform.machine() - else: - assert self.target_arch in {'x86_64', 'arm64', 'universal2'}, \ - f"Unsupported target arch: {self.target_arch}" - logger.info("EXE target arch: %s", self.target_arch) - else: - self.target_arch = None # explicitly disable - - # Code signing identity (macOS only) - self.codesign_identity = kwargs.get('codesign_identity', None) - if is_darwin: - logger.info("Code signing identity: %s", self.codesign_identity) - else: - self.codesign_identity = None # explicitly disable - # Code signing entitlements - self.entitlements_file = kwargs.get('entitlements_file', None) - - # UPX needs to be both available and enabled for the target. - self.upx = CONF['upx_available'] and kwargs.get('upx', False) - - # Catch and clear options that are unsupported on specific platforms. - if self.versrsrc and not is_win: - logger.warning('Ignoring version information; supported only on Windows!') - self.versrsrc = None - if self.manifest and not is_win: - logger.warning('Ignoring manifest; supported only on Windows!') - self.manifest = None - if self.resources and not is_win: - logger.warning('Ignoring resources; supported only on Windows!') - self.resources = [] - if self.icon and not (is_win or is_darwin): - logger.warning('Ignoring icon; supported only on Windows and macOS!') - self.icon = None - if self.hide_console and not is_win: - logger.warning('Ignoring hide_console; supported only on Windows!') - self.hide_console = None - - if self.contents_directory in ("", "."): - self.contents_directory = None # Re-enable old onedir layout without contents directory. - elif self.contents_directory == ".." or "/" in self.contents_directory or "\\" in self.contents_directory: - raise SystemExit( - f'ERROR: Invalid value "{self.contents_directory}" passed to `--contents-directory` or ' - '`contents_directory`. Exactly one directory level is required (or just "." to disable the ' - 'contents directory).' - ) - - if not kwargs.get('embed_manifest', True): - from PyInstaller.exceptions import RemovedExternalManifestError - raise RemovedExternalManifestError( - "Please remove the 'embed_manifest' argument to EXE() in your spec file." - ) - - # Old .spec format included in 'name' the path where to put created app. New format includes only exename. - # - # Ignore fullpath in the 'name' and prepend DISTPATH or WORKPATH. - # DISTPATH - onefile - # WORKPATH - onedir - if self.exclude_binaries: - # onedir mode - create executable in WORKPATH. - self.name = os.path.join(CONF['workpath'], os.path.basename(self.name)) - else: - # onefile mode - create executable in DISTPATH. - self.name = os.path.join(CONF['distpath'], os.path.basename(self.name)) - - # Old .spec format included on Windows in 'name' .exe suffix. - if is_win or is_cygwin: - # Append .exe suffix if it is not already there. - if not self.name.endswith('.exe'): - self.name += '.exe' - base_name = os.path.splitext(os.path.basename(self.name))[0] - else: - base_name = os.path.basename(self.name) - # Create the CArchive PKG in WORKPATH. When instancing PKG(), set name so that guts check can test whether the - # file already exists. - self.pkgname = os.path.join(CONF['workpath'], base_name + '.pkg') - - self.toc = [] - - for arg in args: - # Valid arguments: PYZ object, Splash object, and TOC-list iterables - if isinstance(arg, (PYZ, Splash)): - # Add object as an entry to the TOC, and merge its dependencies TOC - if isinstance(arg, PYZ): - self.toc.append((os.path.basename(arg.name), arg.name, "PYZ")) - else: - self.toc.append((os.path.basename(arg.name), arg.name, "SPLASH")) - self.toc.extend(arg.dependencies) - elif miscutils.is_iterable(arg): - # TOC-like iterable - self.toc.extend(arg) - else: - raise TypeError(f"Invalid argument type for EXE: {type(arg)!r}") - - if is_nogil: - # Signal to bootloader that python was built with Py_GIL_DISABLED, in order to select correct `PyConfig` - # structure layout at run-time. - self.toc.append(("pyi-python-flag Py_GIL_DISABLED", "", "OPTION")) - - if self.runtime_tmpdir is not None: - self.toc.append(("pyi-runtime-tmpdir " + self.runtime_tmpdir, "", "OPTION")) - - if self.bootloader_ignore_signals: - # no value; presence means "true" - self.toc.append(("pyi-bootloader-ignore-signals", "", "OPTION")) - - if self.disable_windowed_traceback: - # no value; presence means "true" - self.toc.append(("pyi-disable-windowed-traceback", "", "OPTION")) - - if self.argv_emulation: - # no value; presence means "true" - self.toc.append(("pyi-macos-argv-emulation", "", "OPTION")) - - if self.contents_directory: - self.toc.append(("pyi-contents-directory " + self.contents_directory, "", "OPTION")) - - if self.hide_console: - # Validate the value - _HIDE_CONSOLE_VALUES = {'hide-early', 'minimize-early', 'hide-late', 'minimize-late'} - self.hide_console = self.hide_console.lower() - if self.hide_console not in _HIDE_CONSOLE_VALUES: - raise ValueError( - f"Invalid hide_console value: {self.hide_console}! Allowed values: {_HIDE_CONSOLE_VALUES}" - ) - self.toc.append((f"pyi-hide-console {self.hide_console}", "", "OPTION")) - - # If the icon path is relative, make it relative to the .spec file. - if self.icon and self.icon != "NONE": - if isinstance(self.icon, list): - self.icon = [self._makeabs(ic) for ic in self.icon] - else: - self.icon = [self._makeabs(self.icon)] - - if is_win: - if not self.icon: - # --icon not specified; use default from bootloader folder - if self.console: - ico = 'icon-console.ico' - else: - ico = 'icon-windowed.ico' - self.icon = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'bootloader', 'images', ico) - - # Prepare manifest for the executable by creating minimal manifest or modifying the supplied one. - if self.manifest: - # Determine if we were given a filename or an XML string. - if "<" in self.manifest: - self.manifest = self.manifest.encode("utf-8") - else: - self.manifest = self._makeabs(self.manifest) - with open(self.manifest, "rb") as fp: - self.manifest = fp.read() - self.manifest = winmanifest.create_application_manifest(self.manifest, self.uac_admin, self.uac_uiaccess) - - if self.versrsrc: - if isinstance(self.versrsrc, versioninfo.VSVersionInfo): - # We were passed a valid versioninfo.VSVersionInfo structure - pass - elif isinstance(self.versrsrc, (str, bytes, os.PathLike)): - # File path; either absolute, or relative to the spec file - self.versrsrc = self._makeabs(self.versrsrc) - logger.debug("Loading version info from file: %r", self.versrsrc) - self.versrsrc = versioninfo.load_version_info_from_text_file(self.versrsrc) - else: - raise TypeError(f"Unsupported type for version info argument: {type(self.versrsrc)!r}") - - # Identify python shared library. This is needed both for PKG (where we need to store the name so that - # bootloader can look it up), and for macOS-specific processing of the generated executable (adjusting the SDK - # version). - # - # NOTE: we already performed an equivalent search (using the same `get_python_library_path` helper) during the - # analysis stage to ensure that the python shared library is collected. Unfortunately, with the way data passing - # works in onedir builds, we cannot look up the value in the TOC at this stage, and we need to search again. - self.python_lib = bindepend.get_python_library_path() - if self.python_lib is None: - from PyInstaller.exceptions import PythonLibraryNotFoundError - raise PythonLibraryNotFoundError() - - # On AIX, the python shared library might in fact be an ar archive with shared object inside it, and needs to - # be `dlopen`'ed with full name (for example, `libpython3.9.a(libpython3.9.so)`. So if the library's suffix is - # .a, adjust the name accordingly, assuming fixed format for the shared object name. NOTE: the information about - # shared object name is in fact available from `ldd` but not propagated from our binary dependency analysis. If - # we ever need to determine the shared object's name dynamically, we could write a simple ar parser, based on - # information from `https://www.ibm.com/docs/en/aix/7.3?topic=formats-ar-file-format-big`. - if is_aix: - _, ext = os.path.splitext(self.python_lib) - if ext == '.a': - _py_major, _py_minor = sys.version_info[:2] - self.python_lib += f"(libpython{_py_major}.{_py_minor}.so)" - - # Normalize TOC - self.toc = normalize_toc(self.toc) - - self.pkg = PKG( - toc=self.toc, - python_lib_name=os.path.basename(self.python_lib), - name=self.pkgname, - cdict=kwargs.get('cdict', None), - exclude_binaries=self.exclude_binaries, - strip_binaries=self.strip, - upx_binaries=self.upx, - upx_exclude=self.upx_exclude, - target_arch=self.target_arch, - codesign_identity=self.codesign_identity, - entitlements_file=self.entitlements_file - ) - self.dependencies = self.pkg.dependencies - - # Get the path of the bootloader and store it in a TOC, so it can be checked for being changed. - exe = self._bootloader_file('run', '.exe' if is_win or is_cygwin else '') - self.exefiles = [(os.path.basename(exe), exe, 'EXECUTABLE')] - - self.__postinit__() - - _GUTS = ( - # input parameters - ('name', _check_guts_eq), - ('console', _check_guts_eq), - ('debug', _check_guts_eq), - ('exclude_binaries', _check_guts_eq), - ('icon', _check_guts_eq), - ('versrsrc', _check_guts_eq), - ('uac_admin', _check_guts_eq), - ('uac_uiaccess', _check_guts_eq), - ('manifest', _check_guts_eq), - ('append_pkg', _check_guts_eq), - ('argv_emulation', _check_guts_eq), - ('target_arch', _check_guts_eq), - ('codesign_identity', _check_guts_eq), - ('entitlements_file', _check_guts_eq), - # for the case the directory is shared between platforms: - ('pkgname', _check_guts_eq), - ('toc', _check_guts_eq), - ('resources', _check_guts_eq), - ('strip', _check_guts_eq), - ('upx', _check_guts_eq), - ('mtm', None), # checked below - # derived values - ('exefiles', _check_guts_toc), - ('python_lib', _check_guts_eq), - ) - - def _check_guts(self, data, last_build): - if not os.path.exists(self.name): - logger.info("Rebuilding %s because %s missing", self.tocbasename, os.path.basename(self.name)) - return True - if not self.append_pkg and not os.path.exists(self.pkgname): - logger.info("Rebuilding because %s missing", os.path.basename(self.pkgname)) - return True - - if Target._check_guts(self, data, last_build): - return True - - mtm = data['mtm'] - if mtm != miscutils.mtime(self.name): - logger.info("Rebuilding %s because mtimes don't match", self.tocbasename) - return True - if mtm < miscutils.mtime(self.pkg.tocfilename): - logger.info("Rebuilding %s because pkg is more recent", self.tocbasename) - return True - - return False - - @staticmethod - def _makeabs(path): - """ - Helper for anchoring relative paths to spec file location. - """ - from PyInstaller.config import CONF - if os.path.isabs(path): - return path - else: - return os.path.join(CONF['specpath'], path) - - def _bootloader_file(self, exe, extension=None): - """ - Pick up the right bootloader file - debug, console, windowed. - """ - # Having console/windowed bootloader makes sense only on Windows and macOS. - if is_win or is_darwin: - if not self.console: - exe = exe + 'w' - # There are two types of bootloaders: - # run - release, no verbose messages in console. - # run_d - contains verbose messages in console. - if self.debug: - exe = exe + '_d' - if extension: - exe = exe + extension - bootloader_file = os.path.join(HOMEPATH, 'PyInstaller', 'bootloader', PLATFORM, exe) - logger.info('Bootloader %s' % bootloader_file) - return bootloader_file - - def assemble(self): - # On Windows, we used to append .notanexecutable to the intermediate/temporary file name to (attempt to) - # prevent interference from anti-virus programs with the build process (see #6467). This is now disabled - # as we wrap all processing steps that modify the executable in the `_retry_operation` helper; however, - # we keep around the `build_name` variable instead of directly using `self.name`, just in case we need - # to re-enable it... - build_name = self.name - - logger.info("Building EXE from %s", self.tocbasename) - if os.path.exists(self.name): - if os.path.isdir(self.name): - _rmtree(self.name) # will prompt for confirmation if --noconfirm is not given - else: - os.remove(self.name) - if not os.path.exists(os.path.dirname(self.name)): - os.makedirs(os.path.dirname(self.name)) - bootloader_exe = self.exefiles[0][1] # pathname of bootloader - if not os.path.exists(bootloader_exe): - raise SystemExit(_MISSING_BOOTLOADER_ERRORMSG) - - # Step 1: copy the bootloader file, and perform any operations that need to be done prior to appending the PKG. - logger.info("Copying bootloader EXE to %s", build_name) - self._retry_operation(shutil.copyfile, bootloader_exe, build_name) - self._retry_operation(os.chmod, build_name, 0o755) - - if is_win: - # First, remove all resources from the file. This ensures that no manifest is embedded, even if bootloader - # was compiled with a toolchain that forcibly embeds a default manifest (e.g., mingw toolchain from msys2). - self._retry_operation(winresource.remove_all_resources, build_name) - # Embed icon. - if self.icon != "NONE": - logger.info("Copying icon to EXE") - self._retry_operation(icon.CopyIcons, build_name, self.icon) - # Embed version info. - if self.versrsrc: - logger.info("Copying version information to EXE") - self._retry_operation(versioninfo.write_version_info_to_executable, build_name, self.versrsrc) - # Embed/copy other resources. - logger.info("Copying %d resources to EXE", len(self.resources)) - for resource in self.resources: - self._retry_operation(self._copy_windows_resource, build_name, resource) - # Embed the manifest into the executable. - logger.info("Embedding manifest in EXE") - self._retry_operation(winmanifest.write_manifest_to_executable, build_name, self.manifest) - elif is_darwin: - # Convert bootloader to the target arch - logger.info("Converting EXE to target arch (%s)", self.target_arch) - osxutils.binary_to_target_arch(build_name, self.target_arch, display_name='Bootloader EXE') - - # Step 2: append the PKG, if necessary - if self.append_pkg: - append_file = self.pkg.name # Append PKG - append_type = 'PKG archive' # For debug messages - else: - # In onefile mode, copy the stand-alone PKG next to the executable. In onedir, this will be done by the - # COLLECT() target. - if not self.exclude_binaries: - pkg_dst = os.path.join(os.path.dirname(build_name), os.path.basename(self.pkgname)) - logger.info("Copying stand-alone PKG archive from %s to %s", self.pkg.name, pkg_dst) - shutil.copyfile(self.pkg.name, pkg_dst) - else: - logger.info("Stand-alone PKG archive will be handled by COLLECT") - - # The bootloader requires package side-loading to be explicitly enabled, which is done by embedding custom - # signature to the executable. This extra signature ensures that the sideload-enabled executable is at least - # slightly different from the stock bootloader executables, which should prevent antivirus programs from - # flagging our stock bootloaders due to sideload-enabled applications in the wild. - - # Write to temporary file - pkgsig_file = self.pkg.name + '.sig' - with open(pkgsig_file, "wb") as f: - # 8-byte MAGIC; slightly changed PKG MAGIC pattern - f.write(b'MEI\015\013\012\013\016') - - append_file = pkgsig_file # Append PKG-SIG - append_type = 'PKG sideload signature' # For debug messages - - if is_linux: - # Linux: append data into custom ELF section using objcopy. - logger.info("Appending %s to custom ELF section in EXE", append_type) - cmd = ['objcopy', '--add-section', f'pydata={append_file}', build_name] - p = subprocess.run(cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, encoding='utf-8') - if p.returncode: - raise SystemError(f"objcopy Failure: {p.returncode} {p.stdout}") - - elif is_darwin: - # macOS: remove signature, append data, and fix-up headers so that the appended data appears to be part of - # the executable (which is required by strict validation during code-signing). - - # Strip signatures from all arch slices. Strictly speaking, we need to remove signature (if present) from - # the last slice, because we will be appending data to it. When building universal2 bootloaders natively on - # macOS, only arm64 slices have a (dummy) signature. However, when cross-compiling with osxcross, we seem to - # get dummy signatures on both x86_64 and arm64 slices. While the former should not have any impact, it does - # seem to cause issues with further binary signing using real identity. Therefore, we remove all signatures - # and re-sign the binary using dummy signature once the data is appended. - logger.info("Removing signature(s) from EXE") - osxutils.remove_signature_from_binary(build_name) - - # Fix Mach-O image UUID(s) in executable to ensure uniqueness across different builds. - # NOTE: even if PKG is side-loaded, use the hash of its contents to generate the new UUID. - # NOTE: this step is performed *before* PKG is appended and sizes are fixed in the executable's headers; - # this ensures that we are operating only on original header size instead of enlarged one (which could - # be significantly larger in large onefile builds). - logger.info("Modifying Mach-O image UUID(s) in EXE") - osxutils.update_exe_identifier(build_name, self.pkg.name) - - # Append the data - logger.info("Appending %s to EXE", append_type) - self._append_data_to_exe(build_name, append_file) - - # Fix Mach-O headers - logger.info("Fixing EXE headers for code signing") - osxutils.fix_exe_for_code_signing(build_name) - else: - # Fall back to just appending data at the end of the file - logger.info("Appending %s to EXE", append_type) - self._retry_operation(self._append_data_to_exe, build_name, append_file) - - # Step 3: post-processing - if is_win: - # Set checksum to appease antiviral software. Also set build timestamp to current time to increase entropy - # (but honor SOURCE_DATE_EPOCH environment variable for reproducible builds). - logger.info("Fixing EXE headers") - build_timestamp = int(os.environ.get('SOURCE_DATE_EPOCH', time.time())) - self._retry_operation(winutils.set_exe_build_timestamp, build_name, build_timestamp) - self._retry_operation(winutils.update_exe_pe_checksum, build_name) - elif is_darwin: - # If the version of macOS SDK used to build bootloader exceeds that of macOS SDK used to built Python - # library (and, by extension, bundled Tcl/Tk libraries), force the version declared by the frozen executable - # to match that of the Python library. - # Having macOS attempt to enable new features (based on SDK version) for frozen application has no benefit - # if the Python library does not support them as well. - # On the other hand, there seem to be UI issues in tkinter due to failed or partial enablement of dark mode - # (i.e., the bootloader executable being built against SDK 10.14 or later, which causes macOS to enable dark - # mode, and Tk libraries being built against an earlier SDK version that does not support the dark mode). - # With python.org Intel macOS installers, this manifests as black Tk windows and UI elements (see issue - # #5827), while in Anaconda python, it may result in white text on bright background. - pylib_version = osxutils.get_macos_sdk_version(self.python_lib) - exe_version = osxutils.get_macos_sdk_version(build_name) - if pylib_version < exe_version: - logger.info( - "Rewriting the executable's macOS SDK version (%d.%d.%d) to match the SDK version of the Python " - "library (%d.%d.%d) in order to avoid inconsistent behavior and potential UI issues in the " - "frozen application.", *exe_version, *pylib_version - ) - osxutils.set_macos_sdk_version(build_name, *pylib_version) - - # Re-sign the binary (either ad-hoc or using real identity, if provided). - logger.info("Re-signing the EXE") - osxutils.sign_binary(build_name, self.codesign_identity, self.entitlements_file) - - # Ensure executable flag is set - self._retry_operation(os.chmod, build_name, 0o755) - # Get mtime for storing into the guts - self.mtm = self._retry_operation(miscutils.mtime, build_name) - if build_name != self.name: - self._retry_operation(os.rename, build_name, self.name) - logger.info("Building EXE from %s completed successfully.", self.tocbasename) - - def _copy_windows_resource(self, build_name, resource_spec): - import pefile - - # Helper for optionally converting integer strings to values; resource types and IDs/names can be specified as - # either numeric values or custom strings... - def _to_int(value): - try: - return int(value) - except Exception: - return value - - logger.debug("Processing resource: %r", resource_spec) - resource = resource_spec.split(",") # filename,[type],[name],[language] - - if len(resource) < 1 or len(resource) > 4: - raise ValueError( - f"Invalid Windows resource specifier {resource_spec!r}! " - f"Must be in format 'filename,[type],[name],[language]'!" - ) - - # Anchor resource file to spec file location, if necessary. - src_filename = self._makeabs(resource[0]) - - # Ensure file exists. - if not os.path.isfile(src_filename): - raise ValueError(f"Resource file {src_filename!r} does not exist!") - - # Check if src_filename points to a PE file or an arbitrary (data) file. - try: - with pefile.PE(src_filename, fast_load=True): - is_pe_file = True - except Exception: - is_pe_file = False - - if is_pe_file: - # If resource file is PE file, copy all resources from it, subject to specified type, name, and language. - logger.debug("Resource file %r is a PE file...", src_filename) - - # Resource type, name, and language serve as filters. If not specified, use "*". - resource_type = _to_int(resource[1]) if len(resource) >= 2 else "*" - resource_name = _to_int(resource[2]) if len(resource) >= 3 else "*" - resource_lang = _to_int(resource[3]) if len(resource) >= 4 else "*" - - try: - winresource.copy_resources_from_pe_file( - build_name, - src_filename, - [resource_type], - [resource_name], - [resource_lang], - ) - except Exception as e: - raise IOError(f"Failed to copy resources from PE file {src_filename!r}") from e - else: - logger.debug("Resource file %r is an arbitrary data file...", src_filename) - - # For arbitrary data file, resource type and name need to be provided. - if len(resource) < 3: - raise ValueError( - f"Invalid Windows resource specifier {resource_spec!r}! " - f"For arbitrary data file, the format is 'filename,type,name,[language]'!" - ) - - resource_type = _to_int(resource[1]) - resource_name = _to_int(resource[2]) - resource_lang = _to_int(resource[3]) if len(resource) >= 4 else 0 # LANG_NEUTRAL - - # Prohibit wildcards for resource type and name. - if resource_type == "*": - raise ValueError( - f"Invalid Windows resource specifier {resource_spec!r}! " - f"For arbitrary data file, resource type cannot be a wildcard (*)!" - ) - if resource_name == "*": - raise ValueError( - f"Invalid Windows resource specifier {resource_spec!r}! " - f"For arbitrary data file, resource ma,e cannot be a wildcard (*)!" - ) - - try: - with open(src_filename, 'rb') as fp: - data = fp.read() - - winresource.add_or_update_resource( - build_name, - data, - resource_type, - [resource_name], - [resource_lang], - ) - except Exception as e: - raise IOError(f"Failed to embed data file {src_filename!r} as Windows resource") from e - - def _append_data_to_exe(self, build_name, append_file): - with open(build_name, 'ab') as outf: - with open(append_file, 'rb') as inf: - shutil.copyfileobj(inf, outf, length=64 * 1024) - - @staticmethod - def _retry_operation(func, *args, max_attempts=20): - """ - Attempt to execute the given function `max_attempts` number of times while catching exceptions that are usually - associated with Windows anti-virus programs temporarily locking the access to the executable. - """ - def _is_allowed_exception(e): - """ - Helper to determine whether the given exception is eligible for retry or not. - """ - if isinstance(e, PermissionError): - # Always retry on all instances of PermissionError - return True - elif is_win: - from PyInstaller.compat import pywintypes - - # Windows-specific errno and winerror codes. - # https://learn.microsoft.com/en-us/cpp/c-runtime-library/errno-constants - _ALLOWED_ERRNO = { - 13, # EACCES (would typically be a PermissionError instead) - 22, # EINVAL (reported to be caused by Crowdstrike; see #7840) - } - # https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499- - _ALLOWED_WINERROR = { - 5, # ERROR_ACCESS_DENIED (reported in #7825) - 32, # ERROR_SHARING_VIOLATION (exclusive lock via `CreateFileW` flags, or via `_locked`). - 110, # ERROR_OPEN_FAILED (reported in #8138) - } - if isinstance(e, OSError): - # For OSError exceptions other than PermissionError, validate errno. - if e.errno in _ALLOWED_ERRNO: - return True - # OSError typically translates `winerror` into `errno` equivalent; but try to match the original - # values as a fall back, just in case. `OSError.winerror` attribute exists only on Windows. - if e.winerror in _ALLOWED_WINERROR: - return True - elif isinstance(e, pywintypes.error): - # pywintypes.error is raised by helper functions that use win32 C API bound via pywin32-ctypes. - if e.winerror in _ALLOWED_WINERROR: - return True - return False - - func_name = func.__name__ - for attempt in range(max_attempts): - try: - return func(*args) - except Exception as e: - # Check if exception is eligible for retry; if not, also check its immediate cause (in case the - # exception was thrown from an eligible exception). - if not _is_allowed_exception(e) and not _is_allowed_exception(e.__context__): - raise - - # Retry after sleep (unless this was our last attempt) - if attempt < max_attempts - 1: - sleep_duration = 1 / (max_attempts - 1 - attempt) - logger.warning( - f"Execution of {func_name!r} failed on attempt #{attempt + 1} / {max_attempts}: {e!r}. " - f"Retrying in {sleep_duration:.2f} second(s)..." - ) - time.sleep(sleep_duration) - else: - logger.warning( - f"Execution of {func_name!r} failed on attempt #{attempt + 1} / {max_attempts}: {e!r}." - ) - raise RuntimeError(f"Execution of {func_name!r} failed - no more attempts left!") from e - - -class COLLECT(Target): - """ - In one-dir mode creates the output folder with all necessary files. - """ - def __init__(self, *args, **kwargs): - """ - args - One or more arguments that are either an instance of `Target` or an iterable representing TOC list. - kwargs - Possible keyword arguments: - - name - The name of the directory to be built. - """ - from PyInstaller.config import CONF - - super().__init__() - - self.strip_binaries = kwargs.get('strip', False) - self.upx_exclude = kwargs.get("upx_exclude", []) - self.console = True - self.target_arch = None - self.codesign_identity = None - self.entitlements_file = None - - # UPX needs to be both available and enabled for the taget. - self.upx_binaries = CONF['upx_available'] and kwargs.get('upx', False) - - # The `name` should be the output directory name, without the parent path (the directory is created in the - # DISTPATH). Old .spec formats included parent path, so strip it away. - self.name = os.path.join(CONF['distpath'], os.path.basename(kwargs.get('name'))) - - for arg in args: - if isinstance(arg, EXE): - self.contents_directory = arg.contents_directory - break - else: - raise ValueError("No EXE() instance was passed to COLLECT()") - - self.toc = [] - for arg in args: - # Valid arguments: EXE object and TOC-like iterables - if isinstance(arg, EXE): - # Add EXE as an entry to the TOC, and merge its dependencies TOC - self.toc.append((os.path.basename(arg.name), arg.name, 'EXECUTABLE')) - self.toc.extend(arg.dependencies) - # Inherit settings - self.console = arg.console - self.target_arch = arg.target_arch - self.codesign_identity = arg.codesign_identity - self.entitlements_file = arg.entitlements_file - # Search for the executable's external manifest, and collect it if available - for dest_name, src_name, typecode in arg.toc: - if dest_name == os.path.basename(arg.name) + ".manifest": - self.toc.append((dest_name, src_name, typecode)) - # If PKG is not appended to the executable, we need to collect it. - if not arg.append_pkg: - self.toc.append((os.path.basename(arg.pkgname), arg.pkgname, 'PKG')) - elif miscutils.is_iterable(arg): - # TOC-like iterable - self.toc.extend(arg) - else: - raise TypeError(f"Invalid argument type for COLLECT: {type(arg)!r}") - - # Normalize TOC - self.toc = normalize_toc(self.toc) - - self.__postinit__() - - _GUTS = ( - # COLLECT always builds, we just want the TOC to be written out. - ('toc', None), - ) - - def _check_guts(self, data, last_build): - # COLLECT always needs to be executed, in order to clean the output directory. - return True - - def assemble(self): - _make_clean_directory(self.name) - logger.info("Building COLLECT %s", self.tocbasename) - for dest_name, src_name, typecode in self.toc: - # Ensure that the source file exists, if necessary. Skip the check for DEPENDENCY entries due to special - # contents of 'dest_name' and/or 'src_name'. Same for the SYMLINK entries, where 'src_name' is relative - # target name for symbolic link. - if typecode not in {'DEPENDENCY', 'SYMLINK'} and not os.path.exists(src_name): - # If file is contained within python egg, it will be added with the egg. - if strict_collect_mode: - raise ValueError(f"Non-existent resource {src_name}, meant to be collected as {dest_name}!") - else: - logger.warning( - "Ignoring non-existent resource %s, meant to be collected as %s", src_name, dest_name - ) - continue - # Disallow collection outside of the dist directory. - if os.pardir in os.path.normpath(dest_name).split(os.sep) or os.path.isabs(dest_name): - raise SystemExit( - 'ERROR: attempting to store file outside of the dist directory: %r. Aborting.' % dest_name - ) - # Create parent directory structure, if necessary - if typecode in ("EXECUTABLE", "PKG"): - dest_path = os.path.join(self.name, dest_name) - else: - dest_path = os.path.join(self.name, self.contents_directory or "", dest_name) - dest_dir = os.path.dirname(dest_path) - try: - os.makedirs(dest_dir, exist_ok=True) - except FileExistsError: - raise SystemExit( - f"ERROR: Pyinstaller needs to create a directory at {dest_dir!r}, " - "but there already exists a file at that path!" - ) - if typecode in ('EXTENSION', 'BINARY'): - src_name = process_collected_binary( - src_name, - dest_name, - use_strip=self.strip_binaries, - use_upx=self.upx_binaries, - upx_exclude=self.upx_exclude, - target_arch=self.target_arch, - codesign_identity=self.codesign_identity, - entitlements_file=self.entitlements_file, - strict_arch_validation=(typecode == 'EXTENSION'), - ) - if typecode == 'SYMLINK': - # On Windows, ensure that symlink target path (stored in src_name) is using Windows-style back slash - # separators. - if is_win and os.path.sep == '/': - src_name = src_name.replace(os.path.sep, '\\') - - os.symlink(src_name, dest_path) # Create link at dest_path, pointing at (relative) src_name - elif typecode != 'DEPENDENCY': - # At this point, `src_name` should be a valid file. - if not os.path.isfile(src_name): - raise ValueError(f"Resource {src_name!r} is not a valid file!") - # If strict collection mode is enabled, the destination should not exist yet. - if strict_collect_mode and os.path.exists(dest_path): - raise ValueError( - f"Attempting to collect a duplicated file into COLLECT: {dest_name} (type: {typecode})" - ) - # Use `shutil.copyfile` to copy file with default permissions. We do not attempt to preserve original - # permissions nor metadata, as they might be too restrictive and cause issues either during subsequent - # re-build attempts or when trying to move the application bundle. For binaries (and data files with - # executable bit set), we manually set the executable bits after copying the file. - shutil.copyfile(src_name, dest_path) - if ( - typecode in ('EXTENSION', 'BINARY', 'EXECUTABLE') - or (typecode == 'DATA' and os.access(src_name, os.X_OK)) - ): - os.chmod(dest_path, 0o755) - logger.info("Building COLLECT %s completed successfully.", self.tocbasename) - - -class MERGE: - """ - Given Analysis objects for multiple executables, replace occurrences of data and binary files with references to the - first executable in which they occur. The actual data and binary files are then collected only once, thereby - reducing the disk space used by multiple executables. Every executable (even onedir ones!) obtained from a - MERGE-processed Analysis gains onefile semantics, because it needs to extract its referenced dependencies from other - executables into temporary directory before they can run. - """ - def __init__(self, *args): - """ - args - Dependencies as a list of (analysis, identifier, path_to_exe) tuples. `analysis` is an instance of - `Analysis`, `identifier` is the basename of the entry-point script (without .py suffix), and `path_to_exe` - is path to the corresponding executable, relative to the `dist` directory (without .exe suffix in the - filename component). For onefile executables, `path_to_exe` is usually just executable's base name - (e.g., `myexecutable`). For onedir executables, `path_to_exe` usually comprises both the application's - directory name and executable name (e.g., `myapp/myexecutable`). - """ - self._dependencies = {} - self._symlinks = set() - - # Process all given (analysis, identifier, path_to_exe) tuples - for analysis, identifier, path_to_exe in args: - # Process analysis.binaries and analysis.datas TOCs. self._process_toc() call returns two TOCs; the first - # contains entries that remain within this analysis, while the second contains entries that reference - # an entry in another executable. - binaries, binaries_refs = self._process_toc(analysis.binaries, path_to_exe) - datas, datas_refs = self._process_toc(analysis.datas, path_to_exe) - # Update `analysis.binaries`, `analysis.datas`, and `analysis.dependencies`. - # The entries that are found in preceding executable(s) are removed from `binaries` and `datas`, and their - # DEPENDENCY entry counterparts are added to `dependencies`. We cannot simply update the entries in - # `binaries` and `datas`, because at least in theory, we need to support both onefile and onedir mode. And - # while in onefile, `a.datas`, `a.binaries`, and `a.dependencies` are passed to `EXE` (and its `PKG`), with - # onedir, `a.datas` and `a.binaries` need to be passed to `COLLECT` (as they were before the MERGE), while - # `a.dependencies` needs to be passed to `EXE`. This split requires DEPENDENCY entries to be in a separate - # TOC. - analysis.binaries = normalize_toc(binaries) - analysis.datas = normalize_toc(datas) - analysis.dependencies += binaries_refs + datas_refs - - def _process_toc(self, toc, path_to_exe): - # NOTE: unfortunately, these need to keep two separate lists. See the comment in the calling code on why this - # is so. - toc_keep = [] - toc_refs = [] - for entry in toc: - dest_name, src_name, typecode = entry - - # Special handling and bookkeeping for symbolic links. We need to account both for dest_name and src_name, - # because src_name might be the same in different contexts. For example, when collecting Qt .framework - # bundles on macOS, there are multiple relative symbolic links `Current -> A` (one in each .framework). - if typecode == 'SYMLINK': - key = dest_name, src_name - if key not in self._symlinks: - # First occurrence; keep the entry in "for-keep" TOC, same as we would for binaries and datas. - logger.debug("Keeping symbolic link %r entry in original TOC.", entry) - self._symlinks.add(key) - toc_keep.append(entry) - else: - # Subsequent occurrence; keep the SYMLINK entry intact, but add it to the references TOC instead of - # "for-keep" TOC, so it ends up in `a.dependencies`. - logger.debug("Moving symbolic link %r entry to references TOC.", entry) - toc_refs.append(entry) - del key # Block-local variable - continue - - # In fact, we need to accout for both dest_name and src_name with regular entries as well; previous - # approach that considered only src_name ended tripped up when same file was collected in different - # locations (i.e., same src_name but different dest_names). - key = dest_name, src_name - if key not in self._dependencies: - logger.debug("Adding dependency %r located in %s", key, path_to_exe) - self._dependencies[key] = path_to_exe - # Add entry to list of kept TOC entries - toc_keep.append(entry) - else: - # Construct relative dependency path; i.e., the relative path from this executable (or rather, its - # parent directory) to the executable that contains the dependency. - dep_path = os.path.relpath(self._dependencies[key], os.path.dirname(path_to_exe)) - # Ignore references that point to the origin package. This can happen if the same resource is listed - # multiple times in TOCs (e.g., once as binary and once as data). - if dep_path.endswith(path_to_exe): - logger.debug( - "Ignoring self-reference of %r for %s, located in %s - duplicated TOC entry?", key, path_to_exe, - dep_path - ) - # The entry is a duplicate, and should be ignored (i.e., do not add it to either of output TOCs). - continue - logger.debug("Referencing %r to be a dependency for %s, located in %s", key, path_to_exe, dep_path) - # Create new DEPENDENCY entry; under destination path (first element), we store the original destination - # path, while source path contains the relative reference path. - toc_refs.append((dest_name, dep_path, "DEPENDENCY")) - - return toc_keep, toc_refs - - -UNCOMPRESSED = False -COMPRESSED = True - -_MISSING_BOOTLOADER_ERRORMSG = """Fatal error: PyInstaller does not include a pre-compiled bootloader for your -platform. For more details and instructions how to build the bootloader see -""" diff --git a/venv/lib/python3.12/site-packages/PyInstaller/building/build_main.py b/venv/lib/python3.12/site-packages/PyInstaller/building/build_main.py deleted file mode 100755 index bceb964..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/building/build_main.py +++ /dev/null @@ -1,1275 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Build packages using spec files. - -NOTE: All global variables, classes and imported modules create API for .spec files. -""" - -import glob -import os -import pathlib -import pprint -import shutil -import enum -import re -import sys - -from PyInstaller import DEFAULT_DISTPATH, DEFAULT_WORKPATH, HOMEPATH, compat -from PyInstaller import log as logging -from PyInstaller.building.api import COLLECT, EXE, MERGE, PYZ -from PyInstaller.building.datastruct import ( - TOC, Target, Tree, _check_guts_eq, normalize_toc, normalize_pyz_toc, toc_process_symbolic_links -) -from PyInstaller.building.osx import BUNDLE -from PyInstaller.building.splash import Splash -from PyInstaller.building.utils import ( - _check_guts_toc, _check_guts_toc_mtime, _should_include_system_binary, format_binaries_and_datas, compile_pymodule, - destination_name_for_extension, postprocess_binaries_toc_pywin32, postprocess_binaries_toc_pywin32_anaconda, - create_base_library_zip -) -from PyInstaller.compat import is_win, is_conda, is_darwin, is_linux -from PyInstaller.depend import bindepend -from PyInstaller.depend.analysis import initialize_modgraph, HOOK_PRIORITY_USER_HOOKS -from PyInstaller.depend.utils import scan_code_for_ctypes -from PyInstaller import isolated -from PyInstaller.utils.misc import absnormpath, get_path_to_toplevel_modules, mtime -from PyInstaller.utils.hooks import get_package_paths -from PyInstaller.utils.hooks.gi import compile_glib_schema_files - -if is_darwin: - from PyInstaller.utils import osx as osxutils - -logger = logging.getLogger(__name__) - -STRINGTYPE = type('') -TUPLETYPE = type((None,)) - -rthooks = {} - -# Place where the loader modules and initialization scripts live. -_init_code_path = os.path.join(HOMEPATH, 'PyInstaller', 'loader') - -IMPORT_TYPES = [ - 'top-level', 'conditional', 'delayed', 'delayed, conditional', 'optional', 'conditional, optional', - 'delayed, optional', 'delayed, conditional, optional' -] - -WARNFILE_HEADER = """\ - -This file lists modules PyInstaller was not able to find. This does not -necessarily mean these modules are required for running your program. Both -Python's standard library and 3rd-party Python packages often conditionally -import optional modules, some of which may be available only on certain -platforms. - -Types of import: -* top-level: imported at the top-level - look at these first -* conditional: imported within an if-statement -* delayed: imported within a function -* optional: imported within a try-except-statement - -IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for - tracking down the missing module yourself. Thanks! - -""" - - -@isolated.decorate -def discover_hook_directories(): - """ - Discover hook directories via pyinstaller40 entry points. Perform the discovery in an isolated subprocess - to avoid importing the package(s) in the main process. - - :return: list of discovered hook directories. - """ - - from traceback import format_exception_only - from PyInstaller.log import logger - from PyInstaller.compat import importlib_metadata - from PyInstaller.depend.analysis import HOOK_PRIORITY_CONTRIBUTED_HOOKS, HOOK_PRIORITY_UPSTREAM_HOOKS - - # The “selectable” entry points (via group and name keyword args) were introduced in importlib_metadata 4.6 and - # Python 3.10. The compat module ensures we are using a compatible version. - entry_points = importlib_metadata.entry_points(group='pyinstaller40', name='hook-dirs') - - # Ensure that pyinstaller_hooks_contrib comes last so that hooks from packages providing their own take priority. - # In pyinstaller-hooks-contrib >= 2024.8, the entry-point module is `_pyinstaller_hooks_contrib`; in earlier - # versions, it was `_pyinstaller_hooks_contrib.hooks`. - entry_points = sorted(entry_points, key=lambda x: x.module.startswith("_pyinstaller_hooks_contrib")) - - hook_directories = [] - for entry_point in entry_points: - # Query hook directory location(s) from entry point - try: - hook_directory_entries = entry_point.load()() - except Exception as e: - msg = "".join(format_exception_only(type(e), e)).strip() - logger.warning("discover_hook_directories: Failed to process hook entry point '%s': %s", entry_point, msg) - continue - - # Determine location-based priority: upstream hooks vs. hooks from contributed hooks package. - location_priority = ( - HOOK_PRIORITY_CONTRIBUTED_HOOKS - if entry_point.module.startswith("_pyinstaller_hooks_contrib") else HOOK_PRIORITY_UPSTREAM_HOOKS - ) - - # Append entries - hook_directories.extend([(hook_directory_entry, location_priority) - for hook_directory_entry in hook_directory_entries]) - - logger.debug("discover_hook_directories: Hook directories: %s", hook_directories) - - return hook_directories - - -def find_binary_dependencies(binaries, import_packages, symlink_suppression_patterns): - """ - Find dynamic dependencies (linked shared libraries) for the provided list of binaries. - - On Windows, this function performs additional pre-processing in an isolated environment in an attempt to handle - dynamic library search path modifications made by packages during their import. The packages from the given list - of collected packages are imported one by one, while keeping track of modifications made by `os.add_dll_directory` - calls and additions to the `PATH` environment variable. The recorded additional search paths are then passed to - the binary dependency analysis step. - - binaries - List of binaries to scan for dynamic dependencies. - import_packages - List of packages to import prior to scanning binaries. - symlink_suppression_patterns - Set of paths and/or path patterns for which binary dependency analysis should not create symbolic links - to the top-level application directory (when the discovered shared library's parent directory structure - is preserved). When binary dependency analysis discovers a shared library, it matches its *source path* - against all symlink suppression patterns (using `pathlib.PurePath.match`) to determine whether to create - a symbolic link to top-level application directory or not. - - :return: expanded list of binaries and then dependencies. - """ - - # Extra library search paths (used on Windows to resolve DLL paths). - extra_libdirs = [] - if compat.is_win: - # Always search `sys.base_prefix`, and search it first. This ensures that we resolve the correct version of - # `python3X.dll` and `python3.dll` (a PEP-0384 stable ABI stub that forwards symbols to the fully versioned - # `python3X.dll`), regardless of other python installations that might be present in the PATH. - extra_libdirs.append(compat.base_prefix) - - # When using python built from source, `sys.base_prefix` does not point to the directory that contains python - # executable, `python3X.dll`, and `python3.dll`. To accommodate such case, also add the directory in which - # python executable is located to the extra search paths. On the off-chance that this is a combination of venv - # and python built from source, prefer `sys._base_executable` over `sys.executable`. - extra_libdirs.append(os.path.dirname(getattr(sys, '_base_executable', sys.executable))) - - # If `pywin32` is installed, resolve the path to the `pywin32_system32` directory. Most `pywin32` extensions - # reference the `pywintypes3X.dll` in there. Based on resolved `pywin32_system32` directory, also add other - # `pywin32` directory, in case extensions in different directories reference each other (the ones in the same - # directory should already be resolvable due to binary dependency analysis passing the analyzed binary's - # location to the `get_imports` function). This allows us to avoid searching all paths in `sys.path`, which - # may lead to other corner-case issues (e.g., #5560). - pywin32_system32_dir = None - try: - # Look up the directory by treating it as a namespace package. - _, pywin32_system32_dir = get_package_paths('pywin32_system32') - except Exception: - pass - - if pywin32_system32_dir: - pywin32_base_dir = os.path.dirname(pywin32_system32_dir) - extra_libdirs += [ - pywin32_system32_dir, # .../pywin32_system32 - # based on pywin32.pth - os.path.join(pywin32_base_dir, 'win32'), # .../win32 - os.path.join(pywin32_base_dir, 'win32', 'lib'), # .../win32/lib - os.path.join(pywin32_base_dir, 'Pythonwin'), # .../Pythonwin - ] - - # On Windows, packages' initialization code might register additional DLL search paths, either by modifying the - # `PATH` environment variable, or by calling `os.add_dll_directory`. Therefore, we import all collected packages, - # and track changes made to the environment. - if compat.is_win: - # Helper functions to be executed in isolated environment. - def setup(suppressed_imports): - """ - Prepare environment for change tracking - """ - import os - import sys - - os._added_dll_directories = [] - os._original_path_env = os.environ.get('PATH', '') - - _original_add_dll_directory = os.add_dll_directory - - def _pyi_add_dll_directory(path): - os._added_dll_directories.append(path) - return _original_add_dll_directory(path) - - os.add_dll_directory = _pyi_add_dll_directory - - # Suppress import of specified packages - for name in suppressed_imports: - sys.modules[name] = None - - def import_library(package): - """ - Import collected package to set up environment. - """ - try: - __import__(package) - except Exception: - pass - - def process_search_paths(): - """ - Obtain lists of added search paths. - """ - import os - - # `os.add_dll_directory` might be called with a `pathlib.Path`, which cannot be marhsalled out of the helper - # process. So explicitly convert all entries to strings. - dll_directories = [str(path) for path in os._added_dll_directories] - - orig_path = set(os._original_path_env.split(os.pathsep)) - modified_path = os.environ.get('PATH', '').split(os.pathsep) - path_additions = [path for path in modified_path if path and path not in orig_path] - - return dll_directories, path_additions - - # Pre-process the list of packages to import. - # Check for Qt bindings packages, and put them at the front of the packages list. This ensures that they are - # always imported first, which should prevent packages that support multiple bindings (`qtypy`, `pyqtgraph`, - # `matplotlib`, etc.) from trying to auto-select bindings. - _QT_BINDINGS = ('PySide2', 'PyQt5', 'PySide6', 'PyQt6') - - qt_packages = [] - other_packages = [] - for package in import_packages: - if package.startswith(_QT_BINDINGS): - qt_packages.append(package) - else: - other_packages.append(package) - import_packages = qt_packages + other_packages - - # Just in case, explicitly suppress imports of Qt bindings that we are *not* collecting - if multiple bindings - # are available and some were excluded from our analysis, a package imported here might still try to import an - # excluded bindings package (and succeed at doing so). - suppressed_imports = [package for package in _QT_BINDINGS if package not in qt_packages] - - # If we suppressed PySide2 or PySide6, we must also suppress their corresponding shiboken package - if "PySide2" in suppressed_imports: - suppressed_imports += ["shiboken2"] - if "PySide6" in suppressed_imports: - suppressed_imports += ["shiboken6"] - - # Suppress import of `pyqtgraph.canvas`, which is known to crash python interpreter. See #7452 and #8322, as - # well as https://github.com/pyqtgraph/pyqtgraph/issues/2838. - suppressed_imports += ['pyqtgraph.canvas'] - - # PySimpleGUI 5.x displays a "first-run" dialog when imported for the first time, which blocks the loop below. - # This is a problem for building on CI, where the dialog cannot be closed, and where PySimpleGUI runs "for the - # first time" every time. See #8396. - suppressed_imports += ['PySimpleGUI'] - - # Processing in isolated environment. - with isolated.Python() as child: - child.call(setup, suppressed_imports) - for package in import_packages: - try: - child.call(import_library, package) - except isolated.SubprocessDiedError as e: - # Re-raise as `isolated.SubprocessDiedError` again, to trigger error-handling codepath in - # `isolated.Python.__exit__()`. - raise isolated.SubprocessDiedError( - f"Isolated subprocess crashed while importing package {package!r}! " - f"Package import list: {import_packages!r}" - ) from e - added_dll_directories, added_path_directories = child.call(process_search_paths) - - # Process extra search paths... - logger.info("Extra DLL search directories (AddDllDirectory): %r", added_dll_directories) - extra_libdirs += added_dll_directories - - logger.info("Extra DLL search directories (PATH): %r", added_path_directories) - extra_libdirs += added_path_directories - - # Deduplicate search paths - # NOTE: `list(set(extra_libdirs))` does not preserve the order of search paths (which matters here), so we need to - # de-duplicate using `list(dict.fromkeys(extra_libdirs).keys())` instead. - extra_libdirs = list(dict.fromkeys(extra_libdirs).keys()) - - # Search for dependencies of the given binaries - return bindepend.binary_dependency_analysis( - binaries, - search_paths=extra_libdirs, - symlink_suppression_patterns=symlink_suppression_patterns, - ) - - -class _ModuleCollectionMode(enum.IntFlag): - """ - Module collection mode flags. - """ - PYZ = enum.auto() # Collect byte-compiled .pyc into PYZ archive - PYC = enum.auto() # Collect byte-compiled .pyc as external data file - PY = enum.auto() # Collect source .py file as external data file - - -_MODULE_COLLECTION_MODES = { - "pyz": _ModuleCollectionMode.PYZ, - "pyc": _ModuleCollectionMode.PYC, - "py": _ModuleCollectionMode.PY, - "pyz+py": _ModuleCollectionMode.PYZ | _ModuleCollectionMode.PY, - "py+pyz": _ModuleCollectionMode.PYZ | _ModuleCollectionMode.PY, -} - - -def _get_module_collection_mode(mode_dict, name, noarchive=False): - """ - Determine the module/package collection mode for the given module name, based on the provided collection - mode settings dictionary. - """ - # Default mode: collect into PYZ, unless noarchive is enabled. In that case, collect as pyc. - mode_flags = _ModuleCollectionMode.PYC if noarchive else _ModuleCollectionMode.PYZ - - # If we have no collection mode settings, end here and now. - if not mode_dict: - return mode_flags - - # Search the parent modules/packages in top-down fashion, and take the last given setting. This ensures that - # a setting given for the top-level package is recursively propagated to all its subpackages and submodules, - # but also allows individual sub-modules to override the setting again. - mode = 'pyz' - - name_parts = name.split('.') - for i in range(len(name_parts)): - modlevel = ".".join(name_parts[:i + 1]) - modlevel_mode = mode_dict.get(modlevel, None) - if modlevel_mode is not None: - mode = modlevel_mode - - # Convert mode string to _ModuleCollectionMode flags - try: - mode_flags = _MODULE_COLLECTION_MODES[mode] - except KeyError: - raise ValueError(f"Unknown module collection mode for {name!r}: {mode!r}!") - - # noarchive flag being set means that we need to change _ModuleCollectionMode.PYZ into _ModuleCollectionMode.PYC - if noarchive and _ModuleCollectionMode.PYZ in mode_flags: - mode_flags ^= _ModuleCollectionMode.PYZ - mode_flags |= _ModuleCollectionMode.PYC - - return mode_flags - - -class Analysis(Target): - """ - Class that performs analysis of the user's main Python scripts. - - An Analysis contains multiple TOC (Table of Contents) lists, accessed as attributes of the analysis object. - - scripts - The scripts you gave Analysis as input, with any runtime hook scripts prepended. - pure - The pure Python modules. - binaries - The extension modules and their dependencies. - datas - Data files collected from packages. - zipfiles - Deprecated - always empty. - zipped_data - Deprecated - always empty. - """ - _old_scripts = { - absnormpath(os.path.join(HOMEPATH, "support", "_mountzlib.py")), - absnormpath(os.path.join(HOMEPATH, "support", "useUnicode.py")), - absnormpath(os.path.join(HOMEPATH, "support", "useTK.py")), - absnormpath(os.path.join(HOMEPATH, "support", "unpackTK.py")), - absnormpath(os.path.join(HOMEPATH, "support", "removeTK.py")) - } - - def __init__( - self, - scripts, - pathex=None, - binaries=None, - datas=None, - hiddenimports=None, - hookspath=None, - hooksconfig=None, - excludes=None, - runtime_hooks=None, - cipher=None, - win_no_prefer_redirects=False, - win_private_assemblies=False, - noarchive=False, - module_collection_mode=None, - optimize=-1, - **_kwargs, - ): - """ - scripts - A list of scripts specified as file names. - pathex - An optional list of paths to be searched before sys.path. - binaries - An optional list of additional binaries (dlls, etc.) to include. - datas - An optional list of additional data files to include. - hiddenimport - An optional list of additional (hidden) modules to include. - hookspath - An optional list of additional paths to search for hooks. (hook-modules). - hooksconfig - An optional dict of config settings for hooks. (hook-modules). - excludes - An optional list of module or package names (their Python names, not path names) that will be - ignored (as though they were not found). - runtime_hooks - An optional list of scripts to use as users' runtime hooks. Specified as file names. - cipher - Deprecated. Raises an error if not None. - win_no_prefer_redirects - Deprecated. Raises an error if not False. - win_private_assemblies - Deprecated. Raises an error if not False. - noarchive - If True, do not place source files in a archive, but keep them as individual files. - module_collection_mode - An optional dict of package/module names and collection mode strings. Valid collection mode strings: - 'pyz' (default), 'pyc', 'py', 'pyz+py' (or 'py+pyz') - optimize - Optimization level for collected bytecode. If not specified or set to -1, it is set to the value of - `sys.flags.optimize` of the running build process. - """ - if cipher is not None: - from PyInstaller.exceptions import RemovedCipherFeatureError - raise RemovedCipherFeatureError( - "Please remove the 'cipher' arguments to PYZ() and Analysis() in your spec file." - ) - if win_no_prefer_redirects: - from PyInstaller.exceptions import RemovedWinSideBySideSupportError - raise RemovedWinSideBySideSupportError( - "Please remove the 'win_no_prefer_redirects' argument to Analysis() in your spec file." - ) - if win_private_assemblies: - from PyInstaller.exceptions import RemovedWinSideBySideSupportError - raise RemovedWinSideBySideSupportError( - "Please remove the 'win_private_assemblies' argument to Analysis() in your spec file." - ) - super().__init__() - from PyInstaller.config import CONF - - self.inputs = [] - spec_dir = os.path.dirname(CONF['spec']) - for script in scripts: - # If path is relative, it is relative to the location of .spec file. - if not os.path.isabs(script): - script = os.path.join(spec_dir, script) - if absnormpath(script) in self._old_scripts: - logger.warning('Ignoring obsolete auto-added script %s', script) - continue - # Normalize script path. - script = os.path.normpath(script) - if not os.path.exists(script): - raise SystemExit("ERROR: script '%s' not found" % script) - self.inputs.append(script) - - # Django hook requires this variable to find the script manage.py. - CONF['main_script'] = self.inputs[0] - - site_packages_pathex = [] - for path in (pathex or []): - if pathlib.Path(path).name == "site-packages": - site_packages_pathex.append(str(path)) - if site_packages_pathex: - logger.log( - logging.DEPRECATION, "Foreign Python environment's site-packages paths added to --paths/pathex:\n%s\n" - "This is ALWAYS the wrong thing to do. If your environment's site-packages is not in PyInstaller's " - "module search path then you are running PyInstaller from a different environment to the one your " - "packages are in. Run print(sys.prefix) without PyInstaller to get the environment you should be using " - "then install and run PyInstaller from that environment instead of this one. This warning will become " - "an error in PyInstaller 7.0.", pprint.pformat(site_packages_pathex) - ) - - self.pathex = self._extend_pathex(pathex, self.inputs) - # Set global config variable 'pathex' to make it available for PyInstaller.utils.hooks and import hooks. Path - # extensions for module search. - CONF['pathex'] = self.pathex - # Extend sys.path so PyInstaller could find all necessary modules. - sys.path.extend(self.pathex) - logger.info('Module search paths (PYTHONPATH):\n' + pprint.pformat(sys.path)) - - self.hiddenimports = hiddenimports or [] - # Include hidden imports passed via CONF['hiddenimports']; these might be populated if user has a wrapper script - # that calls `build_main.main()` with custom `pyi_config` dictionary that contains `hiddenimports`. - self.hiddenimports.extend(CONF.get('hiddenimports', [])) - - for modnm in self.hiddenimports: - if re.search(r"[\\/]", modnm): - raise SystemExit( - f"ERROR: Invalid hiddenimport '{modnm}'. Hidden imports should be importable module names – not " - "file paths. i.e. use --hiddenimport=foo.bar instead of --hiddenimport=.../site-packages/foo/bar.py" - ) - - self.hookspath = [] - # Prepend directories in `hookspath` (`--additional-hooks-dir`) to take precedence over those from the entry - # points. Expand starting tilde into user's home directory, as a work-around for tilde not being expanded by - # shell when using `--additional-hooks-dir=~/path/abc` instead of `--additional-hooks-dir ~/path/abc` (or when - # the path argument is quoted). - if hookspath: - self.hookspath.extend([(os.path.expanduser(path), HOOK_PRIORITY_USER_HOOKS) for path in hookspath]) - - # Add hook directories from PyInstaller entry points. - self.hookspath += discover_hook_directories() - - self.hooksconfig = {} - if hooksconfig: - self.hooksconfig.update(hooksconfig) - - # Custom runtime hook files that should be included and started before any existing PyInstaller runtime hooks. - self.custom_runtime_hooks = runtime_hooks or [] - - self._input_binaries = [] - self._input_datas = [] - - self.excludes = excludes or [] - self.scripts = [] - self.pure = [] - self.binaries = [] - self.zipfiles = [] - self.zipped_data = [] - self.datas = [] - self.dependencies = [] - self._python_version = sys.version - self.noarchive = noarchive - self.module_collection_mode = module_collection_mode or {} - self.optimize = sys.flags.optimize if optimize in {-1, None} else optimize - - self._modules_outside_pyz = [] - - # Validate the optimization level to avoid errors later on... - if self.optimize not in {0, 1, 2}: - raise ValueError(f"Unsupported bytecode optimization level: {self.optimize!r}") - - # Expand the `binaries` and `datas` lists specified in the .spec file, and ensure that the lists are normalized - # and sorted before guts comparison. - # - # While we use these lists to initialize `Analysis.binaries` and `Analysis.datas`, at this point, we need to - # store them in separate variables, which undergo *full* guts comparison (`_check_guts_toc`) as opposed to - # just mtime-based comparison (`_check_guts_toc_mtime`). Changes to these initial list *must* trigger a rebuild - # (and due to the way things work, a re-analysis), otherwise user might end up with a cached build that fails to - # reflect the changes. - if binaries: - logger.info("Appending 'binaries' from .spec") - self._input_binaries = [(dest_name, src_name, 'BINARY') - for dest_name, src_name in format_binaries_and_datas(binaries, workingdir=spec_dir)] - self._input_binaries = sorted(normalize_toc(self._input_binaries)) - - if datas: - logger.info("Appending 'datas' from .spec") - self._input_datas = [(dest_name, src_name, 'DATA') - for dest_name, src_name in format_binaries_and_datas(datas, workingdir=spec_dir)] - self._input_datas = sorted(normalize_toc(self._input_datas)) - - self.__postinit__() - - _GUTS = ( # input parameters - ('inputs', _check_guts_eq), # parameter `scripts` - ('pathex', _check_guts_eq), - ('hiddenimports', _check_guts_eq), - ('hookspath', _check_guts_eq), - ('hooksconfig', _check_guts_eq), - ('excludes', _check_guts_eq), - ('custom_runtime_hooks', _check_guts_eq), - ('noarchive', _check_guts_eq), - ('module_collection_mode', _check_guts_eq), - ('optimize', _check_guts_eq), - - ('_input_binaries', _check_guts_toc), - ('_input_datas', _check_guts_toc), - - # calculated/analysed values - ('_python_version', _check_guts_eq), - ('scripts', _check_guts_toc_mtime), - ('pure', _check_guts_toc_mtime), - ('binaries', _check_guts_toc_mtime), - ('zipfiles', _check_guts_toc_mtime), - ('zipped_data', None), # TODO check this, too - ('datas', _check_guts_toc_mtime), - # TODO: Need to add "dependencies"? - - ('_modules_outside_pyz', _check_guts_toc_mtime), - ) - - def _extend_pathex(self, spec_pathex, scripts): - """ - Normalize additional paths where PyInstaller will look for modules and add paths with scripts to the list of - paths. - - :param spec_pathex: Additional paths defined defined in .spec file. - :param scripts: Scripts to create executable from. - :return: list of updated paths - """ - # Based on main supplied script - add top-level modules directory to PYTHONPATH. - # Sometimes the main app script is not top-level module but submodule like 'mymodule.mainscript.py'. - # In that case PyInstaller will not be able find modules in the directory containing 'mymodule'. - # Add this directory to PYTHONPATH so PyInstaller could find it. - pathex = [] - # Add scripts paths first. - for script in scripts: - logger.debug('script: %s' % script) - script_toplevel_dir = get_path_to_toplevel_modules(script) - if script_toplevel_dir: - pathex.append(script_toplevel_dir) - # Append paths from .spec. - if spec_pathex is not None: - pathex.extend(spec_pathex) - # Normalize paths in pathex and make them absolute. - return list(dict.fromkeys(absnormpath(p) for p in pathex)) - - def _check_guts(self, data, last_build): - if Target._check_guts(self, data, last_build): - return True - for filename in self.inputs: - if mtime(filename) > last_build: - logger.info("Building because %s changed", filename) - return True - # Now we know that none of the input parameters and none of the input files has changed. So take the values - # that were calculated / analyzed in the last run and store them in `self`. These TOC lists should already - # be normalized. - self.scripts = data['scripts'] - self.pure = data['pure'] - self.binaries = data['binaries'] - self.zipfiles = data['zipfiles'] - self.zipped_data = data['zipped_data'] - self.datas = data['datas'] - - return False - - def assemble(self): - """ - This method is the MAIN method for finding all necessary files to be bundled. - """ - from PyInstaller.config import CONF - - # Search for python shared library, which we need to collect into frozen application. Do this as the very - # first step, to minimize the amount of processing when the shared library cannot be found. - logger.info('Looking for Python shared library...') - python_lib = bindepend.get_python_library_path() # Raises PythonLibraryNotFoundError - logger.info('Using Python shared library: %s', python_lib) - - logger.info("Running Analysis %s", self.tocbasename) - logger.info("Target bytecode optimization level: %d", self.optimize) - - for m in self.excludes: - logger.debug("Excluding module '%s'" % m) - self.graph = initialize_modgraph(excludes=self.excludes, user_hook_dirs=self.hookspath) - - # Initialize `binaries` and `datas` with `_input_binaries` and `_input_datas`. Make sure to copy the lists - # to prevent modifications of original lists, which we need to store in original form for guts comparison. - self.datas = [entry for entry in self._input_datas] - self.binaries = [entry for entry in self._input_binaries] - - # Expand sys.path of module graph. The attribute is the set of paths to use for imports: sys.path, plus our - # loader, plus other paths from e.g. --path option). - self.graph.path = self.pathex + self.graph.path - - # Scan for legacy namespace packages. - self.graph.scan_legacy_namespace_packages() - - # Add python shared library to `binaries`. - if is_darwin and osxutils.is_framework_bundle_lib(python_lib): - # If python library is located in macOS .framework bundle, collect the bundle, and create symbolic link to - # top-level directory. - src_path = pathlib.PurePath(python_lib) - dst_path = pathlib.PurePath(src_path.relative_to(src_path.parent.parent.parent.parent)) - self.binaries.append((str(dst_path), str(src_path), 'BINARY')) - self.binaries.append((os.path.basename(python_lib), str(dst_path), 'SYMLINK')) - else: - self.binaries.append((os.path.basename(python_lib), python_lib, 'BINARY')) - - # -- Module graph. -- - # - # Construct the module graph of import relationships between modules required by this user's application. For - # each entry point (top-level user-defined Python script), all imports originating from this entry point are - # recursively parsed into a subgraph of the module graph. This subgraph is then connected to this graph's root - # node, ensuring imported module nodes will be reachable from the root node -- which is is (arbitrarily) chosen - # to be the first entry point's node. - - # List of graph nodes corresponding to program scripts. - program_scripts = [] - - # Assume that if the script does not exist, Modulegraph will raise error. Save the graph nodes of each in - # sequence. - for script in self.inputs: - logger.info("Analyzing %s", script) - program_scripts.append(self.graph.add_script(script)) - - # Analyze the script's hidden imports (named on the command line) - self.graph.add_hiddenimports(self.hiddenimports) - - # -- Post-graph hooks. -- - self.graph.process_post_graph_hooks(self) - - # Update 'binaries' and 'datas' TOC lists with entries collected from hooks. - self.binaries += self.graph.make_hook_binaries_toc() - self.datas += self.graph.make_hook_datas_toc() - - # We do not support zipped eggs anymore (PyInstaller v6.0), so `zipped_data` and `zipfiles` are always empty. - self.zipped_data = [] - self.zipfiles = [] - - # -- Automatic binary vs. data reclassification. -- - # - # At this point, `binaries` and `datas` contain TOC entries supplied by user via input arguments, and by hooks - # that were ran during the analysis. Neither source can be fully trusted regarding the DATA vs BINARY - # classification (no thanks to our hookutils not being 100% reliable, either!). Therefore, inspect the files and - # automatically reclassify them as necessary. - # - # The proper classification is important especially for collected binaries - to ensure that they undergo binary - # dependency analysis and platform-specific binary processing. On macOS, the .app bundle generation code also - # depends on files to be properly classified. - # - # For entries added to `binaries` and `datas` after this point, we trust their typecodes due to the nature of - # their origin. - combined_toc = normalize_toc(self.datas + self.binaries) - - logger.info('Performing binary vs. data reclassification (%d entries)', len(combined_toc)) - - self.datas = [] - self.binaries = [] - - for dest_name, src_name, typecode in combined_toc: - # Returns 'BINARY' or 'DATA', or None if file cannot be classified. - detected_typecode = bindepend.classify_binary_vs_data(src_name) - if detected_typecode is not None: - if detected_typecode != typecode: - logger.debug( - "Reclassifying collected file %r from %s to %s...", src_name, typecode, detected_typecode - ) - typecode = detected_typecode - - # Put back into corresponding TOC list. - if typecode in {'BINARY', 'EXTENSION'}: - self.binaries.append((dest_name, src_name, typecode)) - else: - self.datas.append((dest_name, src_name, typecode)) - - # -- Look for dlls that are imported by Python 'ctypes' module. -- - # First get code objects of all modules that import 'ctypes'. - logger.info('Looking for ctypes DLLs') - # dict like: {'module1': code_obj, 'module2': code_obj} - ctypes_code_objs = self.graph.get_code_using("ctypes") - - for name, co in ctypes_code_objs.items(): - # Get dlls that might be needed by ctypes. - logger.debug('Scanning %s for ctypes-based references to shared libraries', name) - try: - ctypes_binaries = scan_code_for_ctypes(co) - # As this scan happens after automatic binary-vs-data classification, we need to validate the binaries - # ourselves, just in case. - for dest_name, src_name, typecode in set(ctypes_binaries): - # Allow for `None` in case re-classification is not supported on the given platform. - if bindepend.classify_binary_vs_data(src_name) not in (None, 'BINARY'): - logger.warning("Ignoring %s found via ctypes - not a valid binary!", src_name) - continue - self.binaries.append((dest_name, src_name, typecode)) - except Exception as ex: - raise RuntimeError(f"Failed to scan the module '{name}'. This is a bug. Please report it.") from ex - - self.datas.extend((dest, source, "DATA") - for (dest, source) in format_binaries_and_datas(self.graph.metadata_required())) - - # Analyze run-time hooks. - rhtook_scripts = self.graph.analyze_runtime_hooks(self.custom_runtime_hooks) - - # -- Extract the nodes of the graph as TOCs for further processing. -- - - # Initialize the scripts list: run-time hooks (custom ones, followed by regular ones), followed by program - # script(s). - - # We do not optimize bytecode of run-time hooks. - rthook_toc = self.graph.nodes_to_toc(rhtook_scripts) - - # Override the typecode of program script(s) to include bytecode optimization level. - program_toc = self.graph.nodes_to_toc(program_scripts) - optim_typecode = {0: 'PYSOURCE', 1: 'PYSOURCE-1', 2: 'PYSOURCE-2'}[self.optimize] - program_toc = [(name, src_path, optim_typecode) for name, src_path, typecode in program_toc] - - self.scripts = rthook_toc + program_toc - self.scripts = normalize_toc(self.scripts) # Should not really contain duplicates, but just in case... - - # Extend the binaries list with all the Extensions modulegraph has found. - self.binaries += self.graph.make_binaries_toc() - - # Convert extension module names into full filenames, and append suffix. Ensure that extensions that come from - # the lib-dynload are collected into _MEIPASS/python3.x/lib-dynload instead of directly into _MEIPASS. - for idx, (dest, source, typecode) in enumerate(self.binaries): - if typecode != 'EXTENSION': - continue - dest = destination_name_for_extension(dest, source, typecode) - self.binaries[idx] = (dest, source, typecode) - - # Perform initial normalization of `datas` and `binaries` - self.datas = normalize_toc(self.datas) - self.binaries = normalize_toc(self.binaries) - - # Post-process GLib schemas - self.datas = compile_glib_schema_files(self.datas, os.path.join(CONF['workpath'], "_pyi_gschema_compilation")) - self.datas = normalize_toc(self.datas) - - # Process the pure-python modules list. Depending on the collection mode, these entries end up either in "pure" - # list for collection into the PYZ archive, or in the "datas" list for collection as external data files. - assert len(self.pure) == 0 - pure_pymodules_toc = self.graph.make_pure_toc() - - # Merge package collection mode settings from .spec file. These are applied last, so they override the - # settings previously applied by hooks. - self.graph._module_collection_mode.update(self.module_collection_mode) - logger.debug("Module collection settings: %r", self.graph._module_collection_mode) - - # If target bytecode optimization level matches the run-time bytecode optimization level (i.e., of the running - # build process), we can re-use the modulegraph's code-object cache. - if self.optimize == sys.flags.optimize: - logger.debug( - "Target optimization level %d matches run-time optimization level %d - using modulegraph's code-object " - "cache.", - self.optimize, - sys.flags.optimize, - ) - code_cache = self.graph.get_code_objects() - else: - logger.debug( - "Target optimization level %d differs from run-time optimization level %d - ignoring modulegraph's " - "code-object cache.", - self.optimize, - sys.flags.optimize, - ) - code_cache = None - - # Construct a set for look-up of modules that should end up in base_library.zip. The list of corresponding - # modulegraph nodes is stored in `PyiModuleGraph._base_modules` (see `PyiModuleGraph._analyze_base_modules`). - base_modules = set(node.identifier for node in self.graph._base_modules) - base_modules_toc = [] - - pycs_dir = os.path.join(CONF['workpath'], 'localpycs') - optim_level = self.optimize # We could extend this with per-module settings, similar to `collect_mode`. - for name, src_path, typecode in pure_pymodules_toc: - assert typecode == 'PYMODULE' - collect_mode = _get_module_collection_mode(self.graph._module_collection_mode, name, self.noarchive) - - # Collect byte-compiled .pyc into PYZ archive or base_library.zip. Embed optimization level into typecode. - in_pyz = False - if _ModuleCollectionMode.PYZ in collect_mode: - optim_typecode = {0: 'PYMODULE', 1: 'PYMODULE-1', 2: 'PYMODULE-2'}[optim_level] - toc_entry = (name, src_path, optim_typecode) - if name in base_modules: - base_modules_toc.append(toc_entry) - else: - self.pure.append(toc_entry) - in_pyz = True - - # If module is not collected into PYZ archive (and is consequently not tracked in the `self.pure` TOC list), - # add it to the `self._modules_outside_pyz` TOC list, in order to be able to detect modifications in those - # modules. - if not in_pyz: - self._modules_outside_pyz.append((name, src_path, typecode)) - - # Pure namespace packages have no source path, and cannot be collected as external data file. - if src_path in (None, '-'): - continue - - # Collect source .py file as external data file - if _ModuleCollectionMode.PY in collect_mode: - basename, ext = os.path.splitext(os.path.basename(src_path)) - # If the module is available only as a byte-compiled .pyc, we cannot collect its source. - if ext.lower() == '.pyc': - logger.warning( - 'Cannot collect source .py file for module %r - module is available only as .pyc: %r', - name, - src_path, - ) - continue - dest_path = name.replace('.', os.sep) - if basename == '__init__': - dest_path += os.sep + '__init__' + ext - else: - dest_path += ext - self.datas.append((dest_path, src_path, "DATA")) - - # Collect byte-compiled .pyc file as external data file - if _ModuleCollectionMode.PYC in collect_mode: - basename, ext = os.path.splitext(os.path.basename(src_path)) - dest_path = name.replace('.', os.sep) - if basename == '__init__': - dest_path += os.sep + '__init__' - # Append the extension for the compiled result. In python 3.5 (PEP-488) .pyo files were replaced by - # .opt-1.pyc and .opt-2.pyc. However, it seems that for bytecode-only module distribution, we always - # need to use the .pyc extension. - dest_path += '.pyc' - - # Compile - use optimization-level-specific sub-directory in local working directory. - obj_path = compile_pymodule( - name, - src_path, - workpath=os.path.join(pycs_dir, str(optim_level)), - optimize=optim_level, - code_cache=code_cache, - ) - - self.datas.append((dest_path, obj_path, "DATA")) - - # Construct base_library.zip, if applicable (the only scenario where it is not is if we are building with - # noarchive mode). Always remove the file before the build. - base_library_zip = os.path.join(CONF['workpath'], 'base_library.zip') - if os.path.exists(base_library_zip): - os.remove(base_library_zip) - if base_modules_toc: - logger.info('Creating %s...', os.path.basename(base_library_zip)) - create_base_library_zip(base_library_zip, base_modules_toc, code_cache) - self.datas.append((os.path.basename(base_library_zip), base_library_zip, 'DATA')) # Bundle as data file. - - # Normalize list of pure-python modules (these will end up in PYZ archive, so use specific normalization). - self.pure = normalize_pyz_toc(self.pure) - - # Associate the `pure` TOC list instance with code cache in the global `CONF`; this is used by `PYZ` writer - # to obtain modules' code from cache instead - # - # (NOTE: back when `pure` was an instance of `TOC` class, the code object was passed by adding an attribute - # to the `pure` itself; now that `pure` is plain `list`, we cannot do that anymore. But the association via - # object ID should have the same semantics as the added attribute). - from PyInstaller.config import CONF - global_code_cache_map = CONF['code_cache'] - global_code_cache_map[id(self.pure)] = code_cache - - # Add remaining binary dependencies - analyze Python C-extensions and what DLLs they depend on. - # - # Up until this point, we did very best not to import the packages into the main process. However, a package - # may set up additional library search paths during its import (e.g., by modifying PATH or calling the - # add_dll_directory() function on Windows, or modifying LD_LIBRARY_PATH on Linux). In order to reliably - # discover dynamic libraries, we therefore require an environment with all packages imported. We achieve that - # by gathering list of all collected packages, and spawn an isolated process, in which we first import all - # the packages from the list, and then perform search for dynamic libraries. - logger.info('Looking for dynamic libraries') - - collected_packages = self.graph.get_collected_packages() - self.binaries.extend( - find_binary_dependencies(self.binaries, collected_packages, self.graph._bindepend_symlink_suppression) - ) - - # Apply work-around for (potential) binaries collected from `pywin32` package... - if is_win: - self.binaries = postprocess_binaries_toc_pywin32(self.binaries) - # With anaconda, we need additional work-around... - if is_conda: - self.binaries = postprocess_binaries_toc_pywin32_anaconda(self.binaries) - - # On linux, check for HMAC files accompanying shared library files and, if available, collect them. - # These are present on Fedora and RHEL, and are used in FIPS-enabled configurations to ensure shared - # library's file integrity. - if is_linux: - for dest_name, src_name, typecode in self.binaries: - if typecode not in {'BINARY', 'EXTENSION'}: - continue # Skip symbolic links - - src_lib_path = pathlib.Path(src_name) - - # Check for .name.hmac file next to the shared library. - src_hmac_path = src_lib_path.with_name(f".{src_lib_path.name}.hmac") - if src_hmac_path.is_file(): - dest_hmac_path = pathlib.PurePath(dest_name).with_name(src_hmac_path.name) - self.datas.append((str(dest_hmac_path), str(src_hmac_path), 'DATA')) - - # Alternatively, check the fipscheck directory: fipscheck/name.hmac - src_hmac_path = src_lib_path.parent / "fipscheck" / f"{src_lib_path.name}.hmac" - if src_hmac_path.is_file(): - dest_hmac_path = pathlib.PurePath("fipscheck") / src_hmac_path.name - self.datas.append((str(dest_hmac_path), str(src_hmac_path), 'DATA')) - - # Similarly, look for .chk files that are used by NSS libraries. - src_chk_path = src_lib_path.with_suffix(".chk") - if src_chk_path.is_file(): - dest_chk_path = pathlib.PurePath(dest_name).with_name(src_chk_path.name) - self.datas.append((str(dest_chk_path), str(src_chk_path), 'DATA')) - - # Final normalization of `datas` and `binaries`: - # - normalize both TOCs together (to avoid having duplicates across the lists) - # - process the combined normalized TOC for symlinks - # - split back into `binaries` (BINARY, EXTENSION) and `datas` (everything else) - combined_toc = normalize_toc(self.datas + self.binaries) - combined_toc = toc_process_symbolic_links(combined_toc) - - # On macOS, look for binaries collected from .framework bundles, collect their Info.plist files, and fix the - # structure to conform to code-signing requirements (i.e., Versions/Current symbolic link and symbolic links - # for top-level directories). - if is_darwin: - combined_toc = osxutils.collect_files_from_framework_bundles(combined_toc) - combined_toc = normalize_toc(combined_toc) - - self.datas = [] - self.binaries = [] - for entry in combined_toc: - dest_name, src_name, typecode = entry - if typecode in {'BINARY', 'EXTENSION'}: - self.binaries.append(entry) - else: - self.datas.append(entry) - - # On macOS, the Finder app seems to litter visited directories with `.DS_Store` files. These cause issues with - # codesigning when placed in mixed-content directories, where our .app bundle generator cross-links data files - # from `Resources` to `Frameworks` tree, and the `codesign` utility explicitly forbids a `.DS_Store` file to be - # a symbolic link. - # But there is no reason for `.DS_Store` files to be collected in the first place, so filter them out. - if is_darwin: - self.datas = [(dest_name, src_name, typecode) for dest_name, src_name, typecode in self.datas - if os.path.basename(src_name) != '.DS_Store'] - - # Write warnings about missing modules. - self._write_warnings() - # Write debug information about the graph - self._write_graph_debug() - - # On macOS, check the SDK version of the binaries to be collected, and warn when the SDK version is either - # invalid or too low. Such binaries will likely refuse to be loaded when hardened runtime is enabled and - # while we cannot do anything about it, we can at least warn the user about it. - # See: https://developer.apple.com/forums/thread/132526 - if is_darwin: - binaries_with_invalid_sdk = [] - for dest_name, src_name, typecode in self.binaries: - try: - sdk_version = osxutils.get_macos_sdk_version(src_name) - except Exception: - logger.warning("Failed to query macOS SDK version of %r!", src_name, exc_info=True) - binaries_with_invalid_sdk.append((dest_name, src_name, "unavailable")) - continue - - if sdk_version < (10, 9, 0): - binaries_with_invalid_sdk.append((dest_name, src_name, sdk_version)) - if binaries_with_invalid_sdk: - logger.warning("Found one or more binaries with invalid or incompatible macOS SDK version:") - for dest_name, src_name, sdk_version in binaries_with_invalid_sdk: - logger.warning(" * %r, collected as %r; version: %r", src_name, dest_name, sdk_version) - logger.warning("These binaries will likely cause issues with code-signing and hardened runtime!") - - def _write_warnings(self): - """ - Write warnings about missing modules. Get them from the graph and use the graph to figure out who tried to - import them. - """ - def dependency_description(name, dep_info): - if not dep_info or dep_info == 'direct': - imptype = 0 - else: - imptype = (dep_info.conditional + 2 * dep_info.function + 4 * dep_info.tryexcept) - return '%s (%s)' % (name, IMPORT_TYPES[imptype]) - - from PyInstaller.config import CONF - miss_toc = self.graph.make_missing_toc() - with open(CONF['warnfile'], 'w', encoding='utf-8') as wf: - wf.write(WARNFILE_HEADER) - for (n, p, status) in miss_toc: - importers = self.graph.get_importers(n) - print( - status, - 'module named', - n, - '- imported by', - ', '.join(dependency_description(name, data) for name, data in importers), - file=wf - ) - logger.info("Warnings written to %s", CONF['warnfile']) - - def _write_graph_debug(self): - """ - Write a xref (in html) and with `--log-level DEBUG` a dot-drawing of the graph. - """ - from PyInstaller.config import CONF - with open(CONF['xref-file'], 'w', encoding='utf-8') as fh: - self.graph.create_xref(fh) - logger.info("Graph cross-reference written to %s", CONF['xref-file']) - if logger.getEffectiveLevel() > logging.DEBUG: - return - # The `DOT language's `_ default character encoding (see the end - # of the linked page) is UTF-8. - with open(CONF['dot-file'], 'w', encoding='utf-8') as fh: - self.graph.graphreport(fh) - logger.info("Graph drawing written to %s", CONF['dot-file']) - - def exclude_system_libraries(self, list_of_exceptions=None): - """ - This method may be optionally called from the spec file to exclude any system libraries from the list of - binaries other than those containing the shell-style wildcards in list_of_exceptions. Those that match - '*python*' or are stored under 'lib-dynload' are always treated as exceptions and not excluded. - """ - - self.binaries = [ - entry for entry in self.binaries if _should_include_system_binary(entry, list_of_exceptions or []) - ] - - -class ExecutableBuilder: - """ - Class that constructs the executable. - """ - # TODO wrap the 'main' and 'build' function into this class. - - -def build(spec, distpath, workpath, clean_build): - """ - Build the executable according to the created SPEC file. - """ - from PyInstaller.config import CONF - - # Ensure starting tilde in distpath / workpath is expanded into user's home directory. This is to work around for - # tilde not being expanded when using `--workpath=~/path/abc` instead of `--workpath ~/path/abc` (or when the path - # argument is quoted). See https://github.com/pyinstaller/pyinstaller/issues/696 - distpath = os.path.abspath(os.path.expanduser(distpath)) - workpath = os.path.abspath(os.path.expanduser(workpath)) - - CONF['spec'] = os.path.abspath(spec) - CONF['specpath'], CONF['specnm'] = os.path.split(CONF['spec']) - CONF['specnm'] = os.path.splitext(CONF['specnm'])[0] - - # Add 'specname' to workpath and distpath if they point to PyInstaller homepath. - if os.path.dirname(distpath) == HOMEPATH: - distpath = os.path.join(HOMEPATH, CONF['specnm'], os.path.basename(distpath)) - CONF['distpath'] = distpath - if os.path.dirname(workpath) == HOMEPATH: - workpath = os.path.join(HOMEPATH, CONF['specnm'], os.path.basename(workpath), CONF['specnm']) - else: - workpath = os.path.join(workpath, CONF['specnm']) - CONF['workpath'] = workpath - - CONF['warnfile'] = os.path.join(workpath, 'warn-%s.txt' % CONF['specnm']) - CONF['dot-file'] = os.path.join(workpath, 'graph-%s.dot' % CONF['specnm']) - CONF['xref-file'] = os.path.join(workpath, 'xref-%s.html' % CONF['specnm']) - - CONF['code_cache'] = dict() - - # Clean PyInstaller cache (CONF['cachedir']) and temporary files (workpath) to be able start a clean build. - if clean_build: - logger.info('Removing temporary files and cleaning cache in %s', CONF['cachedir']) - for pth in (CONF['cachedir'], workpath): - if os.path.exists(pth): - # Remove all files in 'pth'. - for f in glob.glob(pth + '/*'): - # Remove dirs recursively. - if os.path.isdir(f): - shutil.rmtree(f) - else: - os.remove(f) - - # Create DISTPATH and workpath if they does not exist. - for pth in (CONF['distpath'], CONF['workpath']): - os.makedirs(pth, exist_ok=True) - - # Construct NAMESPACE for running the Python code from .SPEC file. - # NOTE: Passing NAMESPACE allows to avoid having global variables in this module and makes isolated environment for - # running tests. - # NOTE: Defining NAMESPACE allows to map any class to a apecific name for .SPEC. - # FIXME: Some symbols might be missing. Add them if there are some failures. - # TODO: What from this .spec API is deprecated and could be removed? - spec_namespace = { - # Set of global variables that can be used while processing .spec file. Some of them act as configuration - # options. - 'DISTPATH': CONF['distpath'], - 'HOMEPATH': HOMEPATH, - 'SPEC': CONF['spec'], - 'specnm': CONF['specnm'], - 'SPECPATH': CONF['specpath'], - 'WARNFILE': CONF['warnfile'], - 'workpath': CONF['workpath'], - # PyInstaller classes for .spec. - 'TOC': TOC, # Kept for backward compatibility even though `TOC` class is deprecated. - 'Analysis': Analysis, - 'BUNDLE': BUNDLE, - 'COLLECT': COLLECT, - 'EXE': EXE, - 'MERGE': MERGE, - 'PYZ': PYZ, - 'Tree': Tree, - 'Splash': Splash, - # Python modules available for .spec. - 'os': os, - } - - # Execute the specfile. Read it as a binary file... - try: - with open(spec, 'rb') as f: - # ... then let Python determine the encoding, since ``compile`` accepts byte strings. - code = compile(f.read(), spec, 'exec') - except FileNotFoundError: - raise SystemExit(f'ERROR: Spec file "{spec}" not found!') - exec(code, spec_namespace) - - logger.info("Build complete! The results are available in: %s", CONF['distpath']) - - -def __add_options(parser): - parser.add_argument( - "--distpath", - metavar="DIR", - default=DEFAULT_DISTPATH, - help="Where to put the bundled app (default: ./dist)", - ) - parser.add_argument( - '--workpath', - default=DEFAULT_WORKPATH, - help="Where to put all the temporary work files, .log, .pyz and etc. (default: ./build)", - ) - parser.add_argument( - '-y', - '--noconfirm', - action="store_true", - default=False, - help="Replace output directory (default: %s) without asking for confirmation" % - os.path.join('SPECPATH', 'dist', 'SPECNAME'), - ) - parser.add_argument( - '--upx-dir', - default=None, - help="Path to UPX utility (default: search the execution path)", - ) - parser.add_argument( - '--clean', - dest='clean_build', - action='store_true', - default=False, - help="Clean PyInstaller cache and remove temporary files before building.", - ) - - -def main( - pyi_config, - specfile, - noconfirm=False, - distpath=DEFAULT_DISTPATH, - workpath=DEFAULT_WORKPATH, - upx_dir=None, - clean_build=False, - **kw -): - from PyInstaller.config import CONF - CONF['noconfirm'] = noconfirm - - # If configuration dict is supplied - skip configuration step. - if pyi_config is None: - import PyInstaller.configure as configure - CONF.update(configure.get_config(upx_dir=upx_dir)) - else: - CONF.update(pyi_config) - - CONF['ui_admin'] = kw.get('ui_admin', False) - CONF['ui_access'] = kw.get('ui_uiaccess', False) - - build(specfile, distpath, workpath, clean_build) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/building/datastruct.py b/venv/lib/python3.12/site-packages/PyInstaller/building/datastruct.py deleted file mode 100755 index ca16286..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/building/datastruct.py +++ /dev/null @@ -1,459 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -import os -import pathlib -import warnings - -from PyInstaller import log as logging -from PyInstaller.building.utils import _check_guts_eq -from PyInstaller.utils import misc - -logger = logging.getLogger(__name__) - - -def unique_name(entry): - """ - Return the filename used to enforce uniqueness for the given TOC entry. - - Parameters - ---------- - entry : tuple - - Returns - ------- - unique_name: str - """ - name, path, typecode = entry - if typecode in ('BINARY', 'DATA', 'EXTENSION', 'DEPENDENCY'): - name = os.path.normcase(name) - - return name - - -# This class is deprecated and has been replaced by plain lists with explicit normalization (de-duplication) via -# `normalize_toc` and `normalize_pyz_toc` helper functions. -class TOC(list): - """ - TOC (Table of Contents) class is a list of tuples of the form (name, path, typecode). - - typecode name path description - -------------------------------------------------------------------------------------- - EXTENSION Python internal name. Full path name in build. Extension module. - PYSOURCE Python internal name. Full path name in build. Script. - PYMODULE Python internal name. Full path name in build. Pure Python module (including __init__ modules). - PYZ Runtime name. Full path name in build. A .pyz archive (ZlibArchive data structure). - PKG Runtime name. Full path name in build. A .pkg archive (Carchive data structure). - BINARY Runtime name. Full path name in build. Shared library. - DATA Runtime name. Full path name in build. Arbitrary files. - OPTION The option. Unused. Python runtime option (frozen into executable). - - A TOC contains various types of files. A TOC contains no duplicates and preserves order. - PyInstaller uses TOC data type to collect necessary files bundle them into an executable. - """ - def __init__(self, initlist=None): - super().__init__() - - # Deprecation warning - warnings.warn( - "TOC class is deprecated. Use a plain list of 3-element tuples instead.", - DeprecationWarning, - stacklevel=2, - ) - - self.filenames = set() - if initlist: - for entry in initlist: - self.append(entry) - - def append(self, entry): - if not isinstance(entry, tuple): - logger.info("TOC found a %s, not a tuple", entry) - raise TypeError("Expected tuple, not %s." % type(entry).__name__) - - unique = unique_name(entry) - - if unique not in self.filenames: - self.filenames.add(unique) - super().append(entry) - - def insert(self, pos, entry): - if not isinstance(entry, tuple): - logger.info("TOC found a %s, not a tuple", entry) - raise TypeError("Expected tuple, not %s." % type(entry).__name__) - unique = unique_name(entry) - - if unique not in self.filenames: - self.filenames.add(unique) - super().insert(pos, entry) - - def __add__(self, other): - result = TOC(self) - result.extend(other) - return result - - def __radd__(self, other): - result = TOC(other) - result.extend(self) - return result - - def __iadd__(self, other): - for entry in other: - self.append(entry) - return self - - def extend(self, other): - # TODO: look if this can be done more efficient with out the loop, e.g. by not using a list as base at all. - for entry in other: - self.append(entry) - - def __sub__(self, other): - # Construct new TOC with entries not contained in the other TOC - other = TOC(other) - return TOC([entry for entry in self if unique_name(entry) not in other.filenames]) - - def __rsub__(self, other): - result = TOC(other) - return result.__sub__(self) - - def __setitem__(self, key, value): - if isinstance(key, slice): - if key == slice(None, None, None): - # special case: set the entire list - self.filenames = set() - self.clear() - self.extend(value) - return - else: - raise KeyError("TOC.__setitem__ doesn't handle slices") - - else: - old_value = self[key] - old_name = unique_name(old_value) - self.filenames.remove(old_name) - - new_name = unique_name(value) - if new_name not in self.filenames: - self.filenames.add(new_name) - super(TOC, self).__setitem__(key, value) - - -class Target: - invcnum = 0 - - def __init__(self): - from PyInstaller.config import CONF - - # Get a (per class) unique number to avoid conflicts between toc objects - self.invcnum = self.__class__.invcnum - self.__class__.invcnum += 1 - self.tocfilename = os.path.join(CONF['workpath'], '%s-%02d.toc' % (self.__class__.__name__, self.invcnum)) - self.tocbasename = os.path.basename(self.tocfilename) - self.dependencies = [] - - def __postinit__(self): - """ - Check if the target need to be rebuild and if so, re-assemble. - - `__postinit__` is to be called at the end of `__init__` of every subclass of Target. `__init__` is meant to - setup the parameters and `__postinit__` is checking if rebuild is required and in case calls `assemble()` - """ - logger.info("checking %s", self.__class__.__name__) - data = None - last_build = misc.mtime(self.tocfilename) - if last_build == 0: - logger.info("Building %s because %s is non existent", self.__class__.__name__, self.tocbasename) - else: - try: - data = misc.load_py_data_struct(self.tocfilename) - except Exception: - logger.info("Building because %s is bad", self.tocbasename) - else: - # create a dict for easier access - data = dict(zip((g[0] for g in self._GUTS), data)) - # assemble if previous data was not found or is outdated - if not data or self._check_guts(data, last_build): - self.assemble() - self._save_guts() - - _GUTS = [] - - def _check_guts(self, data, last_build): - """ - Returns True if rebuild/assemble is required. - """ - if len(data) != len(self._GUTS): - logger.info("Building because %s is bad", self.tocbasename) - return True - for attr, func in self._GUTS: - if func is None: - # no check for this value - continue - if func(attr, data[attr], getattr(self, attr), last_build): - return True - return False - - def _save_guts(self): - """ - Save the input parameters and the work-product of this run to maybe avoid regenerating it later. - """ - data = tuple(getattr(self, g[0]) for g in self._GUTS) - misc.save_py_data_struct(self.tocfilename, data) - - -class Tree(Target, list): - """ - This class is a way of creating a TOC (Table of Contents) list that describes some or all of the files within a - directory. - """ - def __init__(self, root=None, prefix=None, excludes=None, typecode='DATA'): - """ - root - The root of the tree (on the build system). - prefix - Optional prefix to the names of the target system. - excludes - A list of names to exclude. Two forms are allowed: - - name - Files with this basename will be excluded (do not include the path). - *.ext - Any file with the given extension will be excluded. - typecode - The typecode to be used for all files found in this tree. See the TOC class for for information about - the typcodes. - """ - Target.__init__(self) - list.__init__(self) - self.root = root - self.prefix = prefix - self.excludes = excludes - self.typecode = typecode - if excludes is None: - self.excludes = [] - self.__postinit__() - - _GUTS = ( # input parameters - ('root', _check_guts_eq), - ('prefix', _check_guts_eq), - ('excludes', _check_guts_eq), - ('typecode', _check_guts_eq), - ('data', None), # tested below - # no calculated/analysed values - ) - - def _check_guts(self, data, last_build): - if Target._check_guts(self, data, last_build): - return True - # Walk the collected directories as check if they have been changed - which means files have been added or - # removed. There is no need to check for the files, since `Tree` is only about the directory contents (which is - # the list of files). - stack = [data['root']] - while stack: - d = stack.pop() - if misc.mtime(d) > last_build: - logger.info("Building %s because directory %s changed", self.tocbasename, d) - return True - for nm in os.listdir(d): - path = os.path.join(d, nm) - if os.path.isdir(path): - stack.append(path) - self[:] = data['data'] # collected files - return False - - def _save_guts(self): - # Use the attribute `data` to save the list - self.data = self - super()._save_guts() - del self.data - - def assemble(self): - logger.info("Building Tree %s", self.tocbasename) - stack = [(self.root, self.prefix)] - excludes = set() - xexcludes = set() - for name in self.excludes: - if name.startswith('*'): - xexcludes.add(name[1:]) - else: - excludes.add(name) - result = [] - while stack: - dir, prefix = stack.pop() - for filename in os.listdir(dir): - if filename in excludes: - continue - ext = os.path.splitext(filename)[1] - if ext in xexcludes: - continue - fullfilename = os.path.join(dir, filename) - if prefix: - resfilename = os.path.join(prefix, filename) - else: - resfilename = filename - if os.path.isdir(fullfilename): - stack.append((fullfilename, resfilename)) - else: - result.append((resfilename, fullfilename, self.typecode)) - self[:] = result - - -def normalize_toc(toc): - # Default priority: 0 - _TOC_TYPE_PRIORITIES = { - # DEPENDENCY entries need to replace original entries, so they need the highest priority. - 'DEPENDENCY': 3, - # SYMLINK entries have higher priority than other regular entries - 'SYMLINK': 2, - # BINARY/EXTENSION entries undergo additional processing, so give them precedence over DATA and other entries. - 'BINARY': 1, - 'EXTENSION': 1, - } - - def _type_case_normalization_fcn(typecode): - # Case-normalize all entries except OPTION. - return typecode not in { - "OPTION", - } - - return _normalize_toc(toc, _TOC_TYPE_PRIORITIES, _type_case_normalization_fcn) - - -def normalize_pyz_toc(toc): - # Default priority: 0 - _TOC_TYPE_PRIORITIES = { - # Ensure that entries with higher optimization level take precedence. - 'PYMODULE-2': 2, - 'PYMODULE-1': 1, - 'PYMODULE': 0, - } - - return _normalize_toc(toc, _TOC_TYPE_PRIORITIES) - - -def _normalize_toc(toc, toc_type_priorities, type_case_normalization_fcn=lambda typecode: False): - options_toc = [] - tmp_toc = dict() - for dest_name, src_name, typecode in toc: - # Exempt OPTION entries from de-duplication processing. Some options might allow being specified multiple times. - if typecode == 'OPTION': - options_toc.append(((dest_name, src_name, typecode))) - continue - - # Always sanitize the dest_name with `os.path.normpath` to remove any local loops with parent directory path - # components. `pathlib` does not seem to offer equivalent functionality. - dest_name = os.path.normpath(dest_name) - - # Normalize the destination name for uniqueness. Use `pathlib.PurePath` to ensure that keys are both - # case-normalized (on OSes where applicable) and directory-separator normalized (just in case). - if type_case_normalization_fcn(typecode): - entry_key = pathlib.PurePath(dest_name) - else: - entry_key = dest_name - - existing_entry = tmp_toc.get(entry_key) - if existing_entry is None: - # Entry does not exist - insert - tmp_toc[entry_key] = (dest_name, src_name, typecode) - else: - # Entry already exists - replace if its typecode has higher priority - _, _, existing_typecode = existing_entry - if toc_type_priorities.get(typecode, 0) > toc_type_priorities.get(existing_typecode, 0): - tmp_toc[entry_key] = (dest_name, src_name, typecode) - - # Return the items as list. The order matches the original order due to python dict maintaining the insertion order. - # The exception are OPTION entries, which are now placed at the beginning of the TOC. - return options_toc + list(tmp_toc.values()) - - -def toc_process_symbolic_links(toc): - """ - Process TOC entries and replace entries whose files are symbolic links with SYMLINK entries (provided original file - is also being collected). - """ - # Dictionary of all destination names, for a fast look-up. - all_dest_files = set([dest_name for dest_name, src_name, typecode in toc]) - - # Process the TOC to create SYMLINK entries - new_toc = [] - for entry in toc: - dest_name, src_name, typecode = entry - - # Skip entries that are already symbolic links - if typecode == 'SYMLINK': - new_toc.append(entry) - continue - - # Skip entries without valid source name (e.g., OPTION) - if not src_name: - new_toc.append(entry) - continue - - # Source path is not a symbolic link (i.e., it is a regular file or directory) - if not os.path.islink(src_name): - new_toc.append(entry) - continue - - # Try preserving the symbolic link, under strict relative-relationship-preservation check - symlink_entry = _try_preserving_symbolic_link(dest_name, src_name, all_dest_files) - - if symlink_entry: - new_toc.append(symlink_entry) - else: - new_toc.append(entry) - - return new_toc - - -def _try_preserving_symbolic_link(dest_name, src_name, all_dest_files): - seen_src_files = set() - - # Set initial values for the loop - ref_src_file = src_name - ref_dest_file = dest_name - - while True: - # Guard against cyclic links... - if ref_src_file in seen_src_files: - break - seen_src_files.add(ref_src_file) - - # Stop when referenced source file is not a symbolic link anymore. - if not os.path.islink(ref_src_file): - break - - # Read the symbolic link's target, but do not fully resolve it using os.path.realpath(), because there might be - # other symbolic links involved as well (for example, /lib64 -> /usr/lib64 whereas we are processing - # /lib64/liba.so -> /lib64/liba.so.1) - symlink_target = os.readlink(ref_src_file) - if os.path.isabs(symlink_target): - break # We support only relative symbolic links. - - ref_dest_file = os.path.join(os.path.dirname(ref_dest_file), symlink_target) - ref_dest_file = os.path.normpath(ref_dest_file) # remove any '..' - - ref_src_file = os.path.join(os.path.dirname(ref_src_file), symlink_target) - ref_src_file = os.path.normpath(ref_src_file) # remove any '..' - - # Check if referenced destination file is valid (i.e., we are collecting a file under referenced name). - if ref_dest_file in all_dest_files: - # Sanity check: original source name and current referenced source name must, after complete resolution, - # point to the same file. - if os.path.realpath(src_name) == os.path.realpath(ref_src_file): - # Compute relative link for the destination file (might be modified, if we went over non-collected - # intermediate links). - rel_link = os.path.relpath(ref_dest_file, os.path.dirname(dest_name)) - return dest_name, rel_link, 'SYMLINK' - - # If referenced destination is not valid, do another iteration in case we are dealing with chained links and we - # are not collecting an intermediate link... - - return None diff --git a/venv/lib/python3.12/site-packages/PyInstaller/building/icon.py b/venv/lib/python3.12/site-packages/PyInstaller/building/icon.py deleted file mode 100755 index de298f2..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/building/icon.py +++ /dev/null @@ -1,90 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2022-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from typing import Tuple - -import os -import hashlib - - -def normalize_icon_type(icon_path: str, allowed_types: Tuple[str], convert_type: str, workpath: str) -> str: - """ - Returns a valid icon path or raises an Exception on error. - Ensures that the icon exists, and, if necessary, attempts to convert it to correct OS-specific format using Pillow. - - Takes: - icon_path - the icon given by the user - allowed_types - a tuple of icon formats that should be allowed through - EX: ("ico", "exe") - convert_type - the type to attempt conversion too if necessary - EX: "icns" - workpath - the temp directory to save any newly generated image files - """ - - # explicitly error if file not found - if not os.path.exists(icon_path): - raise FileNotFoundError(f"Icon input file {icon_path} not found") - - _, extension = os.path.splitext(icon_path) - extension = extension[1:] # get rid of the "." in ".whatever" - - # if the file is already in the right format, pass it back unchanged - if extension in allowed_types: - # Check both the suffix and the header of the file to guard against the user confusing image types. - signatures = hex_signatures[extension] - with open(icon_path, "rb") as f: - header = f.read(max(len(s) for s in signatures)) - if any(list(header)[:len(s)] == s for s in signatures): - return icon_path - - # The icon type is wrong! Let's try and import PIL - try: - from PIL import Image as PILImage - import PIL - - except ImportError: - raise ValueError( - f"Received icon image '{icon_path}' which exists but is not in the correct format. On this platform, " - f"only {allowed_types} images may be used as icons. If Pillow is installed, automatic conversion will " - f"be attempted. Please install Pillow or convert your '{extension}' file to one of {allowed_types} " - f"and try again." - ) - - # Let's try to use PIL to convert the icon file type - try: - _generated_name = f"generated-{hashlib.sha256(icon_path.encode()).hexdigest()}.{convert_type}" - generated_icon = os.path.join(workpath, _generated_name) - with PILImage.open(icon_path) as im: - # If an image uses a custom palette + transparency, convert it to RGBA for a better alpha mask depth. - if im.mode == "P" and im.info.get("transparency", None) is not None: - # The bit depth of the alpha channel will be higher, and the images will look better when eventually - # scaled to multiple sizes (16,24,32,..) for the ICO format for example. - im = im.convert("RGBA") - im.save(generated_icon) - icon_path = generated_icon - except PIL.UnidentifiedImageError: - raise ValueError( - f"Something went wrong converting icon image '{icon_path}' to '.{convert_type}' with Pillow, " - f"perhaps the image format is unsupported. Try again with a different file or use a file that can " - f"be used without conversion on this platform: {allowed_types}" - ) - - return icon_path - - -# Possible initial bytes of icon types PyInstaller needs to be able to recognise. -# Taken from: https://en.wikipedia.org/wiki/List_of_file_signatures -hex_signatures = { - "png": [[0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]], - "exe": [[0x4D, 0x5A], [0x5A, 0x4D]], - "ico": [[0x00, 0x00, 0x01, 0x00]], - "icns": [[0x69, 0x63, 0x6e, 0x73]], -} diff --git a/venv/lib/python3.12/site-packages/PyInstaller/building/makespec.py b/venv/lib/python3.12/site-packages/PyInstaller/building/makespec.py deleted file mode 100755 index 0aad832..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/building/makespec.py +++ /dev/null @@ -1,909 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Automatically build spec files containing a description of the project. -""" - -import argparse -import os -import re -import sys - -from PyInstaller import DEFAULT_SPECPATH, HOMEPATH -from PyInstaller import log as logging -from PyInstaller.building.templates import bundleexetmplt, bundletmplt, onedirtmplt, onefiletmplt, splashtmpl -from PyInstaller.compat import is_darwin, is_win - -logger = logging.getLogger(__name__) - -# This list gives valid choices for the ``--debug`` command-line option, except for the ``all`` choice. -DEBUG_ARGUMENT_CHOICES = ['imports', 'bootloader', 'noarchive'] -# This is the ``all`` choice. -DEBUG_ALL_CHOICE = ['all'] - - -def escape_win_filepath(path): - # escape all \ with another \ after using normpath to clean up the path - return os.path.normpath(path).replace('\\', '\\\\') - - -def make_path_spec_relative(filename, spec_dir): - """ - Make the filename relative to the directory containing .spec file if filename is relative and not absolute. - Otherwise keep filename untouched. - """ - if os.path.isabs(filename): - return filename - else: - filename = os.path.abspath(filename) - # Make it relative. - filename = os.path.relpath(filename, start=spec_dir) - return filename - - -# Support for trying to avoid hard-coded paths in the .spec files. Eg, all files rooted in the Installer directory tree -# will be written using "HOMEPATH", thus allowing this spec file to be used with any Installer installation. Same thing -# could be done for other paths too. -path_conversions = ((HOMEPATH, "HOMEPATH"),) - - -class SourceDestAction(argparse.Action): - """ - A command line option which takes multiple source:dest pairs. - """ - def __init__(self, *args, default=None, metavar=None, **kwargs): - super().__init__(*args, default=[], metavar='SOURCE:DEST', **kwargs) - - def __call__(self, parser, namespace, value, option_string=None): - try: - # Find the only separator that isn't a Windows drive. - separator, = (m for m in re.finditer(rf"(^\w:[/\\])|[:{os.pathsep}]", value) if not m[1]) - except ValueError: - # Split into SRC and DEST failed, wrong syntax - raise argparse.ArgumentError(self, f'Wrong syntax, should be {self.option_strings[0]}=SOURCE:DEST') - src = value[:separator.start()] - dest = value[separator.end():] - if not src or not dest: - # Syntax was correct, but one or both of SRC and DEST was not given - raise argparse.ArgumentError(self, "You have to specify both SOURCE and DEST") - - # argparse is not particularly smart with copy by reference typed defaults. If the current list is the default, - # replace it before modifying it to avoid changing the default. - if getattr(namespace, self.dest) is self.default: - setattr(namespace, self.dest, []) - getattr(namespace, self.dest).append((src, dest)) - - -def make_variable_path(filename, conversions=path_conversions): - if not os.path.isabs(filename): - # os.path.commonpath can not compare relative and absolute paths, and if filename is not absolute, none of the - # paths in conversions will match anyway. - return None, filename - for (from_path, to_name) in conversions: - assert os.path.abspath(from_path) == from_path, ("path '%s' should already be absolute" % from_path) - try: - common_path = os.path.commonpath([filename, from_path]) - except ValueError: - # Per https://docs.python.org/3/library/os.path.html#os.path.commonpath, this raises ValueError in several - # cases which prevent computing a common path. - common_path = None - if common_path == from_path: - rest = filename[len(from_path):] - if rest.startswith(('\\', '/')): - rest = rest[1:] - return to_name, rest - return None, filename - - -def removed_key_option(x): - from PyInstaller.exceptions import RemovedCipherFeatureError - raise RemovedCipherFeatureError("Please remove your --key=xxx argument.") - - -class _RemovedFlagAction(argparse.Action): - def __init__(self, *args, **kwargs): - kwargs["help"] = argparse.SUPPRESS - kwargs["nargs"] = 0 - super().__init__(*args, **kwargs) - - -class _RemovedNoEmbedManifestAction(_RemovedFlagAction): - def __call__(self, *args, **kwargs): - from PyInstaller.exceptions import RemovedExternalManifestError - raise RemovedExternalManifestError("Please remove your --no-embed-manifest argument.") - - -class _RemovedWinPrivateAssembliesAction(_RemovedFlagAction): - def __call__(self, *args, **kwargs): - from PyInstaller.exceptions import RemovedWinSideBySideSupportError - raise RemovedWinSideBySideSupportError("Please remove your --win-private-assemblies argument.") - - -class _RemovedWinNoPreferRedirectsAction(_RemovedFlagAction): - def __call__(self, *args, **kwargs): - from PyInstaller.exceptions import RemovedWinSideBySideSupportError - raise RemovedWinSideBySideSupportError("Please remove your --win-no-prefer-redirects argument.") - - -# An object used in place of a "path string", which knows how to repr() itself using variable names instead of -# hard-coded paths. -class Path: - def __init__(self, *parts): - self.path = os.path.join(*parts) - self.variable_prefix = self.filename_suffix = None - - def __repr__(self): - if self.filename_suffix is None: - self.variable_prefix, self.filename_suffix = make_variable_path(self.path) - if self.variable_prefix is None: - return repr(self.path) - return "os.path.join(" + self.variable_prefix + "," + repr(self.filename_suffix) + ")" - - -# An object used to construct extra preamble for the spec file, in order to accommodate extra collect_*() calls from the -# command-line -class Preamble: - def __init__( - self, datas, binaries, hiddenimports, collect_data, collect_binaries, collect_submodules, collect_all, - copy_metadata, recursive_copy_metadata - ): - # Initialize with literal values - will be switched to preamble variable name later, if necessary - self.binaries = binaries or [] - self.hiddenimports = hiddenimports or [] - self.datas = datas or [] - # Preamble content - self.content = [] - - # Import statements - if collect_data: - self._add_hookutil_import('collect_data_files') - if collect_binaries: - self._add_hookutil_import('collect_dynamic_libs') - if collect_submodules: - self._add_hookutil_import('collect_submodules') - if collect_all: - self._add_hookutil_import('collect_all') - if copy_metadata or recursive_copy_metadata: - self._add_hookutil_import('copy_metadata') - if self.content: - self.content += [''] # empty line to separate the section - # Variables - if collect_data or copy_metadata or collect_all or recursive_copy_metadata: - self._add_var('datas', self.datas) - self.datas = 'datas' # switch to variable - if collect_binaries or collect_all: - self._add_var('binaries', self.binaries) - self.binaries = 'binaries' # switch to variable - if collect_submodules or collect_all: - self._add_var('hiddenimports', self.hiddenimports) - self.hiddenimports = 'hiddenimports' # switch to variable - # Content - collect_data_files - for entry in collect_data: - self._add_collect_data(entry) - # Content - copy_metadata - for entry in copy_metadata: - self._add_copy_metadata(entry) - # Content - copy_metadata(..., recursive=True) - for entry in recursive_copy_metadata: - self._add_recursive_copy_metadata(entry) - # Content - collect_binaries - for entry in collect_binaries: - self._add_collect_binaries(entry) - # Content - collect_submodules - for entry in collect_submodules: - self._add_collect_submodules(entry) - # Content - collect_all - for entry in collect_all: - self._add_collect_all(entry) - # Merge - if self.content and self.content[-1] != '': - self.content += [''] # empty line - self.content = '\n'.join(self.content) - - def _add_hookutil_import(self, name): - self.content += ['from PyInstaller.utils.hooks import {0}'.format(name)] - - def _add_var(self, name, initial_value): - self.content += ['{0} = {1}'.format(name, initial_value)] - - def _add_collect_data(self, name): - self.content += ['datas += collect_data_files(\'{0}\')'.format(name)] - - def _add_copy_metadata(self, name): - self.content += ['datas += copy_metadata(\'{0}\')'.format(name)] - - def _add_recursive_copy_metadata(self, name): - self.content += ['datas += copy_metadata(\'{0}\', recursive=True)'.format(name)] - - def _add_collect_binaries(self, name): - self.content += ['binaries += collect_dynamic_libs(\'{0}\')'.format(name)] - - def _add_collect_submodules(self, name): - self.content += ['hiddenimports += collect_submodules(\'{0}\')'.format(name)] - - def _add_collect_all(self, name): - self.content += [ - 'tmp_ret = collect_all(\'{0}\')'.format(name), - 'datas += tmp_ret[0]; binaries += tmp_ret[1]; hiddenimports += tmp_ret[2]' - ] - - -def __add_options(parser): - """ - Add the `Makespec` options to a option-parser instance or a option group. - """ - g = parser.add_argument_group('What to generate') - g.add_argument( - "-D", - "--onedir", - dest="onefile", - action="store_false", - default=None, - help="Create a one-folder bundle containing an executable (default)", - ) - g.add_argument( - "-F", - "--onefile", - dest="onefile", - action="store_true", - default=None, - help="Create a one-file bundled executable.", - ) - g.add_argument( - "--specpath", - metavar="DIR", - help="Folder to store the generated spec file (default: current directory)", - ) - g.add_argument( - "-n", - "--name", - help="Name to assign to the bundled app and spec file (default: first script's basename)", - ) - g.add_argument( - "--contents-directory", - help="For onedir builds only, specify the name of the directory in which all supporting files (i.e. everything " - "except the executable itself) will be placed in. Use \".\" to re-enable old onedir layout without contents " - "directory.", - ) - - g = parser.add_argument_group('What to bundle, where to search') - g.add_argument( - '--add-data', - action=SourceDestAction, - dest='datas', - help="Additional data files or directories containing data files to be added to the application. The argument " - 'value should be in form of "source:dest_dir", where source is the path to file (or directory) to be ' - "collected, dest_dir is the destination directory relative to the top-level application directory, and both " - "paths are separated by a colon (:). To put a file in the top-level application directory, use . as a " - "dest_dir. This option can be used multiple times." - ) - g.add_argument( - '--add-binary', - action=SourceDestAction, - dest="binaries", - help='Additional binary files to be added to the executable. See the ``--add-data`` option for the format. ' - 'This option can be used multiple times.', - ) - g.add_argument( - "-p", - "--paths", - dest="pathex", - metavar="DIR", - action="append", - default=[], - help="A path to search for imports (like using PYTHONPATH). Multiple paths are allowed, separated by ``%s``, " - "or use this option multiple times. Equivalent to supplying the ``pathex`` argument in the spec file." % - repr(os.pathsep), - ) - g.add_argument( - '--hidden-import', - '--hiddenimport', - action='append', - default=[], - metavar="MODULENAME", - dest='hiddenimports', - help='Name an import not visible in the code of the script(s). This option can be used multiple times.', - ) - g.add_argument( - '--collect-submodules', - action="append", - default=[], - metavar="MODULENAME", - dest='collect_submodules', - help='Collect all submodules from the specified package or module. This option can be used multiple times.', - ) - g.add_argument( - '--collect-data', - '--collect-datas', - action="append", - default=[], - metavar="MODULENAME", - dest='collect_data', - help='Collect all data from the specified package or module. This option can be used multiple times.', - ) - g.add_argument( - '--collect-binaries', - action="append", - default=[], - metavar="MODULENAME", - dest='collect_binaries', - help='Collect all binaries from the specified package or module. This option can be used multiple times.', - ) - g.add_argument( - '--collect-all', - action="append", - default=[], - metavar="MODULENAME", - dest='collect_all', - help='Collect all submodules, data files, and binaries from the specified package or module. This option can ' - 'be used multiple times.', - ) - g.add_argument( - '--copy-metadata', - action="append", - default=[], - metavar="PACKAGENAME", - dest='copy_metadata', - help='Copy metadata for the specified package. This option can be used multiple times.', - ) - g.add_argument( - '--recursive-copy-metadata', - action="append", - default=[], - metavar="PACKAGENAME", - dest='recursive_copy_metadata', - help='Copy metadata for the specified package and all its dependencies. This option can be used multiple ' - 'times.', - ) - g.add_argument( - "--additional-hooks-dir", - action="append", - dest="hookspath", - default=[], - help="An additional path to search for hooks. This option can be used multiple times.", - ) - g.add_argument( - '--runtime-hook', - action='append', - dest='runtime_hooks', - default=[], - help='Path to a custom runtime hook file. A runtime hook is code that is bundled with the executable and is ' - 'executed before any other code or module to set up special features of the runtime environment. This option ' - 'can be used multiple times.', - ) - g.add_argument( - '--exclude-module', - dest='excludes', - action='append', - default=[], - help='Optional module or package (the Python name, not the path name) that will be ignored (as though it was ' - 'not found). This option can be used multiple times.', - ) - g.add_argument( - '--key', - dest='key', - help=argparse.SUPPRESS, - type=removed_key_option, - ) - g.add_argument( - '--splash', - dest='splash', - metavar="IMAGE_FILE", - help="(EXPERIMENTAL) Add an splash screen with the image IMAGE_FILE to the application. The splash screen can " - "display progress updates while unpacking.", - ) - - g = parser.add_argument_group('How to generate') - g.add_argument( - "-d", - "--debug", - # If this option is not specified, then its default value is an empty list (no debug options selected). - default=[], - # Note that ``nargs`` is omitted. This produces a single item not stored in a list, as opposed to a list - # containing one item, as per `nargs `_. - nargs=None, - # The options specified must come from this list. - choices=DEBUG_ALL_CHOICE + DEBUG_ARGUMENT_CHOICES, - # Append choice, rather than storing them (which would overwrite any previous selections). - action='append', - # Allow newlines in the help text; see the ``_SmartFormatter`` in ``__main__.py``. - help=( - "R|Provide assistance with debugging a frozen\n" - "application. This argument may be provided multiple\n" - "times to select several of the following options.\n" - "\n" - "- all: All three of the following options.\n" - "\n" - "- imports: specify the -v option to the underlying\n" - " Python interpreter, causing it to print a message\n" - " each time a module is initialized, showing the\n" - " place (filename or built-in module) from which it\n" - " is loaded. See\n" - " https://docs.python.org/3/using/cmdline.html#id4.\n" - "\n" - "- bootloader: tell the bootloader to issue progress\n" - " messages while initializing and starting the\n" - " bundled app. Used to diagnose problems with\n" - " missing imports.\n" - "\n" - "- noarchive: instead of storing all frozen Python\n" - " source files as an archive inside the resulting\n" - " executable, store them as files in the resulting\n" - " output directory.\n" - "\n" - ), - ) - g.add_argument( - '--optimize', - dest='optimize', - metavar='LEVEL', - type=int, - choices={-1, 0, 1, 2}, - default=None, - help='Bytecode optimization level used for collected python modules and scripts. For details, see the section ' - '“Bytecode Optimization Level” in PyInstaller manual.', - ) - g.add_argument( - '--python-option', - dest='python_options', - metavar='PYTHON_OPTION', - action='append', - default=[], - help='Specify a command-line option to pass to the Python interpreter at runtime. Currently supports ' - '"v" (equivalent to "--debug imports"), "u", "W ", "X ", and "hash_seed=". ' - 'For details, see the section "Specifying Python Interpreter Options" in PyInstaller manual.', - ) - g.add_argument( - "-s", - "--strip", - action="store_true", - help="Apply a symbol-table strip to the executable and shared libs (not recommended for Windows)", - ) - g.add_argument( - "--noupx", - action="store_true", - default=False, - help="Do not use UPX even if it is available (works differently between Windows and *nix)", - ) - g.add_argument( - "--upx-exclude", - dest="upx_exclude", - metavar="FILE", - action="append", - help="Prevent a binary from being compressed when using upx. This is typically used if upx corrupts certain " - "binaries during compression. FILE is the filename of the binary without path. This option can be used " - "multiple times.", - ) - - g = parser.add_argument_group('Windows and macOS specific options') - g.add_argument( - "-c", - "--console", - "--nowindowed", - dest="console", - action="store_true", - default=None, - help="Open a console window for standard i/o (default). On Windows this option has no effect if the first " - "script is a '.pyw' file.", - ) - g.add_argument( - "-w", - "--windowed", - "--noconsole", - dest="console", - action="store_false", - default=None, - help="Windows and macOS: do not provide a console window for standard i/o. On macOS this also triggers " - "building a macOS .app bundle. On Windows this option is automatically set if the first script is a '.pyw' " - "file. This option is ignored on *NIX systems.", - ) - g.add_argument( - "--hide-console", - type=str, - choices={'hide-early', 'hide-late', 'minimize-early', 'minimize-late'}, - default=None, - help="Windows only: in console-enabled executable, have bootloader automatically hide or minimize the console " - "window if the program owns the console window (i.e., was not launched from an existing console window).", - ) - g.add_argument( - "-i", - "--icon", - action='append', - dest="icon_file", - metavar='', - help="FILE.ico: apply the icon to a Windows executable. FILE.exe,ID: extract the icon with ID from an exe. " - "FILE.icns: apply the icon to the .app bundle on macOS. If an image file is entered that isn't in the " - "platform format (ico on Windows, icns on Mac), PyInstaller tries to use Pillow to translate the icon into " - "the correct format (if Pillow is installed). Use \"NONE\" to not apply any icon, thereby making the OS show " - "some default (default: apply PyInstaller's icon). This option can be used multiple times.", - ) - g.add_argument( - "--disable-windowed-traceback", - dest="disable_windowed_traceback", - action="store_true", - default=False, - help="Disable traceback dump of unhandled exception in windowed (noconsole) mode (Windows and macOS only), " - "and instead display a message that this feature is disabled.", - ) - - g = parser.add_argument_group('Windows specific options') - g.add_argument( - "--version-file", - dest="version_file", - metavar="FILE", - help="Add a version resource from FILE to the exe.", - ) - g.add_argument( - "--manifest", - metavar="", - help="Add manifest FILE or XML to the exe.", - ) - g.add_argument( - "-m", - dest="shorthand_manifest", - metavar="", - help="Deprecated shorthand for --manifest.", - ) - g.add_argument( - "--no-embed-manifest", - action=_RemovedNoEmbedManifestAction, - ) - g.add_argument( - "-r", - "--resource", - dest="resources", - metavar="RESOURCE", - action="append", - default=[], - help="Add or update a resource to a Windows executable. The RESOURCE is one to four items, " - "FILE[,TYPE[,NAME[,LANGUAGE]]]. FILE can be a data file or an exe/dll. For data files, at least TYPE and NAME " - "must be specified. LANGUAGE defaults to 0 or may be specified as wildcard * to update all resources of the " - "given TYPE and NAME. For exe/dll files, all resources from FILE will be added/updated to the final executable " - "if TYPE, NAME and LANGUAGE are omitted or specified as wildcard *. This option can be used multiple times.", - ) - g.add_argument( - '--uac-admin', - dest='uac_admin', - action="store_true", - default=False, - help="Using this option creates a Manifest that will request elevation upon application start.", - ) - g.add_argument( - '--uac-uiaccess', - dest='uac_uiaccess', - action="store_true", - default=False, - help="Using this option allows an elevated application to work with Remote Desktop.", - ) - - g = parser.add_argument_group('Windows Side-by-side Assembly searching options (advanced)') - g.add_argument( - "--win-private-assemblies", - action=_RemovedWinPrivateAssembliesAction, - ) - g.add_argument( - "--win-no-prefer-redirects", - action=_RemovedWinNoPreferRedirectsAction, - ) - - g = parser.add_argument_group('macOS specific options') - g.add_argument( - "--argv-emulation", - dest="argv_emulation", - action="store_true", - default=False, - help="Enable argv emulation for macOS app bundles. If enabled, the initial open document/URL event is " - "processed by the bootloader and the passed file paths or URLs are appended to sys.argv.", - ) - - g.add_argument( - '--osx-bundle-identifier', - dest='bundle_identifier', - help="macOS .app bundle identifier is used as the default unique program name for code signing purposes. " - "The usual form is a hierarchical name in reverse DNS notation. For example: com.mycompany.department.appname " - "(default: first script's basename)", - ) - - g.add_argument( - '--target-architecture', - '--target-arch', - dest='target_arch', - metavar='ARCH', - default=None, - help="Target architecture (macOS only; valid values: x86_64, arm64, universal2). Enables switching between " - "universal2 and single-arch version of frozen application (provided python installation supports the target " - "architecture). If not target architecture is not specified, the current running architecture is targeted.", - ) - - g.add_argument( - '--codesign-identity', - dest='codesign_identity', - metavar='IDENTITY', - default=None, - help="Code signing identity (macOS only). Use the provided identity to sign collected binaries and generated " - "executable. If signing identity is not provided, ad-hoc signing is performed instead.", - ) - - g.add_argument( - '--osx-entitlements-file', - dest='entitlements_file', - metavar='FILENAME', - default=None, - help="Entitlements file to use when code-signing the collected binaries (macOS only).", - ) - - g = parser.add_argument_group('Rarely used special options') - g.add_argument( - "--runtime-tmpdir", - dest="runtime_tmpdir", - metavar="PATH", - help="Where to extract libraries and support files in `onefile` mode. If this option is given, the bootloader " - "will ignore any temp-folder location defined by the run-time OS. The ``_MEIxxxxxx``-folder will be created " - "here. Please use this option only if you know what you are doing. Note that on POSIX systems, PyInstaller's " - "bootloader does NOT perform shell-style environment variable expansion on the given path string. Therefore, " - "using environment variables (e.g., ``~`` or ``$HOME``) in path will NOT work.", - ) - g.add_argument( - "--bootloader-ignore-signals", - action="store_true", - default=False, - help="Tell the bootloader to ignore signals rather than forwarding them to the child process. Useful in " - "situations where for example a supervisor process signals both the bootloader and the child (e.g., via a " - "process group) to avoid signalling the child twice.", - ) - - -def main( - scripts, - name=None, - onefile=False, - console=True, - debug=[], - python_options=[], - strip=False, - noupx=False, - upx_exclude=None, - runtime_tmpdir=None, - contents_directory=None, - pathex=[], - version_file=None, - specpath=None, - bootloader_ignore_signals=False, - disable_windowed_traceback=False, - datas=[], - binaries=[], - icon_file=None, - manifest=None, - resources=[], - bundle_identifier=None, - hiddenimports=[], - hookspath=[], - runtime_hooks=[], - excludes=[], - uac_admin=False, - uac_uiaccess=False, - collect_submodules=[], - collect_binaries=[], - collect_data=[], - collect_all=[], - copy_metadata=[], - splash=None, - recursive_copy_metadata=[], - target_arch=None, - codesign_identity=None, - entitlements_file=None, - argv_emulation=False, - hide_console=None, - optimize=None, - **_kwargs -): - # Default values for onefile and console when not explicitly specified on command-line (indicated by None) - if onefile is None: - onefile = False - - if console is None: - console = True - - # If appname is not specified - use the basename of the main script as name. - if name is None: - name = os.path.splitext(os.path.basename(scripts[0]))[0] - - # If specpath not specified - use default value - current working directory. - if specpath is None: - specpath = DEFAULT_SPECPATH - else: - # Expand starting tilde into user's home directory, as a work-around for tilde not being expanded by shell when - # using `--specpath=~/path/abc` instead of `--specpath ~/path/abc` (or when the path argument is quoted). - specpath = os.path.expanduser(specpath) - # If cwd is the root directory of PyInstaller, generate the .spec file in ./appname/ subdirectory. - if specpath == HOMEPATH: - specpath = os.path.join(HOMEPATH, name) - # Create directory tree if missing. - if not os.path.exists(specpath): - os.makedirs(specpath) - - # Handle additional EXE options. - exe_options = '' - if version_file: - exe_options += "\n version='%s'," % escape_win_filepath(version_file) - if uac_admin: - exe_options += "\n uac_admin=True," - if uac_uiaccess: - exe_options += "\n uac_uiaccess=True," - if icon_file: - # Icon file for Windows. - # On Windows, the default icon is embedded in the bootloader executable. - if icon_file[0] == 'NONE': - exe_options += "\n icon='NONE'," - else: - exe_options += "\n icon=[%s]," % ','.join("'%s'" % escape_win_filepath(ic) for ic in icon_file) - # Icon file for macOS. - # We need to encapsulate it into apostrofes. - icon_file = "'%s'" % icon_file[0] - else: - # On macOS, the default icon has to be copied into the .app bundle. - # The the text value 'None' means - use default icon. - icon_file = 'None' - if contents_directory: - exe_options += "\n contents_directory='%s'," % (contents_directory or "_internal") - if hide_console: - exe_options += "\n hide_console='%s'," % hide_console - - if bundle_identifier: - # We need to encapsulate it into apostrofes. - bundle_identifier = "'%s'" % bundle_identifier - - if _kwargs["shorthand_manifest"]: - manifest = _kwargs["shorthand_manifest"] - logger.log( - logging.DEPRECATION, "PyInstaller v7 will remove the -m shorthand flag. Please use --manifest=%s instead", - manifest - ) - if manifest: - if "<" in manifest: - # Assume XML string - exe_options += "\n manifest='%s'," % manifest.replace("'", "\\'") - else: - # Assume filename - exe_options += "\n manifest='%s'," % escape_win_filepath(manifest) - if resources: - resources = list(map(escape_win_filepath, resources)) - exe_options += "\n resources=%s," % repr(resources) - - hiddenimports = hiddenimports or [] - upx_exclude = upx_exclude or [] - - if is_darwin and onefile and not console: - from PyInstaller.building.osx import WINDOWED_ONEFILE_DEPRCATION - logger.log(logging.DEPRECATION, WINDOWED_ONEFILE_DEPRCATION) - - # If file extension of the first script is '.pyw', force --windowed option. - if is_win and os.path.splitext(scripts[0])[-1] == '.pyw': - console = False - - # If script paths are relative, make them relative to the directory containing .spec file. - scripts = [make_path_spec_relative(x, specpath) for x in scripts] - # With absolute paths replace prefix with variable HOMEPATH. - scripts = list(map(Path, scripts)) - - # Translate the default of ``debug=None`` to an empty list. - if debug is None: - debug = [] - # Translate the ``all`` option. - if DEBUG_ALL_CHOICE[0] in debug: - debug = DEBUG_ARGUMENT_CHOICES - - # Create preamble (for collect_*() calls) - preamble = Preamble( - datas, binaries, hiddenimports, collect_data, collect_binaries, collect_submodules, collect_all, copy_metadata, - recursive_copy_metadata - ) - - if splash: - splash_init = splashtmpl % {'splash_image': splash} - splash_binaries = "\n splash.binaries," - splash_target = "\n splash," - else: - splash_init = splash_binaries = splash_target = "" - - # Infer byte-code optimization level. - opt_level = sum([opt == 'O' for opt in python_options]) - if opt_level > 2: - logger.warning( - "The switch '--python-option O' has been specified %d times - it should be specified at most twice!", - opt_level, - ) - opt_level = 2 - - if optimize is None: - if opt_level == 0: - # Infer from running python process - optimize = sys.flags.optimize - else: - # Infer from `--python-option O` switch(es). - optimize = opt_level - elif optimize != opt_level and opt_level != 0: - logger.warning( - "Mismatch between optimization level passed via --optimize switch (%d) and number of '--python-option O' " - "switches (%d)!", - optimize, - opt_level, - ) - - if optimize >= 0: - # Ensure OPTIONs passed to bootloader match the optimization settings. - python_options += max(0, optimize - opt_level) * ['O'] - - # Create OPTIONs array - if 'imports' in debug and 'v' not in python_options: - python_options.append('v') - python_options_array = [(opt, None, 'OPTION') for opt in python_options] - - d = { - 'scripts': scripts, - 'pathex': pathex or [], - 'binaries': preamble.binaries, - 'datas': preamble.datas, - 'hiddenimports': preamble.hiddenimports, - 'preamble': preamble.content, - 'name': name, - 'noarchive': 'noarchive' in debug, - 'optimize': optimize, - 'options': python_options_array, - 'debug_bootloader': 'bootloader' in debug, - 'bootloader_ignore_signals': bootloader_ignore_signals, - 'strip': strip, - 'upx': not noupx, - 'upx_exclude': upx_exclude, - 'runtime_tmpdir': runtime_tmpdir, - 'exe_options': exe_options, - # Directory with additional custom import hooks. - 'hookspath': hookspath, - # List with custom runtime hook files. - 'runtime_hooks': runtime_hooks or [], - # List of modules/packages to ignore. - 'excludes': excludes or [], - # only Windows and macOS distinguish windowed and console apps - 'console': console, - 'disable_windowed_traceback': disable_windowed_traceback, - # Icon filename. Only macOS uses this item. - 'icon': icon_file, - # .app bundle identifier. Only macOS uses this item. - 'bundle_identifier': bundle_identifier, - # argv emulation (macOS only) - 'argv_emulation': argv_emulation, - # Target architecture (macOS only) - 'target_arch': target_arch, - # Code signing identity (macOS only) - 'codesign_identity': codesign_identity, - # Entitlements file (macOS only) - 'entitlements_file': entitlements_file, - # splash screen - 'splash_init': splash_init, - 'splash_target': splash_target, - 'splash_binaries': splash_binaries, - } - - # Write down .spec file to filesystem. - specfnm = os.path.join(specpath, name + '.spec') - with open(specfnm, 'w', encoding='utf-8') as specfile: - if onefile: - specfile.write(onefiletmplt % d) - # For macOS create .app bundle. - if is_darwin and not console: - specfile.write(bundleexetmplt % d) - else: - specfile.write(onedirtmplt % d) - # For macOS create .app bundle. - if is_darwin and not console: - specfile.write(bundletmplt % d) - - return specfnm diff --git a/venv/lib/python3.12/site-packages/PyInstaller/building/osx.py b/venv/lib/python3.12/site-packages/PyInstaller/building/osx.py deleted file mode 100755 index dca5649..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/building/osx.py +++ /dev/null @@ -1,736 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -import os -import pathlib -import plistlib -import shutil -import subprocess - -from PyInstaller import log as logging -from PyInstaller.building.api import COLLECT, EXE -from PyInstaller.building.datastruct import Target, logger, normalize_toc -from PyInstaller.building.utils import _check_path_overlap, _rmtree, process_collected_binary -from PyInstaller.compat import is_darwin, strict_collect_mode -from PyInstaller.building.icon import normalize_icon_type -import PyInstaller.utils.misc as miscutils - -if is_darwin: - import PyInstaller.utils.osx as osxutils - -# Character sequence used to replace dot (`.`) in names of directories that are created in `Contents/MacOS` or -# `Contents/Frameworks`, where only .framework bundle directories are allowed to have dot in name. -DOT_REPLACEMENT = '__dot__' - -WINDOWED_ONEFILE_DEPRCATION = ( - "Onefile mode in combination with macOS .app bundles (windowed mode) don't make sense (a .app bundle can not be a " - "single file) and clashes with macOS's security. Please migrate to onedir mode. This will become an error " - "in v7.0." -) - - -class BUNDLE(Target): - def __init__(self, *args, **kwargs): - from PyInstaller.config import CONF - - for item in args: - if isinstance(item, EXE) and not item.exclude_binaries: - logger.log(logging.DEPRECATION, WINDOWED_ONEFILE_DEPRCATION) - - # BUNDLE only has a sense under macOS, it is a noop on other platforms. - if not is_darwin: - return - - # Get a path to a .icns icon for the app bundle. - self.icon = kwargs.get('icon') - if not self.icon: - # --icon not specified; use the default in the pyinstaller folder - self.icon = os.path.join( - os.path.dirname(os.path.dirname(__file__)), 'bootloader', 'images', 'icon-windowed.icns' - ) - else: - # User gave an --icon=path. If it is relative, make it relative to the spec file location. - if not os.path.isabs(self.icon): - self.icon = os.path.join(CONF['specpath'], self.icon) - - super().__init__() - - # .app bundle is created in DISTPATH. - self.name = kwargs.get('name', None) - base_name = os.path.basename(self.name) - self.name = os.path.join(CONF['distpath'], base_name) - - self.appname = os.path.splitext(base_name)[0] - # Ensure version is a string, even if user accidentally passed an int or a float. - # Having a `CFBundleShortVersionString` entry of non-string type in `Info.plist` causes the .app bundle to - # crash at start (#4466). - self.version = str(kwargs.get("version", "0.0.0")) - self.toc = [] - self.strip = False - self.upx = False - self.console = True - self.target_arch = None - self.codesign_identity = None - self.entitlements_file = None - - # .app bundle identifier for Code Signing - self.bundle_identifier = kwargs.get('bundle_identifier') - if not self.bundle_identifier: - # Fallback to appname. - self.bundle_identifier = self.appname - - self.info_plist = kwargs.get('info_plist', None) - - for arg in args: - # Valid arguments: EXE object, COLLECT object, and TOC-like iterables - if isinstance(arg, EXE): - # Add EXE as an entry to the TOC, and merge its dependencies TOC - self.toc.append((os.path.basename(arg.name), arg.name, 'EXECUTABLE')) - self.toc.extend(arg.dependencies) - # Inherit settings - self.strip = arg.strip - self.upx = arg.upx - self.upx_exclude = arg.upx_exclude - self.console = arg.console - self.target_arch = arg.target_arch - self.codesign_identity = arg.codesign_identity - self.entitlements_file = arg.entitlements_file - elif isinstance(arg, COLLECT): - # Merge the TOC - self.toc.extend(arg.toc) - # Inherit settings - self.strip = arg.strip_binaries - self.upx = arg.upx_binaries - self.upx_exclude = arg.upx_exclude - self.console = arg.console - self.target_arch = arg.target_arch - self.codesign_identity = arg.codesign_identity - self.entitlements_file = arg.entitlements_file - elif miscutils.is_iterable(arg): - # TOC-like iterable - self.toc.extend(arg) - else: - raise TypeError(f"Invalid argument type for BUNDLE: {type(arg)!r}") - - # Infer the executable name from the first EXECUTABLE entry in the TOC; it might have come from the COLLECT - # (as opposed to the stand-alone EXE). - for dest_name, src_name, typecode in self.toc: - if typecode == "EXECUTABLE": - self.exename = src_name - break - else: - raise ValueError("No EXECUTABLE entry found in the TOC!") - - # Normalize TOC - self.toc = normalize_toc(self.toc) - - self.__postinit__() - - _GUTS = ( - # BUNDLE always builds, just want the toc to be written out - ('toc', None), - ) - - def _check_guts(self, data, last_build): - # BUNDLE always needs to be executed, in order to clean the output directory. - return True - - # Helper for determining whether the given file belongs to a .framework bundle or not. If it does, it returns - # the path to the top-level .framework bundle directory; otherwise, returns None. In case of nested .framework - # bundles, the path to the top-most .framework bundle directory is returned. - @staticmethod - def _is_framework_file(dest_path): - # NOTE: reverse the parents list because we are looking for the top-most .framework bundle directory! - for parent in reversed(dest_path.parents): - if parent.name.endswith('.framework'): - return parent - return None - - # Helper that computes relative cross-link path between link's location and target, assuming they are both - # rooted in the `Contents` directory of a macOS .app bundle. - @staticmethod - def _compute_relative_crosslink(crosslink_location, crosslink_target): - # We could take symlink_location and symlink_target as they are (relative to parent of the `Contents` - # directory), but that would introduce an unnecessary `../Contents` part. So instead, we take both paths - # relative to the `Contents` directory. - return os.path.join( - *['..' for level in pathlib.PurePath(crosslink_location).relative_to('Contents').parent.parts], - pathlib.PurePath(crosslink_target).relative_to('Contents'), - ) - - # This method takes the original (input) TOC and processes it into final TOC, based on which the `assemble` method - # performs its file collection. The TOC processing here represents the core of our efforts to generate an .app - # bundle that is compatible with Apple's code-signing requirements. - # - # For in-depth details on the code-signing, see Apple's `Technical Note TN2206: macOS Code Signing In Depth` at - # https://developer.apple.com/library/archive/technotes/tn2206/_index.html - # - # The requirements, framed from PyInstaller's perspective, can be summarized as follows: - # - # 1. The `Contents/MacOS` directory is expected to contain only the program executable and (binary) code (= dylibs - # and nested .framework bundles). Alternatively, the dylibs and .framework bundles can be also placed into - # `Contents/Frameworks` directory (where same rules apply as for `Contents/MacOS`, so the remainder of this - # text refers to the two inter-changeably, unless explicitly noted otherwise). The code in `Contents/MacOS` - # is expected to be signed, and the `codesign` utility will recursively sign all found code when using `--deep` - # option to sign the .app bundle. - # - # 2. All non-code files should be be placed in `Contents/Resources`, so they become sealed (data) resources; - # i.e., their signature data is recorded in `Contents/_CodeSignature/CodeResources`. (As a side note, - # it seems that signature information for data/resources in `Contents/Resources` is kept nder `file` key in - # the `CodeResources` file, while the information for contents in `Contents/MacOS` is kept under `file2` key). - # - # 3. The directories in `Contents/MacOS` may not contain dots (`.`) in their names, except for the nested - # .framework bundle directories. The directories in `Contents/Resources` have no such restrictions. - # - # 4. There may not be any content in the top level of a bundle. In other words, if a bundle has a `Contents` - # or a `Versions` directory at its top level, there may be no other files or directories alongside them. The - # sole exception is that alongside `Versions`, there may be symlinks to files and directories in - # `Versions/Current`. This rule is important for nested .framework bundles that we collect from python packages. - # - # Next, let us consider the consequences of violating each of the above requirements: - # - # 1. Code signing machinery can directly store signature only in Mach-O binaries and nested .framework bundles; if - # a data file is placed in `Contents/MacOS`, the signature is stored in the file's extended attributes. If the - # extended attributes are lost, the program's signature will be broken. Many file transfer techniques (e.g., a - # zip file) do not preserve extended attributes, nor are they preserved when uploading to the Mac App Store. - # - # 2. Putting code (a dylib or a .framework bundle) into `Contents/Resources` causes it to be treated as a resource; - # the outer signature (i.e., of the whole .app bundle) does not know that this nested content is actually a code. - # Consequently, signing the bundle with `codesign --deep` will NOT sign binaries placed in the - # `Contents/Resources`, which may result in missing signatures when .app bundle is verified for notarization. - # This might be worked around by signing each binary separately, and then signing the whole bundle (without the - # `--deep` option), but requires the user to keep track of the offending binaries. - # - # 3. If a directory in `Contents/MacOS` contains a dot in the name, code-signing the bundle fails with - # `bundle format unrecognized, invalid, or unsuitable` due to code signing machinery treating directory as a - # nested .framework bundle directory. - # - # 4. If nested .framework bundle is malformed, the signing of the .app bundle might succeed, but subsequent - # verification will fail, for example with `embedded framework contains modified or invalid version` (as observed - # with .framework bundles shipped by contemporary PyQt/PySide PyPI wheels). - # - # The above requirements are unfortunately often at odds with the structure of python packages: - # - # * In general, python packages are mixed-content directories, where binaries and data files may be expected to - # be found next to each other. - # - # For example, `opencv-python` provides a custom loader script that requires the package to be collected in the - # source-only form by PyInstaller (i.e., the python modules and scripts collected as source .py files). At the - # same time, it expects the .py loader script to be able to find the binary extension next to itself. - # - # Another example of mixed-mode directories are Qt QML components' sub-directories, which contain both the - # component's plugin (a binary) and associated meta files (data files). - # - # * In python world, the directories often contain dots in their names. - # - # Dots are often used for private directories containing binaries that are shipped with a package. For example, - # `numpy/.dylibs`, `scipy/.dylibs`, etc. - # - # Qt QML components may also contain a dot in their name; couple of examples from `PySide2` package: - # `PySide2/Qt/qml/QtQuick.2`, `PySide2/Qt/qml/QtQuick/Controls.2`, `PySide2/Qt/qml/QtQuick/Particles.2`, etc. - # - # The packages' metadata directories also invariably contain dots in the name due to version (for example, - # `numpy-1.24.3.dist-info`). - # - # In the light of all above, PyInstaller attempts to strictly place all files to their mandated location - # (`Contents/MacOS` or `Contents/Frameworks` vs `Contents/Resources`). To preserve the illusion of mixed-content - # directories, the content is cross-linked from one directory to the other. Specifically: - # - # * All entries with DATA typecode are assumed to be data files, and are always placed in corresponding directory - # structure rooted in `Contents/Resources`. - # - # * All entries with BINARY or EXTENSION typecode are always placed in corresponding directory structure rooted in - # `Contents/Frameworks`. - # - # * All entries with EXECUTABLE are placed in `Contents/MacOS` directory. - # - # * For the purposes of relocation, nested .framework bundles are treated as a single BINARY entity; i.e., the - # whole .bundle directory is placed in corresponding directory structure rooted in `Contents/Frameworks` (even - # though some of its contents, such as `Info.plist` file, are actually data files). - # - # * Top-level data files and binaries are always cross-linked to the other directory. For example, given a data file - # `data_file.txt` that was collected into `Contents/Resources`, we create a symbolic link called - # `Contents/MacOS/data_file.txt` that points to `../Resources/data_file.txt`. - # - # * The executable itself, while placed in `Contents/MacOS`, are cross-linked into both `Contents/Framworks` and - # `Contents/Resources`. - # - # * The stand-alone PKG entries (used with onefile builds that side-load the PKG archive) are treated as data files - # and collected into `Contents/Resources`, but cross-linked only into `Contents/MacOS` directory (because they - # must appear to be next to the program executable). This is the only entry type that is cross-linked into the - # `Contents/MacOS` directory and also the only data-like entry type that is not cross-linked into the - # `Contents/Frameworks` directory. - # - # * For files in sub-directories, the cross-linking behavior depends on the type of directory: - # - # * A data-only directory is created in directory structure rooted in `Contents/Resources`, and cross-linked - # into directory structure rooted in `Contents/Frameworks` at directory level (i.e., we link the whole - # directory instead of individual files). - # - # This largely saves us from having to deal with dots in the names of collected metadata directories, which - # are examples of data-only directories. - # - # * A binary-only directory is created in directory structure rooted in `Contents/Frameworks`, and cross-linked - # into `Contents/Resources` at directory level. - # - # * A mixed-content directory is created in both directory structures. Files are placed into corresponding - # directory structure based on their type, and cross-linked into other directory structure at file level. - # - # * This rule is applied recursively; for example, a data-only sub-directory in a mixed-content directory is - # cross-linked at directory level, while adjacent binary and data files are cross-linked at file level. - # - # * To work around the issue with dots in the names of directories in `Contents/Frameworks` (applicable to - # binary-only or mixed-content directories), such directories are created with modified name (the dot replaced - # with a pre-defined pattern). Next to the modified directory, a symbolic link with original name is created, - # pointing to the directory with modified name. With mixed-content directories, this modification is performed - # only on the `Contents/Frameworks` side; the corresponding directory in `Contents/Resources` can be created - # directly, without name modification and symbolic link. - # - # * If a symbolic link needs to be created in a mixed-content directory due to a SYMLINK entry from the original - # TOC (i.e., a "collected" symlink originating from analysis, as opposed to the cross-linking mechanism described - # above), the link is created in both directory structures, each pointing to the resource in its corresponding - # directory structure (with one such resource being an actual file, and the other being a cross-link to the file). - # - # Final remarks: - # - # NOTE: the relocation mechanism is codified by tests in `tests/functional/test_macos_bundle_structure.py`. - # - # NOTE: by placing binaries and nested .framework entries into `Contents/Frameworks` instead of `Contents/MacOS`, - # we have effectively relocated the `sys._MEIPASS` directory from the `Contents/MacOS` (= the parent directory of - # the program executable) into `Contents/Frameworks`. This requires the PyInstaller's bootloader to detect that it - # is running in the app-bundle mode (e.g., by checking if program executable's parent directory is `Contents/NacOS`) - # and adjust the path accordingly. - # - # NOTE: the implemented relocation mechanism depends on the input TOC containing properly classified entries - # w.r.t. BINARY vs DATA. So hooks and .spec files triggering collection of binaries as datas (and vice versa) will - # result in incorrect placement of those files in the generated .app bundle. However, this is *not* the proper place - # to address such issues; if necessary, automatic (re)classification should be added to analysis process, to ensure - # that BUNDLE (as well as other build targets) receive correctly classified TOC. - # - # NOTE: similar to the previous note, the relocation mechanism is also not the proper place to enforce compliant - # structure of the nested .framework bundles. Instead, this is handled by the analysis process, using the - # `PyInstaller.utils.osx.collect_files_from_framework_bundles` helper function. So the input TOC that BUNDLE - # receives should already contain entries that reconstruct compliant nested .framework bundles. - def _process_bundle_toc(self, toc): - bundle_toc = [] - - # Step 1: inspect the directory layout and classify the directories according to their contents. - directory_types = dict() - - _MIXED_DIR_TYPE = 'MIXED-DIR' - _DATA_DIR_TYPE = 'DATA-DIR' - _BINARY_DIR_TYPE = 'BINARY-DIR' - _FRAMEWORK_DIR_TYPE = 'FRAMEWORK-DIR' - - _TOP_LEVEL_DIR = pathlib.PurePath('.') - - for dest_name, src_name, typecode in toc: - dest_path = pathlib.PurePath(dest_name) - - framework_dir = self._is_framework_file(dest_path) - if framework_dir: - # Mark the framework directory as FRAMEWORK-DIR. - directory_types[framework_dir] = _FRAMEWORK_DIR_TYPE - # Treat the framework directory as BINARY file when classifying parent directories. - typecode = 'BINARY' - parent_dirs = framework_dir.parents - else: - parent_dirs = dest_path.parents - # Treat BINARY and EXTENSION as BINARY to simplify further processing. - if typecode == 'EXTENSION': - typecode = 'BINARY' - - # (Re)classify parent directories - for parent_dir in parent_dirs: - # Skip the top-level `.` dir. This is also the only directory that can contain EXECUTABLE and PKG - # entries, so we do not have to worry about. - if parent_dir == _TOP_LEVEL_DIR: - continue - - directory_type = _BINARY_DIR_TYPE if typecode == 'BINARY' else _DATA_DIR_TYPE # default - directory_type = directory_types.get(parent_dir, directory_type) - - if directory_type == _DATA_DIR_TYPE and typecode == 'BINARY': - directory_type = _MIXED_DIR_TYPE - if directory_type == _BINARY_DIR_TYPE and typecode == 'DATA': - directory_type = _MIXED_DIR_TYPE - - directory_types[parent_dir] = directory_type - - logger.debug("Directory classification: %r", directory_types) - - # Step 2: process the obtained directory structure and create symlink entries for directories that need to be - # cross-linked. Such directories are data-only and binary-only directories (and framework directories) that are - # located either in the top-level directory (have no parent) or in a mixed-content directory. - for directory_path, directory_type in directory_types.items(): - # Cross-linking at directory level applies only to data-only and binary-only directories (as well as - # framework directories). - if directory_type == _MIXED_DIR_TYPE: - continue - - # The parent needs to be either top-level directory or a mixed-content directory. Otherwise, the parent - # (or one of its ancestors) will get cross-linked, and we do not need the link here. - parent_dir = directory_path.parent - requires_crosslink = parent_dir == _TOP_LEVEL_DIR or directory_types.get(parent_dir) == _MIXED_DIR_TYPE - if not requires_crosslink: - continue - - logger.debug("Cross-linking directory %r of type %r", directory_path, directory_type) - - # Data-only directories are created in `Contents/Resources`, needs to be cross-linked into `Contents/MacOS`. - # Vice versa for binary-only or framework directories. The directory creation is handled implicitly, when we - # create parent directory structure for collected files. - if directory_type == _DATA_DIR_TYPE: - symlink_src = os.path.join('Contents/Resources', directory_path) - symlink_dest = os.path.join('Contents/Frameworks', directory_path) - else: - symlink_src = os.path.join('Contents/Frameworks', directory_path) - symlink_dest = os.path.join('Contents/Resources', directory_path) - symlink_ref = self._compute_relative_crosslink(symlink_dest, symlink_src) - - bundle_toc.append((symlink_dest, symlink_ref, 'SYMLINK')) - - # Step 3: first part of the work-around for directories that are located in `Contents/Frameworks` but contain a - # dot in their name. As per `codesign` rules, the only directories in `Contents/Frameworks` that are allowed to - # contain a dot in their name are .framework bundle directories. So we replace the dot with a custom character - # sequence (stored in global `DOT_REPLACEMENT` variable), and create a symbolic with original name pointing to - # the modified name. This is the best we can do with code-sign requirements vs. python community showing their - # packages' dylibs into `.dylib` subdirectories, or Qt storing their Qml components in directories named - # `QtQuick.2`, `QtQuick/Controls.2`, `QtQuick/Particles.2`, `QtQuick/Templates.2`, etc. - # - # In this step, we only prepare symlink entries that link the original directory name (with dot) to the modified - # one (with dot replaced). The parent paths for collected files are modified in later step(s). - for directory_path, directory_type in directory_types.items(): - # .framework bundle directories contain a dot in the name, but are allowed that. - if directory_type == _FRAMEWORK_DIR_TYPE: - continue - - # Data-only directories are fully located in `Contents/Resources` and cross-linked to `Contents/Frameworks` - # at directory level, so they are also allowed a dot in their name. - if directory_type == _DATA_DIR_TYPE: - continue - - # Apply the work-around, if necessary... - if '.' not in directory_path.name: - continue - - logger.debug( - "Creating symlink to work around the dot in the name of directory %r (%s)...", str(directory_path), - directory_type - ) - - # Create a SYMLINK entry, but only for this level. In case of nested directories with dots in names, the - # symlinks for ancestors will be created by corresponding loop iteration. - bundle_toc.append(( - os.path.join('Contents/Frameworks', directory_path), - directory_path.name.replace('.', DOT_REPLACEMENT), - 'SYMLINK', - )) - - # Step 4: process the entries for collected files, and decide whether they should be placed into - # `Contents/MacOS`, `Contents/Frameworks`, or `Contents/Resources`, and whether they should be cross-linked into - # other directories. - for orig_dest_name, src_name, typecode in toc: - orig_dest_path = pathlib.PurePath(orig_dest_name) - - # Special handling for EXECUTABLE and PKG entries - if typecode == 'EXECUTABLE': - # Place into `Contents/MacOS`, ... - file_dest = os.path.join('Contents/MacOS', orig_dest_name) - bundle_toc.append((file_dest, src_name, typecode)) - # ... and do nothing else. We explicitly avoid cross-linking the executable to `Contents/Frameworks` and - # `Contents/Resources`, because it should be not necessary (the executable's location should be - # discovered via `sys.executable`) and to prevent issues when executable name collides with name of a - # package from which we collect either binaries or data files (or both); see #7314. - continue - elif typecode == 'PKG': - # Place into `Contents/Resources` ... - file_dest = os.path.join('Contents/Resources', orig_dest_name) - bundle_toc.append((file_dest, src_name, typecode)) - # ... and cross-link only into `Contents/MacOS`. - # This is used only in `onefile` mode, where there is actually no other content to distribute among the - # `Contents/Resources` and `Contents/Frameworks` directories, so cross-linking into the latter makes - # little sense. - symlink_dest = os.path.join('Contents/MacOS', orig_dest_name) - symlink_ref = self._compute_relative_crosslink(symlink_dest, file_dest) - bundle_toc.append((symlink_dest, symlink_ref, 'SYMLINK')) - continue - - # Standard data vs binary processing... - - # Determine file location based on its type. - if self._is_framework_file(orig_dest_path): - # File from a framework bundle; put into `Contents/Frameworks`, but never cross-link the file itself. - # The whole .framework bundle directory will be linked as necessary by the directory cross-linking - # mechanism. - file_base_dir = 'Contents/Frameworks' - crosslink_base_dir = None - elif typecode == 'DATA': - # Data file; relocate to `Contents/Resources` and cross-link it back into `Contents/Frameworks`. - file_base_dir = 'Contents/Resources' - crosslink_base_dir = 'Contents/Frameworks' - else: - # Binary; put into `Contents/Frameworks` and cross-link it into `Contents/Resources`. - file_base_dir = 'Contents/Frameworks' - crosslink_base_dir = 'Contents/Resources' - - # Determine if we need to cross-link the file. We need to do this for top-level files (the ones without - # parent directories), and for files whose parent directories are mixed-content directories. - requires_crosslink = False - if crosslink_base_dir is not None: - parent_dir = orig_dest_path.parent - requires_crosslink = parent_dir == _TOP_LEVEL_DIR or directory_types.get(parent_dir) == _MIXED_DIR_TYPE - - # Special handling for SYMLINK entries in original TOC; if we need to cross-link a symlink entry, we create - # it in both locations, and have each point to the (relative) resource in the same directory (so one of the - # targets will likely be a file, and the other will be a symlink due to cross-linking). - if typecode == 'SYMLINK' and requires_crosslink: - bundle_toc.append((os.path.join(file_base_dir, orig_dest_name), src_name, typecode)) - bundle_toc.append((os.path.join(crosslink_base_dir, orig_dest_name), src_name, typecode)) - continue - - # The file itself. - file_dest = os.path.join(file_base_dir, orig_dest_name) - bundle_toc.append((file_dest, src_name, typecode)) - - # Symlink for cross-linking - if requires_crosslink: - symlink_dest = os.path.join(crosslink_base_dir, orig_dest_name) - symlink_ref = self._compute_relative_crosslink(symlink_dest, file_dest) - bundle_toc.append((symlink_dest, symlink_ref, 'SYMLINK')) - - # Step 5: sanitize all destination paths in the new TOC, to ensure that paths that are rooted in - # `Contents/Frameworks` do not contain directories with dots in their names. Doing this as a post-processing - # step keeps code simple and clean and ensures that this step is applied to files, symlinks that originate from - # cross-linking files, and symlinks that originate from cross-linking directories. This in turn ensures that - # all directory hierarchies created during the actual file collection have sanitized names, and that collection - # outcome does not depend on the order of entries in the TOC. - sanitized_toc = [] - for dest_name, src_name, typecode in bundle_toc: - dest_path = pathlib.PurePath(dest_name) - - # Paths rooted in Contents/Resources do not require sanitizing. - if dest_path.parts[0] == 'Contents' and dest_path.parts[1] == 'Resources': - sanitized_toc.append((dest_name, src_name, typecode)) - continue - - # Special handling for files from .framework bundle directories; sanitize only parent path of the .framework - # directory. - framework_path = self._is_framework_file(dest_path) - if framework_path: - parent_path = framework_path.parent - remaining_path = dest_path.relative_to(parent_path) - else: - parent_path = dest_path.parent - remaining_path = dest_path.name - - sanitized_dest_path = pathlib.PurePath( - *parent_path.parts[:2], # Contents/Frameworks - *[part.replace('.', DOT_REPLACEMENT) for part in parent_path.parts[2:]], - remaining_path, - ) - sanitized_dest_name = str(sanitized_dest_path) - - if sanitized_dest_path != dest_path: - logger.debug("Sanitizing dest path: %r -> %r", dest_name, sanitized_dest_name) - - sanitized_toc.append((sanitized_dest_name, src_name, typecode)) - - bundle_toc = sanitized_toc - - # Normalize and sort the TOC for easier inspection - bundle_toc = sorted(normalize_toc(bundle_toc)) - - return bundle_toc - - def assemble(self): - from PyInstaller.config import CONF - - if _check_path_overlap(self.name) and os.path.isdir(self.name): - _rmtree(self.name) - - logger.info("Building BUNDLE %s", self.tocbasename) - - # Create a minimal Mac bundle structure. - os.makedirs(os.path.join(self.name, "Contents", "MacOS")) - os.makedirs(os.path.join(self.name, "Contents", "Resources")) - os.makedirs(os.path.join(self.name, "Contents", "Frameworks")) - - # Makes sure the icon exists and attempts to convert to the proper format if applicable - self.icon = normalize_icon_type(self.icon, ("icns",), "icns", CONF["workpath"]) - - # Ensure icon path is absolute - self.icon = os.path.abspath(self.icon) - - # Copy icns icon to Resources directory. - shutil.copyfile(self.icon, os.path.join(self.name, 'Contents', 'Resources', os.path.basename(self.icon))) - - # Key/values for a minimal Info.plist file - info_plist_dict = { - "CFBundleDisplayName": self.appname, - "CFBundleName": self.appname, - - # Required by 'codesign' utility. - # The value for CFBundleIdentifier is used as the default unique name of your program for Code Signing - # purposes. It even identifies the APP for access to restricted macOS areas like Keychain. - # - # The identifier used for signing must be globally unique. The usual form for this identifier is a - # hierarchical name in reverse DNS notation, starting with the toplevel domain, followed by the company - # name, followed by the department within the company, and ending with the product name. Usually in the - # form: com.mycompany.department.appname - # CLI option --osx-bundle-identifier sets this value. - "CFBundleIdentifier": self.bundle_identifier, - "CFBundleExecutable": os.path.basename(self.exename), - "CFBundleIconFile": os.path.basename(self.icon), - "CFBundleInfoDictionaryVersion": "6.0", - "CFBundlePackageType": "APPL", - "CFBundleShortVersionString": self.version, - } - - # Set some default values. But they still can be overwritten by the user. - if self.console: - # Setting EXE console=True implies LSBackgroundOnly=True. - info_plist_dict['LSBackgroundOnly'] = True - else: - # Let's use high resolution by default. - info_plist_dict['NSHighResolutionCapable'] = True - - # Merge info_plist settings from spec file - if isinstance(self.info_plist, dict) and self.info_plist: - info_plist_dict.update(self.info_plist) - - plist_filename = os.path.join(self.name, "Contents", "Info.plist") - with open(plist_filename, "wb") as plist_fh: - plistlib.dump(info_plist_dict, plist_fh) - - # Pre-process the TOC into its final BUNDLE-compatible form. - bundle_toc = self._process_bundle_toc(self.toc) - - # Perform the actual collection. - CONTENTS_FRAMEWORKS_PATH = pathlib.PurePath('Contents/Frameworks') - for dest_name, src_name, typecode in bundle_toc: - # Create parent directory structure, if necessary - dest_path = os.path.join(self.name, dest_name) # Absolute destination path - dest_dir = os.path.dirname(dest_path) - try: - os.makedirs(dest_dir, exist_ok=True) - except FileExistsError: - raise SystemExit( - f"ERROR: Pyinstaller needs to create a directory at {dest_dir!r}, " - "but there already exists a file at that path!" - ) - # Copy extensions and binaries from cache. This ensures that these files undergo additional binary - # processing - have paths to linked libraries rewritten (relative to `@rpath`) and have rpath set to the - # top-level directory (relative to `@loader_path`, i.e., the file's location). The "top-level" directory - # in this case corresponds to `Contents/MacOS` (where `sys._MEIPASS` also points), so we need to pass - # the cache retrieval function the *original* destination path (which is without preceding - # `Contents/MacOS`). - if typecode in ('EXTENSION', 'BINARY'): - orig_dest_name = str(pathlib.PurePath(dest_name).relative_to(CONTENTS_FRAMEWORKS_PATH)) - src_name = process_collected_binary( - src_name, - orig_dest_name, - use_strip=self.strip, - use_upx=self.upx, - upx_exclude=self.upx_exclude, - target_arch=self.target_arch, - codesign_identity=self.codesign_identity, - entitlements_file=self.entitlements_file, - strict_arch_validation=(typecode == 'EXTENSION'), - ) - if typecode == 'SYMLINK': - os.symlink(src_name, dest_path) # Create link at dest_path, pointing at (relative) src_name - else: - # BUNDLE does not support MERGE-based multipackage - assert typecode != 'DEPENDENCY', "MERGE DEPENDENCY entries are not supported in BUNDLE!" - - # At this point, `src_name` should be a valid file. - if not os.path.isfile(src_name): - raise ValueError(f"Resource {src_name!r} is not a valid file!") - # If strict collection mode is enabled, the destination should not exist yet. - if strict_collect_mode and os.path.exists(dest_path): - raise ValueError( - f"Attempting to collect a duplicated file into BUNDLE: {dest_name} (type: {typecode})" - ) - # Use `shutil.copyfile` to copy file with default permissions. We do not attempt to preserve original - # permissions nor metadata, as they might be too restrictive and cause issues either during subsequent - # re-build attempts or when trying to move the application bundle. For binaries (and data files with - # executable bit set), we manually set the executable bits after copying the file. - shutil.copyfile(src_name, dest_path) - if ( - typecode in ('EXTENSION', 'BINARY', 'EXECUTABLE') - or (typecode == 'DATA' and os.access(src_name, os.X_OK)) - ): - os.chmod(dest_path, 0o755) - - # Sign the bundle - logger.info('Signing the BUNDLE...') - try: - osxutils.sign_binary(self.name, self.codesign_identity, self.entitlements_file, deep=True) - except Exception as e: - # Display a warning or re-raise the error, depending on the environment-variable setting. - if os.environ.get("PYINSTALLER_STRICT_BUNDLE_CODESIGN_ERROR", "0") == "0": - logger.warning("Error while signing the bundle: %s", e) - logger.warning("You will need to sign the bundle manually!") - else: - raise RuntimeError("Failed to codesign the bundle!") from e - - logger.info("Building BUNDLE %s completed successfully.", self.tocbasename) - - # Optionally verify bundle's signature. This is primarily intended for our CI. - if os.environ.get("PYINSTALLER_VERIFY_BUNDLE_SIGNATURE", "0") != "0": - logger.info("Verifying signature for BUNDLE %s...", self.name) - self.verify_bundle_signature(self.name) - logger.info("BUNDLE verification complete!") - - @staticmethod - def verify_bundle_signature(bundle_dir): - # First, verify the bundle signature using codesign. - cmd_args = ['/usr/bin/codesign', '--verify', '--all-architectures', '--deep', '--strict', bundle_dir] - p = subprocess.run(cmd_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding='utf8') - if p.returncode: - raise SystemError( - f"codesign command ({cmd_args}) failed with error code {p.returncode}!\noutput: {p.stdout}" - ) - - # Ensure that code-signing information is *NOT* embedded in the files' extended attributes. - # - # This happens when files other than binaries are present in `Contents/MacOS` or `Contents/Frameworks` - # directory; as the signature cannot be embedded within the file itself (contrary to binaries with - # `LC_CODE_SIGNATURE` section in their header), it ends up stores in the file's extended attributes. However, - # if such bundle is transferred using a method that does not support extended attributes (for example, a zip - # file), the signatures on these files are lost, and the signature of the bundle as a whole becomes invalid. - # This is the primary reason why we need to relocate non-binaries into `Contents/Resources` - the signatures - # for files in that directory end up stored in `Contents/_CodeSignature/CodeResources` file. - # - # This check therefore aims to ensure that all files have been properly relocated to their corresponding - # locations w.r.t. the code-signing requirements. - - try: - import xattr - except ModuleNotFoundError: - logger.info("xattr package not available; skipping verification of extended attributes!") - return - - CODESIGN_ATTRS = ( - "com.apple.cs.CodeDirectory", - "com.apple.cs.CodeRequirements", - "com.apple.cs.CodeRequirements-1", - "com.apple.cs.CodeSignature", - ) - - for entry in pathlib.Path(bundle_dir).rglob("*"): - if not entry.is_file(): - continue - - file_attrs = xattr.listxattr(entry) - if any([codesign_attr in file_attrs for codesign_attr in CODESIGN_ATTRS]): - raise ValueError(f"Code-sign attributes found in extended attributes of {str(entry)!r}!") diff --git a/venv/lib/python3.12/site-packages/PyInstaller/building/splash.py b/venv/lib/python3.12/site-packages/PyInstaller/building/splash.py deleted file mode 100755 index 3b7fe8c..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/building/splash.py +++ /dev/null @@ -1,486 +0,0 @@ -# ----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -# ----------------------------------------------------------------------------- -import io -import os -import re -import struct -import pathlib - -from PyInstaller import log as logging -from PyInstaller.archive.writers import SplashWriter -from PyInstaller.building import splash_templates -from PyInstaller.building.datastruct import Target -from PyInstaller.building.utils import _check_guts_eq, _check_guts_toc, misc -from PyInstaller.compat import is_aix, is_darwin -from PyInstaller.depend import bindepend - -logger = logging.getLogger(__name__) - - -class Splash(Target): - """ - Bundles the required resources for the splash screen into a file, which will be included in the CArchive. - - A Splash has two outputs, one is itself and one is stored in splash.binaries. Both need to be passed to other - build targets in order to enable the splash screen. - """ - def __init__(self, image_file, binaries, datas, **kwargs): - """ - :param str image_file: - A path-like object to the image to be used. Only the PNG file format is supported. - - .. note:: If a different file format is supplied and PIL (Pillow) is installed, the file will be converted - automatically. - - .. note:: *Windows*: The color ``'magenta'`` / ``'#ff00ff'`` must not be used in the image or text, as it is - used by splash screen to indicate transparent areas. Use a similar color (e.g., ``'#ff00fe'``) instead. - - .. note:: If PIL (Pillow) is installed and the image is bigger than max_img_size, the image will be resized - to fit into the specified area. - :param list binaries: - The TOC list of binaries the Analysis build target found. This TOC includes all extension modules and their - binary dependencies. This is required to determine whether the user's program uses `tkinter`. - :param list datas: - The TOC list of data the Analysis build target found. This TOC includes all data-file dependencies of the - modules. This is required to check if all splash screen requirements can be bundled. - - :keyword text_pos: - An optional two-integer tuple that represents the origin of the text on the splash screen image. The - origin of the text is its lower left corner. A unit in the respective coordinate system is a pixel of the - image, its origin lies in the top left corner of the image. This parameter also acts like a switch for - the text feature. If omitted, no text will be displayed on the splash screen. This text will be used to - show textual progress in onefile mode. - :type text_pos: Tuple[int, int] - :keyword text_size: - The desired size of the font. If the size argument is a positive number, it is interpreted as a size in - points. If size is a negative number, its absolute value is interpreted as a size in pixels. Default: ``12`` - :type text_size: int - :keyword text_font: - An optional name of a font for the text. This font must be installed on the user system, otherwise the - system default font is used. If this parameter is omitted, the default font is also used. - :keyword text_color: - An optional color for the text. HTML color codes (``'#40e0d0'``) and color names (``'turquoise'``) are - supported. Default: ``'black'`` - (Windows: the color ``'magenta'`` / ``'#ff00ff'`` is used to indicate transparency, and should not be used) - :type text_color: str - :keyword text_default: - The default text which will be displayed before the extraction starts. Default: ``"Initializing"`` - :type text_default: str - :keyword full_tk: - By default Splash bundles only the necessary files for the splash screen (some tk components). This - options enables adding full tk and making it a requirement, meaning all tk files will be unpacked before - the splash screen can be started. This is useful during development of the splash screen script. - Default: ``False`` - :type full_tk: bool - :keyword minify_script: - The splash screen is created by executing an Tcl/Tk script. This option enables minimizing the script, - meaning removing all non essential parts from the script. Default: ``True`` - :keyword name: - An optional alternative filename for the .res file. If not specified, a name is generated. - :type name: str - :keyword script_name: - An optional alternative filename for the Tcl script, that will be generated. If not specified, a name is - generated. - :type script_name: str - :keyword max_img_size: - Maximum size of the splash screen image as a tuple. If the supplied image exceeds this limit, it will be - resized to fit the maximum width (to keep the original aspect ratio). This option can be disabled by - setting it to None. Default: ``(760, 480)`` - :type max_img_size: Tuple[int, int] - :keyword always_on_top: - Force the splashscreen to be always on top of other windows. If disabled, other windows (e.g., from other - applications) can cover the splash screen by user bringing them to front. This might be useful for - frozen applications with long startup times. Default: ``True`` - :type always_on_top: bool - """ - from PyInstaller.config import CONF - from PyInstaller.utils.hooks.tcl_tk import tcltk_info - - Target.__init__(self) - - # Splash screen is not supported on macOS. It operates in a secondary thread and macOS disallows UI operations - # in any thread other than main. - if is_darwin: - raise SystemExit("ERROR: Splash screen is not supported on macOS.") - - # Ensure tkinter (and thus Tcl/Tk) is available. - if not tcltk_info.available: - raise SystemExit( - "ERROR: Your platform does not support the splash screen feature, since tkinter is not installed. " - "Please install tkinter and try again." - ) - - # Check if the Tcl/Tk version is supported. - logger.info("Verifying Tcl/Tk compatibility with splash screen requirements") - self._check_tcl_tk_compatibility(tcltk_info) - - # Make image path relative to .spec file - if not os.path.isabs(image_file): - image_file = os.path.join(CONF['specpath'], image_file) - image_file = os.path.normpath(image_file) - if not os.path.exists(image_file): - raise ValueError("Image file '%s' not found" % image_file) - - # Copy all arguments - self.image_file = image_file - self.full_tk = kwargs.get("full_tk", False) - self.name = kwargs.get("name", None) - self.script_name = kwargs.get("script_name", None) - self.minify_script = kwargs.get("minify_script", True) - self.max_img_size = kwargs.get("max_img_size", (760, 480)) - - # text options - self.text_pos = kwargs.get("text_pos", None) - self.text_size = kwargs.get("text_size", 12) - self.text_font = kwargs.get("text_font", "TkDefaultFont") - self.text_color = kwargs.get("text_color", "black") - self.text_default = kwargs.get("text_default", "Initializing") - - # always-on-top behavior - self.always_on_top = kwargs.get("always_on_top", True) - - # Save the generated file separately so that it is not necessary to generate the data again and again - root = os.path.splitext(self.tocfilename)[0] - if self.name is None: - self.name = root + '.res' - if self.script_name is None: - self.script_name = root + '_script.tcl' - - # Internal variables - # Store path to _tkinter extension module, so that guts check can detect if the path changed for some reason. - self._tkinter_file = tcltk_info.tkinter_extension_file - - # Calculated / analysed values - self.uses_tkinter = self._uses_tkinter(self._tkinter_file, binaries) - logger.debug("Program uses tkinter: %r", self.uses_tkinter) - self.script = self.generate_script() - self.tcl_lib = tcltk_info.tcl_shared_library # full path to shared library - self.tk_lib = tcltk_info.tk_shared_library - - assert self.tcl_lib is not None - assert self.tk_lib is not None - - logger.debug("Using Tcl shared library: %r", self.tcl_lib) - logger.debug("Using Tk shared library: %r", self.tk_lib) - - self.splash_requirements = set([ - # NOTE: the implicit assumption here is that Tcl and Tk shared library are collected into top-level - # application directory, which, at tme moment, is true in practically all cases. - os.path.basename(self.tcl_lib), - os.path.basename(self.tk_lib), - # The list of requirements below is based on the current implementation of splash screen script. If you want - # to extend the splash screen functionality and run into Tcl/Tk errors, chances are that additional Tk - # components need to be added here. - # - # NOTE: these paths use the *destination* layout for Tcl/Tk scripts, which uses unversioned tcl and tk - # directories (see `PyInstaller.utils.hooks.tcl_tk.collect_tcl_tk_files`). - os.path.join(tcltk_info.TCL_ROOTNAME, "init.tcl"), - # Core Tk - os.path.join(tcltk_info.TK_ROOTNAME, "license.terms"), - os.path.join(tcltk_info.TK_ROOTNAME, "text.tcl"), - os.path.join(tcltk_info.TK_ROOTNAME, "tk.tcl"), - # Used for customizable font - os.path.join(tcltk_info.TK_ROOTNAME, "ttk", "ttk.tcl"), - os.path.join(tcltk_info.TK_ROOTNAME, "ttk", "fonts.tcl"), - os.path.join(tcltk_info.TK_ROOTNAME, "ttk", "cursors.tcl"), - os.path.join(tcltk_info.TK_ROOTNAME, "ttk", "utils.tcl"), - ]) - - if tcltk_info.tk_version >= (9, 0): - self.splash_requirements.update([ - os.path.join(tcltk_info.TK_ROOTNAME, "scaling.tcl"), - os.path.join(tcltk_info.TK_ROOTNAME, "tclIndex"), # required for auto-load of scaling.tcl - ]) - - logger.info("Collect Tcl/Tk data files for the splash screen") - tcltk_tree = tcltk_info.data_files # 3-element tuple TOC - if self.full_tk: - # The user wants a full copy of Tk, so make all Tk files a requirement. - self.splash_requirements.update(entry[0] for entry in tcltk_tree) - - # Scan for binary dependencies of the Tcl/Tk shared libraries, and add them to `binaries` TOC list (which - # should really be called `dependencies` as it is not limited to binaries. But it is too late now, and - # existing spec files depend on this naming). We specify these binary dependencies (which include the - # Tcl and Tk shared libraries themselves) even if the user's program uses tkinter and they would be collected - # anyway; let the collection mechanism deal with potential duplicates. - tcltk_libs = [(os.path.basename(src_name), src_name, 'BINARY') for src_name in (self.tcl_lib, self.tk_lib)] - self.binaries = bindepend.binary_dependency_analysis(tcltk_libs) - - # Put all shared library dependencies in `splash_requirements`, so they are made available in onefile mode. - self.splash_requirements.update(entry[0] for entry in self.binaries) - - # If the user's program does not use tkinter, add resources from Tcl/Tk tree to the dependencies list. - # Do so only for the resources that are part of splash requirements. - if not self.uses_tkinter: - self.binaries.extend(entry for entry in tcltk_tree if entry[0] in self.splash_requirements) - - # Check if all requirements were found. - collected_files = set(entry[0] for entry in (binaries + datas + self.binaries)) - - def _filter_requirement(filename): - if filename not in collected_files: - # Item is not bundled, so warn the user about it. This actually may happen on some tkinter installations - # that are missing the license.terms file - as this file has no effect on operation of splash screen, - # suppress the warning for it. - if os.path.basename(filename) == 'license.terms': - return False - - logger.warning( - "The local Tcl/Tk installation is missing the file %s. The behavior of the splash screen is " - "therefore undefined and may be unsupported.", filename - ) - return False - return True - - # Remove all files which were not found. - self.splash_requirements = set(filter(_filter_requirement, self.splash_requirements)) - - logger.debug("Splash Requirements: %s", self.splash_requirements) - - # On AIX, the Tcl and Tk shared libraries might in fact be ar archives with shared object inside it, and need to - # be `dlopen`'ed with full name (for example, `libtcl.a(libtcl.so.8.6)` and `libtk.a(libtk.so.8.6)`. So if the - # library's suffix is .a, adjust the name accordingly, assuming fixed format for the shared object name. - # Adjust the names at the end of this method, because preceding steps use `self.tcl_lib` and `self.tk_lib` for - # filesystem-based operations and need the original filenames. - if is_aix: - _, ext = os.path.splitext(self.tcl_lib) - if ext == '.a': - tcl_major, tcl_minor = tcltk_info.tcl_version - self.tcl_lib += f"(libtcl.so.{tcl_major}.{tcl_minor})" - _, ext = os.path.splitext(self.tk_lib) - if ext == '.a': - tk_major, tk_minor = tcltk_info.tk_version - self.tk_lib += f"(libtk.so.{tk_major}.{tk_minor})" - - self.__postinit__() - - _GUTS = ( - # input parameters - ('image_file', _check_guts_eq), - ('name', _check_guts_eq), - ('script_name', _check_guts_eq), - ('text_pos', _check_guts_eq), - ('text_size', _check_guts_eq), - ('text_font', _check_guts_eq), - ('text_color', _check_guts_eq), - ('text_default', _check_guts_eq), - ('always_on_top', _check_guts_eq), - ('full_tk', _check_guts_eq), - ('minify_script', _check_guts_eq), - ('max_img_size', _check_guts_eq), - # calculated/analysed values - ('uses_tkinter', _check_guts_eq), - ('script', _check_guts_eq), - ('tcl_lib', _check_guts_eq), - ('tk_lib', _check_guts_eq), - ('splash_requirements', _check_guts_eq), - ('binaries', _check_guts_toc), - # internal value - # Check if the tkinter installation changed. This is theoretically possible if someone uses two different python - # installations of the same version. - ('_tkinter_file', _check_guts_eq), - ) - - def _check_guts(self, data, last_build): - if Target._check_guts(self, data, last_build): - return True - - # Check if the image has been modified. - if misc.mtime(self.image_file) > last_build: - logger.info("Building %s because file %s changed", self.tocbasename, self.image_file) - return True - - return False - - def assemble(self): - logger.info("Building Splash %s", self.name) - - # Check if PIL/pillow is available. - try: - from PIL import Image as PILImage - except ImportError: - PILImage = None - - # Required to pass tcltk_info.TK_ROOTNAME to SplashWriter - from PyInstaller.utils.hooks.tcl_tk import tcltk_info - - # Function to resize a given image to fit into the area defined by max_img_size. - def _resize_image(_image, _orig_size): - if PILImage: - _w, _h = _orig_size - _ratio_w = self.max_img_size[0] / _w - if _ratio_w < 1: - # Image width exceeds limit - _h = int(_h * _ratio_w) - _w = self.max_img_size[0] - - _ratio_h = self.max_img_size[1] / _h - if _ratio_h < 1: - # Image height exceeds limit - _w = int(_w * _ratio_h) - _h = self.max_img_size[1] - - # If a file is given it will be open - if isinstance(_image, PILImage.Image): - _img = _image - else: - _img = PILImage.open(_image) - _img_resized = _img.resize((_w, _h)) - - # Save image into a stream - _image_stream = io.BytesIO() - _img_resized.save(_image_stream, format='PNG') - _img.close() - _img_resized.close() - _image_data = _image_stream.getvalue() - logger.info("Resized image %s from dimensions %r to (%d, %d)", self.image_file, _orig_size, _w, _h) - return _image_data - else: - raise ValueError( - "The splash image dimensions (w: %d, h: %d) exceed max_img_size (w: %d, h:%d), but the image " - "cannot be resized due to missing PIL.Image! Either install the Pillow package, adjust the " - "max_img_size, or use an image of compatible dimensions." % - (_orig_size[0], _orig_size[1], self.max_img_size[0], self.max_img_size[1]) - ) - - # Open image file - image_file = open(self.image_file, 'rb') - - # Check header of the file to identify it - if image_file.read(8) == b'\x89PNG\r\n\x1a\n': - # self.image_file is a PNG file - image_file.seek(16) - img_size = (struct.unpack("!I", image_file.read(4))[0], struct.unpack("!I", image_file.read(4))[0]) - - if img_size > self.max_img_size: - # The image exceeds the maximum image size, so resize it - image = _resize_image(self.image_file, img_size) - else: - image = os.path.abspath(self.image_file) - elif PILImage: - # Pillow is installed, meaning the image can be converted automatically - img = PILImage.open(self.image_file, mode='r') - - if img.size > self.max_img_size: - image = _resize_image(img, img.size) - else: - image_data = io.BytesIO() - img.save(image_data, format='PNG') - img.close() - image = image_data.getvalue() - logger.info("Converted image %s to PNG format", self.image_file) - else: - raise ValueError( - "The image %s needs to be converted to a PNG file, but PIL.Image is not available! Either install the " - "Pillow package, or use a PNG image for you splash screen." % (self.image_file,) - ) - - image_file.close() - - SplashWriter( - self.name, - self.splash_requirements, - os.path.basename(self.tcl_lib), # tcl86t.dll - os.path.basename(self.tk_lib), # tk86t.dll - tcltk_info.TCL_ROOTNAME, - tcltk_info.TK_ROOTNAME, - image, - self.script - ) - - @staticmethod - def _check_tcl_tk_compatibility(tcltk_info): - tcl_version = tcltk_info.tcl_version # (major, minor) tuple - tk_version = tcltk_info.tk_version - - if is_darwin and tcltk_info.is_macos_system_framework: - # Outdated Tcl/Tk 8.5 system framework is not supported. - raise SystemExit( - "ERROR: The splash screen feature does not support macOS system framework version of Tcl/Tk." - ) - - # Test if tcl/tk version is supported - if tcl_version < (8, 6) or tk_version < (8, 6): - logger.warning( - "The installed Tcl/Tk (%d.%d / %d.%d) version might not work with the splash screen feature of the " - "bootloader, which was tested against Tcl/Tk 8.6", *tcl_version, *tk_version - ) - - # This should be impossible, since tcl/tk is released together with the same version number, but just in case - if tcl_version != tk_version: - logger.warning( - "The installed version of Tcl (%d.%d) and Tk (%d.%d) do not match. PyInstaller is tested against " - "matching versions", *tcl_version, *tk_version - ) - - # Ensure that Tcl is built with multi-threading support. - if not tcltk_info.tcl_threaded: - # This is a feature breaking problem, so exit. - raise SystemExit( - "ERROR: The installed Tcl version is not threaded. PyInstaller only supports the splash screen " - "using threaded Tcl." - ) - - # Ensure that Tcl and Tk shared libraries are available - if tcltk_info.tcl_shared_library is None or tcltk_info.tk_shared_library is None: - message = \ - "ERROR: Could not determine the path to Tcl and/or Tk shared library, " \ - "which are required for splash screen." - if not tcltk_info.tkinter_extension_file: - message += ( - " The _tkinter module appears to be a built-in, which likely means that python was built with " - "statically-linked Tcl/Tk libraries and is incompatible with splash screen." - ) - raise SystemExit(message) - - def generate_script(self): - """ - Generate the script for the splash screen. - - If minify_script is True, all unnecessary parts will be removed. - """ - d = {} - if self.text_pos is not None: - logger.debug("Add text support to splash screen") - d.update({ - 'pad_x': self.text_pos[0], - 'pad_y': self.text_pos[1], - 'color': self.text_color, - 'font': self.text_font, - 'font_size': self.text_size, - 'default_text': self.text_default, - }) - script = splash_templates.build_script(text_options=d, always_on_top=self.always_on_top) - - if self.minify_script: - # Remove any documentation, empty lines and unnecessary spaces - script = '\n'.join( - line for line in map(lambda line: line.strip(), script.splitlines()) - if not line.startswith('#') # documentation - and line # empty lines - ) - # Remove unnecessary spaces - script = re.sub(' +', ' ', script) - - # Write script to disk, so that it is transparent to the user what script is executed. - with open(self.script_name, "w", encoding="utf-8") as script_file: - script_file.write(script) - return script - - @staticmethod - def _uses_tkinter(tkinter_file, binaries): - # Test for _tkinter extension instead of tkinter module, because user might use a different wrapping library for - # Tk. Use `pathlib.PurePath` in comparisons to account for case normalization and separator normalization. - tkinter_file = pathlib.PurePath(tkinter_file) - for dest_name, src_name, typecode in binaries: - if pathlib.PurePath(src_name) == tkinter_file: - return True - return False diff --git a/venv/lib/python3.12/site-packages/PyInstaller/building/splash_templates.py b/venv/lib/python3.12/site-packages/PyInstaller/building/splash_templates.py deleted file mode 100755 index afa068e..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/building/splash_templates.py +++ /dev/null @@ -1,229 +0,0 @@ -# ----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -# ----------------------------------------------------------------------------- -""" -Templates for the splash screen tcl script. -""" -from PyInstaller.compat import is_cygwin, is_darwin, is_win - -ipc_script = r""" -proc _ipc_server {channel clientaddr clientport} { - # This function is called if a new client connects to - # the server. This creates a channel, which calls - # _ipc_caller if data was send through the connection - set client_name [format <%s:%d> $clientaddr $clientport] - - chan configure $channel \ - -buffering none \ - -encoding utf-8 \ - -eofchar \x04 \ - -translation cr - chan event $channel readable [list _ipc_caller $channel $client_name] -} - -proc _ipc_caller {channel client_name} { - # This function is called if a command was sent through - # the tcp connection. The current implementation supports - # two commands: update_text and exit, although exit - # is implemented to be called if the connection gets - # closed (from python) or the character 0x04 was received - chan gets $channel cmd - - if {[chan eof $channel]} { - # This is entered if either the connection was closed - # or the char 0x04 was send - chan close $channel - exit - - } elseif {![chan blocked $channel]} { - # RPC methods - - # update_text command - if {[string match "update_text*" $cmd]} { - global status_text - set first [expr {[string first "(" $cmd] + 1}] - set last [expr {[string last ")" $cmd] - 1}] - - set status_text [string range $cmd $first $last] - } - # Implement other procedures here - } -} - -# By setting the port to 0 the os will assign a free port -set server_socket [socket -server _ipc_server -myaddr localhost 0] -set server_port [fconfigure $server_socket -sockname] - -# This environment variable is shared between the python and the tcl -# interpreter and publishes the port the tcp server socket is available -set env(_PYI_SPLASH_IPC) [lindex $server_port 2] -""" - -image_script = r""" -# The variable $_image_data, which holds the data for the splash -# image is created by the bootloader. -image create photo splash_image -splash_image put $_image_data -# delete the variable, because the image now holds the data -unset _image_data - -proc canvas_text_update {canvas tag _var - -} { - # This function is rigged to be called if the a variable - # status_text gets changed. This updates the text on - # the canvas - upvar $_var var - $canvas itemconfigure $tag -text $var -} -""" - -splash_canvas_setup = r""" -package require Tk - -set image_width [image width splash_image] -set image_height [image height splash_image] -set display_width [winfo screenwidth .] -set display_height [winfo screenheight .] - -set x_position [expr {int(0.5*($display_width - $image_width))}] -set y_position [expr {int(0.5*($display_height - $image_height))}] - -# Toplevel frame in which all widgets should be positioned -frame .root - -# Configure the canvas on which the splash -# screen will be drawn -canvas .root.canvas \ - -width $image_width \ - -height $image_height \ - -borderwidth 0 \ - -highlightthickness 0 - -# Draw the image into the canvas, filling it. -.root.canvas create image \ - [expr {$image_width / 2}] \ - [expr {$image_height / 2}] \ - -image splash_image -""" - -splash_canvas_text = r""" -# Create a text on the canvas, which tracks the local -# variable status_text. status_text is changed via C to -# update the progress on the splash screen. -# We cannot use the default label, because it has a -# default background, which cannot be turned transparent -.root.canvas create text \ - %(pad_x)d \ - %(pad_y)d \ - -fill %(color)s \ - -justify center \ - -font myFont \ - -tag vartext \ - -anchor sw -trace add variable status_text write \ - [list canvas_text_update .root.canvas vartext] -set status_text "%(default_text)s" -""" - -splash_canvas_default_font = r""" -font create myFont {*}[font actual TkDefaultFont] -font configure myFont -size %(font_size)d -""" - -splash_canvas_custom_font = r""" -font create myFont -family %(font)s -size %(font_size)d -""" - -if is_win or is_cygwin: - transparent_setup = r""" -# If the image is transparent, the background will be filled -# with magenta. The magenta background is later replaced with transparency. -# Here is the limitation of this implementation, that only -# sharp transparent image corners are possible -wm attributes . -transparentcolor magenta -.root.canvas configure -background magenta -""" - -elif is_darwin: - # This is untested, but should work following: https://stackoverflow.com/a/44296157/5869139 - transparent_setup = r""" -wm attributes . -transparent 1 -. configure -background systemTransparent -.root.canvas configure -background systemTransparent -""" - -else: - # For Linux there is no common way to create a transparent window - transparent_setup = r"" - -pack_widgets = r""" -# Position all widgets in the window -pack .root -grid .root.canvas -column 0 -row 0 -columnspan 1 -rowspan 2 -""" - -# Enable always-on-top behavior, by setting overrideredirect and the topmost attribute. -position_window_on_top = r""" -# Set position and mode of the window - always-on-top behavior -wm overrideredirect . 1 -wm geometry . +${x_position}+${y_position} -wm attributes . -topmost 1 -""" - -# Disable always-on-top behavior -if is_win or is_cygwin or is_darwin: - # On Windows, we disable the always-on-top behavior while still setting overrideredirect - # (to disable window decorations), but set topmost attribute to 0. - position_window = r""" -# Set position and mode of the window -wm overrideredirect . 1 -wm geometry . +${x_position}+${y_position} -wm attributes . -topmost 0 -""" -else: - # On Linux, we must not use overrideredirect; instead, we set X11-specific type attribute to splash, - # which lets the window manager to properly handle the splash screen (without window decorations - # but allowing other windows to be brought to front). - position_window = r""" -# Set position and mode of the window -wm geometry . +${x_position}+${y_position} -wm attributes . -type splash -""" - -raise_window = r""" -raise . -""" - - -def build_script(text_options=None, always_on_top=False): - """ - This function builds the tcl script for the splash screen. - """ - # Order is important! - script = [ - ipc_script, - image_script, - splash_canvas_setup, - ] - - if text_options: - # If the default font is used we need a different syntax - if text_options['font'] == "TkDefaultFont": - script.append(splash_canvas_default_font % text_options) - else: - script.append(splash_canvas_custom_font % text_options) - script.append(splash_canvas_text % text_options) - - script.append(transparent_setup) - - script.append(pack_widgets) - script.append(position_window_on_top if always_on_top else position_window) - script.append(raise_window) - - return '\n'.join(script) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/building/templates.py b/venv/lib/python3.12/site-packages/PyInstaller/building/templates.py deleted file mode 100755 index 24e5080..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/building/templates.py +++ /dev/null @@ -1,126 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Templates to generate .spec files. -""" - -onefiletmplt = """# -*- mode: python ; coding: utf-8 -*- -%(preamble)s - -a = Analysis( - %(scripts)s, - pathex=%(pathex)s, - binaries=%(binaries)s, - datas=%(datas)s, - hiddenimports=%(hiddenimports)s, - hookspath=%(hookspath)r, - hooksconfig={}, - runtime_hooks=%(runtime_hooks)r, - excludes=%(excludes)s, - noarchive=%(noarchive)s, - optimize=%(optimize)r, -) -pyz = PYZ(a.pure) -%(splash_init)s -exe = EXE( - pyz, - a.scripts, - a.binaries, - a.datas,%(splash_target)s%(splash_binaries)s - %(options)s, - name='%(name)s', - debug=%(debug_bootloader)s, - bootloader_ignore_signals=%(bootloader_ignore_signals)s, - strip=%(strip)s, - upx=%(upx)s, - upx_exclude=%(upx_exclude)s, - runtime_tmpdir=%(runtime_tmpdir)r, - console=%(console)s, - disable_windowed_traceback=%(disable_windowed_traceback)s, - argv_emulation=%(argv_emulation)r, - target_arch=%(target_arch)r, - codesign_identity=%(codesign_identity)r, - entitlements_file=%(entitlements_file)r,%(exe_options)s -) -""" - -onedirtmplt = """# -*- mode: python ; coding: utf-8 -*- -%(preamble)s - -a = Analysis( - %(scripts)s, - pathex=%(pathex)s, - binaries=%(binaries)s, - datas=%(datas)s, - hiddenimports=%(hiddenimports)s, - hookspath=%(hookspath)r, - hooksconfig={}, - runtime_hooks=%(runtime_hooks)r, - excludes=%(excludes)s, - noarchive=%(noarchive)s, - optimize=%(optimize)r, -) -pyz = PYZ(a.pure) -%(splash_init)s -exe = EXE( - pyz, - a.scripts,%(splash_target)s - %(options)s, - exclude_binaries=True, - name='%(name)s', - debug=%(debug_bootloader)s, - bootloader_ignore_signals=%(bootloader_ignore_signals)s, - strip=%(strip)s, - upx=%(upx)s, - console=%(console)s, - disable_windowed_traceback=%(disable_windowed_traceback)s, - argv_emulation=%(argv_emulation)r, - target_arch=%(target_arch)r, - codesign_identity=%(codesign_identity)r, - entitlements_file=%(entitlements_file)r,%(exe_options)s -) -coll = COLLECT( - exe, - a.binaries, - a.datas,%(splash_binaries)s - strip=%(strip)s, - upx=%(upx)s, - upx_exclude=%(upx_exclude)s, - name='%(name)s', -) -""" - -bundleexetmplt = """app = BUNDLE( - exe, - name='%(name)s.app', - icon=%(icon)s, - bundle_identifier=%(bundle_identifier)s, -) -""" - -bundletmplt = """app = BUNDLE( - coll, - name='%(name)s.app', - icon=%(icon)s, - bundle_identifier=%(bundle_identifier)s, -) -""" - -splashtmpl = """splash = Splash( - %(splash_image)r, - binaries=a.binaries, - datas=a.datas, - text_pos=None, - text_size=12, - minify_script=True, - always_on_top=True, -) -""" diff --git a/venv/lib/python3.12/site-packages/PyInstaller/building/utils.py b/venv/lib/python3.12/site-packages/PyInstaller/building/utils.py deleted file mode 100755 index da195f2..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/building/utils.py +++ /dev/null @@ -1,846 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -import fnmatch -import glob -import hashlib -import io -import marshal -import os -import pathlib -import platform -import shutil -import struct -import subprocess -import sys -import types -import zipfile - -from PyInstaller import compat -from PyInstaller import log as logging -from PyInstaller.compat import is_aix, is_darwin, is_win, is_linux -from PyInstaller.exceptions import InvalidSrcDestTupleError -from PyInstaller.utils import misc - -if is_win: - from PyInstaller.utils.win32 import versioninfo - -if is_darwin: - import PyInstaller.utils.osx as osxutils - -logger = logging.getLogger(__name__) - -# -- Helpers for checking guts. -# -# NOTE: by _GUTS it is meant intermediate files and data structures that PyInstaller creates for bundling files and -# creating final executable. - - -def _check_guts_eq(attr_name, old_value, new_value, last_build): - """ - Rebuild is required if values differ. - """ - if old_value != new_value: - logger.info("Building because %s changed", attr_name) - return True - return False - - -def _check_guts_toc_mtime(attr_name, old_toc, new_toc, last_build): - """ - Rebuild is required if mtimes of files listed in old TOC are newer than last_build. - - Use this for calculated/analysed values read from cache. - """ - for dest_name, src_name, typecode in old_toc: - if misc.mtime(src_name) > last_build: - logger.info("Building because %s changed", src_name) - return True - return False - - -def _check_guts_toc(attr_name, old_toc, new_toc, last_build): - """ - Rebuild is required if either TOC content changed or mtimes of files listed in old TOC are newer than last_build. - - Use this for input parameters. - """ - return _check_guts_eq(attr_name, old_toc, new_toc, last_build) or \ - _check_guts_toc_mtime(attr_name, old_toc, new_toc, last_build) - - -def destination_name_for_extension(module_name, src_name, typecode): - """ - Take a TOC entry (dest_name, src_name, typecode) and determine the full destination name for the extension. - """ - - assert typecode == 'EXTENSION' - - # The `module_name` should be the extension's importable module name, such as `psutil._psutil_linux` or - # `numpy._core._multiarray_umath`. Reconstruct the directory structure from parent package name(s), if any. - dest_elements = module_name.split('.') - - # We have the base name of the extension file (the last element in the module name), but we do not know the - # full extension suffix. We can take that from source name; for simplicity, replace the whole base name part. - src_path = pathlib.Path(src_name) - dest_elements[-1] = src_path.name - - # Extensions that originate from python's python3.x/lib-dynload directory should be diverted into - # python3.x/lib-dynload destination directory instead of being collected into top-level application directory. - # See #5604 for original motivation (using just lib-dynload), and #9204 for extension (using python3.x/lib-dynload). - if src_path.parent.name == 'lib-dynload': - python_dir = f'python{sys.version_info.major}.{sys.version_info.minor}' - if src_path.parent.parent.name == python_dir: - dest_elements = [python_dir, 'lib-dynload', *dest_elements] - - return os.path.join(*dest_elements) - - -def process_collected_binary( - src_name, - dest_name, - use_strip=False, - use_upx=False, - upx_exclude=None, - target_arch=None, - codesign_identity=None, - entitlements_file=None, - strict_arch_validation=False -): - """ - Process the collected binary using strip or UPX (or both), and apply any platform-specific processing. On macOS, - this rewrites the library paths in the headers, and (re-)signs the binary. On-disk cache is used to avoid processing - the same binary with same options over and over. - - In addition to given arguments, this function also uses CONF['cachedir'] and CONF['upx_dir']. - """ - from PyInstaller.config import CONF - - # We need to use cache in the following scenarios: - # * extra binary processing due to use of `strip` or `upx` - # * building on macOS, where we need to rewrite library paths in binaries' headers and (re-)sign the binaries. - if not use_strip and not use_upx and not is_darwin: - return src_name - - # Match against provided UPX exclude patterns. - upx_exclude = upx_exclude or [] - if use_upx: - src_path = pathlib.PurePath(src_name) - for upx_exclude_entry in upx_exclude: - # pathlib.PurePath.match() matches from right to left, and supports * wildcard, but does not support the - # "**" syntax for directory recursion. Case sensitivity follows the OS default. - if src_path.match(upx_exclude_entry): - logger.info("Disabling UPX for %s due to match in exclude pattern: %s", src_name, upx_exclude_entry) - use_upx = False - break - - # Additional automatic disablement rules for UPX and strip. - - # On Windows, avoid using UPX with binaries that have control flow guard (CFG) enabled. - if use_upx and is_win and versioninfo.pefile_check_control_flow_guard(src_name): - logger.info('Disabling UPX for %s due to CFG!', src_name) - use_upx = False - - # Avoid using UPX with Qt plugins, as it strips the data required by the Qt plugin loader. - if use_upx and misc.is_file_qt_plugin(src_name): - logger.info('Disabling UPX for %s due to it being a Qt plugin!', src_name) - use_upx = False - - # On linux, if a binary has an accompanying HMAC or CHK file, avoid modifying it in any way. - if (use_upx or use_strip) and is_linux: - src_path = pathlib.Path(src_name) - hmac_path = src_path.with_name(f".{src_path.name}.hmac") - chk_path = src_path.with_suffix(".chk") - if hmac_path.is_file(): - logger.info('Disabling UPX and/or strip for %s due to accompanying .hmac file!', src_name) - use_upx = use_strip = False - elif chk_path.is_file(): - logger.info('Disabling UPX and/or strip for %s due to accompanying .chk file!', src_name) - use_upx = use_strip = False - del src_path, hmac_path, chk_path - - # Exit early if no processing is required after above rules are applied. - if not use_strip and not use_upx and not is_darwin: - return src_name - - # Prepare cache directory path. Cache is tied to python major/minor version, but also to various processing options. - pyver = f'py{sys.version_info[0]}{sys.version_info[1]}' - arch = platform.architecture()[0] - cache_dir = os.path.join( - CONF['cachedir'], - f'bincache{use_strip:d}{use_upx:d}{pyver}{arch}', - ) - if target_arch: - cache_dir = os.path.join(cache_dir, target_arch) - if is_darwin: - # Separate by codesign identity - if codesign_identity: - # Compute hex digest of codesign identity string to prevent issues with invalid characters. - csi_hash = hashlib.sha256(codesign_identity.encode('utf-8')) - cache_dir = os.path.join(cache_dir, csi_hash.hexdigest()) - else: - cache_dir = os.path.join(cache_dir, 'adhoc') # ad-hoc signing - # Separate by entitlements - if entitlements_file: - # Compute hex digest of entitlements file contents - with open(entitlements_file, 'rb') as fp: - ef_hash = hashlib.sha256(fp.read()) - cache_dir = os.path.join(cache_dir, ef_hash.hexdigest()) - else: - cache_dir = os.path.join(cache_dir, 'no-entitlements') - os.makedirs(cache_dir, exist_ok=True) - - # Load cache index, if available - cache_index_file = os.path.join(cache_dir, "index.dat") - try: - cache_index = misc.load_py_data_struct(cache_index_file) - except FileNotFoundError: - cache_index = {} - except Exception: - # Tell the user they may want to fix their cache... However, do not delete it for them; if it keeps getting - # corrupted, we will never find out. - logger.warning("PyInstaller bincache may be corrupted; use pyinstaller --clean to fix it.") - raise - - # Look up the file in cache; use case-normalized destination name as identifier. - cached_id = os.path.normcase(dest_name) - cached_name = os.path.join(cache_dir, dest_name) - src_digest = _compute_file_digest(src_name) - - if cached_id in cache_index: - # If digest matches to the cached digest, return the cached file... - if src_digest == cache_index[cached_id]: - return cached_name - - # ... otherwise remove it. - os.remove(cached_name) - - # Ensure parent path exists - os.makedirs(os.path.dirname(cached_name), exist_ok=True) - - # Use `shutil.copyfile` to copy the file with default permissions bits, then manually set executable - # bits. This way, we avoid copying permission bits and metadata from the original file, which might be too - # restrictive for further processing (read-only permissions, immutable flag on FreeBSD, and so on). - shutil.copyfile(src_name, cached_name) - os.chmod(cached_name, 0o755) - - # Apply strip - if use_strip: - strip_options = [] - if is_darwin: - # The default strip behavior breaks some shared libraries under macOS. - strip_options = ["-S"] # -S = strip only debug symbols. - elif is_aix: - # Set -X32_64 flag to have strip transparently process both 32-bit and 64-bit binaries, without user having - # to set OBJECT_MODE environment variable prior to the build. Also accommodates potential mixed-case - # scenario, for example a 32-bit utility program being collected into a 64-bit application bundle. - strip_options = ["-X32_64"] - - cmd = ["strip", *strip_options, cached_name] - logger.info("Executing: %s", " ".join(cmd)) - try: - p = subprocess.run( - cmd, - stdin=subprocess.DEVNULL, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - check=True, - errors='ignore', - encoding='utf-8', - ) - logger.debug("Output from strip command:\n%s", p.stdout) - except subprocess.CalledProcessError as e: - show_warning = True - - # On AIX, strip utility raises an error when ran against already-stripped binary. Catch the corresponding - # message (`0654-419 The specified archive file was already stripped.`) and suppress the warning. - if is_aix and "0654-419" in e.stdout: - show_warning = False - - if show_warning: - logger.warning("Failed to run strip on %r!", cached_name, exc_info=True) - logger.warning("Output from strip command:\n%s", e.stdout) - except Exception: - logger.warning("Failed to run strip on %r!", cached_name, exc_info=True) - - # Apply UPX - if use_upx: - upx_exe = 'upx' - upx_dir = CONF['upx_dir'] - if upx_dir: - upx_exe = os.path.join(upx_dir, upx_exe) - - upx_options = [ - # Do not compress icons, so that they can still be accessed externally. - '--compress-icons=0', - # Use LZMA compression. - '--lzma', - # Quiet mode. - '-q', - ] - if is_win: - # Binaries built with Visual Studio 7.1 require --strip-loadconf or they will not compress. - upx_options.append('--strip-loadconf') - - cmd = [upx_exe, *upx_options, cached_name] - logger.info("Executing: %s", " ".join(cmd)) - try: - p = subprocess.run( - cmd, - stdin=subprocess.DEVNULL, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - check=True, - errors='ignore', - encoding='utf-8', - ) - logger.debug("Output from upx command:\n%s", p.stdout) - except subprocess.CalledProcessError as e: - logger.warning("Failed to upx strip on %r!", cached_name, exc_info=True) - logger.warning("Output from upx command:\n%s", e.stdout) - except Exception: - logger.warning("Failed to run upx on %r!", cached_name, exc_info=True) - - # On macOS, we need to modify the given binary's paths to the dependent libraries, in order to ensure they are - # relocatable and always refer to location within the frozen application. Specifically, we make all dependent - # library paths relative to @rpath, and set @rpath to point to the top-level application directory, relative to - # the binary's location (i.e., @loader_path). - # - # While modifying the headers invalidates existing signatures, we avoid removing them in order to speed things up - # (and to avoid potential bugs in the codesign utility, like the one reported on macOS 10.13 in #6167). - # The forced re-signing at the end should take care of the invalidated signatures. - if is_darwin: - try: - osxutils.binary_to_target_arch(cached_name, target_arch, display_name=src_name) - #osxutils.remove_signature_from_binary(cached_name) # Disabled as per comment above. - target_rpath = str( - pathlib.PurePath('@loader_path', *['..' for level in pathlib.PurePath(dest_name).parent.parts]) - ) - osxutils.set_dylib_dependency_paths(cached_name, target_rpath) - osxutils.sign_binary(cached_name, codesign_identity, entitlements_file) - except osxutils.InvalidBinaryError: - # Raised by osxutils.binary_to_target_arch when the given file is not a valid macOS binary (for example, - # a linux .so file; see issue #6327). The error prevents any further processing, so just ignore it. - pass - except osxutils.IncompatibleBinaryArchError: - # Raised by osxutils.binary_to_target_arch when the given file does not contain (all) required arch slices. - # Depending on the strict validation mode, re-raise or swallow the error. - # - # Strict validation should be enabled only for binaries where the architecture *must* match the target one, - # i.e., the extension modules. Everything else is pretty much a gray area, for example: - # * a universal2 extension may have its x86_64 and arm64 slices linked against distinct single-arch/thin - # shared libraries - # * a collected executable that is launched by python code via a subprocess can be x86_64-only, even though - # the actual python code is running on M1 in native arm64 mode. - if strict_arch_validation: - raise - logger.debug("File %s failed optional architecture validation - collecting as-is!", src_name) - except Exception as e: - raise SystemError(f"Failed to process binary {cached_name!r}!") from e - - # Update cache index - cache_index[cached_id] = src_digest - misc.save_py_data_struct(cache_index_file, cache_index) - - return cached_name - - -def _compute_file_digest(filename): - hasher = hashlib.sha1() - with open(filename, "rb") as fp: - for chunk in iter(lambda: fp.read(16 * 1024), b""): - hasher.update(chunk) - return bytearray(hasher.digest()) - - -def _check_path_overlap(path): - """ - Check that path does not overlap with WORKPATH or SPECPATH (i.e., WORKPATH and SPECPATH may not start with path, - which could be caused by a faulty hand-edited specfile). - - Raise SystemExit if there is overlap, return True otherwise - """ - from PyInstaller.config import CONF - specerr = 0 - if CONF['workpath'].startswith(path): - logger.error('Specfile error: The output path "%s" contains WORKPATH (%s)', path, CONF['workpath']) - specerr += 1 - if CONF['specpath'].startswith(path): - logger.error('Specfile error: The output path "%s" contains SPECPATH (%s)', path, CONF['specpath']) - specerr += 1 - if specerr: - raise SystemExit( - 'ERROR: Please edit/recreate the specfile (%s) and set a different output name (e.g. "dist").' % - CONF['spec'] - ) - return True - - -def _make_clean_directory(path): - """ - Create a clean directory from the given directory name. - """ - if _check_path_overlap(path): - if os.path.isdir(path) or os.path.isfile(path): - try: - os.remove(path) - except OSError: - _rmtree(path) - - os.makedirs(path, exist_ok=True) - - -def _rmtree(path): - """ - Remove directory and all its contents, but only after user confirmation, or if the -y option is set. - """ - from PyInstaller.config import CONF - if CONF['noconfirm']: - choice = 'y' - elif sys.stdout.isatty(): - choice = input( - 'WARNING: The output directory "%s" and ALL ITS CONTENTS will be REMOVED! Continue? (y/N)' % path - ) - else: - raise SystemExit( - 'ERROR: The output directory "%s" is not empty. Please remove all its contents or use the -y option (remove' - ' output directory without confirmation).' % path - ) - if choice.strip().lower() == 'y': - if not CONF['noconfirm']: - print("On your own risk, you can use the option `--noconfirm` to get rid of this question.") - logger.info('Removing dir %s', path) - shutil.rmtree(path) - else: - raise SystemExit('User aborted') - - -# TODO Refactor to prohibit empty target directories. As the docstring below documents, this function currently permits -# the second item of each 2-tuple in "hook.datas" to be the empty string, in which case the target directory defaults to -# the source directory's basename. However, this functionality is very fragile and hence bad. Instead: -# -# * An exception should be raised if such item is empty. -# * All hooks currently passing the empty string for such item (e.g., -# "hooks/hook-babel.py", "hooks/hook-matplotlib.py") should be refactored -# to instead pass such basename. -def format_binaries_and_datas(binaries_or_datas, workingdir=None): - """ - Convert the passed list of hook-style 2-tuples into a returned set of `TOC`-style 2-tuples. - - Elements of the passed list are 2-tuples `(source_dir_or_glob, target_dir)`. - Elements of the returned set are 2-tuples `(target_file, source_file)`. - For backwards compatibility, the order of elements in the former tuples are the reverse of the order of elements in - the latter tuples! - - Parameters - ---------- - binaries_or_datas : list - List of hook-style 2-tuples (e.g., the top-level `binaries` and `datas` attributes defined by hooks) whose: - * The first element is either: - * A glob matching only the absolute or relative paths of source non-Python data files. - * The absolute or relative path of a source directory containing only source non-Python data files. - * The second element is the relative path of the target directory into which these source files will be - recursively copied. - - If the optional `workingdir` parameter is passed, source paths may be either absolute or relative; else, source - paths _must_ be absolute. - workingdir : str - Optional absolute path of the directory to which all relative source paths in the `binaries_or_datas` - parameter will be prepended by (and hence converted into absolute paths) _or_ `None` if these paths are to be - preserved as relative. Defaults to `None`. - - Returns - ---------- - set - Set of `TOC`-style 2-tuples whose: - * First element is the absolute or relative path of a target file. - * Second element is the absolute or relative path of the corresponding source file to be copied to this target - file. - """ - toc_datas = set() - - for src_root_path_or_glob, trg_root_dir in binaries_or_datas: - # Disallow empty source path. Those are typically result of errors, and result in implicit collection of the - # whole current working directory, which is never a good idea. - if not src_root_path_or_glob: - raise InvalidSrcDestTupleError( - (src_root_path_or_glob, trg_root_dir), - "Empty SRC is not allowed when adding binary and data files, as it would result in collection of the " - "whole current working directory." - ) - if not trg_root_dir: - raise InvalidSrcDestTupleError( - (src_root_path_or_glob, trg_root_dir), - "Empty DEST_DIR is not allowed - to collect files into application's top-level directory, use " - f"{os.curdir!r}." - ) - # Disallow absolute target paths, as well as target paths that would end up pointing outside of the - # application's top-level directory. - if os.path.isabs(trg_root_dir): - raise InvalidSrcDestTupleError((src_root_path_or_glob, trg_root_dir), "DEST_DIR must be a relative path!") - if os.path.normpath(trg_root_dir).startswith('..'): - raise InvalidSrcDestTupleError( - (src_root_path_or_glob, trg_root_dir), - "DEST_DIR must not point outside of application's top-level directory!", - ) - - # Convert relative to absolute paths if required. - if workingdir and not os.path.isabs(src_root_path_or_glob): - src_root_path_or_glob = os.path.join(workingdir, src_root_path_or_glob) - - # Normalize paths. - src_root_path_or_glob = os.path.normpath(src_root_path_or_glob) - - # If given source path is a file or directory path, pass it on. - # If not, treat it as a glob and pass on all matching paths. However, we need to preserve the directories - # captured by the glob - as opposed to collecting their contents into top-level target directory. Therefore, - # we set a flag which is used in subsequent processing to distinguish between original directory paths and - # directory paths that were captured by the glob. - if os.path.isfile(src_root_path_or_glob) or os.path.isdir(src_root_path_or_glob): - src_root_paths = [src_root_path_or_glob] - was_glob = False - else: - src_root_paths = glob.glob(src_root_path_or_glob) - was_glob = True - - if not src_root_paths: - raise SystemExit(f'ERROR: Unable to find {src_root_path_or_glob!r} when adding binary and data files.') - - for src_root_path in src_root_paths: - if os.path.isfile(src_root_path): - # Normalizing the result to remove redundant relative paths (e.g., removing "./" from "trg/./file"). - toc_datas.add(( - os.path.normpath(os.path.join(trg_root_dir, os.path.basename(src_root_path))), - os.path.normpath(src_root_path), - )) - elif os.path.isdir(src_root_path): - for src_dir, src_subdir_basenames, src_file_basenames in os.walk(src_root_path): - # Ensure the current source directory is a subdirectory of the passed top-level source directory. - # Since os.walk() does *NOT* follow symlinks by default, this should be the case. (But let's make - # sure.) - assert src_dir.startswith(src_root_path) - - # Relative path of the current target directory, obtained by: - # - # * Stripping the top-level source directory from the current source directory (e.g., removing - # "/top" from "/top/dir"). - # * Normalizing the result to remove redundant relative paths (e.g., removing "./" from - # "trg/./file"). - if was_glob: - # Preserve directories captured by glob. - rel_dir = os.path.relpath(src_dir, os.path.dirname(src_root_path)) - else: - rel_dir = os.path.relpath(src_dir, src_root_path) - trg_dir = os.path.normpath(os.path.join(trg_root_dir, rel_dir)) - - for src_file_basename in src_file_basenames: - src_file = os.path.join(src_dir, src_file_basename) - if os.path.isfile(src_file): - # Normalize the result to remove redundant relative paths (e.g., removing "./" from - # "trg/./file"). - toc_datas.add(( - os.path.normpath(os.path.join(trg_dir, src_file_basename)), os.path.normpath(src_file) - )) - - return toc_datas - - -def get_code_object(modname, filename, optimize): - """ - Get the code-object for a module. - - This is a simplifed non-performant version which circumvents __pycache__. - """ - - # Once upon a time, we compiled dummy code objects for PEP-420 namespace packages. We do not do that anymore. - assert filename not in {'-', None}, "Called with PEP-420 namespace package!" - - _, ext = os.path.splitext(filename) - ext = ext.lower() - - if ext == '.pyc': - # The module is available in binary-only form. Read the contents of .pyc file using helper function, which - # supports reading from either stand-alone or archive-embedded .pyc files. - logger.debug('Reading code object from .pyc file %s', filename) - pyc_data = _read_pyc_data(filename) - code_object = marshal.loads(pyc_data[16:]) - else: - # Assume this is a source .py file, but allow an arbitrary extension (other than .pyc, which is taken in - # the above branch). This allows entry-point scripts to have an arbitrary (or no) extension, as tested by - # the `test_arbitrary_ext` in `test_basic.py`. - logger.debug('Compiling python script/module file %s', filename) - - with open(filename, 'rb') as f: - source = f.read() - - # If entry-point script has no suffix, append .py when compiling the source. In POSIX builds, the executable - # has no suffix either; this causes issues with `traceback` module, as it tries to read the executable file - # when trying to look up the code for the entry-point script (when current working directory contains the - # executable). - _, ext = os.path.splitext(filename) - if not ext: - logger.debug("Appending .py to compiled entry-point name...") - filename += '.py' - - try: - code_object = compile(source, filename, 'exec', optimize=optimize) - except SyntaxError: - logger.warning("Sytnax error while compiling %s", filename) - raise - - return code_object - - -def replace_filename_in_code_object(code_object, filename): - """ - Recursively replace the `co_filename` in the given code object and code objects stored in its `co_consts` entries. - Primarily used to anonymize collected code objects, i.e., by removing the build environment's paths from them. - """ - - consts = tuple( - replace_filename_in_code_object(const_co, filename) if isinstance(const_co, types.CodeType) else const_co - for const_co in code_object.co_consts - ) - - return code_object.replace(co_consts=consts, co_filename=filename) - - -def _should_include_system_binary(binary_tuple, exceptions): - """ - Return True if the given binary_tuple describes a system binary that should be included. - - Exclude all system library binaries other than those with "lib-dynload" in the destination or "python" in the - source, except for those matching the patterns in the exceptions list. Intended to be used from the Analysis - exclude_system_libraries method. - """ - dest = binary_tuple[0] - if dest.startswith(f'python{sys.version_info.major}.{sys.version_info.minor}/lib-dynload'): - return True - src = binary_tuple[1] - if fnmatch.fnmatch(src, '*python*'): - return True - if not src.startswith('/lib') and not src.startswith('/usr/lib'): - return True - for exception in exceptions: - if fnmatch.fnmatch(dest, exception): - return True - return False - - -def compile_pymodule(name, src_path, workpath, optimize, code_cache=None): - """ - Given the name and source file for a pure-python module, compile the module in the specified working directory, - and return the name of resulting .pyc file. The paths in the resulting .pyc module are anonymized by having their - absolute prefix removed. - - If a .pyc file with matching name already exists in the target working directory, it is re-used (provided it has - compatible bytecode magic in the header, and that its modification time is newer than that of the source file). - - If the specified module is available in binary-only form, the input .pyc file is copied to the target working - directory and post-processed. If the specified module is available in source form, it is compiled only if - corresponding code object is not available in the optional code-object cache; otherwise, it is copied from cache - and post-processed. When compiling the module, the specified byte-code optimization level is used. - - It is up to caller to ensure that the optional code-object cache contains only code-objects of target optimization - level, and that if the specified working directory already contains .pyc files, that they were created with target - optimization level. - """ - - # Construct the target .pyc filename in the workpath - split_name = name.split(".") - if "__init__" in src_path: - # __init__ module; use "__init__" as module name, and construct parent path using all components of the - # fully-qualified name - parent_dirs = split_name - mod_basename = "__init__" - else: - # Regular module; use last component of the fully-qualified name as module name, and the rest as the parent - # path. - parent_dirs = split_name[:-1] - mod_basename = split_name[-1] - pyc_path = os.path.join(workpath, *parent_dirs, mod_basename + '.pyc') - - # Check if optional cache contains module entry - code_object = code_cache.get(name, None) if code_cache else None - - if code_object is None: - _, ext = os.path.splitext(src_path) - ext = ext.lower() - - if ext == '.py': - # Source py file; read source and compile it. - with open(src_path, 'rb') as f: - src_data = f.read() - code_object = compile(src_data, src_path, 'exec', optimize=optimize) - elif ext == '.pyc': - # The module is available in binary-only form. Read the contents of .pyc file using helper function, which - # supports reading from either stand-alone or archive-embedded .pyc files. - pyc_data = _read_pyc_data(src_path) - # Unmarshal code object; this is necessary if we want to strip paths from it - code_object = marshal.loads(pyc_data[16:]) - else: - raise ValueError(f"Invalid python module file {src_path}; unhandled extension {ext}!") - - # Replace co_filename in code object with anonymized filename that does not contain full path. Construct the - # relative filename from module name, similar how we earlier constructed the `pyc_path`. - co_filename = os.path.join(*parent_dirs, mod_basename + '.py') - code_object = replace_filename_in_code_object(code_object, co_filename) - - # Write complete .pyc module to in-memory stream. Then, check if .pyc file already exists, compare contents, and - # (re)write it only if different. This avoids unnecessary (re)writing of the file, and in turn also avoids - # unnecessary cache invalidation for targets that make use of the .pyc file (e.g., PKG, COLLECT). - with io.BytesIO() as pyc_stream: - pyc_stream.write(compat.BYTECODE_MAGIC) - pyc_stream.write(struct.pack('= 3.10 stdlib, or equivalent importlib-metadata >= 4.6. -if _setup_py_mode: - importlib_metadata = None -else: - if sys.version_info >= (3, 10): - import importlib.metadata as importlib_metadata - else: - try: - import importlib_metadata - except ImportError as e: - from PyInstaller.exceptions import ImportlibMetadataError - raise ImportlibMetadataError() from e - - import packaging.version # For importlib_metadata version check - - # Validate the version - if packaging.version.parse(importlib_metadata.version("importlib-metadata")) < packaging.version.parse("4.6"): - from PyInstaller.exceptions import ImportlibMetadataError - raise ImportlibMetadataError() - -# Strict collect mode, which raises error when trying to collect duplicate files into PKG/CArchive or COLLECT. -strict_collect_mode = os.environ.get("PYINSTALLER_STRICT_COLLECT_MODE", "0") != "0" - -# Copied from https://docs.python.org/3/library/platform.html#cross-platform. -is_64bits: bool = sys.maxsize > 2**32 - -# Distinguish specific code for various Python versions. Variables 'is_pyXY' mean that Python X.Y and up is supported. -# Keep even unsupported versions here to keep 3rd-party hooks working. -is_py35 = sys.version_info >= (3, 5) -is_py36 = sys.version_info >= (3, 6) -is_py37 = sys.version_info >= (3, 7) -is_py38 = sys.version_info >= (3, 8) -is_py39 = sys.version_info >= (3, 9) -is_py310 = sys.version_info >= (3, 10) -is_py311 = sys.version_info >= (3, 11) -is_py312 = sys.version_info >= (3, 12) -is_py313 = sys.version_info >= (3, 13) -is_py314 = sys.version_info >= (3, 14) - -is_win = sys.platform.startswith('win') -is_win_10 = is_win and (platform.win32_ver()[0] == '10') -is_win_11 = is_win and (platform.win32_ver()[0] == '11') -is_win_wine = False # Running under Wine; determined later on. -is_cygwin = sys.platform == 'cygwin' -is_darwin = sys.platform == 'darwin' # macOS - -# Unix platforms -is_linux = sys.platform.startswith('linux') -is_solar = sys.platform.startswith('sun') # Solaris -is_aix = sys.platform.startswith('aix') -is_freebsd = sys.platform.startswith('freebsd') -is_openbsd = sys.platform.startswith('openbsd') -is_hpux = sys.platform.startswith('hp-ux') - -# Some code parts are similar to several unix platforms (e.g. Linux, Solaris, AIX). -# macOS is not considered as unix since there are many platform-specific details for Mac in PyInstaller. -is_unix = is_linux or is_solar or is_aix or is_freebsd or is_hpux or is_openbsd - -# Linux distributions such as Alpine or OpenWRT use musl as their libc implementation and resultantly need specially -# compiled bootloaders. On musl systems, ldd with no arguments prints 'musl' and its version. -is_musl = is_linux and "musl" in subprocess.run(["ldd"], capture_output=True, encoding="utf-8").stderr - -# Termux - terminal emulator and Linux environment app for Android. -is_termux = is_linux and hasattr(sys, 'getandroidapilevel') - -# macOS version -_macos_ver = tuple(int(x) for x in platform.mac_ver()[0].split('.')) if is_darwin else None - -# macOS 11 (Big Sur): if python is not compiled with Big Sur support, it ends up in compatibility mode by default, which -# is indicated by platform.mac_ver() returning '10.16'. The lack of proper Big Sur support breaks find_library() -# function from ctypes.util module, as starting with Big Sur, shared libraries are not visible on disk anymore. Support -# for the new library search mechanism was added in python 3.9 when compiled with Big Sur support. In such cases, -# platform.mac_ver() reports version as '11.x'. The behavior can be further modified via SYSTEM_VERSION_COMPAT -# environment variable; which allows explicitly enabling or disabling the compatibility mode. However, note that -# disabling the compatibility mode and using python that does not properly support Big Sur still leaves find_library() -# broken (which is a scenario that we ignore at the moment). -# The same logic applies to macOS 12 (Monterey). -is_macos_11_compat = bool(_macos_ver) and _macos_ver[0:2] == (10, 16) # Big Sur or newer in compat mode -is_macos_11_native = bool(_macos_ver) and _macos_ver[0:2] >= (11, 0) # Big Sur or newer in native mode -is_macos_11 = is_macos_11_compat or is_macos_11_native # Big Sur or newer - -# Check if python >= 3.13 was built with Py_GIL_DISABLED / free-threading (PEP703). -# -# This affects the shared library name, which has the "t" ABI suffix, as per: -# https://github.com/python/steering-council/issues/221#issuecomment-1841593283 -# -# It also affects the layout of PyConfig structure used by bootloader; consequently we need to inform bootloader what -# kind of build it is dealing with (only in python 3.13; with 3.14 and later, we use PEP741 configuration API in the -# bootloader, and do not need to know the layout of PyConfig structure anymore) -is_nogil = bool(sysconfig.get_config_var('Py_GIL_DISABLED')) - -# In a virtual environment created by virtualenv (github.com/pypa/virtualenv) there exists sys.real_prefix with the path -# to the base Python installation from which the virtual environment was created. This is true regardless of the version -# of Python used to execute the virtualenv command. -# -# In a virtual environment created by the venv module available in the Python standard lib, there exists sys.base_prefix -# with the path to the base implementation. This does not exist in a virtual environment created by virtualenv. -# -# The following code creates compat.is_venv and is.virtualenv that are True when running a virtual environment, and also -# compat.base_prefix with the path to the base Python installation. - -base_prefix: str = os.path.abspath(getattr(sys, 'real_prefix', getattr(sys, 'base_prefix', sys.prefix))) -# Ensure `base_prefix` is not containing any relative parts. -is_venv = is_virtualenv = base_prefix != os.path.abspath(sys.prefix) - -# Conda environments sometimes have different paths or apply patches to packages that can affect how a hook or package -# should access resources. Method for determining conda taken from https://stackoverflow.com/questions/47610844#47610844 -is_conda = os.path.isdir(os.path.join(base_prefix, 'conda-meta')) - -# Similar to ``is_conda`` but is ``False`` using another ``venv``-like manager on top. In this case, no packages -# encountered will be conda packages meaning that the default non-conda behaviour is generally desired from PyInstaller. -is_pure_conda = os.path.isdir(os.path.join(sys.prefix, 'conda-meta')) - -# Full path to python interpreter. -python_executable = getattr(sys, '_base_executable', sys.executable) - -# Is this Python from Microsoft App Store (Windows only)? Python from Microsoft App Store has executable pointing at -# empty shims. -is_ms_app_store = is_win and os.path.getsize(python_executable) == 0 - -if is_ms_app_store: - # Locate the actual executable inside base_prefix. - python_executable = os.path.join(base_prefix, os.path.basename(python_executable)) - if not os.path.exists(python_executable): - raise SystemExit( - 'ERROR: PyInstaller cannot locate real python executable belonging to Python from Microsoft App Store!' - ) - -# Bytecode magic value -BYTECODE_MAGIC = importlib.util.MAGIC_NUMBER - -# List of suffixes for Python C extension modules. -EXTENSION_SUFFIXES = importlib.machinery.EXTENSION_SUFFIXES -ALL_SUFFIXES = importlib.machinery.all_suffixes() - -# On Windows we require pywin32-ctypes. -# -> all pyinstaller modules should use win32api from PyInstaller.compat to -# ensure that it can work on MSYS2 (which requires pywin32-ctypes) -if is_win: - if _setup_py_mode: - pywintypes = None - win32api = None - else: - try: - # Hide the `cffi` package from win32-ctypes by temporarily blocking its import. This ensures that `ctypes` - # backend is always used, even if `cffi` is available. The `cffi` backend uses `pycparser`, which is - # incompatible with -OO mode (2nd optimization level) due to its removal of docstrings. - # See https://github.com/pyinstaller/pyinstaller/issues/6345 - # On the off chance that `cffi` has already been imported, store the `sys.modules` entry so we can restore - # it after importing `pywin32-ctypes` modules. - orig_cffi = sys.modules.get('cffi') - sys.modules['cffi'] = None - - from win32ctypes.pywin32 import pywintypes # noqa: F401, E402 - from win32ctypes.pywin32 import win32api # noqa: F401, E402 - except ImportError as e: - raise SystemExit( - 'ERROR: Could not import `pywintypes` or `win32api` from `win32ctypes.pywin32`.\n' - 'Please make sure that `pywin32-ctypes` is installed and importable, for example:\n\n' - 'pip install pywin32-ctypes\n' - ) from e - finally: - # Unblock `cffi`. - if orig_cffi is not None: - sys.modules['cffi'] = orig_cffi - else: - del sys.modules['cffi'] - del orig_cffi - -# macOS's platform.architecture() can be buggy, so we do this manually here. Based off the python documentation: -# https://docs.python.org/3/library/platform.html#platform.architecture -if is_darwin: - architecture = '64bit' if sys.maxsize > 2**32 else '32bit' -else: - architecture = platform.architecture()[0] - -# Cygwin needs special handling, because platform.system() contains identifiers such as MSYS_NT-10.0-19042 and -# CYGWIN_NT-10.0-19042 that do not fit PyInstaller's OS naming scheme. Explicitly set `system` to 'Cygwin'. -system = 'Cygwin' if is_cygwin else platform.system() - -# Machine suffix for bootloader. -if is_win: - # On Windows ARM64 using an x64 Python environment, platform.machine() returns ARM64 but - # we really want the bootloader that matches the Python environment instead of the OS. - machine = _pyi_machine(os.environ.get("PROCESSOR_ARCHITECTURE", platform.machine()), platform.system()) -else: - machine = _pyi_machine(platform.machine(), platform.system()) - - -# Wine detection and support -def is_wine_dll(filename: str | os.PathLike): - """ - Check if the given PE file is a Wine DLL (PE-converted built-in, or fake/placeholder one). - - Returns True if the given file is a Wine DLL, False if not (or if file cannot be analyzed or does not exist). - """ - _WINE_SIGNATURES = ( - b'Wine builtin DLL', # PE-converted Wine DLL - b'Wine placeholder DLL', # Fake/placeholder Wine DLL - ) - _MAX_LEN = max([len(sig) for sig in _WINE_SIGNATURES]) - - # Wine places their DLL signature in the padding area between the IMAGE_DOS_HEADER and IMAGE_NT_HEADERS. So we need - # to compare the bytes that come right after IMAGE_DOS_HEADER, i.e., after initial 64 bytes. We can read the file - # directly and avoid using the pefile library to avoid performance penalty associated with full header parsing. - try: - with open(filename, 'rb') as fp: - fp.seek(64) - signature = fp.read(_MAX_LEN) - return signature.startswith(_WINE_SIGNATURES) - except Exception: - pass - return False - - -if is_win: - try: - import ctypes.util # noqa: E402 - is_win_wine = is_wine_dll(ctypes.util.find_library('kernel32')) - except Exception: - pass - -# Set and get environment variables does not handle unicode strings correctly on Windows. - -# Acting on os.environ instead of using getenv()/setenv()/unsetenv(), as suggested in -# : "Calling putenv() directly does not change os.environ, so it is -# better to modify os.environ." (Same for unsetenv.) - - -def getenv(name: str, default: str | None = None): - """ - Returns unicode string containing value of environment variable 'name'. - """ - return os.environ.get(name, default) - - -def setenv(name: str, value: str): - """ - Accepts unicode string and set it as environment variable 'name' containing value 'value'. - """ - os.environ[name] = value - - -def unsetenv(name: str): - """ - Delete the environment variable 'name'. - """ - # Some platforms (e.g., AIX) do not support `os.unsetenv()` and thus `del os.environ[name]` has no effect on the - # real environment. For this case, we set the value to the empty string. - os.environ[name] = "" - del os.environ[name] - - -# Exec commands in subprocesses. - - -def exec_command( - *cmdargs: str, encoding: str | None = None, raise_enoent: bool | None = None, **kwargs: int | bool | list | None -): - """ - Run the command specified by the passed positional arguments, optionally configured by the passed keyword arguments. - - .. DANGER:: - **Ignore this function's return value** -- unless this command's standard output contains _only_ pathnames, in - which case this function returns the correct filesystem-encoded string expected by PyInstaller. In all other - cases, this function's return value is _not_ safely usable. - - For backward compatibility, this function's return value non-portably depends on the current Python version and - passed keyword arguments: - - * Under Python 3.x, this value is a **decoded `str` string**. However, even this value is _not_ necessarily - safely usable: - * If the `encoding` parameter is passed, this value is guaranteed to be safely usable. - * Else, this value _cannot_ be safely used for any purpose (e.g., string manipulation or parsing), except to be - passed directly to another non-Python command. Why? Because this value has been decoded with the encoding - specified by `sys.getfilesystemencoding()`, the encoding used by `os.fsencode()` and `os.fsdecode()` to - convert from platform-agnostic to platform-specific pathnames. This is _not_ necessarily the encoding with - which this command's standard output was encoded. Cue edge-case decoding exceptions. - - Parameters - ---------- - cmdargs : - Variadic list whose: - 1. Mandatory first element is the absolute path, relative path, or basename in the current `${PATH}` of the - command to run. - 2. Optional remaining elements are arguments to pass to this command. - encoding : str, optional - Optional keyword argument specifying the encoding with which to decode this command's standard output under - Python 3. As this function's return value should be ignored, this argument should _never_ be passed. - raise_enoent : boolean, optional - Optional keyword argument to simply raise the exception if the executing the command fails since to the command - is not found. This is useful to checking id a command exists. - - All remaining keyword arguments are passed as is to the `subprocess.Popen()` constructor. - - Returns - ---------- - str - Ignore this value. See discussion above. - """ - - proc = subprocess.Popen(cmdargs, stdout=subprocess.PIPE, **kwargs) - try: - out = proc.communicate(timeout=60)[0] - except OSError as e: - if raise_enoent and e.errno == errno.ENOENT: - raise - print('--' * 20, file=sys.stderr) - print("Error running '%s':" % " ".join(cmdargs), file=sys.stderr) - print(e, file=sys.stderr) - print('--' * 20, file=sys.stderr) - raise ExecCommandFailed("ERROR: Executing command failed!") from e - except subprocess.TimeoutExpired: - proc.kill() - raise - - # stdout/stderr are returned as a byte array NOT as string, so we need to convert that to proper encoding. - try: - if encoding: - out = out.decode(encoding) - else: - # If no encoding is given, assume we are reading filenames from stdout only because it is the common case. - out = os.fsdecode(out) - except UnicodeDecodeError as e: - # The sub-process used a different encoding; provide more information to ease debugging. - print('--' * 20, file=sys.stderr) - print(str(e), file=sys.stderr) - print('These are the bytes around the offending byte:', file=sys.stderr) - print('--' * 20, file=sys.stderr) - raise - return out - - -def exec_command_rc(*cmdargs: str, **kwargs: float | bool | list | None): - """ - Return the exit code of the command specified by the passed positional arguments, optionally configured by the - passed keyword arguments. - - Parameters - ---------- - cmdargs : list - Variadic list whose: - 1. Mandatory first element is the absolute path, relative path, or basename in the current `${PATH}` of the - command to run. - 2. Optional remaining elements are arguments to pass to this command. - - All keyword arguments are passed as is to the `subprocess.call()` function. - - Returns - ---------- - int - This command's exit code as an unsigned byte in the range `[0, 255]`, where 0 signifies success and all other - values signal a failure. - """ - - # 'encoding' keyword is not supported for 'subprocess.call'; remove it from kwargs. - if 'encoding' in kwargs: - kwargs.pop('encoding') - return subprocess.call(cmdargs, **kwargs) - - -def exec_command_all(*cmdargs: str, encoding: str | None = None, **kwargs: int | bool | list | None): - """ - Run the command specified by the passed positional arguments, optionally configured by the passed keyword arguments. - - .. DANGER:: - **Ignore this function's return value.** If this command's standard output consists solely of pathnames, consider - calling `exec_command()` - - Parameters - ---------- - cmdargs : str - Variadic list whose: - 1. Mandatory first element is the absolute path, relative path, or basename in the current `${PATH}` of the - command to run. - 2. Optional remaining elements are arguments to pass to this command. - encoding : str, optional - Optional keyword argument specifying the encoding with which to decode this command's standard output. As this - function's return value should be ignored, this argument should _never_ be passed. - - All remaining keyword arguments are passed as is to the `subprocess.Popen()` constructor. - - Returns - ---------- - (int, str, str) - Ignore this 3-element tuple `(exit_code, stdout, stderr)`. See the `exec_command()` function for discussion. - """ - proc = subprocess.Popen( - cmdargs, - bufsize=-1, # Default OS buffer size. - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - **kwargs - ) - # Waits for subprocess to complete. - try: - out, err = proc.communicate(timeout=60) - except subprocess.TimeoutExpired: - proc.kill() - raise - # stdout/stderr are returned as a byte array NOT as string. Thus we need to convert that to proper encoding. - try: - if encoding: - out = out.decode(encoding) - err = err.decode(encoding) - else: - # If no encoding is given, assume we're reading filenames from stdout only because it's the common case. - out = os.fsdecode(out) - err = os.fsdecode(err) - except UnicodeDecodeError as e: - # The sub-process used a different encoding, provide more information to ease debugging. - print('--' * 20, file=sys.stderr) - print(str(e), file=sys.stderr) - print('These are the bytes around the offending byte:', file=sys.stderr) - print('--' * 20, file=sys.stderr) - raise - - return proc.returncode, out, err - - -def __wrap_python(args, kwargs): - cmdargs = [sys.executable] - - # macOS supports universal binaries (binary for multiple architectures. We need to ensure that subprocess - # binaries are running for the same architecture as python executable. It is necessary to run binaries with 'arch' - # command. - if is_darwin: - if architecture == '64bit': - if platform.machine() == 'arm64': - py_prefix = ['arch', '-arm64'] # Apple M1 - else: - py_prefix = ['arch', '-x86_64'] # Intel - elif architecture == '32bit': - py_prefix = ['arch', '-i386'] - else: - py_prefix = [] - # Since macOS 10.11, the environment variable DYLD_LIBRARY_PATH is no more inherited by child processes, so we - # proactively propagate the current value using the `-e` option of the `arch` command. - if 'DYLD_LIBRARY_PATH' in os.environ: - path = os.environ['DYLD_LIBRARY_PATH'] - py_prefix += ['-e', 'DYLD_LIBRARY_PATH=%s' % path] - cmdargs = py_prefix + cmdargs - - if not __debug__: - cmdargs.append('-O') - - cmdargs.extend(args) - - env = kwargs.get('env') - if env is None: - env = dict(**os.environ) - - # Ensure python 3 subprocess writes 'str' as utf-8 - env['PYTHONIOENCODING'] = 'UTF-8' - # ... and ensure we read output as utf-8 - kwargs['encoding'] = 'UTF-8' - - return cmdargs, kwargs - - -def exec_python(*args: str, **kwargs: str | None): - """ - Wrap running python script in a subprocess. - - Return stdout of the invoked command. - """ - cmdargs, kwargs = __wrap_python(args, kwargs) - return exec_command(*cmdargs, **kwargs) - - -def exec_python_rc(*args: str, **kwargs: str | None): - """ - Wrap running python script in a subprocess. - - Return exit code of the invoked command. - """ - cmdargs, kwargs = __wrap_python(args, kwargs) - return exec_command_rc(*cmdargs, **kwargs) - - -# Path handling. - - -# Site-packages functions - use native function if available. -def getsitepackages(prefixes: list | None = None): - """ - Returns a list containing all global site-packages directories. - - For each directory present in ``prefixes`` (or the global ``PREFIXES``), this function finds its `site-packages` - subdirectory depending on the system environment, and returns a list of full paths. - """ - # This implementation was copied from the ``site`` module, python 3.7.3. - sitepackages = [] - seen = set() - - if prefixes is None: - prefixes = [sys.prefix, sys.exec_prefix] - - for prefix in prefixes: - if not prefix or prefix in seen: - continue - seen.add(prefix) - - if os.sep == '/': - sitepackages.append(os.path.join(prefix, "lib", "python%d.%d" % sys.version_info[:2], "site-packages")) - else: - sitepackages.append(prefix) - sitepackages.append(os.path.join(prefix, "lib", "site-packages")) - return sitepackages - - -# Backported for virtualenv. Module 'site' in virtualenv might not have this attribute. -getsitepackages = getattr(site, 'getsitepackages', getsitepackages) - - -# Wrapper to load a module from a Python source file. This function loads import hooks when processing them. -def importlib_load_source(name: str, pathname: str): - # Import module from a file. - mod_loader = importlib.machinery.SourceFileLoader(name, pathname) - mod = types.ModuleType(mod_loader.name) - mod.__file__ = mod_loader.get_filename() # Some hooks require __file__ attribute in their namespace - mod_loader.exec_module(mod) - return mod - - -# Patterns of module names that should be bundled into the base_library.zip to be available during bootstrap. -# These modules include direct or indirect dependencies of encodings.* modules. The encodings modules must be -# recursively included to set the I/O encoding during python startup. Similarly, this list should include -# modules used by PyInstaller's bootstrap scripts and modules (loader/pyi*.py) - -PY3_BASE_MODULES = { - '_collections_abc', - '_weakrefset', - 'abc', - 'codecs', - 'collections', - 'copyreg', - 'encodings', - 'enum', - 'functools', - 'genericpath', # dependency of os.path - 'io', - 'heapq', - 'keyword', - 'linecache', - 'locale', - 'ntpath', # dependency of os.path - 'operator', - 'os', - 'posixpath', # dependency of os.path - 're', - 'reprlib', - 'sre_compile', - 'sre_constants', - 'sre_parse', - 'stat', # dependency of os.path - 'traceback', # for startup errors - 'types', - 'weakref', - 'warnings', -} - -if not is_py310: - PY3_BASE_MODULES.add('_bootlocale') - -# Object types of Pure Python modules in modulegraph dependency graph. -# Pure Python modules have code object (attribute co_code). -PURE_PYTHON_MODULE_TYPES = { - 'SourceModule', - 'CompiledModule', - 'Package', - 'NamespacePackage', - # Deprecated. - # TODO Could these module types be removed? - 'FlatPackage', - 'ArchiveModule', -} -# Object types of special Python modules (built-in, run-time, namespace package) in modulegraph dependency graph that do -# not have code object. -SPECIAL_MODULE_TYPES = { - # Omit AliasNode from here (and consequently from VALID_MODULE_TYPES), in order to prevent PyiModuleGraph from - # running standard hooks for aliased modules. - #'AliasNode', - 'BuiltinModule', - 'RuntimeModule', - 'RuntimePackage', - - # PyInstaller handles scripts differently and not as standard Python modules. - 'Script', -} -# Object types of Binary Python modules (extensions, etc) in modulegraph dependency graph. -BINARY_MODULE_TYPES = { - 'Extension', - 'ExtensionPackage', -} -# Object types of valid Python modules in modulegraph dependency graph. -VALID_MODULE_TYPES = PURE_PYTHON_MODULE_TYPES | SPECIAL_MODULE_TYPES | BINARY_MODULE_TYPES -# Object types of bad/missing/invalid Python modules in modulegraph dependency graph. -# TODO: should be 'Invalid' module types also in the 'MISSING' set? -BAD_MODULE_TYPES = { - 'BadModule', - 'ExcludedModule', - 'InvalidSourceModule', - 'InvalidCompiledModule', - 'MissingModule', - - # Runtime modules and packages are technically valid rather than bad, but exist only in-memory rather than on-disk - # (typically due to pre_safe_import_module() hooks), and hence cannot be physically frozen. For simplicity, these - # nodes are categorized as bad rather than valid. - 'RuntimeModule', - 'RuntimePackage', -} -ALL_MODULE_TYPES = VALID_MODULE_TYPES | BAD_MODULE_TYPES -# TODO: review this mapping to TOC, remove useless entries. -# Dictionary to map ModuleGraph node types to TOC typecodes. -MODULE_TYPES_TO_TOC_DICT = { - # Pure modules. - 'AliasNode': 'PYMODULE', - 'Script': 'PYSOURCE', - 'SourceModule': 'PYMODULE', - 'CompiledModule': 'PYMODULE', - 'Package': 'PYMODULE', - 'FlatPackage': 'PYMODULE', - 'ArchiveModule': 'PYMODULE', - # Binary modules. - 'Extension': 'EXTENSION', - 'ExtensionPackage': 'EXTENSION', - # Special valid modules. - 'BuiltinModule': 'BUILTIN', - 'NamespacePackage': 'PYMODULE', - # Bad modules. - 'BadModule': 'bad', - 'ExcludedModule': 'excluded', - 'InvalidSourceModule': 'invalid', - 'InvalidCompiledModule': 'invalid', - 'MissingModule': 'missing', - 'RuntimeModule': 'runtime', - 'RuntimePackage': 'runtime', - # Other. - 'does not occur': 'BINARY', -} - - -def check_requirements(): - """ - Verify that all requirements to run PyInstaller are met. - - Fail hard if any requirement is not met. - """ - # Fail hard if Python does not have minimum required version - if sys.version_info < (3, 8): - raise EnvironmentError('PyInstaller requires Python 3.8 or newer.') - - if sys.implementation.name != "cpython": - raise SystemExit(f"ERROR: PyInstaller does not support {sys.implementation.name}. Only CPython is supported.") - - if getattr(sys, "frozen", False): - raise SystemExit("ERROR: PyInstaller can not be ran on itself") - - # There are some old packages which used to be backports of libraries which are now part of the standard library. - # These backports are now unmaintained and contain only an older subset of features leading to obscure errors like - # "enum has not attribute IntFlag" if installed. - from importlib.metadata import distribution, PackageNotFoundError - - for name in ["enum34", "typing", "pathlib"]: - try: - dist = distribution(name) - except PackageNotFoundError: - continue - remove = "conda remove" if is_conda else f'"{sys.executable}" -m pip uninstall {name}' - raise SystemExit( - f"ERROR: The '{name}' package is an obsolete backport of a standard library package and is incompatible " - f"with PyInstaller. Please remove this package (located in {dist.locate_file('')}) using\n {remove}\n" - "then try again." - ) - - # Bail out if binutils is not installed. - if is_linux and shutil.which("objdump") is None: - raise SystemExit( - "ERROR: On Linux, objdump is required. It is typically provided by the 'binutils' package " - "installable via your Linux distribution's package manager." - ) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/config.py b/venv/lib/python3.12/site-packages/PyInstaller/config.py deleted file mode 100755 index e6cb695..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/config.py +++ /dev/null @@ -1,56 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -This module holds run-time PyInstaller configuration. - -Variable CONF is a dict() with all configuration options that are necessary for the build phase. Build phase is done by -passing .spec file to exec() function. CONF variable is the only way how to pass arguments to exec() and how to avoid -using 'global' variables. - -NOTE: Having 'global' variables does not play well with the test suite because it does not provide isolated environments -for tests. Some tests might fail in this case. - -NOTE: The 'CONF' dict() is cleaned after building phase to not interfere with any other possible test. - -To pass any arguments to build phase, just do: - - from PyInstaller.config import CONF - CONF['my_var_name'] = my_value - -And to use this variable in the build phase: - - from PyInstaller.config import CONF - foo = CONF['my_var_name'] - - -This is the list of known variables. (Please update it if necessary.) - -cachedir -hiddenimports -noconfirm -pathex -ui_admin -ui_access -upx_available -upx_dir -workpath - -tests_modgraph - cached PyiModuleGraph object to speed up tests - -code_cache - dictionary associating `Analysis.pure` list instances with code cache dictionaries. Used by PYZ writer. -""" - -# NOTE: Do not import other PyInstaller modules here. Just define constants here. - -CONF = { - # Unit tests require this key to exist. - 'pathex': [], -} diff --git a/venv/lib/python3.12/site-packages/PyInstaller/configure.py b/venv/lib/python3.12/site-packages/PyInstaller/configure.py deleted file mode 100755 index 46234b8..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/configure.py +++ /dev/null @@ -1,107 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Configure PyInstaller for the current Python installation. -""" - -import os -import subprocess - -from PyInstaller import compat -from PyInstaller import log as logging - -logger = logging.getLogger(__name__) - - -def _check_upx_availability(upx_dir): - logger.debug('Testing UPX availability ...') - - upx_exe = "upx" - if upx_dir: - upx_exe = os.path.normpath(os.path.join(upx_dir, upx_exe)) - - # Check if we can call `upx -V`. - try: - output = subprocess.check_output( - [upx_exe, '-V'], - stdin=subprocess.DEVNULL, - stderr=subprocess.DEVNULL, - encoding='utf-8', - ) - except Exception: - logger.debug('UPX is not available.') - return False - - # Read the first line to display version string - try: - version_string = output.splitlines()[0] - except IndexError: - version_string = 'version string unavailable' - - logger.debug('UPX is available: %s', version_string) - return True - - -def _get_pyinstaller_cache_dir(): - old_cache_dir = None - if compat.getenv('PYINSTALLER_CONFIG_DIR'): - cache_dir = compat.getenv('PYINSTALLER_CONFIG_DIR') - elif compat.is_win: - cache_dir = compat.getenv('LOCALAPPDATA') - if not cache_dir: - cache_dir = os.path.expanduser('~\\Application Data') - elif compat.is_darwin: - cache_dir = os.path.expanduser('~/Library/Application Support') - else: - # According to XDG specification: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html - old_cache_dir = compat.getenv('XDG_DATA_HOME') - if not old_cache_dir: - old_cache_dir = os.path.expanduser('~/.local/share') - cache_dir = compat.getenv('XDG_CACHE_HOME') - if not cache_dir: - cache_dir = os.path.expanduser('~/.cache') - cache_dir = os.path.join(cache_dir, 'pyinstaller') - # Move old cache-dir, if any, to new location. - if old_cache_dir and not os.path.exists(cache_dir): - old_cache_dir = os.path.join(old_cache_dir, 'pyinstaller') - if os.path.exists(old_cache_dir): - parent_dir = os.path.dirname(cache_dir) - if not os.path.exists(parent_dir): - os.makedirs(parent_dir) - os.rename(old_cache_dir, cache_dir) - return cache_dir - - -def get_config(upx_dir=None): - config = {} - - config['cachedir'] = _get_pyinstaller_cache_dir() - config['upx_dir'] = upx_dir - - # Disable UPX on non-Windows. Using UPX (3.96) on modern Linux shared libraries (for example, the python3.x.so - # shared library) seems to result in segmentation fault when they are dlopen'd. This happens in recent versions - # of Fedora and Ubuntu linux, as well as in Alpine containers. On macOS, UPX (3.96) fails with - # UnknownExecutableFormatException on most .dylibs (and interferes with code signature on other occasions). And - # even when it would succeed, compressed libraries cannot be (re)signed due to failed strict validation. - upx_available = _check_upx_availability(upx_dir) - if upx_available: - if compat.is_win or compat.is_cygwin: - logger.info("UPX is available and will be used if enabled on build targets.") - elif os.environ.get("PYINSTALLER_FORCE_UPX", "0") != "0": - logger.warning( - "UPX is available and force-enabled on platform with known compatibility problems - use at own risk!" - ) - else: - upx_available = False - logger.info("UPX is available but is disabled on non-Windows due to known compatibility problems.") - config['upx_available'] = upx_available - - return config diff --git a/venv/lib/python3.12/site-packages/PyInstaller/depend/__init__.py b/venv/lib/python3.12/site-packages/PyInstaller/depend/__init__.py deleted file mode 100755 index 792d600..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/depend/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# diff --git a/venv/lib/python3.12/site-packages/PyInstaller/depend/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/depend/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 7329876..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/depend/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/depend/__pycache__/analysis.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/depend/__pycache__/analysis.cpython-312.pyc deleted file mode 100644 index 3afa698..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/depend/__pycache__/analysis.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/depend/__pycache__/bindepend.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/depend/__pycache__/bindepend.cpython-312.pyc deleted file mode 100644 index 28518ea..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/depend/__pycache__/bindepend.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/depend/__pycache__/bytecode.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/depend/__pycache__/bytecode.cpython-312.pyc deleted file mode 100644 index 3085be0..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/depend/__pycache__/bytecode.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/depend/__pycache__/dylib.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/depend/__pycache__/dylib.cpython-312.pyc deleted file mode 100644 index 43174fa..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/depend/__pycache__/dylib.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/depend/__pycache__/imphook.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/depend/__pycache__/imphook.cpython-312.pyc deleted file mode 100644 index 91c4665..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/depend/__pycache__/imphook.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/depend/__pycache__/imphookapi.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/depend/__pycache__/imphookapi.cpython-312.pyc deleted file mode 100644 index 2d07aca..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/depend/__pycache__/imphookapi.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/depend/__pycache__/utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/depend/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index abb0bee..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/depend/__pycache__/utils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/depend/analysis.py b/venv/lib/python3.12/site-packages/PyInstaller/depend/analysis.py deleted file mode 100755 index 72ae4e4..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/depend/analysis.py +++ /dev/null @@ -1,1025 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Define a modified ModuleGraph that can return its contents as a TOC and in other ways act like the old ImpTracker. -TODO: This class, along with TOC and Tree, should be in a separate module. - -For reference, the ModuleGraph node types and their contents: - - nodetype identifier filename - - Script full path to .py full path to .py - SourceModule basename full path to .py - BuiltinModule basename None - CompiledModule basename full path to .pyc - Extension basename full path to .so - MissingModule basename None - Package basename full path to __init__.py - packagepath is ['path to package'] - globalnames is set of global names __init__.py defines - ExtensionPackage basename full path to __init__.{so,dll} - packagepath is ['path to package'] - -The main extension here over ModuleGraph is a method to extract nodes from the flattened graph and return them as a -TOC, or added to a TOC. Other added methods look up nodes by identifier and return facts about them, replacing what -the old ImpTracker list could do. -""" - -import ast -import os -import sys -import traceback -from collections import defaultdict -from copy import deepcopy - -from PyInstaller import HOMEPATH, PACKAGEPATH -from PyInstaller import log as logging -from PyInstaller.building.utils import destination_name_for_extension -from PyInstaller.compat import ( - BAD_MODULE_TYPES, BINARY_MODULE_TYPES, MODULE_TYPES_TO_TOC_DICT, PURE_PYTHON_MODULE_TYPES, PY3_BASE_MODULES, - VALID_MODULE_TYPES, importlib_load_source, is_win -) -from PyInstaller.depend import bytecode -from PyInstaller.depend.imphook import AdditionalFilesCache, ModuleHookCache -from PyInstaller.depend.imphookapi import (PreFindModulePathAPI, PreSafeImportModuleAPI) -from PyInstaller.lib.modulegraph.find_modules import get_implies -from PyInstaller.lib.modulegraph.modulegraph import ModuleGraph, DEFAULT_IMPORT_LEVEL, ABSOLUTE_IMPORT_LEVEL, Package -from PyInstaller.log import DEBUG, INFO, TRACE -from PyInstaller.utils.hooks import collect_submodules, is_package - -logger = logging.getLogger(__name__) - -# Location-based hook priority constants -HOOK_PRIORITY_BUILTIN_HOOKS = -2000 # Built-in hooks. Lowest priority. -HOOK_PRIORITY_CONTRIBUTED_HOOKS = -1000 # Hooks from pyinstaller-hooks-contrib package. -HOOK_PRIORITY_UPSTREAM_HOOKS = 0 # Hooks provided by packages themselves, via entry-points. -HOOK_PRIORITY_USER_HOOKS = 1000 # User-supplied hooks (command-line / spec file). Highest priority. - - -class PyiModuleGraph(ModuleGraph): - """ - Directed graph whose nodes represent modules and edges represent dependencies between these modules. - - This high-level subclass wraps the lower-level `ModuleGraph` class with support for graph and runtime hooks. - While each instance of `ModuleGraph` represents a set of disconnected trees, each instance of this class *only* - represents a single connected tree whose root node is the Python script originally passed by the user on the - command line. For that reason, while there may (and typically do) exist more than one `ModuleGraph` instance, - there typically exists only a singleton instance of this class. - - Attributes - ---------- - _hooks : ModuleHookCache - Dictionary mapping the fully-qualified names of all modules with normal (post-graph) hooks to the absolute paths - of such hooks. See the the `_find_module_path()` method for details. - _hooks_pre_find_module_path : ModuleHookCache - Dictionary mapping the fully-qualified names of all modules with pre-find module path hooks to the absolute - paths of such hooks. See the the `_find_module_path()` method for details. - _hooks_pre_safe_import_module : ModuleHookCache - Dictionary mapping the fully-qualified names of all modules with pre-safe import module hooks to the absolute - paths of such hooks. See the `_safe_import_module()` method for details. - _user_hook_dirs : list - List of the absolute paths of all directories containing user-defined hooks for the current application. - _excludes : list - List of module names to be excluded when searching for dependencies. - _additional_files_cache : AdditionalFilesCache - Cache of all external dependencies (e.g., binaries, datas) listed in hook scripts for imported modules. - _module_collection_mode : dict - A dictionary of module/package collection mode settings set by hook scripts for their modules. - _bindepend_symlink_suppression : set - A set of paths or path patterns corresponding to shared libraries for which binary dependency analysis should - not create symbolic links into top-level application directory. - _base_modules: list - Dependencies for `base_library.zip` (which remain the same for every executable). - """ - - # Note: these levels are completely arbitrary and may be adjusted if needed. - LOG_LEVEL_MAPPING = {0: INFO, 1: DEBUG, 2: TRACE, 3: TRACE, 4: TRACE} - - def __init__(self, pyi_homepath, user_hook_dirs=(), excludes=(), **kwargs): - super().__init__(excludes=excludes, **kwargs) - # Homepath to the place where is PyInstaller located. - self._homepath = pyi_homepath - # modulegraph Node for the main python script that is analyzed by PyInstaller. - self._top_script_node = None - - # Absolute paths of all user-defined hook directories. - self._excludes = excludes - self._reset(user_hook_dirs) - self._analyze_base_modules() - - def _reset(self, user_hook_dirs): - """ - Reset for another set of scripts. This is primary required for running the test-suite. - """ - self._top_script_node = None - self._additional_files_cache = AdditionalFilesCache() - self._module_collection_mode = dict() - self._bindepend_symlink_suppression = set() - # Hook sources: user-supplied (command-line / spec file), entry-point (upstream hooks, contributed hooks), and - # built-in hooks. The order does not really matter anymore, because each entry is now a (location, priority) - # tuple, and order is determined from assigned priority (which may also be overridden by hooks themselves). - self._user_hook_dirs = [ - *user_hook_dirs, - (os.path.join(PACKAGEPATH, 'hooks'), HOOK_PRIORITY_BUILTIN_HOOKS), - ] - # Hook-specific lookup tables. These need to reset when reusing cached PyiModuleGraph to avoid hooks to refer to - # files or data from another test-case. - logger.info('Initializing module graph hook caches...') - self._hooks = self._cache_hooks("") - self._hooks_pre_safe_import_module = self._cache_hooks('pre_safe_import_module') - self._hooks_pre_find_module_path = self._cache_hooks('pre_find_module_path') - - # Search for run-time hooks in all hook directories. - self._available_rthooks = defaultdict(list) - for uhd, _ in self._user_hook_dirs: - uhd_path = os.path.abspath(os.path.join(uhd, 'rthooks.dat')) - try: - with open(uhd_path, 'r', encoding='utf-8') as f: - rthooks = ast.literal_eval(f.read()) - except FileNotFoundError: - # Ignore if this hook path doesn't have run-time hooks. - continue - except Exception as e: - logger.error('Unable to read run-time hooks from %r: %s' % (uhd_path, e)) - continue - - self._merge_rthooks(rthooks, uhd, uhd_path) - - # Convert back to a standard dict. - self._available_rthooks = dict(self._available_rthooks) - - def _merge_rthooks(self, rthooks, uhd, uhd_path): - """ - The expected data structure for a run-time hook file is a Python dictionary of type ``Dict[str, List[str]]``, - where the dictionary keys are module names and the sequence strings are Python file names. - - Check then merge this data structure, updating the file names to be absolute. - """ - # Check that the root element is a dict. - assert isinstance(rthooks, dict), 'The root element in %s must be a dict.' % uhd_path - for module_name, python_file_name_list in rthooks.items(): - # Ensure the key is a string. - assert isinstance(module_name, str), \ - '%s must be a dict whose keys are strings; %s is not a string.' % (uhd_path, module_name) - # Ensure the value is a list. - assert isinstance(python_file_name_list, list), \ - 'The value of %s key %s must be a list.' % (uhd_path, module_name) - if module_name in self._available_rthooks: - logger.warning( - 'Runtime hooks for %s have already been defined. Skipping the runtime hooks for %s that are ' - 'defined in %s.', module_name, module_name, os.path.join(uhd, 'rthooks') - ) - # Skip this module - continue - # Merge this with existing run-time hooks. - for python_file_name in python_file_name_list: - # Ensure each item in the list is a string. - assert isinstance(python_file_name, str), \ - '%s key %s, item %r must be a string.' % (uhd_path, module_name, python_file_name) - # Transform it into an absolute path. - abs_path = os.path.join(uhd, 'rthooks', python_file_name) - # Make sure this file exists. - assert os.path.exists(abs_path), \ - 'In %s, key %s, the file %r expected to be located at %r does not exist.' % \ - (uhd_path, module_name, python_file_name, abs_path) - # Merge it. - self._available_rthooks[module_name].append(abs_path) - - @staticmethod - def _findCaller(*args, **kwargs): - # Used to add an additional stack-frame above logger.findCaller. findCaller expects the caller to be three - # stack-frames above itself. - return logger.findCaller(*args, **kwargs) - - def msg(self, level, s, *args): - """ - Print a debug message with the given level. - - 1. Map the msg log level to a logger log level. - 2. Generate the message format (the same format as ModuleGraph) - 3. Find the caller, which findCaller expects three stack-frames above itself: - [3] caller -> [2] msg (here) -> [1] _findCaller -> [0] logger.findCaller - 4. Create a logRecord with the caller's information. - 5. Handle the logRecord. - """ - try: - level = self.LOG_LEVEL_MAPPING[level] - except KeyError: - return - if not logger.isEnabledFor(level): - return - - msg = "%s %s" % (s, ' '.join(map(repr, args))) - - try: - fn, lno, func, sinfo = self._findCaller() - except ValueError: # pragma: no cover - fn, lno, func, sinfo = "(unknown file)", 0, "(unknown function)", None - record = logger.makeRecord(logger.name, level, fn, lno, msg, [], None, func, None, sinfo) - - logger.handle(record) - - # Set logging methods so that the stack is correctly detected. - msgin = msg - msgout = msg - - def _cache_hooks(self, hook_type): - """ - Create a cache of all hooks of the specified type. - - The cache will include all official hooks defined by the PyInstaller codebase _and_ all unofficial hooks - defined for the current application. - - Parameters - ---------- - hook_type : str - Type of hooks to be cached, equivalent to the basename of the subpackage of the `PyInstaller.hooks` - package containing such hooks (e.g., empty string for standard hooks, `pre_safe_import_module` for - pre-safe-import-module hooks, `pre_find_module_path` for pre-find-module-path hooks). - """ - # Cache of this type of hooks. - hook_dirs = [] - for user_hook_dir, priority in self._user_hook_dirs: - # Absolute path of the user-defined subdirectory of this hook type. If this directory exists, add it to the - # list to be cached. - user_hook_type_dir = os.path.join(user_hook_dir, hook_type) - if os.path.isdir(user_hook_type_dir): - hook_dirs.append((user_hook_type_dir, priority)) - - return ModuleHookCache(self, hook_dirs) - - def _analyze_base_modules(self): - """ - Analyze dependencies of the the modules in base_library.zip. - """ - logger.info('Analyzing modules for base_library.zip ...') - required_mods = [] - # Collect submodules from required modules in base_library.zip. - for m in PY3_BASE_MODULES: - if is_package(m): - required_mods += collect_submodules(m) - else: - required_mods.append(m) - # Initialize ModuleGraph. - self._base_modules = [mod for req in required_mods for mod in self.import_hook(req)] - - def add_script(self, pathname, caller=None): - """ - Wrap the parent's 'run_script' method and create graph from the first script in the analysis, and save its - node to use as the "caller" node for all others. This gives a connected graph rather than a collection of - unrelated trees. - """ - if self._top_script_node is None: - # Remember the node for the first script. - try: - self._top_script_node = super().add_script(pathname) - except SyntaxError: - print("\nSyntax error in", pathname, file=sys.stderr) - formatted_lines = traceback.format_exc().splitlines(True) - print(*formatted_lines[-4:], file=sys.stderr) - sys.exit(1) - # Create references from the top script to the base_modules in graph. - for node in self._base_modules: - self.add_edge(self._top_script_node, node) - # Return top-level script node. - return self._top_script_node - else: - if not caller: - # Defaults to as any additional script is called from the top-level script. - caller = self._top_script_node - return super().add_script(pathname, caller=caller) - - def process_post_graph_hooks(self, analysis): - """ - For each imported module, run this module's post-graph hooks if any. - - Parameters - ---------- - analysis: build_main.Analysis - The Analysis that calls the hooks - - """ - # For each iteration of the infinite "while" loop below: - # - # 1. All hook() functions defined in cached hooks for imported modules are called. This may result in new - # modules being imported (e.g., as hidden imports) that were ignored earlier in the current iteration: if - # this is the case, all hook() functions defined in cached hooks for these modules will be called by the next - # iteration. - # 2. All cached hooks whose hook() functions were called are removed from this cache. If this cache is empty, no - # hook() functions will be called by the next iteration and this loop will be terminated. - # 3. If no hook() functions were called, this loop is terminated. - logger.info('Processing module hooks (post-graph stage)...') - while True: - # Set of the names of all imported modules whose post-graph hooks are run by this iteration, preventing the - # next iteration from re- running these hooks. If still empty at the end of this iteration, no post-graph - # hooks were run; thus, this loop will be terminated. - hooked_module_names = set() - - # For each remaining hookable module and corresponding hooks... - for module_name, module_hook in self._hooks.items(): - # Graph node for this module if imported or "None" otherwise. - module_node = self.find_node(module_name, create_nspkg=False) - - # If this module has not been imported, temporarily ignore it. This module is retained in the cache, as - # a subsequently run post-graph hook could import this module as a hidden import. - if module_node is None: - continue - - # If this module is unimportable, permanently ignore it. - if type(module_node).__name__ not in VALID_MODULE_TYPES: - hooked_module_names.add(module_name) - continue - - # Run this script's post-graph hook. - module_hook.post_graph(analysis) - - # Cache all external dependencies listed by this script after running this hook, which could add - # dependencies. - self._additional_files_cache.add(module_name, module_hook.binaries, module_hook.datas) - - # Update package collection mode settings. - self._module_collection_mode.update(module_hook.module_collection_mode) - - # Update symbolic link suppression patterns for binary dependency analysis. - self._bindepend_symlink_suppression.update(module_hook.bindepend_symlink_suppression) - - # Prevent this module's hooks from being run again. - hooked_module_names.add(module_name) - - # Prevent all post-graph hooks run above from being run again by the next iteration. - self._hooks.remove_modules(*hooked_module_names) - - # If no post-graph hooks were run, terminate iteration. - if not hooked_module_names: - break - - def _find_all_excluded_imports(self, module_name): - """ - Collect excludedimports from the hooks of the specified module and all its parents. - """ - excluded_imports = set() - while module_name: - # Gather excluded imports from hook belonging to the module. - module_hook = self._hooks.get(module_name, None) - if module_hook: - excluded_imports.update(module_hook.excludedimports) - # Change module name to the module's parent name - module_name = module_name.rpartition('.')[0] - return excluded_imports - - def _safe_import_hook( - self, target_module_partname, source_module, target_attr_names, level=DEFAULT_IMPORT_LEVEL, edge_attr=None - ): - if source_module is not None: - # Gather all excluded imports for the referring modules, as well as its parents. - # For example, we want the excluded imports specified by hook for PIL to be also applied when the referring - # module is its submodule, PIL.Image. - excluded_imports = self._find_all_excluded_imports(source_module.identifier) - - # Apply extra processing only if we have any excluded-imports rules - if excluded_imports: - # Resolve the base module name. Level can be ABSOLUTE_IMPORT_LEVEL (= 0) for absolute imports, or an - # integer indicating the relative level. We do not use equality comparison just in case we ever happen - # to get ABSOLUTE_OR_RELATIVE_IMPORT_LEVEL (-1), which is a remnant of python2 days. - if level > ABSOLUTE_IMPORT_LEVEL: - if isinstance(source_module, Package): - # Package - base_module_name = source_module.identifier - else: - # Module in a package; base name must be the parent package name! - base_module_name = '.'.join(source_module.identifier.split('.')[:-1]) - - # Adjust the base module name based on level - if level > 1: - base_module_name = '.'.join(base_module_name.split('.')[:-(level - 1)]) - - if target_module_partname: - base_module_name += '.' + target_module_partname - else: - base_module_name = target_module_partname - - def _exclude_module(module_name, excluded_imports, referrer_name): - """ - Helper for checking whether given module should be excluded. - Returns the name of exclusion rule if module should be excluded, None otherwise. - """ - module_name_parts = module_name.split('.') - for excluded_import in excluded_imports: - excluded_import_parts = excluded_import.split('.') - match = module_name_parts[:len(excluded_import_parts)] == excluded_import_parts - if match: - # Check if the referrer is (was!) subject to the same rule. Because if it was and was - # analyzed anyway, some other import chain must have overrode the exclusion, and we should - # waive it here. A package hook might exclude a part (a subpackage) of the said package to - # prevent its collection when there are no external references; but when they are (for - # example, user explicitly imports the said subpackage in their program), we must let the - # subpackage import its submodules. - referrer_name_parts = referrer_name.split('.') - referrer_match = referrer_name_parts[:len(excluded_import_parts)] == excluded_import_parts - if referrer_match: - logger.debug( - "Deactivating suppression rule %r for module %r because it also applies to the " - "referrer (%r)...", excluded_import, module_name, referrer_name - ) - continue - - return excluded_import - return None - - # First, check if base module name is to be excluded. - # This covers both basic `import a` and `import a.b.c`, as well as `from d import e, f` where base - # module `d` is excluded. - excluded_import_rule = _exclude_module( - base_module_name, - excluded_imports, - source_module.identifier, - ) - if excluded_import_rule: - logger.debug( - "Suppressing import of %r from module %r due to excluded import %r specified in a hook for %r " - "(or its parent package(s)).", base_module_name, source_module.identifier, excluded_import_rule, - source_module.identifier - ) - return [] - - # If we have target attribute names, check each of them, and remove excluded ones from the - # `target_attr_names` list. - if target_attr_names: - filtered_target_attr_names = [] - for target_attr_name in target_attr_names: - submodule_name = base_module_name + '.' + target_attr_name - excluded_import_rule = _exclude_module( - submodule_name, - excluded_imports, - source_module.identifier, - ) - if excluded_import_rule: - logger.debug( - "Suppressing import of %r from module %r due to excluded import %r specified in a hook " - "for %r (or its parent package(s)).", submodule_name, source_module.identifier, - excluded_import_rule, source_module.identifier - ) - else: - filtered_target_attr_names.append(target_attr_name) - - # Swap with filtered target attribute names list; if no elements remain after the filtering, pass - # None... - target_attr_names = filtered_target_attr_names or None - - ret_modules = super()._safe_import_hook( - target_module_partname, source_module, target_attr_names, level, edge_attr - ) - - # Ensure that hooks are pre-loaded for returned module(s), in an attempt to ensure that hooks are called in the - # order of imports. The hooks are cached, so there should be no downsides to pre-loading hooks early (as opposed - # to loading them in post-graph analysis). When modules are imported from other modules, the hooks for those - # referring (source) modules and their parent package(s) are loaded by the exclusion mechanism that takes place - # before the above `super()._safe_import_hook` call. The code below attempts to complement that, but for the - # referred (target) modules and their parent package(s). - for ret_module in ret_modules: - if type(ret_module).__name__ not in VALID_MODULE_TYPES: - continue - # (Ab)use the `_find_all_excluded_imports` helper to load all hooks for the given module and its parent - # package(s). - self._find_all_excluded_imports(ret_module.identifier) - - return ret_modules - - def _safe_import_module(self, module_basename, module_name, parent_package): - """ - Create a new graph node for the module with the passed name under the parent package signified by the passed - graph node. - - This method wraps the superclass method with support for pre-import module hooks. If such a hook exists for - this module (e.g., a script `PyInstaller.hooks.hook-{module_name}` containing a function - `pre_safe_import_module()`), that hook will be run _before_ the superclass method is called. - - Pre-Safe-Import-Hooks are performed just *prior* to importing the module. When running the hook, the modules - parent package has already been imported and ti's `__path__` is set up. But the module is just about to be - imported. - - See the superclass method for description of parameters and return value. - """ - # If this module has a pre-safe import module hook, run it. Make sure to remove it first, to prevent subsequent - # calls from running it again. - hook = self._hooks_pre_safe_import_module.pop(module_name, None) - if hook is not None: - # Dynamically import this hook as a fabricated module. - hook_path, hook_basename = os.path.split(hook.hook_filename) - logger.info('Processing pre-safe-import-module hook %r from %r', hook_basename, hook_path) - hook_module_name = 'PyInstaller_hooks_pre_safe_import_module_' + module_name.replace('.', '_') - hook_module = importlib_load_source(hook_module_name, hook.hook_filename) - - # Object communicating changes made by this hook back to us. - hook_api = PreSafeImportModuleAPI( - module_graph=self, - module_basename=module_basename, - module_name=module_name, - parent_package=parent_package, - ) - - # Run this hook, passed this object. - if not hasattr(hook_module, 'pre_safe_import_module'): - raise NameError('pre_safe_import_module() function not defined by hook %r.' % hook_module) - hook_module.pre_safe_import_module(hook_api) - - # Respect method call changes requested by this hook. - module_basename = hook_api.module_basename - module_name = hook_api.module_name - - # Call the superclass method. - return super()._safe_import_module(module_basename, module_name, parent_package) - - def _find_module_path(self, fullname, module_name, search_dirs): - """ - Get a 3-tuple detailing the physical location of the module with the passed name if that module exists _or_ - raise `ImportError` otherwise. - - This method wraps the superclass method with support for pre-find module path hooks. If such a hook exists - for this module (e.g., a script `PyInstaller.hooks.hook-{module_name}` containing a function - `pre_find_module_path()`), that hook will be run _before_ the superclass method is called. - - See superclass method for parameter and return value descriptions. - """ - # If this module has a pre-find module path hook, run it. Make sure to remove it first, to prevent subsequent - # calls from running it again. - hook = self._hooks_pre_find_module_path.pop(fullname, None) - if hook is not None: - # Dynamically import this hook as a fabricated module. - hook_path, hook_basename = os.path.split(hook.hook_filename) - logger.info('Processing pre-find-module-path hook %r from %r', hook_basename, hook_path) - hook_fullname = 'PyInstaller_hooks_pre_find_module_path_' + fullname.replace('.', '_') - hook_module = importlib_load_source(hook_fullname, hook.hook_filename) - - # Object communicating changes made by this hook back to us. - hook_api = PreFindModulePathAPI( - module_graph=self, - module_name=fullname, - search_dirs=search_dirs, - ) - - # Run this hook, passed this object. - if not hasattr(hook_module, 'pre_find_module_path'): - raise NameError('pre_find_module_path() function not defined by hook %r.' % hook_module) - hook_module.pre_find_module_path(hook_api) - - # Respect search-directory changes requested by this hook. - search_dirs = hook_api.search_dirs - - # Call the superclass method. - return super()._find_module_path(fullname, module_name, search_dirs) - - def get_code_objects(self): - """ - Get code objects from ModuleGraph for pure Python modules. This allows to avoid writing .pyc/pyo files to hdd - at later stage. - - :return: Dict with module name and code object. - """ - code_dict = {} - mod_types = PURE_PYTHON_MODULE_TYPES - for node in self.iter_graph(start=self._top_script_node): - # TODO This is terrible. To allow subclassing, types should never be directly compared. Use isinstance() - # instead, which is safer, simpler, and accepts sets. Most other calls to type() in the codebase should also - # be refactored to call isinstance() instead. - - # get node type e.g. Script - mg_type = type(node).__name__ - if mg_type in mod_types: - if node.code: - code_dict[node.identifier] = node.code - return code_dict - - def _make_toc(self, typecode=None): - """ - Return the name, path and type of selected nodes as a TOC. The selection is determined by the given list - of PyInstaller TOC typecodes. If that list is empty we return the complete flattened graph as a TOC with the - ModuleGraph note types in place of typecodes -- meant for debugging only. Normally we return ModuleGraph - nodes whose types map to the requested PyInstaller typecode(s) as indicated in the MODULE_TYPES_TO_TOC_DICT. - - We use the ModuleGraph (really, ObjectGraph) flatten() method to scan all the nodes. This is patterned after - ModuleGraph.report(). - """ - toc = list() - for node in self.iter_graph(start=self._top_script_node): - entry = self._node_to_toc(node, typecode) - # Append the entry. We do not check for duplicates here; the TOC normalization is left to caller. - # However, as entries are obtained from modulegraph, there should not be any duplicates at this stage. - if entry is not None: - toc.append(entry) - return toc - - def make_pure_toc(self): - """ - Return all pure Python modules formatted as TOC. - """ - # PyInstaller should handle special module types without code object. - return self._make_toc(PURE_PYTHON_MODULE_TYPES) - - def make_binaries_toc(self): - """ - Return all binary Python modules formatted as TOC. - """ - return self._make_toc(BINARY_MODULE_TYPES) - - def make_missing_toc(self): - """ - Return all MISSING Python modules formatted as TOC. - """ - return self._make_toc(BAD_MODULE_TYPES) - - @staticmethod - def _node_to_toc(node, typecode=None): - # TODO This is terrible. Everything in Python has a type. It is nonsensical to even speak of "nodes [that] are - # not typed." How would that even occur? After all, even "None" has a type! (It is "NoneType", for the curious.) - # Remove this, please. - - # Get node type, e.g., Script - mg_type = type(node).__name__ - assert mg_type is not None - - if typecode and mg_type not in typecode: - # Type is not a to be selected one, skip this one - return None - # Extract the identifier and a path if any. - if mg_type == 'Script': - # for Script nodes only, identifier is a whole path - (name, ext) = os.path.splitext(node.filename) - name = os.path.basename(name) - elif mg_type == 'ExtensionPackage': - # Package with __init__ module being an extension module. This needs to end up as e.g. 'mypkg/__init__.so'. - # Convert the packages name ('mypkg') into the module name ('mypkg.__init__') *here* to keep special cases - # away elsewhere (where the module name is converted to a filename). - name = node.identifier + ".__init__" - else: - name = node.identifier - path = node.filename if node.filename is not None else '' - # Ensure name is really 'str'. Module graph might return object type 'modulegraph.Alias' which inherits fromm - # 'str'. But 'marshal.dumps()' function is able to marshal only 'str'. Otherwise on Windows PyInstaller might - # fail with message like: - # ValueError: unmarshallable object - name = str(name) - # Translate to the corresponding TOC typecode. - toc_type = MODULE_TYPES_TO_TOC_DICT[mg_type] - return name, path, toc_type - - def nodes_to_toc(self, nodes): - """ - Given a list of nodes, create a TOC representing those nodes. This is mainly used to initialize a TOC of - scripts with the ones that are runtime hooks. The process is almost the same as _make_toc(), but the caller - guarantees the nodes are valid, so minimal checking. - """ - return [self._node_to_toc(node) for node in nodes] - - # Return true if the named item is in the graph as a BuiltinModule node. The passed name is a basename. - def is_a_builtin(self, name): - node = self.find_node(name) - if node is None: - return False - return type(node).__name__ == 'BuiltinModule' - - def get_importers(self, name): - """ - List all modules importing the module with the passed name. - - Returns a list of (identifier, DependencyIinfo)-tuples. If the names module has not yet been imported, this - method returns an empty list. - - Parameters - ---------- - name : str - Fully-qualified name of the module to be examined. - - Returns - ---------- - list - List of (fully-qualified names, DependencyIinfo)-tuples of all modules importing the module with the passed - fully-qualified name. - - """ - def get_importer_edge_data(importer): - edge = self.graph.edge_by_node(importer, name) - # edge might be None in case an AliasModule was added. - if edge is not None: - return self.graph.edge_data(edge) - - node = self.find_node(name) - if node is None: - return [] - _, importers = self.get_edges(node) - importers = (importer.identifier for importer in importers if importer is not None) - return [(importer, get_importer_edge_data(importer)) for importer in importers] - - # TODO: create a class from this function. - def analyze_runtime_hooks(self, custom_runhooks): - """ - Analyze custom run-time hooks and run-time hooks implied by found modules. - - :return : list of Graph nodes. - """ - rthooks_nodes = [] - logger.info('Analyzing run-time hooks ...') - # Process custom runtime hooks (from --runtime-hook options). The runtime hooks are order dependent. First hooks - # in the list are executed first. Put their graph nodes at the head of the priority_scripts list Pyinstaller - # defined rthooks and thus they are executed first. - if custom_runhooks: - for hook_file in custom_runhooks: - logger.info("Including custom run-time hook %r", hook_file) - hook_file = os.path.abspath(hook_file) - # Not using "try" here because the path is supposed to exist, if it does not, the raised error will - # explain. - rthooks_nodes.append(self.add_script(hook_file)) - - # Find runtime hooks that are implied by packages already imported. Get a temporary TOC listing all the scripts - # and packages graphed so far. Assuming that runtime hooks apply only to modules and packages. - temp_toc = self._make_toc(VALID_MODULE_TYPES) - for (mod_name, path, typecode) in temp_toc: - # Look if there is any run-time hook for given module. - if mod_name in self._available_rthooks: - # There could be several run-time hooks for a module. - for abs_path in self._available_rthooks[mod_name]: - hook_path, hook_basename = os.path.split(abs_path) - logger.info("Including run-time hook %r from %r", hook_basename, hook_path) - rthooks_nodes.append(self.add_script(abs_path)) - - return rthooks_nodes - - def add_hiddenimports(self, module_list): - """ - Add hidden imports that are either supplied as CLI option --hidden-import=MODULENAME or as dependencies from - some PyInstaller features when enabled (e.g., crypto feature). - """ - assert self._top_script_node is not None - # Analyze the script's hidden imports (named on the command line). - for modnm in module_list: - node = self.find_node(modnm) - if node is not None: - logger.debug('Hidden import %r already found', modnm) - else: - logger.info("Analyzing hidden import %r", modnm) - # ModuleGraph throws ImportError if import not found. - try: - nodes = self.import_hook(modnm) - assert len(nodes) == 1 - node = nodes[0] - except ImportError: - logger.error("Hidden import %r not found", modnm) - continue - # Create references from the top script to the hidden import, even if found otherwise. Do not waste time - # checking whether it is actually added by this (test-) script. - self.add_edge(self._top_script_node, node) - - def get_code_using(self, module: str) -> dict: - """ - Find modules that import a given **module**. - """ - co_dict = {} - pure_python_module_types = PURE_PYTHON_MODULE_TYPES | { - 'Script', - } - node = self.find_node(module) - if node: - referrers = self.incoming(node) - for r in referrers: - # Under python 3.7 and earlier, if `module` is added to hidden imports, one of referrers ends up being - # None, causing #3825. Work around it. - if r is None: - continue - # Ensure that modulegraph objects have 'code' attribute. - if type(r).__name__ not in pure_python_module_types: - continue - identifier = r.identifier - if identifier == module or identifier.startswith(module + '.'): - # Skip self references or references from `modules`'s own submodules. - continue - # The code object may be None if referrer ends up shadowed by eponymous directory that ends up treated - # as a namespace package. See #6873 for an example. - if r.code is None: - continue - co_dict[r.identifier] = r.code - return co_dict - - def metadata_required(self) -> set: - """ - Collect metadata for all packages that appear to need it. - """ - - # List every function that we can think of which is known to require metadata. - out = set() - - out |= self._metadata_from( - "pkg_resources", - ["get_distribution"], # Requires metadata for one distribution. - ["require"], # Requires metadata for all dependencies. - ) - - # importlib.metadata is often `import ... as` aliased to importlib_metadata for compatibility with < py38. - # Assume both are valid. - for importlib_metadata in ["importlib.metadata", "importlib_metadata"]: - out |= self._metadata_from( - importlib_metadata, - ["metadata", "distribution", "version", "files", "requires"], - [], - ) - - return out - - def _metadata_from(self, package, methods=(), recursive_methods=()) -> set: - """ - Collect metadata whose requirements are implied by given function names. - - Args: - package: - The module name that must be imported in a source file to trigger the search. - methods: - Function names from **package** which take a distribution name as an argument and imply that metadata - is required for that distribution. - recursive_methods: - Like **methods** but also implies that a distribution's dependencies' metadata must be collected too. - Returns: - Required metadata in hook data ``(source, dest)`` format as returned by - :func:`PyInstaller.utils.hooks.copy_metadata()`. - - Scan all source code to be included for usage of particular *key* functions which imply that that code will - require metadata for some distribution (which may not be its own) at runtime. In the case of a match, - collect the required metadata. - """ - from PyInstaller.utils.hooks import copy_metadata - from PyInstaller.compat import importlib_metadata - - # Generate sets of possible function names to search for. - need_metadata = set() - need_recursive_metadata = set() - for method in methods: - need_metadata.update(bytecode.any_alias(package + "." + method)) - for method in recursive_methods: - need_recursive_metadata.update(bytecode.any_alias(package + "." + method)) - - out = set() - - for name, code in self.get_code_using(package).items(): - for calls in bytecode.recursive_function_calls(code).values(): - for function_name, args in calls: - # Only consider function calls taking one argument. - if len(args) != 1: - continue - package = args[0] - try: - if function_name in need_metadata: - out.update(copy_metadata(package)) - elif function_name in need_recursive_metadata: - out.update(copy_metadata(package, recursive=True)) - - except importlib_metadata.PackageNotFoundError: - # Currently, we opt to silently skip over missing metadata. - continue - - return out - - def get_collected_packages(self) -> list: - """ - Return the list of collected python packages. - """ - # `node.identifier` might be an instance of `modulegraph.Alias`, hence explicit conversion to `str`. - return [ - str(node.identifier) for node in self.iter_graph(start=self._top_script_node) - if type(node).__name__ == 'Package' - ] - - def make_hook_binaries_toc(self) -> list: - """ - Return the TOC list of binaries collected by hooks." - """ - toc = [] - for node in self.iter_graph(start=self._top_script_node): - module_name = str(node.identifier) - for dest_name, src_name in self._additional_files_cache.binaries(module_name): - toc.append((dest_name, src_name, 'BINARY')) - - return toc - - def make_hook_datas_toc(self) -> list: - """ - Return the TOC list of data files collected by hooks." - """ - toc = [] - for node in self.iter_graph(start=self._top_script_node): - module_name = str(node.identifier) - for dest_name, src_name in self._additional_files_cache.datas(module_name): - toc.append((dest_name, src_name, 'DATA')) - - return toc - - -_cached_module_graph_ = None - - -def initialize_modgraph(excludes=(), user_hook_dirs=()): - """ - Create the cached module graph. - - This function might appear weird but is necessary for speeding up test runtime because it allows caching basic - ModuleGraph object that gets created for 'base_library.zip'. - - Parameters - ---------- - excludes : list - List of the fully-qualified names of all modules to be "excluded" and hence _not_ frozen into the executable. - user_hook_dirs : list - List of the absolute paths of all directories containing user-defined hooks for the current application or - `None` if no such directories were specified. - - Returns - ---------- - PyiModuleGraph - Module graph with core dependencies. - """ - # Normalize parameters to ensure tuples and make comparison work. - user_hook_dirs = user_hook_dirs or () - excludes = excludes or () - - # Ensure that __main__ is always excluded from the modulegraph, to prevent accidentally pulling PyInstaller itself - # into the modulegraph. This seems to happen on Windows, because modulegraph is able to resolve `__main__` as - # `.../PyInstaller.exe/__main__.py` and analyze it. The `__main__` has a different meaning during analysis compared - # to the program run-time, when it refers to the program's entry-point (which would always be part of the - # modulegraph anyway, by virtue of being the starting point of the analysis). - if "__main__" not in excludes: - excludes += ("__main__",) - - # If there is a graph cached with the same excludes, reuse it. See ``PyiModulegraph._reset()`` for what is - # reset. This cache is used primarily to speed up the test-suite. Fixture `pyi_modgraph` calls this function with - # empty excludes, creating a graph suitable for the huge majority of tests. - global _cached_module_graph_ - if _cached_module_graph_ and _cached_module_graph_._excludes == excludes: - logger.info('Reusing cached module dependency graph...') - graph = deepcopy(_cached_module_graph_) - graph._reset(user_hook_dirs) - return graph - - logger.info('Initializing module dependency graph...') - - # Construct the initial module graph by analyzing all import statements. - graph = PyiModuleGraph( - HOMEPATH, - excludes=excludes, - # get_implies() are hidden imports known by modulgraph. - implies=get_implies(), - user_hook_dirs=user_hook_dirs, - ) - - if not _cached_module_graph_: - # Only cache the first graph, see above for explanation. - logger.info('Caching module dependency graph...') - # cache a deep copy of the graph - _cached_module_graph_ = deepcopy(graph) - # Clear data which does not need to be copied from the cached graph since it will be reset by - # ``PyiModulegraph._reset()`` anyway. - _cached_module_graph_._hooks = None - _cached_module_graph_._hooks_pre_safe_import_module = None - _cached_module_graph_._hooks_pre_find_module_path = None - - return graph - - -def get_bootstrap_modules(): - """ - Get TOC with the bootstrapping modules and their dependencies. - :return: TOC with modules - """ - # Import 'struct' modules to get real paths to module file names. - mod_struct = __import__('struct') - # Basic modules necessary for the bootstrap process. - loader_mods = list() - loaderpath = os.path.join(HOMEPATH, 'PyInstaller', 'loader') - # On some platforms (Windows, Debian/Ubuntu) '_struct' and zlib modules are built-in modules (linked statically) - # and thus does not have attribute __file__. 'struct' module is required for reading Python bytecode from - # executable. 'zlib' is required to decompress this bytecode. - for mod_name in ['_struct', 'zlib']: - mod = __import__(mod_name) # C extension. - if hasattr(mod, '__file__'): - mod_file = os.path.abspath(mod.__file__) - # Resolve full destination name for extension, diverting it into python3.x/lib-dynload directory if - # necessary (to match behavior for extension collection introduced in #5604). - mod_dest = destination_name_for_extension(mod_name, mod_file, 'EXTENSION') - loader_mods.append((mod_dest, mod_file, 'EXTENSION')) - loader_mods.append(('struct', os.path.abspath(mod_struct.__file__), 'PYMODULE')) - # Loader/bootstrap modules. - # NOTE: These modules should be kept simple without any complicated dependencies. - loader_mods += [ - ('pyimod01_archive', os.path.join(loaderpath, 'pyimod01_archive.py'), 'PYMODULE'), - ('pyimod02_importers', os.path.join(loaderpath, 'pyimod02_importers.py'), 'PYMODULE'), - ('pyimod03_ctypes', os.path.join(loaderpath, 'pyimod03_ctypes.py'), 'PYMODULE'), - ] - if is_win: - loader_mods.append(('pyimod04_pywin32', os.path.join(loaderpath, 'pyimod04_pywin32.py'), 'PYMODULE')) - # The bootstrap script - loader_mods.append(('pyiboot01_bootstrap', os.path.join(loaderpath, 'pyiboot01_bootstrap.py'), 'PYSOURCE')) - return loader_mods diff --git a/venv/lib/python3.12/site-packages/PyInstaller/depend/bindepend.py b/venv/lib/python3.12/site-packages/PyInstaller/depend/bindepend.py deleted file mode 100755 index 23b3769..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/depend/bindepend.py +++ /dev/null @@ -1,1131 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Find external dependencies of binary libraries. -""" - -import ctypes.util -import functools -import os -import pathlib -import re -import sys -import sysconfig -import subprocess - -from PyInstaller import compat -from PyInstaller import log as logging -from PyInstaller.depend import dylib, utils -from PyInstaller.utils.win32 import winutils -from PyInstaller.exceptions import PythonLibraryNotFoundError - -if compat.is_darwin: - import PyInstaller.utils.osx as osxutils - -logger = logging.getLogger(__name__) - -_exe_machine_type = None -if compat.is_win: - _exe_machine_type = winutils.get_pe_file_machine_type(compat.python_executable) - -#- High-level binary dependency analysis - - -def _get_paths_for_parent_directory_preservation(): - """ - Return list of paths that serve as prefixes for parent-directory preservation of collected binaries and/or - shared libraries. If a binary is collected from a location that starts with a path from this list, the relative - directory structure is preserved within the frozen application bundle; otherwise, the binary is collected to the - frozen application's top-level directory. - """ - - # Use only site-packages paths. We have no control over contents of `sys.path`, so using all paths from that may - # lead to unintended behavior in corner cases. For example, if `sys.path` contained the drive root (see #7028), - # all paths that do not match some other sub-path rooted in that drive will end up recognized as relative to the - # drive root. In such case, any DLL collected from `c:\Windows\system32` will be collected into `Windows\system32` - # sub-directory; ucrt DLLs collected from MSVC or Windows SDK installed in `c:\Program Files\...` will end up - # collected into `Program Files\...` subdirectory; etc. - # - # On the other hand, the DLL parent directory preservation is primarily aimed at packages installed via PyPI - # wheels, which are typically installed into site-packages. Therefore, limiting the directory preservation for - # shared libraries collected from site-packages should do the trick, and should be reasonably safe. - import site - - orig_paths = site.getsitepackages() - orig_paths.append(site.getusersitepackages()) - - # Explicitly excluded paths. `site.getsitepackages` seems to include `sys.prefix`, which we need to exclude, to - # avoid issue swith DLLs in its sub-directories. We need both resolved and unresolved variant to handle cases - # where `base_prefix` itself is a symbolic link (e.g., `scoop`-installed python on Windows, see #8023). - excluded_paths = { - pathlib.Path(sys.base_prefix), - pathlib.Path(sys.base_prefix).resolve(), - pathlib.Path(sys.prefix), - pathlib.Path(sys.prefix).resolve(), - } - - # For each path in orig_paths, append a resolved variant. This helps with linux venv where we need to consider - # both `venv/lib/python3.11/site-packages` and `venv/lib/python3.11/site-packages` and `lib64` is a symlink - # to `lib`. - orig_paths += [pathlib.Path(path).resolve() for path in orig_paths] - - paths = set() - for path in orig_paths: - if not path: - continue - path = pathlib.Path(path) - # Filter out non-directories (e.g., /path/to/python3x.zip) or non-existent paths - if not path.is_dir(): - continue - # Filter out explicitly excluded paths - if path in excluded_paths: - continue - paths.add(path) - - # Sort by length (in term of path components) to ensure match against the longest common prefix (for example, match - # /path/to/venv/lib/site-packages instead of /path/to/venv when both paths are in site paths). - paths = sorted(paths, key=lambda x: len(x.parents), reverse=True) - - return paths - - -def _select_destination_directory(src_filename, parent_dir_preservation_paths): - # Check parent directory preservation paths - for parent_dir_preservation_path in parent_dir_preservation_paths: - if parent_dir_preservation_path in src_filename.parents: - # Collect into corresponding sub-directory. - return src_filename.relative_to(parent_dir_preservation_path) - - # Collect into top-level directory. - return src_filename.name - - -def binary_dependency_analysis(binaries, search_paths=None, symlink_suppression_patterns=None): - """ - Perform binary dependency analysis on the given TOC list of collected binaries, by recursively scanning each binary - for linked dependencies (shared library imports). Returns new TOC list that contains both original entries and their - binary dependencies. - - Additional search paths for dependencies' full path resolution may be supplied via optional argument. - """ - - # Get all path prefixes for binaries' parent-directory preservation. For binaries collected from packages in (for - # example) site-packages directory, we should try to preserve the parent directory structure. - parent_dir_preservation_paths = _get_paths_for_parent_directory_preservation() - - # Keep track of processed binaries and processed dependencies. - processed_binaries = set() - processed_dependencies = set() - - # Keep track of unresolved dependencies, in order to defer the missing-library warnings until after everything has - # been processed. This allows us to suppress warnings for dependencies that end up being collected anyway; for - # details, see the end of this function. - missing_dependencies = [] - - # Populate output TOC with input binaries - this also serves as TODO list, as we iterate over it while appending - # new entries at the end. - output_toc = binaries[:] - for dest_name, src_name, typecode in output_toc: - # Do not process symbolic links (already present in input TOC list, or added during analysis below). - if typecode == 'SYMLINK': - continue - - # Keep track of processed binaries, to avoid unnecessarily repeating analysis of the same file. Use pathlib.Path - # to avoid having to worry about case normalization. - src_path = pathlib.Path(src_name) - if src_path in processed_binaries: - continue - processed_binaries.add(src_path) - - logger.debug("Analyzing binary %r", src_name) - - # Analyze imports (linked dependencies) - for dep_name, dep_src_path in get_imports(src_name, search_paths): - logger.debug("Processing dependency, name: %r, resolved path: %r", dep_name, dep_src_path) - - # Skip unresolved dependencies. Defer the missing-library warnings until after binary dependency analysis - # is complete. - if not dep_src_path: - missing_dependencies.append((dep_name, src_name)) - continue - - # Compare resolved dependency against global inclusion/exclusion rules. - if not dylib.include_library(dep_src_path): - logger.debug("Skipping dependency %r due to global exclusion rules.", dep_src_path) - continue - - dep_src_path = pathlib.Path(dep_src_path) # Turn into pathlib.Path for subsequent processing - - # Avoid processing this dependency if we have already processed it. - if dep_src_path in processed_dependencies: - logger.debug("Skipping dependency %r due to prior processing.", str(dep_src_path)) - continue - processed_dependencies.add(dep_src_path) - - # Try to preserve parent directory structure, if applicable. - # NOTE: do not resolve the source path, because on macOS and linux, it may be a versioned .so (e.g., - # libsomething.so.1, pointing at libsomething.so.1.2.3), and we need to collect it under original name! - dep_dest_path = _select_destination_directory(dep_src_path, parent_dir_preservation_paths) - dep_dest_path = pathlib.PurePath(dep_dest_path) # Might be a str() if it is just a basename... - - # If we are collecting library into top-level directory on macOS, check whether it comes from a - # .framework bundle. If it does, re-create the .framework bundle in the top-level directory - # instead. - if compat.is_darwin and dep_dest_path.parent == pathlib.PurePath('.'): - if osxutils.is_framework_bundle_lib(dep_src_path): - # dst_src_path is parent_path/Name.framework/Versions/Current/Name - framework_parent_path = dep_src_path.parent.parent.parent.parent - dep_dest_path = pathlib.PurePath(dep_src_path.relative_to(framework_parent_path)) - - logger.debug("Collecting dependency %r as %r.", str(dep_src_path), str(dep_dest_path)) - output_toc.append((str(dep_dest_path), str(dep_src_path), 'BINARY')) - - # On non-Windows, if we are not collecting the binary into application's top-level directory ('.'), - # add a symbolic link from top-level directory to the actual location. This is to accommodate - # LD_LIBRARY_PATH being set to the top-level application directory on linux (although library search - # should be mostly done via rpaths, so this might be redundant) and to accommodate library path - # rewriting on macOS, which assumes that the library was collected into top-level directory. - if compat.is_win: - # We do not use symlinks on Windows. - pass - elif dep_dest_path.parent == pathlib.PurePath('.'): - # The shared library itself is being collected into top-level application directory. - pass - elif any(dep_src_path.match(pattern) for pattern in symlink_suppression_patterns): - # Honor symlink suppression patterns specified by hooks. - logger.debug( - "Skipping symbolic link from %r to top-level application directory due to source path matching one " - "of symlink suppression path patterns.", str(dep_dest_path) - ) - else: - logger.debug("Adding symbolic link from %r to top-level application directory.", str(dep_dest_path)) - output_toc.append((str(dep_dest_path.name), str(dep_dest_path), 'SYMLINK')) - - # Handle missing dependencies: display warnings, add missing symbolic links to top-level application directory, etc. - seen_binaries = { - os.path.normcase(os.path.basename(src_name)): (dest_name, src_name, typecode) - for dest_name, src_name, typecode in output_toc if typecode != 'SYMLINK' - } - existing_symlinks = set([dest_name for dest_name, src_name, typecode in output_toc if typecode == 'SYMLINK']) - - for dependency_name, referring_binary in missing_dependencies: - # Ignore libraries that we would not collect in the first place. - if not dylib.include_library(dependency_name): - continue - - # If the binary with a matching basename happens to be among the discovered binaries, suppress the message as - # well. This might happen either because the library was collected by some other mechanism (for example, via - # hook, or supplied by the user), or because it was discovered during the analysis of another binary (which, - # for example, had properly set run-paths on Linux/macOS or was located next to that other analyzed binary on - # Windows). - # - # On non-Windows, also check if symbolic link to the discovered binary already exists in the top-level - # application directory, and if not, create it. This is important especially on macOS, where our library path - # rewriting assumes that all dependent libraries are available in the top-level application directory, or - # linked into it. - dependency_basename = os.path.normcase(os.path.basename(dependency_name)) - dependency_toc_entry = seen_binaries.get(dependency_basename, None) - if dependency_toc_entry is None: - # Not found, emit a warning (subject to global warning suppression rules). - if not dylib.warn_missing_lib(dependency_name): - continue - logger.warning( - "Library not found: could not resolve %r, dependency of %r.", dependency_name, referring_binary - ) - elif not compat.is_win: - # Found; generate symbolic link if necessary. - dependency_dest_path = pathlib.PurePath(dependency_toc_entry[0]) - dependency_src_path = pathlib.Path(dependency_toc_entry[1]) - - if dependency_dest_path.parent == pathlib.PurePath('.'): - # The binary is collected into top-level application directory. - continue - elif dependency_basename in existing_symlinks: - # The symbolic link already exists. - continue - - # Keep honoring symlink suppression patterns specified by hooks (same as in main binary dependency analysis - # loop). - if any(dependency_src_path.match(pattern) for pattern in symlink_suppression_patterns): - logger.info( - "Missing dependency handling: skipping symbolic link from %r to top-level application directory " - "due to source path matching one of symlink suppression path patterns.", str(dependency_dest_path) - ) - continue - - # Create the symbolic link - logger.info( - "Missing dependency handling: adding symbolic link from %r to top-level application directory.", - str(dependency_dest_path) - ) - output_toc.append((dependency_basename, str(dependency_dest_path), 'SYMLINK')) - existing_symlinks.add(dependency_basename) - - return output_toc - - -#- Low-level import analysis - - -def get_imports(filename, search_paths=None): - """ - Analyze the given binary file (shared library or executable), and obtain the list of shared libraries it imports - (i.e., link-time dependencies). - - Returns set of tuples (name, fullpath). The name component is the referenced name, and on macOS, may not be just - a base name. If the library's full path cannot be resolved, fullpath element is None. - - Additional list of search paths may be specified via `search_paths`, to be used as a fall-back when the - platform-specific resolution mechanism fails to resolve a library fullpath. - """ - if compat.is_win: - if str(filename).lower().endswith(".manifest"): - return [] - return _get_imports_pefile(filename, search_paths) - elif compat.is_darwin: - return _get_imports_macholib(filename, search_paths) - else: - return _get_imports_ldd(filename, search_paths) - - -def _get_imports_pefile(filename, search_paths): - """ - Windows-specific helper for `get_imports`, which uses the `pefile` library to walk through PE header. - """ - import pefile - - output = set() - - # By default, pefile library parses all PE information. We are only interested in the list of dependent dlls. - # Performance is improved by reading only needed information. https://code.google.com/p/pefile/wiki/UsageExamples - pe = pefile.PE(filename, fast_load=True) - pe.parse_data_directories( - directories=[ - pefile.DIRECTORY_ENTRY['IMAGE_DIRECTORY_ENTRY_IMPORT'], - pefile.DIRECTORY_ENTRY['IMAGE_DIRECTORY_ENTRY_EXPORT'], - ], - forwarded_exports_only=True, - import_dllnames_only=True, - ) - - # If a library has no binary dependencies, pe.DIRECTORY_ENTRY_IMPORT does not exist. - for entry in getattr(pe, 'DIRECTORY_ENTRY_IMPORT', []): - dll_str = entry.dll.decode('utf-8') - output.add(dll_str) - - # We must also read the exports table to find forwarded symbols: - # http://blogs.msdn.com/b/oldnewthing/archive/2006/07/19/671238.aspx - exported_symbols = getattr(pe, 'DIRECTORY_ENTRY_EXPORT', None) - if exported_symbols: - for symbol in exported_symbols.symbols: - if symbol.forwarder is not None: - # symbol.forwarder is a bytes object. Convert it to a string. - forwarder = symbol.forwarder.decode('utf-8') - # symbol.forwarder is for example 'KERNEL32.EnterCriticalSection' - dll = forwarder.split('.')[0] - output.add(dll + ".dll") - - pe.close() - - # Attempt to resolve full paths to referenced DLLs. Always add the input binary's parent directory to the search - # paths. - search_paths = [os.path.dirname(filename)] + (search_paths or []) - output = {(lib, resolve_library_path(lib, search_paths)) for lib in output} - - return output - - -def _get_imports_ldd(filename, search_paths): - """ - Helper for `get_imports`, which uses `ldd` to analyze shared libraries. Used on Linux and other POSIX-like platforms - (with exception of macOS). - """ - - output = set() - - # Output of ldd varies between platforms... - if compat.is_aix: - # Match libs of the form - # 'archivelib.a(objectmember.so/.o)' - # or - # 'sharedlib.so' - # Will not match the fake lib '/unix' - LDD_PATTERN = re.compile(r"^\s*(((?P(.*\.a))(?P\(.*\)))|((?P(.*\.so))))$") - elif compat.is_hpux: - # Match libs of the form - # 'sharedlib.so => full-path-to-lib - # e.g. - # 'libpython2.7.so => /usr/local/lib/hpux32/libpython2.7.so' - LDD_PATTERN = re.compile(r"^\s+(.*)\s+=>\s+(.*)$") - elif compat.is_solar: - # Match libs of the form - # 'sharedlib.so => full-path-to-lib - # e.g. - # 'libpython2.7.so.1.0 => /usr/local/lib/libpython2.7.so.1.0' - # Will not match the platform specific libs starting with '/platform' - LDD_PATTERN = re.compile(r"^\s+(.*)\s+=>\s+(.*)$") - elif compat.is_linux: - # Match libs of the form - # libpython3.13.so.1.0 => /home/brenainn/.pyenv/versions/3.13.0/lib/libpython3.13.so.1.0 (0x00007a9e15800000) - # or - # /tmp/python/install/bin/../lib/libpython3.13.so.1.0 (0x00007b9489c82000) - LDD_PATTERN = re.compile(r"^\s*(?:(.*?)\s+=>\s+)?(.*?)\s+\(.*\)") - else: - LDD_PATTERN = re.compile(r"\s*(.*?)\s+=>\s+(.*?)\s+\(.*\)") - - # Resolve symlinks since GNU ldd contains a bug in processing a symlink to a binary - # using $ORIGIN: https://sourceware.org/bugzilla/show_bug.cgi?id=25263 - p = subprocess.run( - ['ldd', os.path.realpath(filename)], - stdin=subprocess.DEVNULL, - stderr=subprocess.PIPE, - stdout=subprocess.PIPE, - encoding='utf-8', - ) - - ldd_warnings = [] - for line in p.stderr.splitlines(): - if not line: - continue - # Python extensions (including stdlib ones) are not linked against python.so but rely on Python's symbols having - # already been loaded into symbol space at runtime. musl's ldd issues a series of harmless warnings to stderr - # telling us that those symbols are unfindable. These should be suppressed. - elif line.startswith("Error relocating ") and line.endswith(" symbol not found"): - continue - # Shared libraries should have the executable bits set; however, this is not the case for shared libraries - # shipped in PyPI wheels, which cause ldd to emit `ldd: warning: you do not have execution permission for ...` - # warnings. Suppress these. - elif line.startswith("ldd: warning: you do not have execution permission for "): - continue - # When `ldd` is ran against a file that is not a dynamic binary (i.e., is not a binary at all, or is a static - # binary), it emits a "not a dynamic executable" warning. Suppress it. - elif "not a dynamic executable" in line: - continue - # Propagate any other warnings it might have. - ldd_warnings.append(line) - if ldd_warnings: - logger.warning("ldd warnings for %r:\n%s", filename, "\n".join(ldd_warnings)) - - for line in p.stdout.splitlines(): - name = None # Referenced name - lib = None # Resolved library path - - m = LDD_PATTERN.search(line) - if m: - if compat.is_aix: - libarchive = m.group('libarchive') - if libarchive: - # We matched an archive lib with a request for a particular embedded shared object. - # 'archivelib.a(objectmember.so/.o)' - lib = libarchive - name = os.path.basename(lib) + m.group('objectmember') - else: - # We matched a stand-alone shared library. - # 'sharedlib.so' - lib = m.group('libshared') - name = os.path.basename(lib) - elif compat.is_hpux: - name, lib = m.group(1), m.group(2) - else: - name, lib = m.group(1), m.group(2) - name = name or os.path.basename(lib) - if compat.is_linux: - # Skip all ld variants listed https://sourceware.org/glibc/wiki/ABIList - # plus musl's ld-musl-*.so.*. - if re.fullmatch(r"ld(64)?(-linux|-musl)?(-.+)?\.so(\..+)?", os.path.basename(lib)): - continue - if name[:10] in ('linux-gate', 'linux-vdso'): - # linux-gate is a fake library which does not exist and should be ignored. See also: - # http://www.trilithium.com/johan/2005/08/linux-gate/ - continue - - if compat.is_cygwin: - # exclude Windows system library - if lib.lower().startswith('/cygdrive/c/windows/system'): - continue - - # Reset library path if it does not exist - if not os.path.exists(lib): - lib = None - elif line.endswith("not found"): - # On glibc-based linux distributions, missing libraries are marked with name.so => not found - tokens = line.split('=>') - if len(tokens) != 2: - continue - name = tokens[0].strip() - lib = None - else: - # TODO: should we warn about unprocessed lines? - continue - - # Fall back to searching the supplied search paths, if any. - if not lib: - lib = _resolve_library_path_in_search_paths( - os.path.basename(name), # Search for basename of the referenced name. - search_paths, - ) - - # Normalize the resolved path, to remove any extraneous "../" elements. - if lib: - lib = os.path.normpath(lib) - - # Return referenced name as-is instead of computing a basename, to provide additional context when library - # cannot be resolved. - output.add((name, lib)) - - return output - - -def _get_imports_macholib(filename, search_paths): - """ - macOS-specific helper for `get_imports`, which uses `macholib` to analyze library load commands in Mach-O headers. - """ - from macholib.dyld import dyld_find - from macholib.mach_o import LC_RPATH - from macholib.MachO import MachO - - try: - from macholib.dyld import _dyld_shared_cache_contains_path - except ImportError: - _dyld_shared_cache_contains_path = None - - output = set() - - # Parent directory of the input binary and parent directory of python executable, used to substitute @loader_path - # and @executable_path. The macOS dylib loader (dyld) fully resolves the symbolic links when using @loader_path - # and @executable_path references, so we need to do the same using `os.path.realpath`. - bin_path = os.path.dirname(os.path.realpath(filename)) - python_bin = os.path.realpath(sys.executable) - python_bin_path = os.path.dirname(python_bin) - - def _get_referenced_libs(m): - # Collect referenced libraries from MachO object. - referenced_libs = set() - for header in m.headers: - for idx, name, lib in header.walkRelocatables(): - referenced_libs.add(lib) - return referenced_libs - - def _get_run_paths(m): - # Find LC_RPATH commands to collect rpaths from MachO object. - # macholib does not handle @rpath, so we need to handle run paths ourselves. - run_paths = [] - for header in m.headers: - for command in header.commands: - # A command is a tuple like: - # (, - # , - # '../lib\x00\x00') - cmd_type = command[0].cmd - if cmd_type == LC_RPATH: - rpath = command[2].decode('utf-8') - # Remove trailing '\x00' characters. E.g., '../lib\x00\x00' - rpath = rpath.rstrip('\x00') - # If run path starts with @, ensure it starts with either @loader_path or @executable_path. - # We cannot process anything else. - if rpath.startswith("@") and not rpath.startswith(("@executable_path", "@loader_path")): - logger.warning("Unsupported rpath format %r found in binary %r - ignoring...", rpath, filename) - continue - run_paths.append(rpath) - return run_paths - - @functools.lru_cache - def get_run_paths_and_referenced_libs(filename): - # Walk through Mach-O headers, and collect all referenced libraries and run paths. - m = MachO(filename) - return _get_referenced_libs(m), _get_run_paths(m) - - @functools.lru_cache - def get_run_paths(filename): - # Walk through Mach-O headers, and collect only run paths. - return _get_run_paths(MachO(filename)) - - # Collect referenced libraries and run paths from the input binary. - referenced_libs, run_paths = get_run_paths_and_referenced_libs(filename) - - # On macOS, run paths (rpaths) are inherited from the executable that loads the given shared library (or from the - # shared library that loads the given shared library). This means that shared libraries and python binary extensions - # can reference other shared libraries using @rpath without having set any run paths themselves. - # - # In order to simulate the run path inheritance that happens in unfrozen python programs, we need to augment the - # run paths from the given binary with those set by the python interpreter executable (`sys.executable`). Anaconda - # python, for example, sets the run path on the python executable to `@loader_path/../lib`, which allows python - # extensions to reference shared libraries in the Anaconda environment's `lib` directory via only `@rpath` - # (for example, the `_ssl` extension can reference the OpenSSL library as `@rpath/libssl.3.dylib`). In another - # example, python executable has its run path set to the top-level directory of its .framework bundle; in this - # case the `ssl` extension references the OpenSSL library as `@rpath/Versions/3.10/lib/libssl.1.1.dylib`. - run_paths += get_run_paths(python_bin) - - # This fallback should be fully superseded by the above recovery of run paths from python executable; but for now, - # keep it around in case of unforeseen corner cases. - run_paths.append(os.path.join(compat.base_prefix, 'lib')) - - # De-duplicate run_paths while preserving their order. - run_paths = list(dict.fromkeys(run_paths)) - - def _resolve_using_path(lib): - # Absolute paths should not be resolved; we should just check whether the library exists or not. This used to - # be done using macholib's dyld_find() as well (as it properly handles system libraries that are hidden on - # Big Sur and later), but it turns out that even if given an absolute path, it gives precedence to search paths - # from DYLD_LIBRARY_PATH. This leads to confusing errors when directory in DYLD_LIBRARY_PATH contains a file - # (shared library or data file) that happens to have the same name as a library from a system framework. - if os.path.isabs(lib): - if _dyld_shared_cache_contains_path is not None and _dyld_shared_cache_contains_path(lib): - return lib - if os.path.isfile(lib): - return lib - return None - - try: - return dyld_find(lib) - except ValueError: - return None - - def _resolve_using_loader_path(lib, bin_path, python_bin_path): - # Strictly speaking, @loader_path should be anchored to parent directory of analyzed binary (`bin_path`), while - # @executable_path should be anchored to the parent directory of the process' executable. Typically, this would - # be python executable (`python_bin_path`). Unless we are analyzing a collected 3rd party executable; in that - # case, `bin_path` is correct option. So we first try resolving using `bin_path`, and then fall back to - # `python_bin_path`. This does not account for transitive run paths of higher-order dependencies, but there is - # only so much we can do here... - # - # NOTE: do not use macholib's `dyld_find`, because its fallback search locations might end up resolving wrong - # instance of the library! For example, if our `bin_path` and `python_bin_path` are anchored in an Anaconda - # python environment and the candidate library path does not exit (because we are calling this function when - # trying to resolve @rpath with multiple candidate run paths), we do not want to fall back to eponymous library - # that happens to be present in the Homebrew python environment... - if lib.startswith('@loader_path/'): - lib = lib[len('@loader_path/'):] - elif lib.startswith('@executable_path/'): - lib = lib[len('@executable_path/'):] - - # Try resolving with binary's path first... - resolved_lib = _resolve_using_path(os.path.join(bin_path, lib)) - if resolved_lib is not None: - return resolved_lib - - # ... and fall-back to resolving with python executable's path - return _resolve_using_path(os.path.join(python_bin_path, lib)) - - # Try to resolve full path of the referenced libraries. - for referenced_lib in referenced_libs: - resolved_lib = None - - # If path starts with @rpath, we have to handle it ourselves. - if referenced_lib.startswith('@rpath'): - lib = os.path.join(*referenced_lib.split(os.sep)[1:]) # Remove the @rpath/ prefix - - # Try all run paths. - for run_path in run_paths: - # Join the path. - lib_path = os.path.join(run_path, lib) - - if lib_path.startswith(("@executable_path", "@loader_path")): - # Run path starts with @executable_path or @loader_path. - lib_path = _resolve_using_loader_path(lib_path, bin_path, python_bin_path) - else: - # If run path was relative, anchor it to binary's location. - if not os.path.isabs(lib_path): - os.path.join(bin_path, lib_path) - lib_path = _resolve_using_path(lib_path) - - if lib_path and os.path.exists(lib_path): - resolved_lib = lib_path - break - else: - if referenced_lib.startswith(("@executable_path", "@loader_path")): - resolved_lib = _resolve_using_loader_path(referenced_lib, bin_path, python_bin_path) - else: - resolved_lib = _resolve_using_path(referenced_lib) - - # Fall back to searching the supplied search paths, if any. - if not resolved_lib: - resolved_lib = _resolve_library_path_in_search_paths( - os.path.basename(referenced_lib), # Search for basename of the referenced name. - search_paths, - ) - - # Normalize the resolved path, to remove any extraneous "../" elements. - if resolved_lib: - resolved_lib = os.path.normpath(resolved_lib) - - # Return referenced library name as-is instead of computing a basename. Full referenced name carries additional - # information that might be useful for the caller to determine how to deal with unresolved library (e.g., ignore - # unresolved libraries that are supposed to be located in system-wide directories). - output.add((referenced_lib, resolved_lib)) - - return output - - -#- Library full path resolution - - -def resolve_library_path(name, search_paths=None): - """ - Given a library name, attempt to resolve full path to that library. The search for library is done via - platform-specific mechanism and fall back to optionally-provided list of search paths. Returns None if library - cannot be resolved. If give library name is already an absolute path, the given path is returned without any - processing. - """ - # No-op if path is already absolute. - if os.path.isabs(name): - return name - - if compat.is_unix: - # Use platform-specific helper. - fullpath = _resolve_library_path_unix(name) - if fullpath: - return fullpath - # Fall back to searching the supplied search paths, if any - return _resolve_library_path_in_search_paths(name, search_paths) - elif compat.is_win: - # Try the caller-supplied search paths, if any. - fullpath = _resolve_library_path_in_search_paths(name, search_paths) - if fullpath: - return fullpath - - # Fall back to default Windows search paths, using the PATH environment variable (which should also include - # the system paths, such as c:\windows and c:\windows\system32) - win_search_paths = [path for path in compat.getenv('PATH', '').split(os.pathsep) if path] - return _resolve_library_path_in_search_paths(name, win_search_paths) - else: - return ctypes.util.find_library(name) - - return None - - -# Compatibility aliases for hooks from contributed hooks repository. All of these now point to the high-level -# `resolve_library_path`. -findLibrary = resolve_library_path -findSystemLibrary = resolve_library_path - - -def _resolve_library_path_in_search_paths(name, search_paths=None): - """ - Low-level helper for resolving given library name to full path in given list of search paths. - """ - for search_path in search_paths or []: - fullpath = os.path.join(search_path, name) - if not os.path.isfile(fullpath): - continue - - # On Windows, ensure that architecture matches that of running python interpreter. - if compat.is_win: - try: - dll_machine_type = winutils.get_pe_file_machine_type(fullpath) - except Exception: - # A search path might contain a DLL that we cannot analyze; for example, a stub file. Skip over. - continue - if dll_machine_type != _exe_machine_type: - continue - - return os.path.normpath(fullpath) - - return None - - -def _resolve_library_path_unix(name): - """ - UNIX-specific helper for resolving library path. - - Emulates the algorithm used by dlopen. `name` must include the prefix, e.g., ``libpython2.4.so``. - """ - assert compat.is_unix, "Current implementation for Unix only (Linux, Solaris, AIX, FreeBSD)" - - if name.endswith('.so') or '.so.' in name: - # We have been given full library name that includes suffix. Use `_resolve_library_path_in_search_paths` to find - # the exact match. - lib_search_func = _resolve_library_path_in_search_paths - else: - # We have been given a library name without suffix. Use `_which_library` as search function, which will try to - # find library with matching basename. - lib_search_func = _which_library - - # Look in the LD_LIBRARY_PATH according to platform. - if compat.is_aix: - lp = compat.getenv('LIBPATH', '') - elif compat.is_darwin: - lp = compat.getenv('DYLD_LIBRARY_PATH', '') - else: - lp = compat.getenv('LD_LIBRARY_PATH', '') - lib = lib_search_func(name, filter(None, lp.split(os.pathsep))) - - # Look in /etc/ld.so.cache - # Solaris does not have /sbin/ldconfig. Just check if this file exists. - if lib is None: - utils.load_ldconfig_cache() - lib = utils.LDCONFIG_CACHE.get(name) - if lib: - assert os.path.isfile(lib) - - # Look in the known safe paths. - if lib is None: - # Architecture independent locations. - paths = ['/lib', '/usr/lib'] - # Architecture dependent locations. - if compat.architecture == '32bit': - paths.extend(['/lib32', '/usr/lib32']) - else: - paths.extend(['/lib64', '/usr/lib64']) - # Machine dependent locations. - if compat.machine == 'intel': - if compat.architecture == '32bit': - paths.extend(['/usr/lib/i386-linux-gnu']) - else: - paths.extend(['/usr/lib/x86_64-linux-gnu']) - - # On Debian/Ubuntu /usr/bin/python is linked statically with libpython. Newer Debian/Ubuntu with multiarch - # support puts the libpythonX.Y.so in paths like /usr/lib/i386-linux-gnu/. Try to query the arch-specific - # sub-directory, if available. - arch_subdir = sysconfig.get_config_var('multiarchsubdir') - if arch_subdir: - arch_subdir = os.path.basename(arch_subdir) - paths.append(os.path.join('/usr/lib', arch_subdir)) - else: - logger.debug('Multiarch directory not detected.') - - # Termux (a Ubuntu like subsystem for Android) has an additional libraries directory. - if os.path.isdir('/data/data/com.termux/files/usr/lib'): - paths.append('/data/data/com.termux/files/usr/lib') - - if compat.is_aix: - paths.append('/opt/freeware/lib') - elif compat.is_hpux: - if compat.architecture == '32bit': - paths.append('/usr/local/lib/hpux32') - else: - paths.append('/usr/local/lib/hpux64') - elif compat.is_freebsd or compat.is_openbsd: - paths.append('/usr/local/lib') - lib = lib_search_func(name, paths) - - return lib - - -def _which_library(name, dirs): - """ - Search for a shared library in a list of directories. - - Args: - name: - The library name including the `lib` prefix but excluding any `.so` suffix. - dirs: - An iterable of folders to search in. - Returns: - The path to the library if found or None otherwise. - - """ - matcher = _library_matcher(name) - for path in filter(os.path.exists, dirs): - for _path in os.listdir(path): - if matcher(_path): - return os.path.join(path, _path) - - -def _library_matcher(name): - """ - Create a callable that matches libraries if **name** is a valid library prefix for input library full names. - """ - return re.compile(name + r"[0-9]*\.").match - - -#- Python shared library search - - -def get_python_library_path(): - """ - Find Python shared library that belongs to the current interpreter. - - Return full path to Python dynamic library or None when not found. - - PyInstaller needs to collect the Python shared library, so that bootloader can load it, import Python C API - symbols, and use them to set up the embedded Python interpreter. - - The name of the shared library is typically fixed (`python3.X.dll` on Windows, libpython3.X.so on Unix systems, - and `libpython3.X.dylib` on macOS for shared library builds and `Python.framework/Python` for framework build). - Its location can usually be inferred from the Python interpreter executable, when the latter is dynamically - linked against the shared library. - - However, some situations require extra handling due to various quirks; for example, Debian-based linux - distributions statically link the Python interpreter executable against the Python library, while also providing - a shared library variant for external users. - """ - - # With Windows Python builds, this is pretty straight-forward: `sys.dllhandle` provides a handle to the loaded - # Python DLL, and we can resolve its path using `GetModuleFileName()` from win32 API. - # This is applicable to python.org Windows builds, Anaconda on Windows, and MSYS2 Python. - if compat.is_win: - if hasattr(sys, 'dllhandle'): - import _winapi - return _winapi.GetModuleFileName(sys.dllhandle) - else: - raise PythonLibraryNotFoundError( - "Python was built without a shared library, which is required by PyInstaller." - ) - - # On other (POSIX) platforms, the name of the Python shared library is available in the `INSTSONAME` variable - # exposed by the `sysconfig` module. There is also the `LDLIBRARY` variable, which points to the unversioned .so - # symbolic link for linking purposes; however, we are interested in the actual, fully-versioned soname. - # This should cover all variations in the naming schemes across different platforms as well as different build - # options (debug build, free-threaded build, etc.). - # - # However, `INSTSONAME` points to the shared library only if shared library is enabled; in static-library builds, - # it points to the static library, which is of no use to us. We can check if Python was built with shared library - # (i.e., the `--enable-shared` option) by checking `Py_ENABLE_SHARED` variable, which should be set to 1 in this - # case (and 0 in the case of a static-library build). On macOS, builds made with `--enable-framework` have - # `Py_ENABLE_SHARED` set to 0, but have `PYTHONFRAMEWORK`set to a non-empty string. - # - # The above description is further complicated by the fact that in some Python builds, the `python` executable is - # built against static Python library, and the shared library is built separately and provided for development and - # for embedders (such as PyInstaller). Presumably, this is done for performance reasons. Also, it is enabled by the - # fact that on POSIX, Python extensions do not need to have the referenced Python symbols resolved at link-time; - # rather, these symbols can be resolved at run-time from the running Python process (and are effectively provided - # by the `python` executable). Such builds come in two variants. In the first variant, `Py_ENABLE_SHARED` is 0 and - # `INSTSONAME` points to the static library; an example of such build is Anaconda Python. In the second variant, - # `Py_ENABLE_SHARED` is 1 and `INSTSONAME` points to the shared library, but `python` executable is not linked - # against it; examples of such build are Debian-packaged Python and `astral-sh/python-build-standalone` Python. - # - # Therefore, our strategy is as follows: if we determine that shared library was enabled (via `Py_ENABLE_SHARED` - # on all platforms and/or via `PYTHONFRAMEWORK` on macOS), we use the name given by `INSTSONAME`. First, we try - # to locate it by analyzing binary dependencies of `python` executable (regular shared-library-enabled build), - # then fall back to standard search locations (second variant of static-executable-with-separate-shared-library). - # If `Py_ENABLE_SHARED` is set to 0, we try to guess the library name based on version and feature flags, but we - # search only `sys.base_prefix` and `lib` directory under `sys.base_prefix`; if the shared library is not found - # there, we assume it is unavailable and raise an error. This attempts to accommodate Anaconda python (and corner - # cases when we cannot reliably identify Anaconda python - see #9273) and prevent accidental bundling of - # system-wide Python shared library in cases when user tries to use custom Python build without shared library. - - def _find_lib_in_libdirs(name, *libdirs): - for libdir in libdirs: - full_path = os.path.join(libdir, name) - if not os.path.exists(full_path): - continue - # Resolve potential symbolic links to achieve consistent results with linker-based search; e.g., on - # POSIX systems, linker resolves unversioned library names (python3.X.so) to versioned ones - # (libpython3.X.so.1.0) due to former being symbolic links to the latter. See #6831. - full_path = os.path.realpath(full_path) - if not os.path.exists(full_path): - continue - return full_path - return None - - is_shared = ( - # Builds made with `--enable-shared` have `Py_ENABLE_SHARED` set to 1. This is true even for Debian-packaged - # Python, which has the `python` executable statically linked against the Python library. - sysconfig.get_config_var("Py_ENABLE_SHARED") or - # On macOS, builds made with `--enable-framework` have `Py_ENABLE_SHARED` set to 0, but have `PYTHONFRAMEWORK` - # set to a non-empty string. - (compat.is_darwin and sysconfig.get_config_var("PYTHONFRAMEWORK")) - ) - - if not is_shared: - # Anaconda Python; this codepath used to be under `compat.is_conda` switch, but we may also be dealing with - # Anaconda Python without `conda-meta` directory (see #9273). Or some other Python build where shared library - # is provided but `Py_ENABLE_SHARED` is set to 0. - py_major, py_minor = sys.version_info[:2] - py_suffix = "t" if compat.is_nogil else "" # TODO: does Anaconda provide debug builds with "d" suffix? - if compat.is_darwin: - # macOS - expected_name = f"libpython{py_major}.{py_minor}{py_suffix}.dylib" - else: - # Linux; assume any other potential POSIX builds use the same naming scheme. - expected_name = f"libpython{py_major}.{py_minor}{py_suffix}.so.1.0" - - # Allow the library to be only in `sys.base_prefix` or the `lib` directory under it. This should prevent us from - # picking up an unrelated copy of shared library that might happen to be available in standard search path, when - # we should instead be raising an error due to Python having been built without a shared library. (In true - # static-library builds, Python's own extension modules are usually turned into built-ins. So picking up an - # unrelated Python shared library that happens to be of the same version results in run-time errors due to - # missing extensions - because in the build that produced the shared library, those extensions are expected to - # be external extension modules!) - python_libname = _find_lib_in_libdirs( - expected_name, # Full name - compat.base_prefix, - os.path.join(compat.base_prefix, 'lib'), - ) - if python_libname: - return python_libname - - # Raise PythonLibraryNotFoundError - option_str = ( - "either the `--enable-shared` or the `--enable-framework` option" - if compat.is_darwin else "the `--enable-shared` option" - ) - raise PythonLibraryNotFoundError( - "Python was built without a shared library, which is required by PyInstaller. " - f"If you built Python from source, rebuild it with {option_str}." - ) - - # Use the library name from `INSTSONAME`. - expected_name = sysconfig.get_config_var('INSTSONAME') - - # In Cygwin builds (and also MSYS2 python, although that should be handled by Windows-specific codepath...), - # INSTSONAME is available, but the name has a ".dll.a" suffix; remove that trailing ".a". - if (compat.is_win or compat.is_cygwin) and os.path.normcase(expected_name).endswith('.dll.a'): - expected_name = expected_name[:-2] - - # NOTE: on macOS with .framework bundle build, INSTSONAME contains full name of the .framework library, for example - # `Python.framework/Versions/3.13/Python`. Pre-compute a basename for comparisons that are using only basename. - expected_basename = os.path.normcase(os.path.basename(expected_name)) - - # First, try to find the expected name among the libraries against which the Python executable is linked. This - # assumes that the Python executable was not statically linked against the library (as is the case with - # Debian-packaged Python or `astral-sh/python-build-standalone` Python). - imported_libraries = get_imports(compat.python_executable) # (name, fullpath) tuples - for _, lib_path in imported_libraries: - if lib_path is None: - continue # Skip unresolved imports - if os.path.normcase(os.path.basename(lib_path)) == expected_basename: # Basename comparison - # Python library found. Return absolute path to it. - return lib_path - - # As a fallback, try to find the library in several "standard" search locations... - - # First, search the `sys.base_prefix` and `lib` directory in `sys.base_prefix`, as these locations have the closest - # ties to our current Python process. This caters to builds such as `astral-sh/python-build-standalone` Python. - python_libname = _find_lib_in_libdirs( - expected_name, # Full name - compat.base_prefix, - os.path.join(compat.base_prefix, 'lib'), - ) - if python_libname: - return python_libname - - # Perform search in the configured library search locations. This should be done after exhausting all other options; - # it primarily caters to Debian-packaged Python, but we need to make sure that we do not collect shared library from - # system-installed Python when the current interpreter is in fact some other Python build (such as, for example, - # `astral-sh/python-build-standalone` Python that is handled in the preceding code block). - python_libname = resolve_library_path(expected_basename) # Basename - if python_libname: - return python_libname - - # Not found. Raise a PythonLibraryNotFoundError with corresponding message. - message = f"ERROR: Python shared library ({expected_name!r}) was not found!" - if compat.is_linux and os.path.isfile('/etc/debian_version'): - # The shared library is provided by `libpython3.x` package (i.e., no need to install full `python3-dev`). - pkg_name = f"libpython3.{sys.version_info.minor}" - message += ( - " If you are using system python on Debian/Ubuntu, you might need to install a separate package by running " - f"`apt install {pkg_name}`." - ) - - raise PythonLibraryNotFoundError(message) - - -#- Binary vs data (re)classification - - -def classify_binary_vs_data(filename): - """ - Classify the given file as either BINARY or a DATA, using appropriate platform-specific method. Returns 'BINARY' - or 'DATA' string depending on the determined file type, or None if classification cannot be performed (non-existing - file, missing tool, and other errors during classification). - """ - - # We cannot classify non-existent files. - if not os.path.isfile(filename): - return None - - # Use platform-specific implementation. - return _classify_binary_vs_data(filename) - - -if compat.is_linux: - - def _classify_binary_vs_data(filename): - # First check for ELF signature, in order to avoid calling `objdump` on every data file, which can be costly. - try: - with open(filename, 'rb') as fp: - sig = fp.read(4) - except Exception: - return None - - if sig != b"\x7FELF": - return "DATA" - - # Verify the binary by checking if `objdump` recognizes the file. The preceding ELF signature check should - # ensure that this is an ELF file, while this check should ensure that it is a valid ELF file. In the future, - # we could try checking that the architecture matches the running platform. - cmd_args = ['objdump', '-a', filename] - try: - p = subprocess.run( - cmd_args, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - stdin=subprocess.DEVNULL, - encoding='utf8', - ) - except Exception: - return None # Failed to run `objdump` or `objdump` unavailable. - - return 'BINARY' if p.returncode == 0 else 'DATA' - -elif compat.is_win: - - @functools.lru_cache() - def _no_op_pefile_gc(): - # Disable pefile's reduntant and very slow call to gc.collect(). See #8762. - import types - import gc - import pefile - - fake_gc = types.ModuleType("gc") - fake_gc.__dict__.update(gc.__dict__) - fake_gc.collect = lambda *_, **__: None - pefile.gc = fake_gc - - def _classify_binary_vs_data(filename): - import pefile - - _no_op_pefile_gc() - - # First check for MZ signature, which should allow us to quickly classify the majority of data files. - try: - with open(filename, 'rb') as fp: - sig = fp.read(2) - except Exception: - return None - - if sig != b"MZ": - return "DATA" - - # Check if the file can be opened using `pefile`. - try: - with pefile.PE(filename, fast_load=True) as pe: # noqa: F841 - pass - return 'BINARY' - except pefile.PEFormatError: - return 'DATA' - except Exception: - pass - - return None - -elif compat.is_darwin: - - def _classify_binary_vs_data(filename): - # See if the file can be opened using `macholib`. - import macholib.MachO - - try: - macho = macholib.MachO.MachO(filename) # noqa: F841 - return 'BINARY' - except Exception: - # TODO: catch only `ValueError`? - pass - - return 'DATA' - -else: - - def _classify_binary_vs_data(filename): - # Classification not implemented for the platform. - return None diff --git a/venv/lib/python3.12/site-packages/PyInstaller/depend/bytecode.py b/venv/lib/python3.12/site-packages/PyInstaller/depend/bytecode.py deleted file mode 100755 index d51ea34..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/depend/bytecode.py +++ /dev/null @@ -1,366 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Tools for searching bytecode for key statements that indicate the need for additional resources, such as data files -and package metadata. - -By *bytecode* I mean the ``code`` object given by ``compile()``, accessible from the ``__code__`` attribute of any -non-builtin function or, in PyInstallerLand, the ``PyiModuleGraph.node("some.module").code`` attribute. The best -guide for bytecode format I have found is the disassembler reference: https://docs.python.org/3/library/dis.html - -This parser implementation aims to combine the flexibility and speed of regex with the clarity of the output of -``dis.dis(code)``. It has not achieved the 2nd, but C'est la vie... - -The biggest clarity killer here is the ``EXTENDED_ARG`` opcode which can appear almost anywhere and therefore needs -to be tiptoed around at every step. If this code needs to expand significantly, I would recommend an upgrade to a -regex-based grammar parsing library such as Reparse. This way, little steps like unpacking ``EXTENDED_ARGS`` can be -defined once then simply referenced forming a nice hierarchy rather than copied everywhere its needed. -""" - -import dis -import re -from types import CodeType -from typing import Pattern - -from PyInstaller import compat - -# opcode name -> opcode map -# Python 3.11 introduced specialized opcodes that are not covered by opcode.opmap (and equivalent dis.opmap), but dis -# has a private map of all opcodes called _all_opmap. So use the latter, if available. -opmap = getattr(dis, '_all_opmap', dis.opmap) - - -def _instruction_to_regex(x: str): - """ - Get a regex-escaped opcode byte from its human readable name. - """ - return re.escape(bytes([opmap[x]])) - - -def bytecode_regex(pattern: bytes, flags=re.VERBOSE | re.DOTALL): - """ - A regex-powered Python bytecode matcher. - - ``bytecode_regex`` provides a very thin wrapper around :func:`re.compile`. - - * Any opcode names wrapped in backticks are substituted for their corresponding opcode bytes. - * Patterns are compiled in VERBOSE mode by default so that whitespace and comments may be used. - - This aims to mirror the output of :func:`dis.dis`, which is far more readable than looking at raw byte strings. - """ - assert isinstance(pattern, bytes) - - # Replace anything wrapped in backticks with regex-escaped opcodes. - pattern = re.sub( - rb"`(\w+)`", - lambda m: _instruction_to_regex(m[1].decode()), - pattern, - ) - return re.compile(pattern, flags=flags) - - -def finditer(pattern: Pattern, string: bytes): - """ - Call ``pattern.finditer(string)``, but remove any matches beginning on an odd byte (i.e., matches where - match.start() is not a multiple of 2). - - This should be used to avoid false positive matches where a bytecode pair's argument is mistaken for an opcode. - """ - assert isinstance(string, bytes) - string = _cleanup_bytecode_string(string) - matches = pattern.finditer(string) - while True: - for match in matches: - if match.start() % 2 == 0: - # All is good. This match starts on an OPCODE. - yield match - else: - # This match has started on an odd byte, meaning that it is a false positive and should be skipped. - # There is a very slim chance that a genuine match overlaps this one and, because re.finditer() does not - # allow overlapping matches, it would be lost. To avoid that, restart the regex scan, starting at the - # next even byte. - matches = pattern.finditer(string, match.start() + 1) - break - else: - break - - -# Opcodes involved in function calls with constant arguments. The differences between python versions are handled by -# variables below, which are then used to construct the _call_function_bytecode regex. -# NOTE1: the _OPCODES_* entries are typically used in (non-capturing) groups that match the opcode plus an arbitrary -# argument. But because the entries themselves may contain more than on opcode (with OR operator between them), they -# themselves need to be enclosed in another (non-capturing) group. E.g., "(?:(?:_OPCODES_FUNCTION_GLOBAL).)". -# NOTE2: _OPCODES_EXTENDED_ARG2 is an exception, as it is used as a list of opcodes to exclude, i.e., -# "[^_OPCODES_EXTENDED_ARG2]". Therefore, multiple opcodes are not separated by the OR operator. -if not compat.is_py311: - # Python 3.7 introduced two new function-related opcodes, LOAD_METHOD and CALL_METHOD - _OPCODES_EXTENDED_ARG = rb"`EXTENDED_ARG`" - _OPCODES_EXTENDED_ARG2 = _OPCODES_EXTENDED_ARG - _OPCODES_FUNCTION_GLOBAL = rb"`LOAD_NAME`|`LOAD_GLOBAL`|`LOAD_FAST`" - _OPCODES_FUNCTION_LOAD = rb"`LOAD_ATTR`|`LOAD_METHOD`" - _OPCODES_FUNCTION_ARGS = rb"`LOAD_CONST`" - _OPCODES_FUNCTION_CALL = rb"`CALL_FUNCTION`|`CALL_METHOD`|`CALL_FUNCTION_EX`" - - def _cleanup_bytecode_string(bytecode): - return bytecode # Nothing to do here -elif not compat.is_py312: - # Python 3.11 removed CALL_FUNCTION and CALL_METHOD, and replaced them with PRECALL + CALL instruction sequence. - # As both PRECALL and CALL have the same parameter (the argument count), we need to match only up to the PRECALL. - # The CALL_FUNCTION_EX is still present. - # From Python 3.11b1 on, there is an EXTENDED_ARG_QUICK specialization opcode present. - _OPCODES_EXTENDED_ARG = rb"`EXTENDED_ARG`|`EXTENDED_ARG_QUICK`" - _OPCODES_EXTENDED_ARG2 = rb"`EXTENDED_ARG``EXTENDED_ARG_QUICK`" # Special case; see note above the if/else block! - _OPCODES_FUNCTION_GLOBAL = rb"`LOAD_NAME`|`LOAD_GLOBAL`|`LOAD_FAST`" - _OPCODES_FUNCTION_LOAD = rb"`LOAD_ATTR`|`LOAD_METHOD`" - _OPCODES_FUNCTION_ARGS = rb"`LOAD_CONST`" - _OPCODES_FUNCTION_CALL = rb"`PRECALL`|`CALL_FUNCTION_EX`" - - # Starting with python 3.11, the bytecode is peppered with CACHE instructions (which dis module conveniently hides - # unless show_caches=True is used). Dealing with these CACHE instructions in regex rules is going to render them - # unreadable, so instead we pre-process the bytecode and filter the offending opcodes out. - _cache_instruction_filter = bytecode_regex(rb"(`CACHE`.)|(..)") - - def _cleanup_bytecode_string(bytecode): - return _cache_instruction_filter.sub(rb"\2", bytecode) -else: - # Python 3.12 merged EXTENDED_ARG_QUICK back in to EXTENDED_ARG, and LOAD_METHOD in to LOAD_ATTR - # PRECALL is no longer a valid key - _OPCODES_EXTENDED_ARG = rb"`EXTENDED_ARG`" - _OPCODES_EXTENDED_ARG2 = _OPCODES_EXTENDED_ARG - if compat.is_py314: - # Python 3.14.0a7 added LOAD_FAST_BORROW. - _OPCODES_FUNCTION_GLOBAL = rb"`LOAD_NAME`|`LOAD_GLOBAL`|`LOAD_FAST`|`LOAD_FAST_BORROW`" - else: - _OPCODES_FUNCTION_GLOBAL = rb"`LOAD_NAME`|`LOAD_GLOBAL`|`LOAD_FAST`" - _OPCODES_FUNCTION_LOAD = rb"`LOAD_ATTR`" - if compat.is_py314: - # Python 3.14.0a2 split LOAD_CONST into LOAD_CONST, LOAD_IMMORTAL_CONST, and LOAD_SMALL_INT. - # https://github.com/python/cpython/commit/faa3272fb8d63d481a136cc0467a0cba6ed7b264 - _OPCODES_FUNCTION_ARGS = rb"`LOAD_CONST`|`LOAD_SMALL_INT`|`LOAD_CONST_IMMORTAL`" - else: - _OPCODES_FUNCTION_ARGS = rb"`LOAD_CONST`" - _OPCODES_FUNCTION_CALL = rb"`CALL`|`CALL_FUNCTION_EX`" - - # In Python 3.13, PUSH_NULL opcode is emitted after the LOAD_NAME (and after LOAD_ATTR opcode(s), if applicable). - # In python 3.11 and 3.12, it was emitted before the LOAD_NAME, and thus fell outside of our regex matching; now, - # we have to deal with it. But, instead of trying to add it to matching rules and adjusting the post-processing - # to deal with it, we opt to filter them out (at the same time as we filter out CACHE opcodes), and leave the rest - # of processing untouched. - if compat.is_py313: - _cache_instruction_filter = bytecode_regex(rb"(`CACHE`.)|(`PUSH_NULL`.)|(..)") - - def _cleanup_bytecode_string(bytecode): - return _cache_instruction_filter.sub(rb"\3", bytecode) - else: - _cache_instruction_filter = bytecode_regex(rb"(`CACHE`.)|(..)") - - def _cleanup_bytecode_string(bytecode): - return _cache_instruction_filter.sub(rb"\2", bytecode) - - -# language=PythonVerboseRegExp -_call_function_bytecode = bytecode_regex( - rb""" - # Matches `global_function('some', 'constant', 'arguments')`. - - # Load the global function. In code with >256 of names, this may require extended name references. - ( - (?:(?:""" + _OPCODES_EXTENDED_ARG + rb""").)* - (?:(?:""" + _OPCODES_FUNCTION_GLOBAL + rb""").) - ) - - # For foo.bar.whizz(), the above is the 'foo', below is the 'bar.whizz' (one opcode per name component, each - # possibly preceded by name reference extension). - ( - (?: - (?:(?:""" + _OPCODES_EXTENDED_ARG + rb""").)* - (?:""" + _OPCODES_FUNCTION_LOAD + rb"""). - )* - ) - - # Load however many arguments it takes. These (for now) must all be constants. - # Again, code with >256 constants may need extended enumeration. - ( - (?: - (?:(?:""" + _OPCODES_EXTENDED_ARG + rb""").)* - (?:""" + _OPCODES_FUNCTION_ARGS + rb"""). - )* - ) - - # Call the function. If opcode is CALL_FUNCTION_EX, the parameter are flags. For other opcodes, the parameter - # is the argument count (which may be > 256). - ( - (?:(?:""" + _OPCODES_EXTENDED_ARG + rb""").)* - (?:""" + _OPCODES_FUNCTION_CALL + rb"""). - ) -""" -) - -# language=PythonVerboseRegExp -_extended_arg_bytecode = bytecode_regex( - rb"""( - # Arbitrary number of EXTENDED_ARG pairs. - (?:(?:""" + _OPCODES_EXTENDED_ARG + rb""").)* - - # Followed by some other instruction (usually a LOAD). - [^""" + _OPCODES_EXTENDED_ARG2 + rb"""]. -)""" -) - - -def extended_arguments(extended_args: bytes): - """ - Unpack the (extended) integer used to reference names or constants. - - The input should be a bytecode snippet of the following form:: - - EXTENDED_ARG ? # Repeated 0-4 times. - LOAD_xxx ? # Any of LOAD_NAME/LOAD_CONST/LOAD_METHOD/... - - Each ? byte combined together gives the number we want. - """ - return int.from_bytes(extended_args[1::2], "big") - - -def load(raw: bytes, code: CodeType) -> str: - """ - Parse an (extended) LOAD_xxx instruction. - """ - # Get the enumeration. - index = extended_arguments(raw) - - # Work out what that enumeration was for (constant/local var/global var). - - # If the last instruction byte is a LOAD_FAST: - if raw[-2] == opmap["LOAD_FAST"]: - # Then this is a local variable. - return code.co_varnames[index] - # Or if it is a LOAD_CONST: - if raw[-2] == opmap["LOAD_CONST"]: - # Then this is a literal. - return code.co_consts[index] - # Otherwise, it is a global name. - if compat.is_py311 and raw[-2] == opmap["LOAD_GLOBAL"]: - # In python 3.11, namei>>1 is pushed on stack... - return code.co_names[index >> 1] - if compat.is_py312 and raw[-2] == opmap["LOAD_ATTR"]: - # In python 3.12, namei>>1 is pushed on stack... - return code.co_names[index >> 1] - if compat.is_py314 and raw[-2] == opmap["LOAD_SMALL_INT"]: - # python 3.14 introduced LOAD_SMALL_INT, which pushes its argument (int value < 256) on the stack - return index - if compat.is_py314 and raw[-2] == opmap["LOAD_CONST_IMMORTAL"]: - # python 3.14 introduced LOAD_CONST_IMMORTAL, which pushes co_consts[consti] on the stack. This is intended to - # be a variant of LOAD_CONST for constants that are known to be immortal. - return code.co_consts[index] - if compat.is_py314 and raw[-2] == opmap["LOAD_FAST_BORROW"]: - # python 3.14 introduced LOAD_FAST_BORROW, which pushes a borrowed reference to the local co_varnames[var_num] - # onto the stack. - return code.co_varnames[index] - - return code.co_names[index] - - -def loads(raw: bytes, code: CodeType) -> list: - """ - Parse multiple consecutive LOAD_xxx instructions. Or load() in a for loop. - - May be used to unpack a function's parameters or nested attributes ``(foo.bar.pop.whack)``. - """ - return [load(i, code) for i in _extended_arg_bytecode.findall(raw)] - - -def function_calls(code: CodeType) -> list: - """ - Scan a code object for all function calls on constant arguments. - """ - match: re.Match - out = [] - - for match in finditer(_call_function_bytecode, code.co_code): - function_root, methods, args, function_call = match.groups() - - # For foo(): - # `function_root` contains 'foo' and `methods` is empty. - # For foo.bar.whizz(): - # `function_root` contains 'foo' and `methods` contains the rest. - function_root = load(function_root, code) - methods = loads(methods, code) - function = ".".join([function_root] + methods) - - args = loads(args, code) - if function_call[0] == opmap['CALL_FUNCTION_EX']: - flags = extended_arguments(function_call) - if flags != 0: - # Keyword arguments present. Unhandled at the moment. - continue - # In calls with const arguments, args contains a single - # tuple with all values. - if len(args) != 1 or not isinstance(args[0], tuple): - continue - args = list(args[0]) - else: - arg_count = extended_arguments(function_call) - - if arg_count != len(args): - # This happens if there are variable or keyword arguments. Bail out in either case. - continue - - out.append((function, args)) - - return out - - -def search_recursively(search: callable, code: CodeType, _memo=None) -> dict: - """ - Apply a search function to a code object, recursing into child code objects (function definitions). - """ - if _memo is None: - _memo = {} - if code not in _memo: - _memo[code] = search(code) - for const in code.co_consts: - if isinstance(const, CodeType): - search_recursively(search, const, _memo) - return _memo - - -def recursive_function_calls(code: CodeType) -> dict: - """ - Scan a code object for function calls on constant arguments, recursing into function definitions and bodies of - comprehension loops. - """ - return search_recursively(function_calls, code) - - -def any_alias(full_name: str): - """List possible aliases of a fully qualified Python name. - - >>> list(any_alias("foo.bar.wizz")) - ['foo.bar.wizz', 'bar.wizz', 'wizz'] - - This crudely allows us to capture uses of wizz() under any of - :: - import foo - foo.bar.wizz() - :: - from foo import bar - bar.wizz() - :: - from foo.bar import wizz - wizz() - - However, it will fail for any form of aliases and quite likely find false matches. - """ - parts = full_name.split('.') - while parts: - yield ".".join(parts) - parts = parts[1:] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/depend/dylib.py b/venv/lib/python3.12/site-packages/PyInstaller/depend/dylib.py deleted file mode 100755 index b351dcd..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/depend/dylib.py +++ /dev/null @@ -1,379 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Manipulating with dynamic libraries. -""" - -import os -import pathlib -import re -import sys - -from PyInstaller import compat -import PyInstaller.log as logging - -logger = logging.getLogger(__name__) - -# Ignoring some system libraries speeds up packaging process -_excludes = { - # Ignore annoying warnings with Windows system DLLs. - # - # 'W: library kernel32.dll required via ctypes not found' - # 'W: library coredll.dll required via ctypes not found' - # - # These these dlls has to be ignored for all operating systems because they might be resolved when scanning code for - # ctypes dependencies. - r'advapi32\.dll', - r'ws2_32\.dll', - r'gdi32\.dll', - r'oleaut32\.dll', - r'shell32\.dll', - r'ole32\.dll', - r'coredll\.dll', - r'crypt32\.dll', - r'kernel32', - r'kernel32\.dll', - r'msvcrt\.dll', - r'rpcrt4\.dll', - r'user32\.dll', - # Some modules tries to import the Python library. e.g. pyreadline.console.console - r'python\%s\%s', -} - -# Regex includes - overrides excludes. Include list is used only to override specific libraries from exclude list. -_includes = set() - -_win_includes = { - # We need to allow collection of Visual Studio C++ (VC) runtime DLLs from system directories in order to avoid - # missing DLL errors when the frozen application is run on a system that does not have the corresponding VC - # runtime installed. The VC runtime DLLs may be dependencies of python shared library itself or of extension - # modules provided by 3rd party packages. - - # Visual Studio 2010 (VC10) runtime - # http://msdn.microsoft.com/en-us/library/8kche8ah(v=vs.100).aspx - r'atl100\.dll', - r'msvcr100\.dll', - r'msvcp100\.dll', - r'mfc100\.dll', - r'mfc100u\.dll', - r'mfcmifc80\.dll', - r'mfcm100\.dll', - r'mfcm100u\.dll', - - # Visual Studio 2012 (VC11) runtime - # https://docs.microsoft.com/en-us/visualstudio/releases/2013/2012-redistribution-vs - # - # VC110.ATL - r'atl110\.dll', - # VC110.CRT - r'msvcp110\.dll', - r'msvcr110\.dll', - r'vccorlib110\.dll', - # VC110.CXXAMP - r'vcamp110\.dll', - # VC110.MFC - r'mfc110\.dll', - r'mfc110u\.dll', - r'mfcm110\.dll', - r'mfcm110u\.dll', - # VC110.MFCLOC - r'mfc110chs\.dll', - r'mfc110cht\.dll', - r'mfc110enu\.dll', - r'mfc110esn\.dll', - r'mfc110deu\.dll', - r'mfc110fra\.dll', - r'mfc110ita\.dll', - r'mfc110jpn\.dll', - r'mfc110kor\.dll', - r'mfc110rus\.dll', - # VC110.OpenMP - r'vcomp110\.dll', - # DIA SDK - r'msdia110\.dll', - - # Visual Studio 2013 (VC12) runtime - # https://docs.microsoft.com/en-us/visualstudio/releases/2013/2013-redistribution-vs - # - # VC120.CRT - r'msvcp120\.dll', - r'msvcr120\.dll', - r'vccorlib120\.dll', - # VC120.CXXAMP - r'vcamp120\.dll', - # VC120.MFC - r'mfc120\.dll', - r'mfc120u\.dll', - r'mfcm120\.dll', - r'mfcm120u\.dll', - # VC120.MFCLOC - r'mfc120chs\.dll', - r'mfc120cht\.dll', - r'mfc120deu\.dll', - r'mfc120enu\.dll', - r'mfc120esn\.dll', - r'mfc120fra\.dll', - r'mfc120ita\.dll', - r'mfc120jpn\.dll', - r'mfc120kor\.dll', - r'mfc120rus\.dll', - # VC120.OPENMP - r'vcomp120\.dll', - # DIA SDK - r'msdia120\.dll', - # Cpp REST Windows SDK - r'casablanca120.winrt\.dll', - # Mobile Services Cpp Client - r'zumosdk120.winrt\.dll', - # Cpp REST SDK - r'casablanca120\.dll', - - # Universal C Runtime Library (since Visual Studio 2015) - # - # NOTE: these should be put under a switch, as they need not to be bundled if deployment target is Windows 10 - # and later, as "UCRT is now a system component in Windows 10 and later, managed by Windows Update". - # (https://docs.microsoft.com/en-us/cpp/windows/determining-which-dlls-to-redistribute?view=msvc-170) - # And as discovered in #6326, Windows prefers system-installed version over the bundled one, anyway - # (see https://docs.microsoft.com/en-us/cpp/windows/universal-crt-deployment?view=msvc-170#local-deployment). - r'api-ms-win-core.*', - r'api-ms-win-crt.*', - r'ucrtbase\.dll', - - # Visual Studio 2015/2017/2019/2022 (VC14) runtime - # https://docs.microsoft.com/en-us/visualstudio/releases/2022/redistribution - # - # VC141.CRT/VC142.CRT/VC143.CRT - r'concrt140\.dll', - r'msvcp140\.dll', - r'msvcp140_1\.dll', - r'msvcp140_2\.dll', - r'msvcp140_atomic_wait\.dll', - r'msvcp140_codecvt_ids\.dll', - r'vccorlib140\.dll', - r'vcruntime140\.dll', - r'vcruntime140_1\.dll', - # VC141.CXXAMP/VC142.CXXAMP/VC143.CXXAMP - r'vcamp140\.dll', - # VC141.OpenMP/VC142.OpenMP/VC143.OpenMP - r'vcomp140\.dll', - # DIA SDK - r'msdia140\.dll', - - # Allow pythonNN.dll, pythoncomNN.dll, pywintypesNN.dll - r'py(?:thon(?:com(?:loader)?)?|wintypes)\d+\.dll', -} - -_win_excludes = { - # On Windows, only .dll files can be loaded. - r'.*\.so', - r'.*\.dylib', - - # MS assembly excludes - r'Microsoft\.Windows\.Common-Controls', -} - -_unix_excludes = { - r'libc\.so(\..*)?', - r'libdl\.so(\..*)?', - r'libm\.so(\..*)?', - r'libpthread\.so(\..*)?', - r'librt\.so(\..*)?', - r'libthread_db\.so(\..*)?', - # glibc regex excludes. - r'ld-linux\.so(\..*)?', - r'libBrokenLocale\.so(\..*)?', - r'libanl\.so(\..*)?', - r'libcidn\.so(\..*)?', - r'libcrypt\.so(\..*)?', - r'libnsl\.so(\..*)?', - r'libnss_compat.*\.so(\..*)?', - r'libnss_dns.*\.so(\..*)?', - r'libnss_files.*\.so(\..*)?', - r'libnss_hesiod.*\.so(\..*)?', - r'libnss_nis.*\.so(\..*)?', - r'libnss_nisplus.*\.so(\..*)?', - r'libresolv\.so(\..*)?', - r'libutil\.so(\..*)?', - # graphical interface libraries come with graphical stack (see libglvnd) - r'libE?(Open)?GLX?(ESv1_CM|ESv2)?(dispatch)?\.so(\..*)?', - r'libdrm\.so(\..*)?', - # a subset of libraries included as part of the Nvidia Linux Graphics Driver as of 520.56.06: - # https://download.nvidia.com/XFree86/Linux-x86_64/520.56.06/README/installedcomponents.html - r'nvidia_drv\.so', - r'libglxserver_nvidia\.so(\..*)?', - r'libnvidia-egl-(gbm|wayland)\.so(\..*)?', - r'libnvidia-(cfg|compiler|e?glcore|glsi|glvkspirv|rtcore|allocator|tls|ml)\.so(\..*)?', - r'lib(EGL|GLX)_nvidia\.so(\..*)?', - # libcuda.so, libcuda.so.1, and libcuda.so.{version} are run-time part of NVIDIA driver, and should not be - # collected, as they need to match the rest of driver components on the target system. - r'libcuda\.so(\..*)?', - r'libcudadebugger\.so(\..*)?', - # libxcb-dri changes ABI frequently (e.g.: between Ubuntu LTS releases) and is usually installed as dependency of - # the graphics stack anyway. No need to bundle it. - r'libxcb\.so(\..*)?', - r'libxcb-dri.*\.so(\..*)?', - # system running a Wayland compositor should already have these libraries - # in versions that should not conflict with system drivers, unlike bundled - r'libwayland.*\.so(\..*)?', -} - -_aix_excludes = { - r'libbz2\.a', - r'libc\.a', - r'libC\.a', - r'libcrypt\.a', - r'libdl\.a', - r'libintl\.a', - r'libpthreads\.a', - r'librt\\.a', - r'librtl\.a', - r'libz\.a', -} - -_solaris_excludes = { - r'libsocket\.so(\..*)?', -} - -_cygwin_excludes = { - r'cygwin1\.dll', -} - -if compat.is_win: - _includes |= _win_includes - _excludes |= _win_excludes -elif compat.is_cygwin: - _excludes |= _cygwin_excludes -elif compat.is_aix: - # The exclude list for AIX differs from other *nix platforms. - _excludes |= _aix_excludes -elif compat.is_solar: - # The exclude list for Solaris differs from other *nix platforms. - _excludes |= _solaris_excludes - _excludes |= _unix_excludes -elif compat.is_unix: - # Common excludes for *nix platforms -- except AIX. - _excludes |= _unix_excludes - - -class MatchList: - def __init__(self, entries): - self._regex = re.compile('|'.join(entries), re.I) if entries else None - - def check_library(self, libname): - if self._regex: - return self._regex.match(os.path.basename(libname)) - return False - - -if compat.is_darwin: - import macholib.util - - class MacExcludeList(MatchList): - def __init__(self, entries): - super().__init__(entries) - - def check_library(self, libname): - # Try the global exclude list. - result = super().check_library(libname) - if result: - return result - - # Exclude libraries in standard system locations. - return macholib.util.in_system_path(libname) - - exclude_list = MacExcludeList(_excludes) - include_list = MatchList(_includes) - -elif compat.is_win: - from PyInstaller.utils.win32 import winutils - - class WinExcludeList(MatchList): - def __init__(self, entries): - super().__init__(entries) - - self._windows_dir = pathlib.Path(winutils.get_windows_dir()).resolve() - - # When running as SYSTEM user, the home directory is `%WINDIR%\system32\config\systemprofile`. - self._home_dir = pathlib.Path.home().resolve() - self._system_home = self._windows_dir in self._home_dir.parents - - def check_library(self, libname): - # Try the global exclude list. The global exclude list contains lower-cased names, so lower-case the input - # for case-normalized comparison. - result = super().check_library(libname.lower()) - if result: - return result - - # Exclude everything from the Windows directory by default; but allow contents of user's gome directory if - # that happens to be rooted under Windows directory (e.g., when running PyInstaller as SYSTEM user). - lib_fullpath = pathlib.Path(libname).resolve() - exclude = self._windows_dir in lib_fullpath.parents - if exclude and self._system_home and self._home_dir in lib_fullpath.parents: - exclude = False - return exclude - - exclude_list = WinExcludeList(_excludes) - include_list = MatchList(_includes) -else: - exclude_list = MatchList(_excludes) - include_list = MatchList(_includes) - -_seen_wine_dlls = set() # Used for warning tracking in include_library() - - -def include_library(libname): - """ - Check if the dynamic library should be included with application or not. - """ - if exclude_list.check_library(libname) and not include_list.check_library(libname): - # Library is excluded and is not overridden by include list. It should be excluded. - return False - - # If we are running under Wine and the library is a Wine built-in DLL, ensure that it is always excluded. Typically, - # excluding a DLL leads to an incomplete bundle and run-time errors when the said DLL is not installed on the target - # system. However, having Wine built-in DLLs collected is even more detrimental, as they usually provide Wine's - # implementation of low-level functionality, and therefore cannot be used on actual Windows (i.e., system libraries - # from the C:\Windows\system32 directory that might end up collected due to ``_win_includes`` list; a prominent - # example are VC runtime DLLs, for which Wine provides their own implementation, unless user explicitly installs - # Microsoft's VC redistributable package in their Wine environment). Therefore, excluding the Wine built-in DLLs - # actually improves the chances of the bundle running on Windows, or at least makes the issue easier to debug by - # turning it into the "standard" missing DLL problem. Exclusion should not affect the bundle's ability to run under - # Wine itself, as the excluded DLLs are available there. - if compat.is_win_wine and compat.is_wine_dll(libname): - # Display warning message only once per DLL. Note that it is also displayed only if the DLL were to be included - # in the first place. - if libname not in _seen_wine_dlls: - logger.warning("Excluding Wine built-in DLL: %s", libname) - _seen_wine_dlls.add(libname) - return False - - return True - - -# Patterns for suppressing warnings about missing dynamically linked libraries -_warning_suppressions = [] - -# On some systems (e.g., openwrt), libc.so might point to ldd. Suppress warnings about it. -if compat.is_linux: - _warning_suppressions.append(r'ldd') - -# Suppress warnings about unresolvable UCRT DLLs (see issue #1566) on Windows 10+ -if compat.is_win and sys.getwindowsversion().major >= 10: - _warning_suppressions.append(r'api-ms-win-.*\.dll') - -missing_lib_warning_suppression_list = MatchList(_warning_suppressions) - - -def warn_missing_lib(libname): - """ - Check if a missing-library warning should be displayed for the given library name (or full path). - """ - return not missing_lib_warning_suppression_list.check_library(libname) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/depend/imphook.py b/venv/lib/python3.12/site-packages/PyInstaller/depend/imphook.py deleted file mode 100755 index b4f184a..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/depend/imphook.py +++ /dev/null @@ -1,582 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Code related to processing of import hooks. -""" - -import glob -import os.path -import sys -import weakref -import re - -from PyInstaller import log as logging -from PyInstaller.building.utils import format_binaries_and_datas -from PyInstaller.compat import importlib_load_source -from PyInstaller.depend.imphookapi import PostGraphAPI -from PyInstaller.exceptions import ImportErrorWhenRunningHook - -logger = logging.getLogger(__name__) - - -class ModuleHookCache(dict): - """ - Cache of lazily loadable hook script objects. - - This cache is implemented as a `dict` subclass mapping from the fully-qualified names of all modules with at - least one hook script to lists of `ModuleHook` instances encapsulating these scripts. As a `dict` subclass, - all cached module names and hook scripts are accessible via standard dictionary operations. - - Attributes - ---------- - module_graph : ModuleGraph - Current module graph. - _hook_module_name_prefix : str - String prefixing the names of all in-memory modules lazily loaded from cached hook scripts. See also the - `hook_module_name_prefix` parameter passed to the `ModuleHook.__init__()` method. - """ - - _cache_id_next = 0 - """ - 0-based identifier unique to the next `ModuleHookCache` to be instantiated. - - This identifier is incremented on each instantiation of a new `ModuleHookCache` to isolate in-memory modules of - lazily loaded hook scripts in that cache to the same cache-specific namespace, preventing edge-case collisions - with existing in-memory modules in other caches. - - """ - def __init__(self, module_graph, hook_dirs): - """ - Cache all hook scripts in the passed directories. - - **Order of caching is significant** with respect to hooks for the same module, as the values of this - dictionary are lists. Hooks for the same module will be run in the order in which they are cached. Previously - cached hooks are always preserved rather than overridden. - - By default, official hooks are cached _before_ user-defined hooks. For modules with both official and - user-defined hooks, this implies that the former take priority over and hence will be loaded _before_ the - latter. - - Parameters - ---------- - module_graph : ModuleGraph - Current module graph. - hook_dirs : list - List of the absolute or relative paths of all directories containing **hook scripts** (i.e., - Python scripts with filenames matching `hook-{module_name}.py`, where `{module_name}` is the module - hooked by that script) to be cached. - """ - super().__init__() - - # To avoid circular references and hence increased memory consumption, a weak rather than strong reference is - # stored to the passed graph. Since this graph is guaranteed to live longer than this cache, - # this is guaranteed to be safe. - self.module_graph = weakref.proxy(module_graph) - - # String unique to this cache prefixing the names of all in-memory modules lazily loaded from cached hook - # scripts, privatized for safety. - self._hook_module_name_prefix = '__PyInstaller_hooks_{}_'.format(ModuleHookCache._cache_id_next) - ModuleHookCache._cache_id_next += 1 - - # Cache all hook scripts in the passed directories. - self._cache_hook_dirs(hook_dirs) - - def _cache_hook_dirs(self, hook_dirs): - """ - Cache all hook scripts in the passed directories. - - Parameters - ---------- - hook_dirs : list - List of the absolute or relative paths of all directories containing hook scripts to be cached. - """ - - for hook_dir, default_priority in hook_dirs: - # Canonicalize this directory's path and validate its existence. - hook_dir = os.path.abspath(hook_dir) - if not os.path.isdir(hook_dir): - raise FileNotFoundError('Hook directory "{}" not found.'.format(hook_dir)) - - # For each hook script in this directory... - hook_filenames = glob.glob(os.path.join(hook_dir, 'hook-*.py')) - for hook_filename in hook_filenames: - # Fully-qualified name of this hook's corresponding module, constructed by removing the "hook-" prefix - # and ".py" suffix. - module_name = os.path.basename(hook_filename)[5:-3] - - # Lazily loadable hook object. - module_hook = ModuleHook( - module_graph=self.module_graph, - module_name=module_name, - hook_filename=hook_filename, - hook_module_name_prefix=self._hook_module_name_prefix, - default_priority=default_priority, - ) - - # Add this hook to this module's list of hooks. - module_hooks = self.setdefault(module_name, []) - module_hooks.append(module_hook) - - # Post-processing: we allow only one instance of hook per module. Currently, the priority order is defined - # implicitly, via order of hook directories, so the first hook in the list has the highest priority. - for module_name in self.keys(): - hooks = self[module_name] - if len(hooks) == 1: - self[module_name] = hooks[0] - else: - # Order by priority value, in descending order. - sorted_hooks = sorted(hooks, key=lambda hook: hook.priority, reverse=True) - self[module_name] = sorted_hooks[0] - - def remove_modules(self, *module_names): - """ - Remove the passed modules and all hook scripts cached for these modules from this cache. - - Parameters - ---------- - module_names : list - List of all fully-qualified module names to be removed. - """ - - for module_name in module_names: - # Unload this module's hook script modules from memory. Since these are top-level pure-Python modules cached - # only in the "sys.modules" dictionary, popping these modules from this dictionary suffices to garbage - # collect them. - module_hook = self.pop(module_name, None) # Remove our reference, if available. - if module_hook is not None: - sys.modules.pop(module_hook.hook_module_name, None) - - -def _module_collection_mode_sanitizer(value): - if isinstance(value, dict): - # Hook set a dictionary; use it as-is - return value - elif isinstance(value, str): - # Hook set a mode string; convert to a dictionary and assign the string to `None` (= the hooked module). - return {None: value} - - raise ValueError(f"Invalid module collection mode setting value: {value!r}") - - -def _bindepend_symlink_suppression_sanitizer(value): - if isinstance(value, (list, set)): - # Hook set a list or a set; use it as-is - return set(value) - elif isinstance(value, str): - # Hook set a string; create a set with single element. - return set([value]) - - raise ValueError(f"Invalid value for bindepend_symlink_suppression: {value!r}") - - -# Dictionary mapping the names of magic attributes required by the "ModuleHook" class to 2-tuples "(default_type, -# sanitizer_func)", where: -# -# * "default_type" is the type to which that attribute will be initialized when that hook is lazily loaded. -# * "sanitizer_func" is the callable sanitizing the original value of that attribute defined by that hook into a -# safer value consumable by "ModuleHook" callers if any or "None" if the original value requires no sanitization. -# -# To avoid subtleties in the ModuleHook.__getattr__() method, this dictionary is declared as a module rather than a -# class attribute. If declared as a class attribute and then undefined (...for whatever reason), attempting to access -# this attribute from that method would produce infinite recursion. -_MAGIC_MODULE_HOOK_ATTRS = { - # Collections in which order is insignificant. This includes: - # - # * "datas", sanitized from hook-style 2-tuple lists defined by hooks into TOC-style 2-tuple sets consumable by - # "ModuleHook" callers. - # * "binaries", sanitized in the same way. - 'datas': (set, format_binaries_and_datas), - 'binaries': (set, format_binaries_and_datas), - 'excludedimports': (set, None), - - # Collections in which order is significant. This includes: - # - # * "hiddenimports", as order of importation is significant. On module importation, hook scripts are loaded and hook - # functions declared by these scripts are called. As these scripts and functions can have side effects dependent - # on module importation order, module importation itself can have side effects dependent on this order! - 'hiddenimports': (list, None), - - # Flags - 'warn_on_missing_hiddenimports': (lambda: True, bool), - - # Package/module collection mode dictionary. - 'module_collection_mode': (dict, _module_collection_mode_sanitizer), - - # Path patterns for suppression of symbolic links created by binary dependency analysis. - 'bindepend_symlink_suppression': (set, _bindepend_symlink_suppression_sanitizer), -} - - -class ModuleHook: - """ - Cached object encapsulating a lazy loadable hook script. - - This object exposes public attributes (e.g., `datas`) of the underlying hook script as attributes of the same - name of this object. On the first access of any such attribute, this hook script is lazily loaded into an - in-memory private module reused on subsequent accesses. These dynamic attributes are referred to as "magic." All - other static attributes of this object (e.g., `hook_module_name`) are referred to as "non-magic." - - Attributes (Magic) - ---------- - datas : set - Set of `TOC`-style 2-tuples `(target_file, source_file)` for all external non-executable files required by - the module being hooked, converted from the `datas` list of hook-style 2-tuples `(source_dir_or_glob, - target_dir)` defined by this hook script. - binaries : set - Set of `TOC`-style 2-tuples `(target_file, source_file)` for all external executable files required by the - module being hooked, converted from the `binaries` list of hook-style 2-tuples `(source_dir_or_glob, - target_dir)` defined by this hook script. - excludedimports : set - Set of the fully-qualified names of all modules imported by the module being hooked to be ignored rather than - imported from that module, converted from the `excludedimports` list defined by this hook script. These - modules will only be "locally" rather than "globally" ignored. These modules will remain importable from all - modules other than the module being hooked. - hiddenimports : set - Set of the fully-qualified names of all modules imported by the module being hooked that are _not_ - automatically detectable by PyInstaller (usually due to being dynamically imported in that module), - converted from the `hiddenimports` list defined by this hook script. - warn_on_missing_hiddenimports : bool - Boolean flag indicating whether missing hidden imports from the hook should generate warnings or not. This - behavior is enabled by default, but individual hooks can opt out of it. - module_collection_mode : dict - A dictionary of package/module names and their corresponding collection mode strings ('pyz', 'pyc', 'py', - 'pyz+py', 'py+pyz'). - bindepend_symlink_suppression : set - A set of paths or path patterns corresponding to shared libraries for which binary dependency analysis should - not create symbolic links into top-level application directory. - - Attributes (Non-magic) - ---------- - module_graph : ModuleGraph - Current module graph. - module_name : str - Name of the module hooked by this hook script. - hook_filename : str - Absolute or relative path of this hook script. - hook_module_name : str - Name of the in-memory module of this hook script's interpreted contents. - _hook_module : module - In-memory module of this hook script's interpreted contents, lazily loaded on the first call to the - `_load_hook_module()` method _or_ `None` if this method has yet to be accessed. - _default_priority : int - Default (location-based) priority for this hook. - priority : int - Actual priority for this hook. Might be different from `_default_priority` if hook file specifies the hook - priority override. - """ - - #-- Magic -- - - def __init__(self, module_graph, module_name, hook_filename, hook_module_name_prefix, default_priority): - """ - Initialize this metadata. - - Parameters - ---------- - module_graph : ModuleGraph - Current module graph. - module_name : str - Name of the module hooked by this hook script. - hook_filename : str - Absolute or relative path of this hook script. - hook_module_name_prefix : str - String prefixing the name of the in-memory module for this hook script. To avoid namespace clashes with - similar modules created by other `ModuleHook` objects in other `ModuleHookCache` containers, this string - _must_ be unique to the `ModuleHookCache` container containing this `ModuleHook` object. If this string - is non-unique, an existing in-memory module will be erroneously reused when lazily loading this hook - script, thus erroneously resanitizing previously sanitized hook script attributes (e.g., `datas`) with - the `format_binaries_and_datas()` helper. - default_priority : int - Default, location-based priority for this hook. Used to select active hook when multiple hooks are defined - for the same module. - """ - # Note that the passed module graph is already a weak reference, avoiding circular reference issues. See - # ModuleHookCache.__init__(). TODO: Add a failure message - assert isinstance(module_graph, weakref.ProxyTypes) - self.module_graph = module_graph - self.module_name = module_name - self.hook_filename = hook_filename - - # Default priority; used as fall-back for dynamic `hook_priority` attribute. - self._default_priority = default_priority - - # Name of the in-memory module fabricated to refer to this hook script. - self.hook_module_name = hook_module_name_prefix + self.module_name.replace('.', '_') - - # Attributes subsequently defined by the _load_hook_module() method. - self._loaded = False - self._has_hook_function = False - self._hook_module = None - - def __getattr__(self, attr_name): - """ - Get the magic attribute with the passed name (e.g., `datas`) from this lazily loaded hook script if any _or_ - raise `AttributeError` otherwise. - - This special method is called only for attributes _not_ already defined by this object. This includes - undefined attributes and the first attempt to access magic attributes. - - This special method is _not_ called for subsequent attempts to access magic attributes. The first attempt to - access magic attributes defines corresponding instance variables accessible via the `self.__dict__` instance - dictionary (e.g., as `self.datas`) without calling this method. This approach also allows magic attributes to - be deleted from this object _without_ defining the `__delattr__()` special method. - - See Also - ---------- - Class docstring for supported magic attributes. - """ - - if attr_name == 'priority': - # If attribute is part of hook metadata, read metadata from hook script and return the attribute value. - self._load_hook_metadata() - return getattr(self, attr_name) - if attr_name in _MAGIC_MODULE_HOOK_ATTRS and not self._loaded: - # If attribute is hook's magic attribute, load and run the hook script, and return the attribute value. - self._load_hook_module() - return getattr(self, attr_name) - else: - # This is an undefined attribute. Raise an exception. - raise AttributeError(attr_name) - - def __setattr__(self, attr_name, attr_value): - """ - Set the attribute with the passed name to the passed value. - - If this is a magic attribute, this hook script will be lazily loaded before setting this attribute. Unlike - `__getattr__()`, this special method is called to set _any_ attribute -- including magic, non-magic, - and undefined attributes. - - See Also - ---------- - Class docstring for supported magic attributes. - """ - - # If this is a magic attribute, initialize this attribute by lazy loading this hook script before overwriting - # this attribute. - if attr_name in _MAGIC_MODULE_HOOK_ATTRS: - self._load_hook_module() - - # Set this attribute to the passed value. To avoid recursion, the superclass method rather than setattr() is - # called. - return super().__setattr__(attr_name, attr_value) - - #-- Loading -- - - def _load_hook_metadata(self): - """ - Load hook metadata from its source file. - """ - self.priority = self._default_priority - - # Priority override pattern: `# $PyInstaller-Hook-Priority: ` - priority_pattern = re.compile(r"^\s*#\s*\$PyInstaller-Hook-Priority:\s*(?P[\S]+)") - - with open(self.hook_filename, "r", encoding="utf-8") as f: - for line in f: - # Attempt to match and parse hook priority directive - m = priority_pattern.match(line) - if m is not None: - try: - self.priority = int(m.group('value')) - except Exception: - logger.warning( - "Failed to parse hook priority value string: %r!", m.group('value'), exc_info=True - ) - # Currently, this is our only line of interest, so we can stop the search here. - return - - def _load_hook_module(self, keep_module_ref=False): - """ - Lazily load this hook script into an in-memory private module. - - This method (and, indeed, this class) preserves all attributes and functions defined by this hook script as - is, ensuring sane behaviour in hook functions _not_ expecting unplanned external modification. Instead, - this method copies public attributes defined by this hook script (e.g., `binaries`) into private attributes - of this object, which the special `__getattr__()` and `__setattr__()` methods safely expose to external - callers. For public attributes _not_ defined by this hook script, the corresponding private attributes will - be assigned sane defaults. For some public attributes defined by this hook script, the corresponding private - attributes will be transformed into objects more readily and safely consumed elsewhere by external callers. - - See Also - ---------- - Class docstring for supported attributes. - """ - - # If this hook script module has already been loaded, noop. - if self._loaded and (self._hook_module is not None or not keep_module_ref): - return - - # Load and execute the hook script. Even if mechanisms from the import machinery are used, this does not import - # the hook as the module. - hook_path, hook_basename = os.path.split(self.hook_filename) - logger.info('Processing standard module hook %r from %r', hook_basename, hook_path) - try: - self._hook_module = importlib_load_source(self.hook_module_name, self.hook_filename) - except ImportError: - logger.debug("Hook failed with:", exc_info=True) - raise ImportErrorWhenRunningHook(self.hook_module_name, self.hook_filename) - - # Mark as loaded - self._loaded = True - - # Check if module has hook() function. - self._has_hook_function = hasattr(self._hook_module, 'hook') - - # Copy hook script attributes into magic attributes exposed as instance variables of the current "ModuleHook" - # instance. - for attr_name, (default_type, sanitizer_func) in _MAGIC_MODULE_HOOK_ATTRS.items(): - # Unsanitized value of this attribute. - attr_value = getattr(self._hook_module, attr_name, None) - - # If this attribute is undefined, expose a sane default instead. - if attr_value is None: - attr_value = default_type() - # Else if this attribute requires sanitization, do so. - elif sanitizer_func is not None: - attr_value = sanitizer_func(attr_value) - # Else, expose the unsanitized value of this attribute. - - # Expose this attribute as an instance variable of the same name. - setattr(self, attr_name, attr_value) - - # If module_collection_mode has an entry with None key, reassign it to the hooked module's name. - setattr( - self, 'module_collection_mode', { - key if key is not None else self.module_name: value - for key, value in getattr(self, 'module_collection_mode').items() - } - ) - - # Release the module if we do not need the reference. This is the case when hook is loaded during the analysis - # rather as part of the post-graph operations. - if not keep_module_ref: - self._hook_module = None - - #-- Hooks -- - - def post_graph(self, analysis): - """ - Call the **post-graph hook** (i.e., `hook()` function) defined by this hook script, if any. - - Parameters - ---------- - analysis: build_main.Analysis - Analysis that calls the hook - - This method is intended to be called _after_ the module graph for this application is constructed. - """ - - # Lazily load this hook script into an in-memory module. - # The script might have been loaded before during modulegraph analysis; in that case, it needs to be reloaded - # only if it provides a hook() function. - if not self._loaded or self._has_hook_function: - # Keep module reference when loading the hook, so we can call its hook function! - self._load_hook_module(keep_module_ref=True) - - # Call this hook script's hook() function, which modifies attributes accessed by subsequent methods and - # hence must be called first. - self._process_hook_func(analysis) - - # Order is insignificant here. - self._process_hidden_imports() - - def _process_hook_func(self, analysis): - """ - Call this hook's `hook()` function if defined. - - Parameters - ---------- - analysis: build_main.Analysis - Analysis that calls the hook - """ - - # If this hook script defines no hook() function, noop. - if not hasattr(self._hook_module, 'hook'): - return - - # Call this hook() function. - hook_api = PostGraphAPI(module_name=self.module_name, module_graph=self.module_graph, analysis=analysis) - try: - self._hook_module.hook(hook_api) - except ImportError: - logger.debug("Hook failed with:", exc_info=True) - raise ImportErrorWhenRunningHook(self.hook_module_name, self.hook_filename) - - # Update all magic attributes modified by the prior call. - self.datas.update(set(hook_api._added_datas)) - self.binaries.update(set(hook_api._added_binaries)) - self.hiddenimports.extend(hook_api._added_imports) - self.module_collection_mode.update(hook_api._module_collection_mode) - self.bindepend_symlink_suppression.update(hook_api._bindepend_symlink_suppression) - - # FIXME: `hook_api._deleted_imports` should be appended to `self.excludedimports` and used to suppress module - # import during the modulegraph construction rather than handled here. However, for that to work, the `hook()` - # function needs to be ran during modulegraph construction instead of in post-processing (and this in turn - # requires additional code refactoring in order to be able to pass `analysis` to `PostGraphAPI` object at - # that point). So once the modulegraph rewrite is complete, remove the code block below. - for deleted_module_name in hook_api._deleted_imports: - # Remove the graph link between the hooked module and item. This removes the 'item' node from the graph if - # no other links go to it (no other modules import it) - self.module_graph.removeReference(hook_api.node, deleted_module_name) - - def _process_hidden_imports(self): - """ - Add all imports listed in this hook script's `hiddenimports` attribute to the module graph as if directly - imported by this hooked module. - - These imports are typically _not_ implicitly detectable by PyInstaller and hence must be explicitly defined - by hook scripts. - """ - - # For each hidden import required by the module being hooked... - for import_module_name in self.hiddenimports: - try: - # Graph node for this module. Do not implicitly create namespace packages for non-existent packages. - caller = self.module_graph.find_node(self.module_name, create_nspkg=False) - - # Manually import this hidden import from this module. - self.module_graph.import_hook(import_module_name, caller) - # If this hidden import is unimportable, print a non-fatal warning. Hidden imports often become - # desynchronized from upstream packages and hence are only "soft" recommendations. - except ImportError: - if self.warn_on_missing_hiddenimports: - logger.warning('Hidden import "%s" not found!', import_module_name) - - -class AdditionalFilesCache: - """ - Cache for storing what binaries and datas were pushed by what modules when import hooks were processed. - """ - def __init__(self): - self._binaries = {} - self._datas = {} - - def add(self, modname, binaries, datas): - - self._binaries.setdefault(modname, []) - self._binaries[modname].extend(binaries or []) - self._datas.setdefault(modname, []) - self._datas[modname].extend(datas or []) - - def __contains__(self, name): - return name in self._binaries or name in self._datas - - def binaries(self, modname): - """ - Return list of binaries for given module name. - """ - return self._binaries.get(modname, []) - - def datas(self, modname): - """ - Return list of datas for given module name. - """ - return self._datas.get(modname, []) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/depend/imphookapi.py b/venv/lib/python3.12/site-packages/PyInstaller/depend/imphookapi.py deleted file mode 100755 index 16ce0c1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/depend/imphookapi.py +++ /dev/null @@ -1,486 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Classes facilitating communication between PyInstaller and import hooks. - -PyInstaller passes instances of classes defined by this module to corresponding functions defined by external import -hooks, which commonly modify the contents of these instances before returning. PyInstaller then detects and converts -these modifications into appropriate operations on the current `PyiModuleGraph` instance, thus modifying which -modules will be frozen into the executable. -""" - -from PyInstaller.building.utils import format_binaries_and_datas -from PyInstaller.lib.modulegraph.modulegraph import (RuntimeModule, RuntimePackage) - - -class PreSafeImportModuleAPI: - """ - Metadata communicating changes made by the current **pre-safe import module hook** (i.e., hook run immediately - _before_ a call to `ModuleGraph._safe_import_module()` recursively adding the hooked module, package, - or C extension and all transitive imports thereof to the module graph) back to PyInstaller. - - Pre-safe import module hooks _must_ define a `pre_safe_import_module()` function accepting an instance of this - class, whose attributes describe the subsequent `ModuleGraph._safe_import_module()` call creating the hooked - module's graph node. - - Each pre-safe import module hook is run _only_ on the first attempt to create the hooked module's graph node and - then subsequently ignored. If this hook successfully creates that graph node, the subsequent - `ModuleGraph._safe_import_module()` call will observe this fact and silently return without attempting to - recreate that graph node. - - Pre-safe import module hooks are typically used to create graph nodes for **runtime modules** (i.e., - modules dynamically defined at runtime). Most modules are physically defined in external `.py`-suffixed scripts. - Some modules, however, are dynamically defined at runtime (e.g., `six.moves`, dynamically defined by the - physically defined `six.py` module). However, `ModuleGraph` only parses `import` statements residing in external - scripts. `ModuleGraph` is _not_ a full-fledged, Turing-complete Python interpreter and hence has no means of - parsing `import` statements performed by runtime modules existing only in-memory. - - 'With great power comes great responsibility.' - - - Attributes (Immutable) - ---------------------------- - The following attributes are **immutable** (i.e., read-only). For safety, any attempts to change these attributes - _will_ result in a raised exception: - - module_graph : PyiModuleGraph - Current module graph. - parent_package : Package - Graph node for the package providing this module _or_ `None` if this module is a top-level module. - - Attributes (Mutable) - ----------------------------- - The following attributes are editable. - - module_basename : str - Unqualified name of the module to be imported (e.g., `text`). - module_name : str - Fully-qualified name of this module (e.g., `email.mime.text`). - """ - def __init__(self, module_graph, module_basename, module_name, parent_package): - self._module_graph = module_graph - self.module_basename = module_basename - self.module_name = module_name - self._parent_package = parent_package - - # Immutable properties. No corresponding setters are defined. - @property - def module_graph(self): - """ - Current module graph. - """ - return self._module_graph - - @property - def parent_package(self): - """ - Parent Package of this node. - """ - return self._parent_package - - def add_runtime_module(self, module_name): - """ - Add a graph node representing a non-package Python module with the passed name dynamically defined at runtime. - - Most modules are statically defined on-disk as standard Python files. Some modules, however, are dynamically - defined in-memory at runtime (e.g., `gi.repository.Gst`, dynamically defined by the statically defined - `gi.repository.__init__` module). - - This method adds a graph node representing such a runtime module. Since this module is _not_ a package, - all attempts to import submodules from this module in `from`-style import statements (e.g., the `queue` - submodule in `from six.moves import queue`) will be silently ignored. To circumvent this, simply call - `add_runtime_package()` instead. - - Parameters - ---------- - module_name : str - Fully-qualified name of this module (e.g., `gi.repository.Gst`). - - Examples - ---------- - This method is typically called by `pre_safe_import_module()` hooks, e.g.: - - def pre_safe_import_module(api): - api.add_runtime_module(api.module_name) - """ - - self._module_graph.add_module(RuntimeModule(module_name)) - - def add_runtime_package(self, package_name): - """ - Add a graph node representing a non-namespace Python package with the passed name dynamically defined at - runtime. - - Most packages are statically defined on-disk as standard subdirectories containing `__init__.py` files. Some - packages, however, are dynamically defined in-memory at runtime (e.g., `six.moves`, dynamically defined by - the statically defined `six` module). - - This method adds a graph node representing such a runtime package. All attributes imported from this package - in `from`-style import statements that are submodules of this package (e.g., the `queue` submodule in `from - six.moves import queue`) will be imported rather than ignored. - - Parameters - ---------- - package_name : str - Fully-qualified name of this package (e.g., `six.moves`). - - Examples - ---------- - This method is typically called by `pre_safe_import_module()` hooks, e.g.: - - def pre_safe_import_module(api): - api.add_runtime_package(api.module_name) - """ - - self._module_graph.add_module(RuntimePackage(package_name)) - - def add_alias_module(self, real_module_name, alias_module_name): - """ - Alias the source module to the target module with the passed names. - - This method ensures that the next call to findNode() given the target module name will resolve this alias. - This includes importing and adding a graph node for the source module if needed as well as adding a reference - from the target to the source module. - - Parameters - ---------- - real_module_name : str - Fully-qualified name of the **existing module** (i.e., the module being aliased). - alias_module_name : str - Fully-qualified name of the **non-existent module** (i.e., the alias to be created). - """ - - self._module_graph.alias_module(real_module_name, alias_module_name) - - def append_package_path(self, directory): - """ - Modulegraph does a good job at simulating Python's, but it cannot handle packagepath `__path__` modifications - packages make at runtime. - - Therefore there is a mechanism whereby you can register extra paths in this map for a package, and it will be - honored. - - Parameters - ---------- - directory : str - Absolute or relative path of the directory to be appended to this package's `__path__` attribute. - """ - - self._module_graph.append_package_path(self.module_name, directory) - - -class PreFindModulePathAPI: - """ - Metadata communicating changes made by the current **pre-find module path hook** (i.e., hook run immediately - _before_ a call to `ModuleGraph._find_module_path()` finding the hooked module's absolute path) back to PyInstaller. - - Pre-find module path hooks _must_ define a `pre_find_module_path()` function accepting an instance of this class, - whose attributes describe the subsequent `ModuleGraph._find_module_path()` call to be performed. - - Pre-find module path hooks are typically used to change the absolute path from which a module will be - subsequently imported and thus frozen into the executable. To do so, hooks may overwrite the default - `search_dirs` list of the absolute paths of all directories to be searched for that module: e.g., - - def pre_find_module_path(api): - api.search_dirs = ['/the/one/true/package/providing/this/module'] - - Each pre-find module path hook is run _only_ on the first call to `ModuleGraph._find_module_path()` for the - corresponding module. - - Attributes - ---------- - The following attributes are **mutable** (i.e., modifiable). All changes to these attributes will be immediately - respected by PyInstaller: - - search_dirs : list - List of the absolute paths of all directories to be searched for this module (in order). Searching will halt - at the first directory containing this module. - - Attributes (Immutable) - ---------- - The following attributes are **immutable** (i.e., read-only). For safety, any attempts to change these attributes - _will_ result in a raised exception: - - module_name : str - Fully-qualified name of this module. - module_graph : PyiModuleGraph - Current module graph. For efficiency, this attribute is technically mutable. To preserve graph integrity, - this attribute should nonetheless _never_ be modified. While read-only `PyiModuleGraph` methods (e.g., - `findNode()`) are safely callable from within pre-find module path hooks, methods modifying the graph are - _not_. If graph modifications are required, consider an alternative type of hook (e.g., pre-import module - hooks). - """ - def __init__( - self, - module_graph, - module_name, - search_dirs, - ): - # Mutable attributes. - self.search_dirs = search_dirs - - # Immutable attributes. - self._module_graph = module_graph - self._module_name = module_name - - # Immutable properties. No corresponding setters are defined. - @property - def module_graph(self): - """ - Current module graph. - """ - return self._module_graph - - @property - def module_name(self): - """ - Fully-qualified name of this module. - """ - return self._module_name - - -class PostGraphAPI: - """ - Metadata communicating changes made by the current **post-graph hook** (i.e., hook run for a specific module - transitively imported by the current application _after_ the module graph of all `import` statements performed by - this application has been constructed) back to PyInstaller. - - Post-graph hooks may optionally define a `post_graph()` function accepting an instance of this class, - whose attributes describe the current state of the module graph and the hooked module's graph node. - - Attributes (Mutable) - ---------- - The following attributes are **mutable** (i.e., modifiable). All changes to these attributes will be immediately - respected by PyInstaller: - - module_graph : PyiModuleGraph - Current module graph. - module : Node - Graph node for the currently hooked module. - - 'With great power comes great responsibility.' - - Attributes (Immutable) - ---------- - The following attributes are **immutable** (i.e., read-only). For safety, any attempts to change these attributes - _will_ result in a raised exception: - - __name__ : str - Fully-qualified name of this module (e.g., `six.moves.tkinter`). - __file__ : str - Absolute path of this module. If this module is: - * A standard (rather than namespace) package, this is the absolute path of this package's directory. - * A namespace (rather than standard) package, this is the abstract placeholder `-`. (Don't ask. Don't tell.) - * A non-package module or C extension, this is the absolute path of the corresponding file. - __path__ : list - List of the absolute paths of all directories comprising this package if this module is a package _or_ `None` - otherwise. If this module is a standard (rather than namespace) package, this list contains only the absolute - path of this package's directory. - co : code - Code object compiled from the contents of `__file__` (e.g., via the `compile()` builtin). - analysis: build_main.Analysis - The Analysis that load the hook. - - Attributes (Private) - ---------- - The following attributes are technically mutable but private, and hence should _never_ be externally accessed or - modified by hooks. Call the corresponding public methods instead: - - _added_datas : list - List of the `(name, path)` 2-tuples or TOC objects of all external data files required by the current hook, - defaulting to the empty list. This is equivalent to the global `datas` hook attribute. - _added_imports : list - List of the fully-qualified names of all modules imported by the current hook, defaulting to the empty list. - This is equivalent to the global `hiddenimports` hook attribute. - _added_binaries : list - List of the `(name, path)` 2-tuples or TOC objects of all external C extensions imported by the current hook, - defaulting to the empty list. This is equivalent to the global `binaries` hook attribute. - _module_collection_mode : dict - Dictionary of package/module names and their corresponding collection mode strings. This is equivalent to the - global `module_collection_mode` hook attribute. - _bindepend_symlink_suppression : set - A set of paths or path patterns corresponding to shared libraries for which binary dependency analysis should - not generate symbolic links into top-level application directory. - """ - def __init__(self, module_name, module_graph, analysis): - # Mutable attributes. - self.module_graph = module_graph - self.module = module_graph.find_node(module_name) - assert self.module is not None # should not occur - - # Immutable attributes. - self.___name__ = module_name - self.___file__ = self.module.filename - self._co = self.module.code - self._analysis = analysis - - # To enforce immutability, convert this module's package path if any into an immutable tuple. - self.___path__ = tuple(self.module.packagepath) \ - if self.module.packagepath is not None else None - - #FIXME: Refactor "_added_datas", "_added_binaries", and "_deleted_imports" into sets. Since order of - #import is important, "_added_imports" must remain a list. - - # Private attributes. - self._added_binaries = [] - self._added_datas = [] - self._added_imports = [] - self._deleted_imports = [] - self._module_collection_mode = {} - self._bindepend_symlink_suppression = set() - - # Immutable properties. No corresponding setters are defined. - @property - def __file__(self): - """ - Absolute path of this module's file. - """ - return self.___file__ - - @property - def __path__(self): - """ - List of the absolute paths of all directories comprising this package if this module is a package _or_ `None` - otherwise. If this module is a standard (rather than namespace) package, this list contains only the absolute - path of this package's directory. - """ - return self.___path__ - - @property - def __name__(self): - """ - Fully-qualified name of this module (e.g., `six.moves.tkinter`). - """ - return self.___name__ - - @property - def co(self): - """ - Code object compiled from the contents of `__file__` (e.g., via the `compile()` builtin). - """ - return self._co - - @property - def analysis(self): - """ - build_main.Analysis that calls the hook. - """ - return self._analysis - - # Obsolete immutable properties provided to preserve backward compatibility. - @property - def name(self): - """ - Fully-qualified name of this module (e.g., `six.moves.tkinter`). - - **This property has been deprecated by the `__name__` property.** - """ - return self.___name__ - - @property - def graph(self): - """ - Current module graph. - - **This property has been deprecated by the `module_graph` property.** - """ - return self.module_graph - - @property - def node(self): - """ - Graph node for the currently hooked module. - - **This property has been deprecated by the `module` property.** - """ - return self.module - - # TODO: This incorrectly returns the list of the graph nodes of all modules *TRANSITIVELY* (rather than directly) - # imported by this module. Unfortunately, this implies that most uses of this property are currently broken - # (e.g., "hook-PIL.SpiderImagePlugin.py"). We only require this for the aforementioned hook, so contemplate - # alternative approaches. - @property - def imports(self): - """ - List of the graph nodes of all modules directly imported by this module. - """ - return self.module_graph.iter_graph(start=self.module) - - def add_imports(self, *module_names): - """ - Add all Python modules whose fully-qualified names are in the passed list as "hidden imports" upon which the - current module depends. - - This is equivalent to appending such names to the hook-specific `hiddenimports` attribute. - """ - # Append such names to the current list of all such names. - self._added_imports.extend(module_names) - - def del_imports(self, *module_names): - """ - Remove the named fully-qualified modules from the set of imports (either hidden or visible) upon which the - current module depends. - - This is equivalent to appending such names to the hook-specific `excludedimports` attribute. - """ - self._deleted_imports.extend(module_names) - - def add_binaries(self, binaries): - """ - Add all external dynamic libraries in the passed list of `(src_name, dest_name)` 2-tuples as dependencies of the - current module. This is equivalent to adding to the global `binaries` hook attribute. - - For convenience, the `binaries` may also be a list of TOC-style 3-tuples `(dest_name, src_name, typecode)`. - """ - - # Detect TOC 3-tuple list by checking the length of the first entry - if binaries and len(binaries[0]) == 3: - self._added_binaries.extend(entry[:2] for entry in binaries) - else: - # NOTE: `format_binaries_and_datas` changes tuples from input format `(src_name, dest_name)` to output - # format `(dest_name, src_name)`. - self._added_binaries.extend(format_binaries_and_datas(binaries)) - - def add_datas(self, datas): - """ - Add all external data files in the passed list of `(src_name, dest_name)` 2-tuples as dependencies of the - current module. This is equivalent to adding to the global `datas` hook attribute. - - For convenience, the `datas` may also be a list of TOC-style 3-tuples `(dest_name, src_name, typecode)`. - """ - - # Detect TOC 3-tuple list by checking the length of the first entry - if datas and len(datas[0]) == 3: - self._added_datas.extend(entry[:2] for entry in datas) - else: - # NOTE: `format_binaries_and_datas` changes tuples from input format `(src_name, dest_name)` to output - # format `(dest_name, src_name)`. - self._added_datas.extend(format_binaries_and_datas(datas)) - - def set_module_collection_mode(self, name, mode): - """" - Set the package/module collection mode for the specified module name. If `name` is `None`, the hooked - module/package name is used. `mode` can be one of valid mode strings (`'pyz'`, `'pyc'`, `'py'`, `'pyz+py'`, - `'py+pyz'`) or `None`, which clears the setting for the module/package - but only within this hook's context! - """ - if name is None: - name = self.__name__ - if mode is None: - self._module_collection_mode.pop(name) - else: - self._module_collection_mode[name] = mode - - def add_bindepend_symlink_suppression_pattern(self, pattern): - """ - Add the given path or path pattern to the set of patterns that prevent binary dependency analysis from creating - a symbolic link to the top-level application directory. - """ - self._bindepend_symlink_suppression.add(pattern) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/depend/utils.py b/venv/lib/python3.12/site-packages/PyInstaller/depend/utils.py deleted file mode 100755 index ebbbbff..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/depend/utils.py +++ /dev/null @@ -1,344 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Utility functions related to analyzing/bundling dependencies. -""" - -import ctypes.util -import os -import re -import shutil -from types import CodeType - -from PyInstaller import compat -from PyInstaller import log as logging -from PyInstaller.depend import bytecode -from PyInstaller.depend.dylib import include_library -from PyInstaller.exceptions import ExecCommandFailed - -logger = logging.getLogger(__name__) - - -def scan_code_for_ctypes(co): - binaries = __recursively_scan_code_objects_for_ctypes(co) - - # If any of the libraries has been requested with anything else than the basename, drop that entry and warn the - # user - PyInstaller would need to patch the compiled pyc file to make it work correctly! - binaries = set(binaries) - for binary in list(binaries): - # 'binary' might be in some cases None. Some Python modules (e.g., PyObjC.objc._bridgesupport) might contain - # code like this: - # dll = ctypes.CDLL(None) - if not binary: - # None values have to be removed too. - binaries.remove(binary) - elif binary != os.path.basename(binary): - # TODO make these warnings show up somewhere. - try: - filename = co.co_filename - except Exception: - filename = 'UNKNOWN' - logger.warning( - "Ignoring %s imported from %s - only basenames are supported with ctypes imports!", binary, filename - ) - binaries.remove(binary) - - binaries = _resolveCtypesImports(binaries) - return binaries - - -def __recursively_scan_code_objects_for_ctypes(code: CodeType): - """ - Detects ctypes dependencies, using reasonable heuristics that should cover most common ctypes usages; returns a - list containing names of binaries detected as dependencies. - """ - from PyInstaller.depend.bytecode import any_alias, search_recursively - - binaries = [] - ctypes_dll_names = { - *any_alias("ctypes.CDLL"), - *any_alias("ctypes.cdll.LoadLibrary"), - *any_alias("ctypes.WinDLL"), - *any_alias("ctypes.windll.LoadLibrary"), - *any_alias("ctypes.OleDLL"), - *any_alias("ctypes.oledll.LoadLibrary"), - *any_alias("ctypes.PyDLL"), - *any_alias("ctypes.pydll.LoadLibrary"), - } - find_library_names = { - *any_alias("ctypes.util.find_library"), - } - - for calls in bytecode.recursive_function_calls(code).values(): - for (name, args) in calls: - if not len(args) == 1 or not isinstance(args[0], str): - continue - if name in ctypes_dll_names: - # ctypes.*DLL() or ctypes.*dll.LoadLibrary() - binaries.append(*args) - elif name in find_library_names: - # ctypes.util.find_library() needs to be handled separately, because we need to resolve the library base - # name given as the argument (without prefix and suffix, e.g. 'gs') into corresponding full name (e.g., - # 'libgs.so.9'). - libname = args[0] - if libname: - try: # this try was inserted due to the ctypes bug https://github.com/python/cpython/issues/93094 - libname = ctypes.util.find_library(libname) - except FileNotFoundError: - libname = None - logger.warning( - 'ctypes.util.find_library raised a FileNotFoundError. ' - 'Supressing and assuming no lib with the name "%s" was found.', args[0] - ) - if libname: - # On Windows, `find_library` may return a full pathname. See issue #1934. - libname = os.path.basename(libname) - binaries.append(libname) - - # The above handles any flavour of function/class call. We still need to capture the (albeit rarely used) case of - # loading libraries with ctypes.cdll's getattr. - for i in search_recursively(_scan_code_for_ctypes_getattr, code).values(): - binaries.extend(i) - - return binaries - - -_ctypes_getattr_regex = bytecode.bytecode_regex( - rb""" - # Matches 'foo.bar' or 'foo.bar.whizz'. - - # Load the 'foo'. - ( - (?:(?:""" + bytecode._OPCODES_EXTENDED_ARG + rb""").)* - (?:""" + bytecode._OPCODES_FUNCTION_GLOBAL + rb"""). - ) - - # Load the 'bar.whizz' (one opcode per name component, each possibly preceded by name reference extension). - ( - (?: - (?:(?:""" + bytecode._OPCODES_EXTENDED_ARG + rb""").)* - (?:""" + bytecode._OPCODES_FUNCTION_LOAD + rb"""). - )+ - ) -""" -) - - -def _scan_code_for_ctypes_getattr(code: CodeType): - """ - Detect uses of ``ctypes.cdll.library_name``, which implies that ``library_name.dll`` should be collected. - """ - - key_names = ("cdll", "oledll", "pydll", "windll") - - for match in bytecode.finditer(_ctypes_getattr_regex, code.co_code): - name, attrs = match.groups() - name = bytecode.load(name, code) - attrs = bytecode.loads(attrs, code) - - if attrs and attrs[-1] == "LoadLibrary": - continue - - # Capture `from ctypes import ole; ole.dll_name`. - if len(attrs) == 1: - if name in key_names: - yield attrs[0] + ".dll" - # Capture `import ctypes; ctypes.ole.dll_name`. - if len(attrs) == 2: - if name == "ctypes" and attrs[0] in key_names: - yield attrs[1] + ".dll" - - -# TODO: reuse this code with modulegraph implementation. -def _resolveCtypesImports(cbinaries): - """ - Completes ctypes BINARY entries for modules with their full path. - - Input is a list of c-binary-names (as found by `scan_code_instruction_for_ctypes`). Output is a list of tuples - ready to be appended to the ``binaries`` of a modules. - - This function temporarily extents PATH, LD_LIBRARY_PATH or DYLD_LIBRARY_PATH (depending on the platform) by - CONF['pathex'] so shared libs will be search there, too. - - Example: - >>> _resolveCtypesImports(['libgs.so']) - [(libgs.so', ''/usr/lib/libgs.so', 'BINARY')] - """ - from ctypes.util import find_library - - from PyInstaller.config import CONF - - if compat.is_unix: - envvar = "LD_LIBRARY_PATH" - elif compat.is_darwin: - envvar = "DYLD_LIBRARY_PATH" - else: - envvar = "PATH" - - def _setPaths(): - path = os.pathsep.join(CONF['pathex']) - old = compat.getenv(envvar) - if old is not None: - path = os.pathsep.join((path, old)) - compat.setenv(envvar, path) - return old - - def _restorePaths(old): - if old is None: - compat.unsetenv(envvar) - else: - compat.setenv(envvar, old) - - ret = [] - - # Try to locate the shared library on the disk. This is done by calling ctypes.util.find_library with - # ImportTracker's local paths temporarily prepended to the library search paths (and restored after the call). - old = _setPaths() - for cbin in cbinaries: - try: - # There is an issue with find_library() where it can run into errors trying to locate the library. See - # #5734. - cpath = find_library(os.path.splitext(cbin)[0]) - except FileNotFoundError: - # In these cases, find_library() should return None. - cpath = None - if compat.is_unix or compat.is_cygwin: - # CAVEAT: find_library() is not the correct function. ctype's documentation says that it is meant to resolve - # only the filename (as a *compiler* does) not the full path. Anyway, it works well enough on Windows and - # macOS. On Linux, we need to implement more code to find out the full path. - if cpath is None: - cpath = cbin - # "man ld.so" says that we should first search LD_LIBRARY_PATH and then the ldcache. - for d in compat.getenv(envvar, '').split(os.pathsep): - if os.path.isfile(os.path.join(d, cpath)): - cpath = os.path.join(d, cpath) - break - else: - if LDCONFIG_CACHE is None: - load_ldconfig_cache() - if cpath in LDCONFIG_CACHE: - cpath = LDCONFIG_CACHE[cpath] - assert os.path.isfile(cpath) - else: - cpath = None - if cpath is None: - # Skip warning message if cbin (basename of library) is ignored. This prevents messages like: - # 'W: library kernel32.dll required via ctypes not found' - if not include_library(cbin): - continue - # On non-Windows, automatically ignore all ctypes-based referenes to DLL files. This complements the above - # check, which might not match potential case variations (e.g., `KERNEL32.dll`, instead of `kernel32.dll`) - # due to case-sensitivity of the matching that is in effect on non-Windows platforms. - if (not compat.is_win and not compat.is_cygwin) and cbin.lower().endswith('.dll'): - continue - logger.warning("Library %s required via ctypes not found", cbin) - else: - if not include_library(cpath): - continue - ret.append((cbin, cpath, "BINARY")) - _restorePaths(old) - return ret - - -LDCONFIG_CACHE = None # cache the output of `/sbin/ldconfig -p` - - -def load_ldconfig_cache(): - """ - Create a cache of the `ldconfig`-output to call it only once. - It contains thousands of libraries and running it on every dylib is expensive. - """ - global LDCONFIG_CACHE - - if LDCONFIG_CACHE is not None: - return - - if compat.is_cygwin: - # Not available under Cygwin; but we might be re-using general POSIX codepaths, and end up here. So exit early. - LDCONFIG_CACHE = {} - return - - if compat.is_musl: - # Musl deliberately doesn't use ldconfig. The ldconfig executable either doesn't exist or it's a functionless - # executable which, on calling with any arguments, simply tells you that those arguments are invalid. - LDCONFIG_CACHE = {} - return - - ldconfig = shutil.which('ldconfig') - if ldconfig is None: - # If `ldconfig` is not found in $PATH, search for it in some fixed directories. Simply use a second call instead - # of fiddling around with checks for empty env-vars and string-concat. - ldconfig = shutil.which('ldconfig', path='/usr/sbin:/sbin:/usr/bin:/bin') - - # If we still could not find the 'ldconfig' command... - if ldconfig is None: - LDCONFIG_CACHE = {} - return - - if compat.is_freebsd or compat.is_openbsd: - # This has a quite different format than other Unixes: - # [vagrant@freebsd-10 ~]$ ldconfig -r - # /var/run/ld-elf.so.hints: - # search directories: /lib:/usr/lib:/usr/lib/compat:... - # 0:-lgeom.5 => /lib/libgeom.so.5 - # 184:-lpython2.7.1 => /usr/local/lib/libpython2.7.so.1 - ldconfig_arg = '-r' - splitlines_count = 2 - pattern = re.compile(r'^\s+\d+:-l(\S+)(\s.*)? => (\S+)') - else: - # Skip first line of the library list because it is just an informative line and might contain localized - # characters. Example of first line with locale set to cs_CZ.UTF-8: - #$ /sbin/ldconfig -p - #V keši „/etc/ld.so.cache“ nalezeno knihoven: 2799 - # libzvbi.so.0 (libc6,x86-64) => /lib64/libzvbi.so.0 - # libzvbi-chains.so.0 (libc6,x86-64) => /lib64/libzvbi-chains.so.0 - ldconfig_arg = '-p' - splitlines_count = 1 - pattern = re.compile(r'^\s+(\S+)(\s.*)? => (\S+)') - - try: - text = compat.exec_command(ldconfig, ldconfig_arg) - except ExecCommandFailed: - logger.warning("Failed to execute ldconfig. Disabling LD cache.") - LDCONFIG_CACHE = {} - return - - text = text.strip().splitlines()[splitlines_count:] - - LDCONFIG_CACHE = {} - for line in text: - # :fixme: this assumes library names do not contain whitespace - m = pattern.match(line) - - # Sanitize away any abnormal lines of output. - if m is None: - # Warn about it then skip the rest of this iteration. - if re.search("Cache generated by:", line): - # See #5540. This particular line is harmless. - pass - else: - logger.warning("Unrecognised line of output %r from ldconfig", line) - continue - - path = m.groups()[-1] - if compat.is_freebsd or compat.is_openbsd: - # Insert `.so` at the end of the lib's basename. soname and filename may have (different) trailing versions. - # We assume the `.so` in the filename to mark the end of the lib's basename. - bname = os.path.basename(path).split('.so', 1)[0] - name = 'lib' + m.group(1) - assert name.startswith(bname) - name = bname + '.so' + name[len(bname):] - else: - name = m.group(1) - # ldconfig may know about several versions of the same lib, e.g., different arch, different libc, etc. - # Use the first entry. - if name not in LDCONFIG_CACHE: - LDCONFIG_CACHE[name] = path diff --git a/venv/lib/python3.12/site-packages/PyInstaller/exceptions.py b/venv/lib/python3.12/site-packages/PyInstaller/exceptions.py deleted file mode 100755 index 020e878..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/exceptions.py +++ /dev/null @@ -1,70 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -class ExecCommandFailed(SystemExit): - pass - - -class HookError(Exception): - """ - Base class for hook related errors. - """ - pass - - -class ImportErrorWhenRunningHook(HookError): - def __str__(self): - return ( - "ERROR: Failed to import module {0} required by hook for module {1}. Please check whether module {0} " - "actually exists and whether the hook is compatible with your version of {1}: You might want to read more " - "about hooks in the manual and provide a pull-request to improve PyInstaller.".format( - self.args[0], self.args[1] - ) - ) - - -class RemovedCipherFeatureError(SystemExit): - def __init__(self, message): - super().__init__( - f"ERROR: Bytecode encryption was removed in PyInstaller v6.0. {message}" - " For the rationale and alternatives see https://github.com/pyinstaller/pyinstaller/pull/6999" - ) - - -class RemovedExternalManifestError(SystemExit): - def __init__(self, message): - super().__init__(f"ERROR: Support for external executable manifest was removed in PyInstaller v6.0. {message}") - - -class RemovedWinSideBySideSupportError(SystemExit): - def __init__(self, message): - super().__init__( - f"ERROR: Support for collecting and processing WinSxS assemblies was removed in PyInstaller v6.0. {message}" - ) - - -class PythonLibraryNotFoundError(SystemExit): - def __init__(self, message): - super().__init__(f"ERROR: {message}") - - -class InvalidSrcDestTupleError(SystemExit): - def __init__(self, src_dest, message): - super().__init__(f"ERROR: Invalid (SRC, DEST_DIR) tuple: {src_dest!r}. {message}") - - -class ImportlibMetadataError(SystemExit): - def __init__(self): - super().__init__( - "ERROR: PyInstaller requires importlib.metadata from python >= 3.10 stdlib or importlib_metadata from " - "importlib-metadata >= 4.6" - ) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/__pycache__/pyi_splash.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/__pycache__/pyi_splash.cpython-312.pyc deleted file mode 100644 index f830fad..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/__pycache__/pyi_splash.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__init__.py b/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__init__.py deleted file mode 100755 index e006337..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__init__.py +++ /dev/null @@ -1,36 +0,0 @@ -# ----------------------------------------------------------------------------- -# Copyright (c) 2023, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -# ----------------------------------------------------------------------------- - -import sys -import os - -# A boolean indicating whether the frozen application is a macOS .app bundle. -is_macos_app_bundle = sys.platform == 'darwin' and sys._MEIPASS.endswith("Contents/Frameworks") - - -def prepend_path_to_environment_variable(path, variable_name): - """ - Prepend the given path to the list of paths stored in the given environment variable (separated by `os.pathsep`). - If the given path is already specified in the environment variable, no changes are made. If the environment variable - is not set or is empty, it is set/overwritten with the given path. - """ - stored_paths = os.environ.get(variable_name) - if stored_paths: - # If path is already included, make this a no-op. NOTE: we need to split the string and search in the list of - # substrings to find an exact match; searching in the original string might erroneously match a prefix of a - # longer (i.e., sub-directory) path when such entry already happens to be in PATH (see #8857). - if path in stored_paths.split(os.pathsep): - return - # Otherwise, prepend the path - stored_paths = path + os.pathsep + stored_paths - else: - stored_paths = path - os.environ[variable_name] = stored_paths diff --git a/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 47131f9..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__pycache__/_win32.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__pycache__/_win32.cpython-312.pyc deleted file mode 100644 index 0b02fe0..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__pycache__/_win32.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__pycache__/qt.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__pycache__/qt.cpython-312.pyc deleted file mode 100644 index d5c6873..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__pycache__/qt.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__pycache__/tempfile.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__pycache__/tempfile.cpython-312.pyc deleted file mode 100644 index 06847e0..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__pycache__/tempfile.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/_win32.py b/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/_win32.py deleted file mode 100755 index 80e30ec..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/_win32.py +++ /dev/null @@ -1,333 +0,0 @@ -# ----------------------------------------------------------------------------- -# Copyright (c) 2023, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -# ----------------------------------------------------------------------------- - -import ctypes -import ctypes.wintypes - -# Constants from win32 headers -TOKEN_QUERY = 0x0008 - -TokenUser = 1 # from TOKEN_INFORMATION_CLASS enum -TokenAppContainerSid = 31 # from TOKEN_INFORMATION_CLASS enum - -ERROR_INSUFFICIENT_BUFFER = 122 - -INVALID_HANDLE = -1 - -FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100 -FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000 - -SDDL_REVISION1 = 1 - -# Structures for ConvertSidToStringSidW -PSID = ctypes.wintypes.LPVOID - - -class SID_AND_ATTRIBUTES(ctypes.Structure): - _fields_ = [ - ("Sid", PSID), - ("Attributes", ctypes.wintypes.DWORD), - ] - - -class TOKEN_USER(ctypes.Structure): - _fields_ = [ - ("User", SID_AND_ATTRIBUTES), - ] - - -PTOKEN_USER = ctypes.POINTER(TOKEN_USER) - - -class TOKEN_APPCONTAINER_INFORMATION(ctypes.Structure): - _fields_ = [ - ("TokenAppContainer", PSID), - ] - - -PTOKEN_APPCONTAINER_INFORMATION = ctypes.POINTER(TOKEN_APPCONTAINER_INFORMATION) - -# SECURITY_ATTRIBUTES structure for CreateDirectoryW -PSECURITY_DESCRIPTOR = ctypes.wintypes.LPVOID - - -class SECURITY_ATTRIBUTES(ctypes.Structure): - _fields_ = [ - ("nLength", ctypes.wintypes.DWORD), - ("lpSecurityDescriptor", PSECURITY_DESCRIPTOR), - ("bInheritHandle", ctypes.wintypes.BOOL), - ] - - -# win32 API functions, bound via ctypes. -# NOTE: we do not use ctypes.windll. to avoid modifying its (global) function prototypes, which might affect -# user's code. -advapi32 = ctypes.WinDLL("advapi32") -kernel32 = ctypes.WinDLL("kernel32") - -advapi32.ConvertSidToStringSidW.restype = ctypes.wintypes.BOOL -advapi32.ConvertSidToStringSidW.argtypes = ( - PSID, # [in] PSID Sid - ctypes.POINTER(ctypes.wintypes.LPWSTR), # [out] LPWSTR *StringSid -) - -advapi32.ConvertStringSecurityDescriptorToSecurityDescriptorW.restype = ctypes.wintypes.BOOL -advapi32.ConvertStringSecurityDescriptorToSecurityDescriptorW.argtypes = ( - ctypes.wintypes.LPCWSTR, # [in] LPCWSTR StringSecurityDescriptor - ctypes.wintypes.DWORD, # [in] DWORD StringSDRevision - ctypes.POINTER(PSECURITY_DESCRIPTOR), # [out] PSECURITY_DESCRIPTOR *SecurityDescriptor - ctypes.wintypes.PULONG, # [out] PULONG SecurityDescriptorSize -) - -advapi32.GetTokenInformation.restype = ctypes.wintypes.BOOL -advapi32.GetTokenInformation.argtypes = ( - ctypes.wintypes.HANDLE, # [in] HANDLE TokenHandle - ctypes.c_int, # [in] TOKEN_INFORMATION_CLASS TokenInformationClass - ctypes.wintypes.LPVOID, # [out, optional] LPVOID TokenInformation - ctypes.wintypes.DWORD, # [in] DWORD TokenInformationLength - ctypes.wintypes.PDWORD, # [out] PDWORD ReturnLength -) - -kernel32.CloseHandle.restype = ctypes.wintypes.BOOL -kernel32.CloseHandle.argtypes = ( - ctypes.wintypes.HANDLE, # [in] HANDLE hObject -) - -kernel32.CreateDirectoryW.restype = ctypes.wintypes.BOOL -kernel32.CreateDirectoryW.argtypes = ( - ctypes.wintypes.LPCWSTR, # [in] LPCWSTR lpPathName - ctypes.POINTER(SECURITY_ATTRIBUTES), # [in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes -) - -kernel32.FormatMessageW.restype = ctypes.wintypes.DWORD -kernel32.FormatMessageW.argtypes = ( - ctypes.wintypes.DWORD, # [in] DWORD dwFlags - ctypes.wintypes.LPCVOID, # [in, optional] LPCVOID lpSource - ctypes.wintypes.DWORD, # [in] DWORD dwMessageId - ctypes.wintypes.DWORD, # [in] DWORD dwLanguageId - ctypes.wintypes.LPWSTR, # [out] LPWSTR lpBuffer - ctypes.wintypes.DWORD, # [in] DWORD nSize - ctypes.wintypes.LPVOID, # [in, optional] va_list *Arguments -) - -kernel32.GetCurrentProcess.restype = ctypes.wintypes.HANDLE -# kernel32.GetCurrentProcess has no arguments - -kernel32.GetLastError.restype = ctypes.wintypes.DWORD -# kernel32.GetLastError has no arguments - -kernel32.LocalFree.restype = ctypes.wintypes.BOOL -kernel32.LocalFree.argtypes = ( - ctypes.wintypes.HLOCAL, # [in] _Frees_ptr_opt_ HLOCAL hMem -) - -kernel32.OpenProcessToken.restype = ctypes.wintypes.BOOL -kernel32.OpenProcessToken.argtypes = ( - ctypes.wintypes.HANDLE, # [in] HANDLE ProcessHandle - ctypes.wintypes.DWORD, # [in] DWORD DesiredAccess - ctypes.wintypes.PHANDLE, # [out] PHANDLE TokenHandle -) - - -def _win_error_to_message(error_code): - """ - Convert win32 error code to message. - """ - message_wstr = ctypes.wintypes.LPWSTR(None) - ret = kernel32.FormatMessageW( - FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - None, # lpSource - error_code, # dwMessageId - 0x400, # dwLanguageId = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT) - ctypes.cast( - ctypes.byref(message_wstr), - ctypes.wintypes.LPWSTR, - ), # pointer to LPWSTR due to FORMAT_MESSAGE_ALLOCATE_BUFFER; needs to be cast to LPWSTR - 64, # due to FORMAT_MESSAGE_ALLOCATE_BUFFER, this is minimum number of characters to allocate - None, - ) - if ret == 0: - return None - - message = message_wstr.value - kernel32.LocalFree(message_wstr) - - # Strip trailing CR/LF. - if message: - message = message.strip() - return message - - -def _get_process_sid(token_information_class): - """ - Obtain the SID from the current process by the given token information class. - - Args: - token_information_class: Token information class identifying the SID that we're - interested in. Only TokenUser and TokenAppContainerSid are supported. - - Returns: SID (if it could be fetched) or None if not available or on error. - """ - process_token = ctypes.wintypes.HANDLE(INVALID_HANDLE) - - try: - # Get access token for the current process - ret = kernel32.OpenProcessToken( - kernel32.GetCurrentProcess(), - TOKEN_QUERY, - ctypes.pointer(process_token), - ) - if ret == 0: - error_code = kernel32.GetLastError() - raise RuntimeError(f"Failed to open process token! Error code: 0x{error_code:X}") - - # Query buffer size for sid - token_info_size = ctypes.wintypes.DWORD(0) - - ret = advapi32.GetTokenInformation( - process_token, - token_information_class, - None, - 0, - ctypes.byref(token_info_size), - ) - - # We expect this call to fail with ERROR_INSUFFICIENT_BUFFER - if ret == 0: - error_code = kernel32.GetLastError() - if error_code != ERROR_INSUFFICIENT_BUFFER: - raise RuntimeError(f"Failed to query token information buffer size! Error code: 0x{error_code:X}") - else: - raise RuntimeError("Unexpected return value from GetTokenInformation!") - - # Allocate buffer - token_info = ctypes.create_string_buffer(token_info_size.value) - ret = advapi32.GetTokenInformation( - process_token, - token_information_class, - token_info, - token_info_size, - ctypes.byref(token_info_size), - ) - if ret == 0: - error_code = kernel32.GetLastError() - raise RuntimeError(f"Failed to query token information! Error code: 0x{error_code:X}") - - # Convert SID to string - # Technically, when UserToken is used, we need to pass user_info->User.Sid, - # but as they are at the beginning of the buffer, just pass the buffer instead... - sid_wstr = ctypes.wintypes.LPWSTR(None) - - if token_information_class == TokenUser: - sid = ctypes.cast(token_info, PTOKEN_USER).contents.User.Sid - elif token_information_class == TokenAppContainerSid: - sid = ctypes.cast(token_info, PTOKEN_APPCONTAINER_INFORMATION).contents.TokenAppContainer - else: - raise ValueError(f"Unexpected token information class: {token_information_class}") - - ret = advapi32.ConvertSidToStringSidW(sid, ctypes.pointer(sid_wstr)) - if ret == 0: - error_code = kernel32.GetLastError() - raise RuntimeError(f"Failed to convert SID to string! Error code: 0x{error_code:X}") - sid = sid_wstr.value - kernel32.LocalFree(sid_wstr) - except Exception: - sid = None - finally: - # Close the process token - if process_token.value != INVALID_HANDLE: - kernel32.CloseHandle(process_token) - - return sid - - -# Get and cache current user's SID -_user_sid = _get_process_sid(TokenUser) - -# Get and cache current app container's SID (if any) -_app_container_sid = _get_process_sid(TokenAppContainerSid) - - -def secure_mkdir(dir_name): - """ - Replacement for mkdir that limits the access to created directory to current user. - """ - - # Create security descriptor - # Prefer actual user SID over SID S-1-3-4 (current owner), because at the time of writing, Wine does not properly - # support the latter. - user_sid = _user_sid or "S-1-3-4" - - # DACL descriptor (D): - # ace_type;ace_flags;rights;object_guid;inherit_object_guid;account_sid;(resource_attribute) - # - ace_type = SDDL_ACCESS_ALLOWED (A) - # - rights = SDDL_FILE_ALL (FA) - # - account_sid = current user (queried SID) - security_desc_str = f"D:(A;;FA;;;{user_sid})" - - # If the app is running within an AppContainer, the app container SID has to be added to the DACL. - # Otherwise our process will not have access to the temp dir. - # - # Quoting https://learn.microsoft.com/en-us/windows/win32/secauthz/implementing-an-appcontainer: - # "The AppContainer SID is a persistent unique identifier for the appcontainer. ... - # To allow a single AppContainer to access a resource, add its AppContainerSID to the ACL for that resource." - if _app_container_sid: - security_desc_str += f"(A;;FA;;;{_app_container_sid})" - security_desc = ctypes.wintypes.LPVOID(None) - - ret = advapi32.ConvertStringSecurityDescriptorToSecurityDescriptorW( - security_desc_str, - SDDL_REVISION1, - ctypes.byref(security_desc), - None, - ) - if ret == 0: - error_code = kernel32.GetLastError() - raise RuntimeError( - f"Failed to create security descriptor! Error code: 0x{error_code:X}, " - f"message: {_win_error_to_message(error_code)}" - ) - - security_attr = SECURITY_ATTRIBUTES() - security_attr.nLength = ctypes.sizeof(SECURITY_ATTRIBUTES) - security_attr.lpSecurityDescriptor = security_desc - security_attr.bInheritHandle = False - - # Create directory - ret = kernel32.CreateDirectoryW( - dir_name, - security_attr, - ) - if ret == 0: - # Call failed; store error code immediately, to avoid it being overwritten in cleanup below. - error_code = kernel32.GetLastError() - - # Free security descriptor - kernel32.LocalFree(security_desc) - - # Exit on succeess - if ret != 0: - return - - # Construct OSError from win error code - error_message = _win_error_to_message(error_code) - - # Strip trailing dot to match error message from os.mkdir(). - if error_message and error_message[-1] == '.': - error_message = error_message[:-1] - - raise OSError( - None, # errno - error_message, # strerror - dir_name, # filename - error_code, # winerror - None, # filename2 - ) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/qt.py b/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/qt.py deleted file mode 100755 index b406677..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/qt.py +++ /dev/null @@ -1,118 +0,0 @@ -# ----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -# ----------------------------------------------------------------------------- - -import os -import importlib -import atexit - -# Helper for ensuring that only one Qt bindings package is registered at run-time via run-time hooks. -_registered_qt_bindings = None - - -def ensure_single_qt_bindings_package(qt_bindings): - global _registered_qt_bindings - if _registered_qt_bindings is not None: - raise RuntimeError( - f"Cannot execute run-time hook for {qt_bindings!r} because run-time hook for {_registered_qt_bindings!r} " - "has been run before, and PyInstaller-frozen applications do not support multiple Qt bindings in the same " - "application!" - ) - _registered_qt_bindings = qt_bindings - - -# Helper for relocating Qt prefix via embedded qt.conf file. -_QT_CONF_FILENAME = ":/qt/etc/qt.conf" - -_QT_CONF_RESOURCE_NAME = ( - # qt - b"\x00\x02" - b"\x00\x00\x07\x84" - b"\x00\x71" - b"\x00\x74" - # etc - b"\x00\x03" - b"\x00\x00\x6c\xa3" - b"\x00\x65" - b"\x00\x74\x00\x63" - # qt.conf - b"\x00\x07" - b"\x08\x74\xa6\xa6" - b"\x00\x71" - b"\x00\x74\x00\x2e\x00\x63\x00\x6f\x00\x6e\x00\x66" -) - -_QT_CONF_RESOURCE_STRUCT = ( - # : - b"\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01" - # :/qt - b"\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02" - # :/qt/etc - b"\x00\x00\x00\x0a\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03" - # :/qt/etc/qt.conf - b"\x00\x00\x00\x16\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00" -) - - -def create_embedded_qt_conf(qt_bindings, prefix_path): - # The QtCore module might be unavailable if we collected just the top-level binding package (e.g., PyQt5) without - # any of its submodules. Since this helper is called from run-time hook for the binding package, we need to handle - # that scenario here. - try: - QtCore = importlib.import_module(qt_bindings + ".QtCore") - except ImportError: - return - - # No-op if embedded qt.conf already exists - if QtCore.QFile.exists(_QT_CONF_FILENAME): - return - - # Create qt.conf file that relocates Qt prefix. - # NOTE: paths should use POSIX-style forward slashes as separator, even on Windows. - if os.sep == '\\': - prefix_path = prefix_path.replace(os.sep, '/') - - qt_conf = f"[Paths]\nPrefix = {prefix_path}\n" - if os.name == 'nt' and qt_bindings in {"PySide2", "PySide6"}: - # PySide PyPI wheels on Windows set LibraryExecutablesPath to PrefixPath - qt_conf += f"LibraryExecutables = {prefix_path}" - - # Encode the contents; in Qt5, QSettings uses Latin1 encoding, in Qt6, it uses UTF8. - if qt_bindings in {"PySide2", "PyQt5"}: - qt_conf = qt_conf.encode("latin1") - else: - qt_conf = qt_conf.encode("utf-8") - - # Prepend data size (32-bit integer, big endian) - qt_conf_size = len(qt_conf) - qt_resource_data = qt_conf_size.to_bytes(4, 'big') + qt_conf - - # Register - succeeded = QtCore.qRegisterResourceData( - 0x01, - _QT_CONF_RESOURCE_STRUCT, - _QT_CONF_RESOURCE_NAME, - qt_resource_data, - ) - if not succeeded: - return # Tough luck - - # Unregister the resource at exit, to ensure that the registered resource on Qt/C++ side does not outlive the - # `_qt_resource_data` python variable and its data buffer. This also adds a reference to the `_qt_resource_data`, - # which conveniently ensures that the data is not garbage collected before we perform the cleanup (otherwise garbage - # collector might kick in at any time after we exit this helper function, and `qRegisterResourceData` does not seem - # to make a copy of the data!). - atexit.register( - QtCore.qUnregisterResourceData, - 0x01, - _QT_CONF_RESOURCE_STRUCT, - _QT_CONF_RESOURCE_NAME, - qt_resource_data, - ) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/tempfile.py b/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/tempfile.py deleted file mode 100755 index da2307b..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/tempfile.py +++ /dev/null @@ -1,56 +0,0 @@ -# ----------------------------------------------------------------------------- -# Copyright (c) 2023, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -# ----------------------------------------------------------------------------- - -import os -import sys -import errno -import tempfile - -# Helper for creating temporary directories with access restricted to the user running the process. -# On POSIX systems, this is already achieved by `tempfile.mkdtemp`, which uses 0o700 permissions mask. -# On Windows, however, the POSIX permissions semantics have no effect, and we need to provide our own implementation -# that restricts the access by passing appropriate security attributes to the `CreateDirectory` function. - -if os.name == 'nt': - from . import _win32 - - def secure_mkdtemp(suffix=None, prefix=None, dir=None): - """ - Windows-specific replacement for `tempfile.mkdtemp` that restricts access to the user running the process. - Based on `mkdtemp` implementation from python 3.11 stdlib. - """ - - prefix, suffix, dir, output_type = tempfile._sanitize_params(prefix, suffix, dir) - - names = tempfile._get_candidate_names() - if output_type is bytes: - names = map(os.fsencode, names) - - for seq in range(tempfile.TMP_MAX): - name = next(names) - file = os.path.join(dir, prefix + name + suffix) - sys.audit("tempfile.mkdtemp", file) - try: - _win32.secure_mkdir(file) - except FileExistsError: - continue # try again - except PermissionError: - # This exception is thrown when a directory with the chosen name already exists on windows. - if (os.name == 'nt' and os.path.isdir(dir) and os.access(dir, os.W_OK)): - continue - else: - raise - return file - - raise FileExistsError(errno.EEXIST, "No usable temporary directory name found") - -else: - secure_mkdtemp = tempfile.mkdtemp diff --git a/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/pyi_splash.py b/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/pyi_splash.py deleted file mode 100755 index 3eb5719..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/fake-modules/pyi_splash.py +++ /dev/null @@ -1,211 +0,0 @@ -# ----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -# ----------------------------------------------------------------------------- - -# This module is not a "fake module" in the classical sense, but a real module that can be imported. It acts as an RPC -# interface for the functions of the bootloader. -""" -This module connects to the bootloader to send messages to the splash screen. - -It is intended to act as a RPC interface for the functions provided by the bootloader, such as displaying text or -closing. This makes the users python program independent of how the communication with the bootloader is implemented, -since a consistent API is provided. - -To connect to the bootloader, it connects to a local tcp socket whose port is passed through the environment variable -'_PYI_SPLASH_IPC'. The bootloader creates a server socket and accepts every connection request. Since the os-module, -which is needed to request the environment variable, is not available at boot time, the module does not establish the -connection until initialization. - -The protocol by which the Python interpreter communicates with the bootloader is implemented in this module. - -This module does not support reloads while the splash screen is displayed, i.e. it cannot be reloaded (such as by -importlib.reload), because the splash screen closes automatically when the connection to this instance of the module -is lost. -""" - -import atexit -import os - -# Import the _socket module instead of the socket module. All used functions to connect to the ipc system are -# provided by the C module and the users program does not necessarily need to include the socket module and all -# required modules it uses. -import _socket - -__all__ = ["CLOSE_CONNECTION", "FLUSH_CHARACTER", "is_alive", "close", "update_text"] - -try: - # The user might have excluded logging from imports. - import logging as _logging -except ImportError: - _logging = None - -try: - # The user might have excluded functools from imports. - from functools import update_wrapper -except ImportError: - update_wrapper = None - - -# Utility -def _log(level, msg, *args, **kwargs): - """ - Conditional wrapper around logging module. If the user excluded logging from the imports or it was not imported, - this function should handle it and avoid using the logger. - """ - if _logging: - logger = _logging.getLogger(__name__) - logger.log(level, msg, *args, **kwargs) - - -# These constants define single characters which are needed to send commands to the bootloader. Those constants are -# also set in the tcl script. -CLOSE_CONNECTION = b'\x04' # ASCII End-of-Transmission character -FLUSH_CHARACTER = b'\x0D' # ASCII Carriage Return character - -# Module internal variables -_initialized = False -# Keep these variables always synchronized -_ipc_socket_closed = True -_ipc_socket = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM) - - -def _initialize(): - """ - Initialize this module - - :return: - """ - global _initialized, _ipc_socket_closed - - # If _ipc_port is zero, the splash screen is intentionally suppressed (for example, we are in sub-process spawned - # via sys.executable). Mark the splash screen as initialized, but do not attempt to connect. - if _ipc_port == 0: - _initialized = True - return - - # Attempt to connect to the splash screen process. - try: - _ipc_socket.connect(("127.0.0.1", _ipc_port)) - _ipc_socket_closed = False - - _initialized = True - _log(10, "IPC connection to the splash screen was successfully established.") # log-level: debug - except OSError as err: - raise ConnectionError(f"Could not connect to TCP port {_ipc_port}.") from err - - -# We expect a splash screen from the bootloader, but if _PYI_SPLASH_IPC is not set, the module cannot connect to it. -# _PYI_SPLASH_IPC being set to zero indicates that splash screen should be (gracefully) suppressed; i.e., the calls -# in this module should become no-op without generating warning messages. -try: - _ipc_port = int(os.environ['_PYI_SPLASH_IPC']) - del os.environ['_PYI_SPLASH_IPC'] - # Initialize the connection upon importing this module. This will establish a connection to the bootloader's TCP - # server socket. - _initialize() -except (KeyError, ValueError): - # log-level: warning - _log( - 30, - "The environment does not allow connecting to the splash screen. Did bootloader fail to initialize it?", - exc_info=True, - ) -except ConnectionError: - # log-level: error - _log(40, "Failed to connect to the bootloader's IPC server!", exc_info=True) - - -def _check_connection(func): - """ - Utility decorator for checking whether the function should be executed. - - The wrapped function may raise a ConnectionError if the module was not initialized correctly. - """ - def wrapper(*args, **kwargs): - """ - Executes the wrapped function if the environment allows it. - - That is, if the connection to to bootloader has not been closed and the module is initialized. - - :raises RuntimeError: if the module was not initialized correctly. - """ - if _initialized and _ipc_socket_closed: - if _ipc_port != 0: - _log(10, "Connection to splash screen has already been closed.") # log-level: debug - return - elif not _initialized: - raise RuntimeError("This module is not initialized; did it fail to load?") - - return func(*args, **kwargs) - - if update_wrapper: - # For runtime introspection - update_wrapper(wrapper, func) - - return wrapper - - -@_check_connection -def _send_command(cmd, args=None): - """ - Send the command followed by args to the splash screen. - - :param str cmd: The command to send. All command have to be defined as procedures in the tcl splash screen script. - :param list[str] args: All arguments to send to the receiving function - """ - if args is None: - args = [] - - full_cmd = "%s(%s)" % (cmd, " ".join(args)) - try: - _ipc_socket.sendall(full_cmd.encode("utf-8") + FLUSH_CHARACTER) - except OSError as err: - raise ConnectionError(f"Unable to send command {full_cmd!r} to the bootloader") from err - - -def is_alive(): - """ - Indicates whether the module can be used. - - Returns False if the module is either not initialized or was disabled by closing the splash screen. Otherwise, - the module should be usable. - """ - return _initialized and not _ipc_socket_closed - - -@_check_connection -def update_text(msg: str): - """ - Updates the text on the splash screen window. - - :param str msg: the text to be displayed - :raises ConnectionError: If the OS fails to write to the socket. - :raises RuntimeError: If the module is not initialized. - """ - _send_command("update_text", [msg]) - - -def close(): - """ - Close the connection to the ipc tcp server socket. - - This will close the splash screen and renders this module unusable. After this function is called, no connection - can be opened to the splash screen again and all functions in this module become unusable. - """ - global _ipc_socket_closed - if _initialized and not _ipc_socket_closed: - _ipc_socket.sendall(CLOSE_CONNECTION) - _ipc_socket.close() - _ipc_socket_closed = True - - -@atexit.register -def _exit(): - close() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__init__.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__init__.py deleted file mode 100755 index 792d600..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index d552c2b..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PIL.Image.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PIL.Image.cpython-312.pyc deleted file mode 100644 index 099a5a5..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PIL.Image.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PIL.ImageFilter.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PIL.ImageFilter.cpython-312.pyc deleted file mode 100644 index ea6a2ad..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PIL.ImageFilter.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PIL.SpiderImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PIL.SpiderImagePlugin.cpython-312.pyc deleted file mode 100644 index 9871f23..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PIL.SpiderImagePlugin.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PIL.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PIL.cpython-312.pyc deleted file mode 100644 index 548667f..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PIL.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QAxContainer.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QAxContainer.cpython-312.pyc deleted file mode 100644 index 92dcd0f..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QAxContainer.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qsci.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qsci.cpython-312.pyc deleted file mode 100644 index 52e29c6..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qsci.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt.cpython-312.pyc deleted file mode 100644 index fd8f2ee..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DAnimation.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DAnimation.cpython-312.pyc deleted file mode 100644 index dfd6796..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DAnimation.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DCore.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DCore.cpython-312.pyc deleted file mode 100644 index fac46d3..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DCore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DExtras.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DExtras.cpython-312.pyc deleted file mode 100644 index 0b09b94..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DExtras.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DInput.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DInput.cpython-312.pyc deleted file mode 100644 index edd88c7..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DInput.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DLogic.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DLogic.cpython-312.pyc deleted file mode 100644 index a52f6c7..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DLogic.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DRender.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DRender.cpython-312.pyc deleted file mode 100644 index 47ef2b0..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DRender.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtBluetooth.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtBluetooth.cpython-312.pyc deleted file mode 100644 index 45c8d46..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtBluetooth.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtChart.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtChart.cpython-312.pyc deleted file mode 100644 index 655f6dd..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtChart.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtCore.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtCore.cpython-312.pyc deleted file mode 100644 index b86caea..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtCore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtDBus.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtDBus.cpython-312.pyc deleted file mode 100644 index 5a20807..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtDBus.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtDataVisualization.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtDataVisualization.cpython-312.pyc deleted file mode 100644 index 87d19b0..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtDataVisualization.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtDesigner.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtDesigner.cpython-312.pyc deleted file mode 100644 index 928ce75..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtDesigner.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtGui.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtGui.cpython-312.pyc deleted file mode 100644 index ac716eb..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtGui.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtHelp.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtHelp.cpython-312.pyc deleted file mode 100644 index 010b446..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtHelp.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtLocation.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtLocation.cpython-312.pyc deleted file mode 100644 index 24e3a9f..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtLocation.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtMacExtras.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtMacExtras.cpython-312.pyc deleted file mode 100644 index 92e6c9d..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtMacExtras.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtMultimedia.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtMultimedia.cpython-312.pyc deleted file mode 100644 index 4d3a9df..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtMultimedia.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtMultimediaWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtMultimediaWidgets.cpython-312.pyc deleted file mode 100644 index 9009ac6..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtMultimediaWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtNetwork.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtNetwork.cpython-312.pyc deleted file mode 100644 index c6f35ac..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtNetwork.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtNetworkAuth.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtNetworkAuth.cpython-312.pyc deleted file mode 100644 index 0eb6837..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtNetworkAuth.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtNfc.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtNfc.cpython-312.pyc deleted file mode 100644 index 3e15241..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtNfc.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtOpenGL.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtOpenGL.cpython-312.pyc deleted file mode 100644 index 038edba..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtOpenGL.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtPositioning.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtPositioning.cpython-312.pyc deleted file mode 100644 index f6a5213..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtPositioning.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtPrintSupport.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtPrintSupport.cpython-312.pyc deleted file mode 100644 index 357940f..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtPrintSupport.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtPurchasing.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtPurchasing.cpython-312.pyc deleted file mode 100644 index 7daf5c5..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtPurchasing.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtQml.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtQml.cpython-312.pyc deleted file mode 100644 index cb653b1..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtQml.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtQuick.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtQuick.cpython-312.pyc deleted file mode 100644 index 956ada7..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtQuick.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtQuick3D.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtQuick3D.cpython-312.pyc deleted file mode 100644 index a9d1dff..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtQuick3D.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtQuickWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtQuickWidgets.cpython-312.pyc deleted file mode 100644 index 87fabd9..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtQuickWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtRemoteObjects.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtRemoteObjects.cpython-312.pyc deleted file mode 100644 index 5149d1f..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtRemoteObjects.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtScript.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtScript.cpython-312.pyc deleted file mode 100644 index 68371af..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtScript.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtSensors.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtSensors.cpython-312.pyc deleted file mode 100644 index c49a4a5..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtSensors.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtSerialPort.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtSerialPort.cpython-312.pyc deleted file mode 100644 index 1737607..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtSerialPort.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtSql.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtSql.cpython-312.pyc deleted file mode 100644 index 79c8078..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtSql.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtSvg.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtSvg.cpython-312.pyc deleted file mode 100644 index 5994576..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtSvg.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtTest.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtTest.cpython-312.pyc deleted file mode 100644 index b20932b..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtTest.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtTextToSpeech.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtTextToSpeech.cpython-312.pyc deleted file mode 100644 index 130d19e..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtTextToSpeech.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebChannel.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebChannel.cpython-312.pyc deleted file mode 100644 index 2f0321e..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebChannel.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebEngine.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebEngine.cpython-312.pyc deleted file mode 100644 index b55d2e8..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebEngine.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebEngineCore.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebEngineCore.cpython-312.pyc deleted file mode 100644 index 70cb339..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebEngineCore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebEngineWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebEngineWidgets.cpython-312.pyc deleted file mode 100644 index e53c869..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebEngineWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebKit.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebKit.cpython-312.pyc deleted file mode 100644 index 8caa556..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebKit.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebKitWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebKitWidgets.cpython-312.pyc deleted file mode 100644 index bc22a4a..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebKitWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebSockets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebSockets.cpython-312.pyc deleted file mode 100644 index 24a7063..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebSockets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWidgets.cpython-312.pyc deleted file mode 100644 index 3c2a6a7..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWinExtras.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWinExtras.cpython-312.pyc deleted file mode 100644 index fab31d1..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWinExtras.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtX11Extras.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtX11Extras.cpython-312.pyc deleted file mode 100644 index 591f065..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtX11Extras.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtXml.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtXml.cpython-312.pyc deleted file mode 100644 index f7ee8ad..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtXml.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtXmlPatterns.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtXmlPatterns.cpython-312.pyc deleted file mode 100644 index 6e40073..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtXmlPatterns.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.cpython-312.pyc deleted file mode 100644 index 11449e0..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.uic.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.uic.cpython-312.pyc deleted file mode 100644 index 9a0e1b9..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.uic.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QAxContainer.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QAxContainer.cpython-312.pyc deleted file mode 100644 index 7568a6f..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QAxContainer.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qsci.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qsci.cpython-312.pyc deleted file mode 100644 index dec5ef5..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qsci.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DAnimation.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DAnimation.cpython-312.pyc deleted file mode 100644 index 54acf67..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DAnimation.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DCore.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DCore.cpython-312.pyc deleted file mode 100644 index 5c59a1d..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DCore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DExtras.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DExtras.cpython-312.pyc deleted file mode 100644 index 3453bb5..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DExtras.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DInput.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DInput.cpython-312.pyc deleted file mode 100644 index 24b9f4a..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DInput.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DLogic.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DLogic.cpython-312.pyc deleted file mode 100644 index 5c29206..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DLogic.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DRender.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DRender.cpython-312.pyc deleted file mode 100644 index d5995fb..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DRender.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtBluetooth.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtBluetooth.cpython-312.pyc deleted file mode 100644 index f971447..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtBluetooth.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtCharts.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtCharts.cpython-312.pyc deleted file mode 100644 index b3be33f..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtCharts.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtCore.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtCore.cpython-312.pyc deleted file mode 100644 index 0168209..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtCore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtDBus.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtDBus.cpython-312.pyc deleted file mode 100644 index 04d299b..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtDBus.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtDataVisualization.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtDataVisualization.cpython-312.pyc deleted file mode 100644 index d3114d3..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtDataVisualization.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtDesigner.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtDesigner.cpython-312.pyc deleted file mode 100644 index f1ba0d7..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtDesigner.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtGraphs.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtGraphs.cpython-312.pyc deleted file mode 100644 index f16f62d..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtGraphs.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtGraphsWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtGraphsWidgets.cpython-312.pyc deleted file mode 100644 index 88476fe..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtGraphsWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtGui.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtGui.cpython-312.pyc deleted file mode 100644 index bbf8979..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtGui.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtHelp.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtHelp.cpython-312.pyc deleted file mode 100644 index a885b2b..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtHelp.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtMultimedia.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtMultimedia.cpython-312.pyc deleted file mode 100644 index 0a5ef79..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtMultimedia.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtMultimediaWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtMultimediaWidgets.cpython-312.pyc deleted file mode 100644 index ba3a0a3..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtMultimediaWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtNetwork.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtNetwork.cpython-312.pyc deleted file mode 100644 index 10a25e7..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtNetwork.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtNetworkAuth.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtNetworkAuth.cpython-312.pyc deleted file mode 100644 index 3014316..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtNetworkAuth.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtNfc.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtNfc.cpython-312.pyc deleted file mode 100644 index df6f5f7..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtNfc.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtOpenGL.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtOpenGL.cpython-312.pyc deleted file mode 100644 index 3cf394e..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtOpenGL.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtOpenGLWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtOpenGLWidgets.cpython-312.pyc deleted file mode 100644 index 2b1f7f9..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtOpenGLWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtPdf.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtPdf.cpython-312.pyc deleted file mode 100644 index a4f56ab..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtPdf.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtPdfWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtPdfWidgets.cpython-312.pyc deleted file mode 100644 index 74024ef..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtPdfWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtPositioning.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtPositioning.cpython-312.pyc deleted file mode 100644 index 8dfe7b0..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtPositioning.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtPrintSupport.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtPrintSupport.cpython-312.pyc deleted file mode 100644 index c8315c1..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtPrintSupport.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtQml.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtQml.cpython-312.pyc deleted file mode 100644 index 690a7c8..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtQml.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtQuick.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtQuick.cpython-312.pyc deleted file mode 100644 index a2bb563..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtQuick.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtQuick3D.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtQuick3D.cpython-312.pyc deleted file mode 100644 index 9f8662d..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtQuick3D.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtQuickWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtQuickWidgets.cpython-312.pyc deleted file mode 100644 index bdddded..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtQuickWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtRemoteObjects.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtRemoteObjects.cpython-312.pyc deleted file mode 100644 index 3eaf50f..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtRemoteObjects.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSensors.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSensors.cpython-312.pyc deleted file mode 100644 index 97a423b..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSensors.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSerialPort.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSerialPort.cpython-312.pyc deleted file mode 100644 index 914eb9d..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSerialPort.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSpatialAudio.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSpatialAudio.cpython-312.pyc deleted file mode 100644 index 75365c1..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSpatialAudio.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSql.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSql.cpython-312.pyc deleted file mode 100644 index 1065ea9..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSql.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtStateMachine.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtStateMachine.cpython-312.pyc deleted file mode 100644 index 3a4c57a..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtStateMachine.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSvg.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSvg.cpython-312.pyc deleted file mode 100644 index a062c39..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSvg.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSvgWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSvgWidgets.cpython-312.pyc deleted file mode 100644 index 3f9c82d..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSvgWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtTest.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtTest.cpython-312.pyc deleted file mode 100644 index 1c520b5..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtTest.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtTextToSpeech.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtTextToSpeech.cpython-312.pyc deleted file mode 100644 index 4c40ad9..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtTextToSpeech.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebChannel.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebChannel.cpython-312.pyc deleted file mode 100644 index e07b9f6..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebChannel.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebEngineCore.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebEngineCore.cpython-312.pyc deleted file mode 100644 index 97603a7..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebEngineCore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebEngineQuick.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebEngineQuick.cpython-312.pyc deleted file mode 100644 index b86d5bb..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebEngineQuick.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebEngineWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebEngineWidgets.cpython-312.pyc deleted file mode 100644 index 10d22b2..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebEngineWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebSockets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebSockets.cpython-312.pyc deleted file mode 100644 index c0a6599..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebSockets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWidgets.cpython-312.pyc deleted file mode 100644 index c319353..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtXml.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtXml.cpython-312.pyc deleted file mode 100644 index df5d9e0..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtXml.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.cpython-312.pyc deleted file mode 100644 index 40d9ada..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.uic.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.uic.cpython-312.pyc deleted file mode 100644 index 399c3e6..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.uic.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DAnimation.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DAnimation.cpython-312.pyc deleted file mode 100644 index baebc01..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DAnimation.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DCore.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DCore.cpython-312.pyc deleted file mode 100644 index 0f4dbe2..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DCore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DExtras.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DExtras.cpython-312.pyc deleted file mode 100644 index defc00b..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DExtras.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DInput.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DInput.cpython-312.pyc deleted file mode 100644 index 90a7643..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DInput.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DLogic.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DLogic.cpython-312.pyc deleted file mode 100644 index 0677e4c..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DLogic.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DRender.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DRender.cpython-312.pyc deleted file mode 100644 index 2f25f26..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DRender.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtAxContainer.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtAxContainer.cpython-312.pyc deleted file mode 100644 index 19c4a7d..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtAxContainer.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtCharts.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtCharts.cpython-312.pyc deleted file mode 100644 index 9eaf2cf..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtCharts.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtConcurrent.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtConcurrent.cpython-312.pyc deleted file mode 100644 index a65d9e2..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtConcurrent.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtCore.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtCore.cpython-312.pyc deleted file mode 100644 index f643d87..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtCore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtDataVisualization.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtDataVisualization.cpython-312.pyc deleted file mode 100644 index e9ed740..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtDataVisualization.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtGui.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtGui.cpython-312.pyc deleted file mode 100644 index 82ec512..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtGui.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtHelp.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtHelp.cpython-312.pyc deleted file mode 100644 index 15da58a..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtHelp.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtLocation.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtLocation.cpython-312.pyc deleted file mode 100644 index da9c7be..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtLocation.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtMacExtras.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtMacExtras.cpython-312.pyc deleted file mode 100644 index 5a1d27f..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtMacExtras.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtMultimedia.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtMultimedia.cpython-312.pyc deleted file mode 100644 index f0a35c7..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtMultimedia.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtMultimediaWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtMultimediaWidgets.cpython-312.pyc deleted file mode 100644 index 4355946..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtMultimediaWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtNetwork.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtNetwork.cpython-312.pyc deleted file mode 100644 index 30f12b8..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtNetwork.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtOpenGL.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtOpenGL.cpython-312.pyc deleted file mode 100644 index 10c713d..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtOpenGL.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtOpenGLFunctions.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtOpenGLFunctions.cpython-312.pyc deleted file mode 100644 index b6517f1..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtOpenGLFunctions.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtPositioning.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtPositioning.cpython-312.pyc deleted file mode 100644 index b763562..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtPositioning.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtPrintSupport.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtPrintSupport.cpython-312.pyc deleted file mode 100644 index 1daa72c..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtPrintSupport.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtQml.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtQml.cpython-312.pyc deleted file mode 100644 index 6a4dd33..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtQml.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtQuick.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtQuick.cpython-312.pyc deleted file mode 100644 index 00c9ad4..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtQuick.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtQuickControls2.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtQuickControls2.cpython-312.pyc deleted file mode 100644 index e90146c..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtQuickControls2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtQuickWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtQuickWidgets.cpython-312.pyc deleted file mode 100644 index 3977383..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtQuickWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtRemoteObjects.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtRemoteObjects.cpython-312.pyc deleted file mode 100644 index 60cf80e..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtRemoteObjects.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtScript.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtScript.cpython-312.pyc deleted file mode 100644 index c53cf9e..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtScript.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtScriptTools.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtScriptTools.cpython-312.pyc deleted file mode 100644 index 3506ba0..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtScriptTools.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtScxml.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtScxml.cpython-312.pyc deleted file mode 100644 index 3f6fd02..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtScxml.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtSensors.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtSensors.cpython-312.pyc deleted file mode 100644 index 8c80ca8..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtSensors.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtSerialPort.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtSerialPort.cpython-312.pyc deleted file mode 100644 index 53b15e5..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtSerialPort.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtSql.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtSql.cpython-312.pyc deleted file mode 100644 index 4df6fad..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtSql.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtSvg.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtSvg.cpython-312.pyc deleted file mode 100644 index e3c18fb..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtSvg.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtTest.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtTest.cpython-312.pyc deleted file mode 100644 index b771567..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtTest.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtTextToSpeech.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtTextToSpeech.cpython-312.pyc deleted file mode 100644 index e0e14cf..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtTextToSpeech.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtUiTools.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtUiTools.cpython-312.pyc deleted file mode 100644 index 5c471e9..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtUiTools.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebChannel.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebChannel.cpython-312.pyc deleted file mode 100644 index d4e41af..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebChannel.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebEngine.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebEngine.cpython-312.pyc deleted file mode 100644 index 45f19b4..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebEngine.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebEngineCore.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebEngineCore.cpython-312.pyc deleted file mode 100644 index be17403..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebEngineCore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebEngineWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebEngineWidgets.cpython-312.pyc deleted file mode 100644 index 9d66500..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebEngineWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebKit.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebKit.cpython-312.pyc deleted file mode 100644 index 2062fe5..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebKit.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebKitWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebKitWidgets.cpython-312.pyc deleted file mode 100644 index 617eb70..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebKitWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebSockets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebSockets.cpython-312.pyc deleted file mode 100644 index 9b05f2e..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebSockets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWidgets.cpython-312.pyc deleted file mode 100644 index aef10a0..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWinExtras.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWinExtras.cpython-312.pyc deleted file mode 100644 index 16763df..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWinExtras.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtX11Extras.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtX11Extras.cpython-312.pyc deleted file mode 100644 index 3b27074..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtX11Extras.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtXml.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtXml.cpython-312.pyc deleted file mode 100644 index 4eae8b5..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtXml.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtXmlPatterns.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtXmlPatterns.cpython-312.pyc deleted file mode 100644 index 1072946..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtXmlPatterns.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qwt5.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qwt5.cpython-312.pyc deleted file mode 100644 index 2dd27a3..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qwt5.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.cpython-312.pyc deleted file mode 100644 index 569b2fc..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DAnimation.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DAnimation.cpython-312.pyc deleted file mode 100644 index 467079a..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DAnimation.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DCore.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DCore.cpython-312.pyc deleted file mode 100644 index b143744..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DCore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DExtras.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DExtras.cpython-312.pyc deleted file mode 100644 index 7464403..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DExtras.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DInput.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DInput.cpython-312.pyc deleted file mode 100644 index ce6777b..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DInput.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DLogic.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DLogic.cpython-312.pyc deleted file mode 100644 index cd5b578..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DLogic.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DRender.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DRender.cpython-312.pyc deleted file mode 100644 index 776c591..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DRender.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtAxContainer.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtAxContainer.cpython-312.pyc deleted file mode 100644 index 5af5e48..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtAxContainer.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtBluetooth.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtBluetooth.cpython-312.pyc deleted file mode 100644 index 27d5d1a..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtBluetooth.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtCharts.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtCharts.cpython-312.pyc deleted file mode 100644 index 1487806..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtCharts.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtConcurrent.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtConcurrent.cpython-312.pyc deleted file mode 100644 index 91e184b..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtConcurrent.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtCore.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtCore.cpython-312.pyc deleted file mode 100644 index bb88f97..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtCore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtDBus.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtDBus.cpython-312.pyc deleted file mode 100644 index 92f970c..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtDBus.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtDataVisualization.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtDataVisualization.cpython-312.pyc deleted file mode 100644 index acf1911..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtDataVisualization.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtDesigner.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtDesigner.cpython-312.pyc deleted file mode 100644 index 09c8c8c..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtDesigner.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtGraphs.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtGraphs.cpython-312.pyc deleted file mode 100644 index 164820e..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtGraphs.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtGraphsWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtGraphsWidgets.cpython-312.pyc deleted file mode 100644 index bcb7e1a..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtGraphsWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtGui.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtGui.cpython-312.pyc deleted file mode 100644 index 70fbf98..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtGui.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtHelp.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtHelp.cpython-312.pyc deleted file mode 100644 index 023e5bf..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtHelp.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtHttpServer.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtHttpServer.cpython-312.pyc deleted file mode 100644 index 6d08aa9..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtHttpServer.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtLocation.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtLocation.cpython-312.pyc deleted file mode 100644 index 4a21fa0..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtLocation.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtMultimedia.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtMultimedia.cpython-312.pyc deleted file mode 100644 index 4667b52..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtMultimedia.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtMultimediaWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtMultimediaWidgets.cpython-312.pyc deleted file mode 100644 index d076480..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtMultimediaWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtNetwork.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtNetwork.cpython-312.pyc deleted file mode 100644 index 2d7f838..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtNetwork.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtNetworkAuth.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtNetworkAuth.cpython-312.pyc deleted file mode 100644 index d20d8bd..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtNetworkAuth.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtNfc.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtNfc.cpython-312.pyc deleted file mode 100644 index 1b80596..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtNfc.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtOpenGL.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtOpenGL.cpython-312.pyc deleted file mode 100644 index 7f2fd6a..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtOpenGL.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtOpenGLWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtOpenGLWidgets.cpython-312.pyc deleted file mode 100644 index c4549dc..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtOpenGLWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtPdf.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtPdf.cpython-312.pyc deleted file mode 100644 index 48771c4..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtPdf.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtPdfWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtPdfWidgets.cpython-312.pyc deleted file mode 100644 index 5343bdd..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtPdfWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtPositioning.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtPositioning.cpython-312.pyc deleted file mode 100644 index 663bc27..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtPositioning.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtPrintSupport.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtPrintSupport.cpython-312.pyc deleted file mode 100644 index 71887a1..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtPrintSupport.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQml.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQml.cpython-312.pyc deleted file mode 100644 index 0e69ee4..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQml.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQuick.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQuick.cpython-312.pyc deleted file mode 100644 index be878ae..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQuick.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQuick3D.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQuick3D.cpython-312.pyc deleted file mode 100644 index f8d3894..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQuick3D.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQuickControls2.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQuickControls2.cpython-312.pyc deleted file mode 100644 index a846dad..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQuickControls2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQuickWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQuickWidgets.cpython-312.pyc deleted file mode 100644 index 91410a2..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQuickWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtRemoteObjects.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtRemoteObjects.cpython-312.pyc deleted file mode 100644 index 5757668..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtRemoteObjects.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtScxml.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtScxml.cpython-312.pyc deleted file mode 100644 index 6ed4f3c..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtScxml.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSensors.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSensors.cpython-312.pyc deleted file mode 100644 index 5005b6d..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSensors.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSerialBus.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSerialBus.cpython-312.pyc deleted file mode 100644 index b1afa20..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSerialBus.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSerialPort.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSerialPort.cpython-312.pyc deleted file mode 100644 index 25c994c..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSerialPort.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSpatialAudio.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSpatialAudio.cpython-312.pyc deleted file mode 100644 index ae11ba6..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSpatialAudio.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSql.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSql.cpython-312.pyc deleted file mode 100644 index 20f80b0..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSql.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtStateMachine.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtStateMachine.cpython-312.pyc deleted file mode 100644 index 5992bd3..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtStateMachine.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSvg.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSvg.cpython-312.pyc deleted file mode 100644 index 0e85c83..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSvg.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSvgWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSvgWidgets.cpython-312.pyc deleted file mode 100644 index e042dfa..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSvgWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtTest.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtTest.cpython-312.pyc deleted file mode 100644 index 6cb9185..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtTest.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtTextToSpeech.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtTextToSpeech.cpython-312.pyc deleted file mode 100644 index 2460db7..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtTextToSpeech.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtUiTools.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtUiTools.cpython-312.pyc deleted file mode 100644 index 1a024d1..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtUiTools.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebChannel.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebChannel.cpython-312.pyc deleted file mode 100644 index 539ef63..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebChannel.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebEngineCore.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebEngineCore.cpython-312.pyc deleted file mode 100644 index 45a5804..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebEngineCore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebEngineQuick.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebEngineQuick.cpython-312.pyc deleted file mode 100644 index e86bcd2..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebEngineQuick.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebEngineWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebEngineWidgets.cpython-312.pyc deleted file mode 100644 index 989b2f1..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebEngineWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebSockets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebSockets.cpython-312.pyc deleted file mode 100644 index e2e2e56..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebSockets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWidgets.cpython-312.pyc deleted file mode 100644 index 406fcfd..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtXml.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtXml.cpython-312.pyc deleted file mode 100644 index 37f7e9c..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtXml.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.cpython-312.pyc deleted file mode 100644 index ae4504e..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-_ctypes.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-_ctypes.cpython-312.pyc deleted file mode 100644 index d6f6475..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-_ctypes.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-_osx_support.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-_osx_support.cpython-312.pyc deleted file mode 100644 index 1899372..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-_osx_support.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-_pyi_rth_utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-_pyi_rth_utils.cpython-312.pyc deleted file mode 100644 index b227cd9..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-_pyi_rth_utils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-_tkinter.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-_tkinter.cpython-312.pyc deleted file mode 100644 index 32ff17c..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-_tkinter.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-babel.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-babel.cpython-312.pyc deleted file mode 100644 index ee88f26..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-babel.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-difflib.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-difflib.cpython-312.pyc deleted file mode 100644 index f1d6f98..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-difflib.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-distutils.command.check.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-distutils.command.check.cpython-312.pyc deleted file mode 100644 index 2fb85fc..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-distutils.command.check.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-distutils.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-distutils.cpython-312.pyc deleted file mode 100644 index 3657e2a..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-distutils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-distutils.util.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-distutils.util.cpython-312.pyc deleted file mode 100644 index b7909a6..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-distutils.util.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.contrib.sessions.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.contrib.sessions.cpython-312.pyc deleted file mode 100644 index 344492f..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.contrib.sessions.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.core.cache.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.core.cache.cpython-312.pyc deleted file mode 100644 index dacd591..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.core.cache.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.core.mail.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.core.mail.cpython-312.pyc deleted file mode 100644 index a283114..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.core.mail.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.core.management.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.core.management.cpython-312.pyc deleted file mode 100644 index 9444b94..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.core.management.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.cpython-312.pyc deleted file mode 100644 index c44aa64..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.db.backends.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.db.backends.cpython-312.pyc deleted file mode 100644 index 01f94cf..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.db.backends.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.db.backends.mysql.base.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.db.backends.mysql.base.cpython-312.pyc deleted file mode 100644 index 6ca447c..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.db.backends.mysql.base.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.db.backends.oracle.base.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.db.backends.oracle.base.cpython-312.pyc deleted file mode 100644 index 824cf0c..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.db.backends.oracle.base.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.template.loaders.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.template.loaders.cpython-312.pyc deleted file mode 100644 index 6aa3807..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-django.template.loaders.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-encodings.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-encodings.cpython-312.pyc deleted file mode 100644 index 5b13453..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-encodings.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gevent.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gevent.cpython-312.pyc deleted file mode 100644 index 2b9b21f..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gevent.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.cpython-312.pyc deleted file mode 100644 index abc26df..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Adw.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Adw.cpython-312.pyc deleted file mode 100644 index 914af62..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Adw.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.AppIndicator3.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.AppIndicator3.cpython-312.pyc deleted file mode 100644 index 3d97c0a..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.AppIndicator3.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Atk.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Atk.cpython-312.pyc deleted file mode 100644 index fadb842..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Atk.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.AyatanaAppIndicator3.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.AyatanaAppIndicator3.cpython-312.pyc deleted file mode 100644 index c94165d..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.AyatanaAppIndicator3.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Champlain.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Champlain.cpython-312.pyc deleted file mode 100644 index e7b2312..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Champlain.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Clutter.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Clutter.cpython-312.pyc deleted file mode 100644 index 8b10dc6..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Clutter.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.DBus.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.DBus.cpython-312.pyc deleted file mode 100644 index 11993e0..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.DBus.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GIRepository.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GIRepository.cpython-312.pyc deleted file mode 100644 index 5be90ba..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GIRepository.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GLib.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GLib.cpython-312.pyc deleted file mode 100644 index 1b13cb2..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GLib.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GModule.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GModule.cpython-312.pyc deleted file mode 100644 index 7d98cfd..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GModule.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GObject.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GObject.cpython-312.pyc deleted file mode 100644 index eedd843..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GObject.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gdk.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gdk.cpython-312.pyc deleted file mode 100644 index 72b71de..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gdk.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GdkPixbuf.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GdkPixbuf.cpython-312.pyc deleted file mode 100644 index 2dea84a..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GdkPixbuf.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gio.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gio.cpython-312.pyc deleted file mode 100644 index 49b7a3b..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gio.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Graphene.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Graphene.cpython-312.pyc deleted file mode 100644 index b2a24a4..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Graphene.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gsk.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gsk.cpython-312.pyc deleted file mode 100644 index 86b375a..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gsk.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gst.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gst.cpython-312.pyc deleted file mode 100644 index bbd3da5..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gst.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstAllocators.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstAllocators.cpython-312.pyc deleted file mode 100644 index ad3604d..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstAllocators.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstApp.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstApp.cpython-312.pyc deleted file mode 100644 index 3104656..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstApp.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstAudio.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstAudio.cpython-312.pyc deleted file mode 100644 index f0562fc..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstAudio.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstBadAudio.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstBadAudio.cpython-312.pyc deleted file mode 100644 index 5f23593..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstBadAudio.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstBase.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstBase.cpython-312.pyc deleted file mode 100644 index ea119eb..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstBase.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstCheck.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstCheck.cpython-312.pyc deleted file mode 100644 index 9b2fabb..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstCheck.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstCodecs.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstCodecs.cpython-312.pyc deleted file mode 100644 index 0fb814b..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstCodecs.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstController.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstController.cpython-312.pyc deleted file mode 100644 index 6b35508..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstController.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstGL.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstGL.cpython-312.pyc deleted file mode 100644 index 7c50f5e..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstGL.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstGLEGL.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstGLEGL.cpython-312.pyc deleted file mode 100644 index 8002b4a..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstGLEGL.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstGLWayland.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstGLWayland.cpython-312.pyc deleted file mode 100644 index 5901771..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstGLWayland.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstGLX11.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstGLX11.cpython-312.pyc deleted file mode 100644 index 1ab9209..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstGLX11.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstInsertBin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstInsertBin.cpython-312.pyc deleted file mode 100644 index 902735f..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstInsertBin.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstMpegts.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstMpegts.cpython-312.pyc deleted file mode 100644 index e133a2d..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstMpegts.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstNet.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstNet.cpython-312.pyc deleted file mode 100644 index 801a4a8..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstNet.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstPbutils.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstPbutils.cpython-312.pyc deleted file mode 100644 index 8d24649..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstPbutils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstPlay.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstPlay.cpython-312.pyc deleted file mode 100644 index f1300f6..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstPlay.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstPlayer.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstPlayer.cpython-312.pyc deleted file mode 100644 index a7501bf..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstPlayer.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstRtp.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstRtp.cpython-312.pyc deleted file mode 100644 index bffc20b..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstRtp.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstRtsp.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstRtsp.cpython-312.pyc deleted file mode 100644 index 1fa1cc3..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstRtsp.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstRtspServer.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstRtspServer.cpython-312.pyc deleted file mode 100644 index 14f1730..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstRtspServer.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstSdp.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstSdp.cpython-312.pyc deleted file mode 100644 index 7599bda..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstSdp.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstTag.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstTag.cpython-312.pyc deleted file mode 100644 index ee48671..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstTag.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstTranscoder.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstTranscoder.cpython-312.pyc deleted file mode 100644 index dc271a8..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstTranscoder.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstVideo.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstVideo.cpython-312.pyc deleted file mode 100644 index cf54140..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstVideo.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstVulkan.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstVulkan.cpython-312.pyc deleted file mode 100644 index 43c9217..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstVulkan.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstVulkanWayland.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstVulkanWayland.cpython-312.pyc deleted file mode 100644 index 6bc89ff..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstVulkanWayland.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstVulkanXCB.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstVulkanXCB.cpython-312.pyc deleted file mode 100644 index 6e104a2..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstVulkanXCB.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstWebRTC.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstWebRTC.cpython-312.pyc deleted file mode 100644 index 8c0ae56..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstWebRTC.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gtk.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gtk.cpython-312.pyc deleted file mode 100644 index ac6bfbd..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gtk.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GtkChamplain.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GtkChamplain.cpython-312.pyc deleted file mode 100644 index ca1d54f..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GtkChamplain.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GtkClutter.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GtkClutter.cpython-312.pyc deleted file mode 100644 index 47bae91..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GtkClutter.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GtkSource.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GtkSource.cpython-312.pyc deleted file mode 100644 index cfd8f00..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GtkSource.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GtkosxApplication.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GtkosxApplication.cpython-312.pyc deleted file mode 100644 index 339dc97..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GtkosxApplication.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.HarfBuzz.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.HarfBuzz.cpython-312.pyc deleted file mode 100644 index 5a29003..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.HarfBuzz.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.OsmGpsMap.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.OsmGpsMap.cpython-312.pyc deleted file mode 100644 index 5dfb4e4..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.OsmGpsMap.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Pango.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Pango.cpython-312.pyc deleted file mode 100644 index b3b352e..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Pango.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.PangoCairo.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.PangoCairo.cpython-312.pyc deleted file mode 100644 index 08706ac..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.PangoCairo.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Rsvg.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Rsvg.cpython-312.pyc deleted file mode 100644 index 3da1fb3..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Rsvg.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.cairo.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.cairo.cpython-312.pyc deleted file mode 100644 index 164c85b..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.cairo.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.freetype2.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.freetype2.cpython-312.pyc deleted file mode 100644 index bb9b164..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.freetype2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.xlib.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.xlib.cpython-312.pyc deleted file mode 100644 index aa64742..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.xlib.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-heapq.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-heapq.cpython-312.pyc deleted file mode 100644 index 0c22a4a..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-heapq.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-idlelib.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-idlelib.cpython-312.pyc deleted file mode 100644 index 8973ac9..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-idlelib.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-importlib_metadata.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-importlib_metadata.cpython-312.pyc deleted file mode 100644 index 782f67a..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-importlib_metadata.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-importlib_resources.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-importlib_resources.cpython-312.pyc deleted file mode 100644 index a83d1a6..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-importlib_resources.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-keyring.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-keyring.cpython-312.pyc deleted file mode 100644 index cd667a7..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-keyring.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-kivy.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-kivy.cpython-312.pyc deleted file mode 100644 index 5aa641d..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-kivy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-lib2to3.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-lib2to3.cpython-312.pyc deleted file mode 100644 index 81ecd0a..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-lib2to3.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backend_bases.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backend_bases.cpython-312.pyc deleted file mode 100644 index d9df70b..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backend_bases.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backends.backend_qtagg.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backends.backend_qtagg.cpython-312.pyc deleted file mode 100644 index 76720e1..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backends.backend_qtagg.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backends.backend_qtcairo.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backends.backend_qtcairo.cpython-312.pyc deleted file mode 100644 index c451961..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backends.backend_qtcairo.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backends.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backends.cpython-312.pyc deleted file mode 100644 index 3fff505..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backends.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backends.qt_compat.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backends.qt_compat.cpython-312.pyc deleted file mode 100644 index 76e345c..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backends.qt_compat.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.cpython-312.pyc deleted file mode 100644 index 5f8ad3c..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.numerix.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.numerix.cpython-312.pyc deleted file mode 100644 index ffe59a2..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.numerix.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.pyplot.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.pyplot.cpython-312.pyc deleted file mode 100644 index c530ce4..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.pyplot.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-multiprocessing.util.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-multiprocessing.util.cpython-312.pyc deleted file mode 100644 index 19b9192..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-multiprocessing.util.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-numpy.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-numpy.cpython-312.pyc deleted file mode 100644 index b37dcc2..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-numpy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pandas.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pandas.cpython-312.pyc deleted file mode 100644 index 361d7cc..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pandas.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pandas.io.clipboard.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pandas.io.clipboard.cpython-312.pyc deleted file mode 100644 index 8853540..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pandas.io.clipboard.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pandas.io.formats.style.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pandas.io.formats.style.cpython-312.pyc deleted file mode 100644 index ec7e047..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pandas.io.formats.style.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pandas.plotting.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pandas.plotting.cpython-312.pyc deleted file mode 100644 index 2579080..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pandas.plotting.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pickle.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pickle.cpython-312.pyc deleted file mode 100644 index 6d37874..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pickle.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pkg_resources.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pkg_resources.cpython-312.pyc deleted file mode 100644 index 44381b8..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pkg_resources.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-platform.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-platform.cpython-312.pyc deleted file mode 100644 index 40bed57..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-platform.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pygments.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pygments.cpython-312.pyc deleted file mode 100644 index 61fa9f6..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pygments.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pytz.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pytz.cpython-312.pyc deleted file mode 100644 index 7ed93bf..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pytz.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pytzdata.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pytzdata.cpython-312.pyc deleted file mode 100644 index e575eb8..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-pytzdata.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-qtawesome.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-qtawesome.cpython-312.pyc deleted file mode 100644 index f8afc11..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-qtawesome.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-qtpy.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-qtpy.cpython-312.pyc deleted file mode 100644 index 17bcdb4..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-qtpy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scapy.layers.all.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scapy.layers.all.cpython-312.pyc deleted file mode 100644 index 7dba75f..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scapy.layers.all.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.cpython-312.pyc deleted file mode 100644 index 9e219d3..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.io.matlab.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.io.matlab.cpython-312.pyc deleted file mode 100644 index 4a07ee7..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.io.matlab.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.linalg.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.linalg.cpython-312.pyc deleted file mode 100644 index e9e4139..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.linalg.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.sparse.csgraph.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.sparse.csgraph.cpython-312.pyc deleted file mode 100644 index 3d7c724..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.sparse.csgraph.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.spatial._ckdtree.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.spatial._ckdtree.cpython-312.pyc deleted file mode 100644 index be9a801..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.spatial._ckdtree.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.spatial.transform.rotation.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.spatial.transform.rotation.cpython-312.pyc deleted file mode 100644 index 82f2ce9..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.spatial.transform.rotation.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.special._ellip_harm_2.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.special._ellip_harm_2.cpython-312.pyc deleted file mode 100644 index ae75071..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.special._ellip_harm_2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.special._ufuncs.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.special._ufuncs.cpython-312.pyc deleted file mode 100644 index e9b2fa3..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.special._ufuncs.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.stats._stats.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.stats._stats.cpython-312.pyc deleted file mode 100644 index 4e6267b..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.stats._stats.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scrapy.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scrapy.cpython-312.pyc deleted file mode 100644 index 5db96f4..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-scrapy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-setuptools._vendor.importlib_metadata.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-setuptools._vendor.importlib_metadata.cpython-312.pyc deleted file mode 100644 index 55169bd..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-setuptools._vendor.importlib_metadata.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-setuptools._vendor.jaraco.text.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-setuptools._vendor.jaraco.text.cpython-312.pyc deleted file mode 100644 index b1621ee..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-setuptools._vendor.jaraco.text.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-setuptools.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-setuptools.cpython-312.pyc deleted file mode 100644 index c4d733c..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-setuptools.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-shelve.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-shelve.cpython-312.pyc deleted file mode 100644 index 2d27846..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-shelve.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-shiboken6.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-shiboken6.cpython-312.pyc deleted file mode 100644 index 683779b..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-shiboken6.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-sphinx.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-sphinx.cpython-312.pyc deleted file mode 100644 index ff8af14..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-sphinx.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-sqlalchemy.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-sqlalchemy.cpython-312.pyc deleted file mode 100644 index 5643df6..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-sqlalchemy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-sqlite3.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-sqlite3.cpython-312.pyc deleted file mode 100644 index 2f53e98..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-sqlite3.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-sysconfig.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-sysconfig.cpython-312.pyc deleted file mode 100644 index 5103a93..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-sysconfig.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-wcwidth.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-wcwidth.cpython-312.pyc deleted file mode 100644 index 7dfee93..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-wcwidth.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-win32ctypes.core.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-win32ctypes.core.cpython-312.pyc deleted file mode 100644 index a042d29..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-win32ctypes.core.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-xml.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-xml.cpython-312.pyc deleted file mode 100644 index 882d4ee..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-xml.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-xml.dom.domreg.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-xml.dom.domreg.cpython-312.pyc deleted file mode 100644 index 4c3d853..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-xml.dom.domreg.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-xml.etree.cElementTree.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-xml.etree.cElementTree.cpython-312.pyc deleted file mode 100644 index 0e1f8eb..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-xml.etree.cElementTree.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-zope.interface.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-zope.interface.cpython-312.pyc deleted file mode 100644 index cf04f64..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/__pycache__/hook-zope.interface.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PIL.Image.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PIL.Image.py deleted file mode 100755 index 1d9e029..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PIL.Image.py +++ /dev/null @@ -1,17 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This hook was tested with Pillow 2.9.0 (Maintained fork of PIL): https://pypi.python.org/pypi/Pillow - -from PyInstaller.utils.hooks import collect_submodules - -# Include all PIL image plugins - module names containing 'ImagePlugin'. e.g. PIL.JpegImagePlugin -hiddenimports = collect_submodules('PIL', lambda name: 'ImagePlugin' in name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PIL.ImageFilter.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PIL.ImageFilter.py deleted file mode 100755 index 528694b..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PIL.ImageFilter.py +++ /dev/null @@ -1,13 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# Only used if installed, not mean to pull in numpy. -excludedimports = ["numpy"] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PIL.SpiderImagePlugin.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PIL.SpiderImagePlugin.py deleted file mode 100755 index 1b6466f..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PIL.SpiderImagePlugin.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# PIL's SpiderImagePlugin features a tkPhotoImage() method, which imports ImageTk (and thus brings in the whole Tcl/Tk -# library). Assume that if people are really using tkinter in their application, they will also import it directly. -excludedimports = ['tkinter'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PIL.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PIL.py deleted file mode 100755 index b7a6849..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PIL.py +++ /dev/null @@ -1,21 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This hook was tested with Pillow 2.9.0 (Maintained fork of PIL): -# https://pypi.python.org/pypi/Pillow - -# Ignore tkinter to prevent inclusion of Tcl/Tk library and other GUI libraries. Assume that if people are really using -# tkinter in their application, they will also import it directly and thus PyInstaller bundles the right GUI library. -excludedimports = ['tkinter', 'PyQt5', 'PySide2', 'PyQt6', 'PySide6'] - -# Similarly, prevent inclusion of IPython, which in turn ends up pulling in whole matplotlib, along with its optional -# GUI library dependencies. -excludedimports += ['IPython'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QAxContainer.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QAxContainer.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QAxContainer.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.Qsci.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.Qsci.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.Qsci.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.Qt.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.Qt.py deleted file mode 100755 index 668d423..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.Qt.py +++ /dev/null @@ -1,29 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# When PyQt5.Qt is imported it implies the import of all PyQt5 modules. See -# http://pyqt.sourceforge.net/Docs/PyQt5/Qt.html. -import os - -from PyInstaller.utils.hooks import get_module_file_attribute - -# Only do this if PyQt5 is found. -mfi = get_module_file_attribute('PyQt5') -if mfi: - # Determine the name of all these modules by looking in the PyQt5 directory. - hiddenimports = [] - for f in os.listdir(os.path.dirname(mfi)): - root, ext = os.path.splitext(os.path.basename(f)) - if root.startswith('Qt') and root != 'Qt': - # On Linux and macOS, PyQt 5.14.1 has a ``.abi3`` suffix on all library names. Remove it. - if root.endswith('.abi3'): - root = root[:-5] - hiddenimports.append('PyQt5.' + root) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DAnimation.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DAnimation.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DAnimation.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DCore.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DCore.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DCore.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DExtras.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DExtras.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DExtras.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DInput.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DInput.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DInput.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DLogic.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DLogic.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DLogic.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DRender.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DRender.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DRender.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtBluetooth.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtBluetooth.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtBluetooth.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtChart.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtChart.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtChart.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtCore.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtCore.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtCore.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtDBus.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtDBus.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtDBus.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtDataVisualization.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtDataVisualization.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtDataVisualization.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtDesigner.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtDesigner.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtDesigner.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtGui.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtGui.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtGui.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtHelp.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtHelp.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtHelp.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtLocation.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtLocation.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtLocation.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtMacExtras.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtMacExtras.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtMacExtras.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtMultimedia.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtMultimedia.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtMultimedia.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtMultimediaWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtMultimediaWidgets.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtMultimediaWidgets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtNetwork.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtNetwork.py deleted file mode 100755 index 1c8cc67..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtNetwork.py +++ /dev/null @@ -1,15 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies, pyqt5_library_info - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) -binaries += pyqt5_library_info.collect_qtnetwork_files() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtNetworkAuth.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtNetworkAuth.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtNetworkAuth.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtNfc.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtNfc.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtNfc.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtOpenGL.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtOpenGL.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtOpenGL.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtPositioning.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtPositioning.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtPositioning.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtPrintSupport.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtPrintSupport.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtPrintSupport.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtPurchasing.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtPurchasing.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtPurchasing.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtQml.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtQml.py deleted file mode 100755 index 718d323..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtQml.py +++ /dev/null @@ -1,17 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies, pyqt5_library_info - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) -qml_binaries, qml_datas = pyqt5_library_info.collect_qtqml_files() -binaries += qml_binaries -datas += qml_datas diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtQuick.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtQuick.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtQuick.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtQuick3D.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtQuick3D.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtQuick3D.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtQuickWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtQuickWidgets.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtQuickWidgets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtRemoteObjects.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtRemoteObjects.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtRemoteObjects.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtScript.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtScript.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtScript.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtSensors.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtSensors.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtSensors.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtSerialPort.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtSerialPort.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtSerialPort.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtSql.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtSql.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtSql.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtSvg.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtSvg.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtSvg.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtTest.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtTest.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtTest.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtTextToSpeech.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtTextToSpeech.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtTextToSpeech.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebChannel.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebChannel.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebChannel.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebEngine.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebEngine.py deleted file mode 100755 index 7b67e1b..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebEngine.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2014-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebEngineCore.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebEngineCore.py deleted file mode 100755 index f575e0d..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebEngineCore.py +++ /dev/null @@ -1,22 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2014-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import \ - add_qt5_dependencies, pyqt5_library_info - -# Ensure PyQt5 is importable before adding info depending on it. -if pyqt5_library_info.version is not None: - hiddenimports, binaries, datas = add_qt5_dependencies(__file__) - - # Include helper process executable, translations, and resources. - webengine_binaries, webengine_datas = pyqt5_library_info.collect_qtwebengine_files() - binaries += webengine_binaries - datas += webengine_datas diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebEngineWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebEngineWidgets.py deleted file mode 100755 index 7b67e1b..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebEngineWidgets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2014-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebKit.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebKit.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebKit.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebKitWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebKitWidgets.py deleted file mode 100755 index 7b67e1b..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebKitWidgets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2014-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebSockets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebSockets.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebSockets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWidgets.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWidgets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWinExtras.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWinExtras.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtWinExtras.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtX11Extras.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtX11Extras.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtX11Extras.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtXml.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtXml.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtXml.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtXmlPatterns.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtXmlPatterns.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.QtXmlPatterns.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.py deleted file mode 100755 index 2325577..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.py +++ /dev/null @@ -1,29 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import pyqt5_library_info, ensure_single_qt_bindings_package - -# Allow only one Qt bindings package to be collected in frozen application. -ensure_single_qt_bindings_package("PyQt5") - -# Only proceed if PyQt5 can be imported. -if pyqt5_library_info.version is not None: - hiddenimports = [ - # PyQt5.10 and earlier uses sip in an separate package; - 'sip', - # PyQt5.11 and later provides SIP in a private package. Support both. - 'PyQt5.sip', - # Imported via __import__ in PyQt5/__init__.py - 'pkgutil', - ] - - # Collect required Qt binaries. - binaries = pyqt5_library_info.collect_extra_binaries() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.uic.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.uic.py deleted file mode 100755 index e4474dd..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt5.uic.py +++ /dev/null @@ -1,17 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import collect_data_files - -# We need to include modules in PyQt5.uic.widget-plugins, so they can be dynamically loaded by uic. They should be -# included as separate (data-like) files, so they can be found by os.listdir and friends. However, as this directory -# is not a package, refer to it using the package (PyQt5.uic) followed by the subdirectory name (``widget-plugins/``). -datas = collect_data_files('PyQt5.uic', True, 'widget-plugins') diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QAxContainer.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QAxContainer.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QAxContainer.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.Qsci.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.Qsci.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.Qsci.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DAnimation.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DAnimation.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DAnimation.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DCore.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DCore.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DCore.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DExtras.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DExtras.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DExtras.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DInput.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DInput.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DInput.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DLogic.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DLogic.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DLogic.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DRender.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DRender.py deleted file mode 100755 index 58ac06d..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DRender.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) - -hiddenimports += ["PyQt6.QtOpenGL"] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtBluetooth.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtBluetooth.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtBluetooth.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtCharts.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtCharts.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtCharts.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtCore.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtCore.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtCore.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtDBus.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtDBus.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtDBus.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtDataVisualization.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtDataVisualization.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtDataVisualization.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtDesigner.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtDesigner.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtDesigner.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtGraphs.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtGraphs.py deleted file mode 100755 index 17c60d1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtGraphs.py +++ /dev/null @@ -1,17 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) - -# These dependencies cannot seem to be inferred from linked libraries. -hiddenimports += ['PyQt6.QtNetwork', 'PyQt6.QtQml'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtGraphsWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtGraphsWidgets.py deleted file mode 100755 index c4cba93..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtGraphsWidgets.py +++ /dev/null @@ -1,17 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) - -# These dependencies cannot seem to be inferred from linked libraries. -hiddenimports += ['PyQt6.QtGraphs', 'PyQt6.QtQuickWidgets'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtGui.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtGui.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtGui.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtHelp.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtHelp.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtHelp.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtMultimedia.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtMultimedia.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtMultimedia.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtMultimediaWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtMultimediaWidgets.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtMultimediaWidgets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtNetwork.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtNetwork.py deleted file mode 100755 index c780c7c..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtNetwork.py +++ /dev/null @@ -1,15 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies, pyqt6_library_info - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) -binaries += pyqt6_library_info.collect_qtnetwork_files() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtNetworkAuth.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtNetworkAuth.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtNetworkAuth.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtNfc.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtNfc.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtNfc.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtOpenGL.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtOpenGL.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtOpenGL.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtOpenGLWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtOpenGLWidgets.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtOpenGLWidgets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtPdf.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtPdf.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtPdf.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtPdfWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtPdfWidgets.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtPdfWidgets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtPositioning.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtPositioning.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtPositioning.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtPrintSupport.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtPrintSupport.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtPrintSupport.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtQml.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtQml.py deleted file mode 100755 index 024696a..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtQml.py +++ /dev/null @@ -1,17 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies, pyqt6_library_info - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) -qml_binaries, qml_datas = pyqt6_library_info.collect_qtqml_files() -binaries += qml_binaries -datas += qml_datas diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtQuick.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtQuick.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtQuick.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtQuick3D.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtQuick3D.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtQuick3D.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtQuickWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtQuickWidgets.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtQuickWidgets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtRemoteObjects.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtRemoteObjects.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtRemoteObjects.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtSensors.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtSensors.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtSensors.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtSerialPort.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtSerialPort.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtSerialPort.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtSpatialAudio.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtSpatialAudio.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtSpatialAudio.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtSql.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtSql.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtSql.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtStateMachine.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtStateMachine.py deleted file mode 100755 index b1b97aa..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtStateMachine.py +++ /dev/null @@ -1,17 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2025, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) - -# This dependency cannot seem to be inferred from linked libraries (at least on Windows). -hiddenimports += ['PyQt6.QtGui'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtSvg.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtSvg.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtSvg.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtSvgWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtSvgWidgets.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtSvgWidgets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtTest.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtTest.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtTest.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtTextToSpeech.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtTextToSpeech.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtTextToSpeech.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebChannel.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebChannel.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebChannel.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebEngineCore.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebEngineCore.py deleted file mode 100755 index 7eb593c..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebEngineCore.py +++ /dev/null @@ -1,27 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2014-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import \ - add_qt6_dependencies, pyqt6_library_info - -# Ensure PyQt6 is importable before adding info depending on it. -if pyqt6_library_info.version is not None: - # Qt6 prior to 6.2.2 contains a bug that makes it incompatible with the way PyInstaller collects - # QtWebEngine shared libraries and resources. So exit here and now instead of producing a defunct build. - if pyqt6_library_info.version < [6, 2, 2]: - raise SystemExit("ERROR: PyInstaller's QtWebEngine support requires Qt6 6.2.2 or later!") - - hiddenimports, binaries, datas = add_qt6_dependencies(__file__) - - # Include helper process executable, translations, and resources. - webengine_binaries, webengine_datas = pyqt6_library_info.collect_qtwebengine_files() - binaries += webengine_binaries - datas += webengine_datas diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebEngineQuick.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebEngineQuick.py deleted file mode 100755 index 19083de..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebEngineQuick.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2014-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebEngineWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebEngineWidgets.py deleted file mode 100755 index 19083de..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebEngineWidgets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2014-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebSockets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebSockets.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebSockets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtWidgets.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtWidgets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtXml.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtXml.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.QtXml.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.py deleted file mode 100755 index b9e2f51..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.py +++ /dev/null @@ -1,26 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import pyqt6_library_info, ensure_single_qt_bindings_package - -# Allow only one Qt bindings package to be collected in frozen application. -ensure_single_qt_bindings_package("PyQt6") - -# Only proceed if PyQt6 can be imported. -if pyqt6_library_info.version is not None: - hiddenimports = [ - 'PyQt6.sip', - # Imported via __import__ in PyQt6/__init__.py - 'pkgutil', - ] - - # Collect required Qt binaries. - binaries = pyqt6_library_info.collect_extra_binaries() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.uic.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.uic.py deleted file mode 100755 index 7744cbc..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PyQt6.uic.py +++ /dev/null @@ -1,17 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import collect_data_files - -# We need to include modules in PyQt6.uic.widget-plugins, so they can be dynamically loaded by uic. They should be -# included as separate (data-like) files, so they can be found by os.listdir and friends. However, as this directory -# is not a package, refer to it using the package (PyQt6.uic) followed by the subdirectory name (``widget-plugins/``). -datas = collect_data_files('PyQt6.uic', True, 'widget-plugins') diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DAnimation.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DAnimation.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DAnimation.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DCore.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DCore.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DCore.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DExtras.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DExtras.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DExtras.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DInput.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DInput.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DInput.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DLogic.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DLogic.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DLogic.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DRender.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DRender.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DRender.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtAxContainer.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtAxContainer.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtAxContainer.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtCharts.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtCharts.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtCharts.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtConcurrent.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtConcurrent.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtConcurrent.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtCore.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtCore.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtCore.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtDataVisualization.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtDataVisualization.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtDataVisualization.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtGui.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtGui.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtGui.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtHelp.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtHelp.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtHelp.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtLocation.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtLocation.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtLocation.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtMacExtras.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtMacExtras.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtMacExtras.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtMultimedia.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtMultimedia.py deleted file mode 100755 index 1f3f908..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtMultimedia.py +++ /dev/null @@ -1,19 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) - -# Using PySide2 true_properties ("from __feature__ import true_properties") causes a hidden dependency on -# QtMultimediaWidgets python module: -# https://github.com/qtproject/pyside-pyside-setup/blob/5.15.2/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/mapping.py#L577-L586 -hiddenimports += ['PySide2.QtMultimediaWidgets'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtMultimediaWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtMultimediaWidgets.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtMultimediaWidgets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtNetwork.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtNetwork.py deleted file mode 100755 index 4e62091..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtNetwork.py +++ /dev/null @@ -1,15 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies, pyside2_library_info - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) -binaries += pyside2_library_info.collect_qtnetwork_files() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtOpenGL.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtOpenGL.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtOpenGL.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtOpenGLFunctions.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtOpenGLFunctions.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtOpenGLFunctions.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtPositioning.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtPositioning.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtPositioning.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtPrintSupport.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtPrintSupport.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtPrintSupport.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtQml.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtQml.py deleted file mode 100755 index a9f7162..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtQml.py +++ /dev/null @@ -1,19 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies, pyside2_library_info - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) -qml_binaries, qml_datas = pyside2_library_info.collect_qtqml_files() -binaries += qml_binaries -datas += qml_datas - -hiddenimports += ["PySide2.QtGui"] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtQuick.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtQuick.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtQuick.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtQuickControls2.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtQuickControls2.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtQuickControls2.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtQuickWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtQuickWidgets.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtQuickWidgets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtRemoteObjects.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtRemoteObjects.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtRemoteObjects.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtScript.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtScript.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtScript.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtScriptTools.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtScriptTools.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtScriptTools.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtScxml.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtScxml.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtScxml.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtSensors.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtSensors.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtSensors.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtSerialPort.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtSerialPort.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtSerialPort.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtSql.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtSql.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtSql.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtSvg.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtSvg.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtSvg.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtTest.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtTest.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtTest.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtTextToSpeech.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtTextToSpeech.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtTextToSpeech.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtUiTools.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtUiTools.py deleted file mode 100755 index 9f47776..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtUiTools.py +++ /dev/null @@ -1,15 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) -hiddenimports += ['PySide2.QtXml'] # Not inferred from dynamic lib analysis diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWebChannel.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWebChannel.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWebChannel.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWebEngine.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWebEngine.py deleted file mode 100755 index 7b67e1b..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWebEngine.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2014-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWebEngineCore.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWebEngineCore.py deleted file mode 100755 index afb578e..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWebEngineCore.py +++ /dev/null @@ -1,22 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2014-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import \ - add_qt5_dependencies, pyside2_library_info - -# Ensure PySide2 is importable before adding info depending on it. -if pyside2_library_info.version is not None: - hiddenimports, binaries, datas = add_qt5_dependencies(__file__) - - # Include helper process executable, translations, and resources. - webengine_binaries, webengine_datas = pyside2_library_info.collect_qtwebengine_files() - binaries += webengine_binaries - datas += webengine_datas diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWebEngineWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWebEngineWidgets.py deleted file mode 100755 index 7b67e1b..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWebEngineWidgets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2014-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWebKit.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWebKit.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWebKit.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWebKitWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWebKitWidgets.py deleted file mode 100755 index 7b67e1b..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWebKitWidgets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2014-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWebSockets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWebSockets.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWebSockets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWidgets.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWidgets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWinExtras.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWinExtras.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtWinExtras.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtX11Extras.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtX11Extras.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtX11Extras.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtXml.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtXml.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtXml.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtXmlPatterns.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtXmlPatterns.py deleted file mode 100755 index 51258b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.QtXmlPatterns.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt5_dependencies - -hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.Qwt5.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.Qwt5.py deleted file mode 100755 index 57f3c22..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.Qwt5.py +++ /dev/null @@ -1,31 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller import isolated - -hiddenimports = ['PySide2.QtCore', 'PySide2.QtWidgets', 'PySide2.QtGui', 'PySide2.QtSvg'] - - -@isolated.decorate -def conditional_imports(): - from PySide2 import Qwt5 - - out = [] - if hasattr(Qwt5, "toNumpy"): - out.append("numpy") - if hasattr(Qwt5, "toNumeric"): - out.append("numeric") - if hasattr(Qwt5, "toNumarray"): - out.append("numarray") - return out - - -hiddenimports += conditional_imports() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.py deleted file mode 100755 index aa7a714..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide2.py +++ /dev/null @@ -1,25 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import pyside2_library_info, ensure_single_qt_bindings_package - -# Allow only one Qt bindings package to be collected in frozen application. -ensure_single_qt_bindings_package("PySide2") - -# Only proceed if PySide2 can be imported. -if pyside2_library_info.version is not None: - hiddenimports = ['shiboken2', 'inspect'] - if pyside2_library_info.version < [5, 15]: - # The shiboken2 bootstrap in earlier releases requires __future__ in addition to inspect - hiddenimports += ['__future__'] - - # Collect required Qt binaries. - binaries = pyside2_library_info.collect_extra_binaries() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DAnimation.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DAnimation.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DAnimation.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DCore.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DCore.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DCore.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DExtras.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DExtras.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DExtras.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DInput.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DInput.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DInput.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DLogic.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DLogic.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DLogic.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DRender.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DRender.py deleted file mode 100755 index 2bb9b83..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DRender.py +++ /dev/null @@ -1,20 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies, pyside6_library_info - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) - -# In PySide 6.7.0, Qt3DRender module added a reference to QtOpenGL type system. The hidden import is required on -# Windows, while on macOS and Linux we seem to pick it up automatically due to the corresponding Qt shared library -# appearing among binary dependencies. Keep it around on all OSes, though - just in case this ever changes. -if pyside6_library_info.version is not None and pyside6_library_info.version >= [6, 7]: - hiddenimports += ['PySide6.QtOpenGL'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtAxContainer.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtAxContainer.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtAxContainer.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtBluetooth.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtBluetooth.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtBluetooth.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtCharts.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtCharts.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtCharts.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtConcurrent.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtConcurrent.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtConcurrent.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtCore.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtCore.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtCore.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtDBus.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtDBus.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtDBus.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtDataVisualization.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtDataVisualization.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtDataVisualization.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtDesigner.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtDesigner.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtDesigner.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtGraphs.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtGraphs.py deleted file mode 100755 index 00941c0..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtGraphs.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtGraphsWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtGraphsWidgets.py deleted file mode 100755 index 91ae027..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtGraphsWidgets.py +++ /dev/null @@ -1,17 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) - -# These dependencies cannot seem to be inferred from linked libraries. -hiddenimports += ['PySide6.QtQuickWidgets', 'PySide6.QtGraphs'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtGui.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtGui.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtGui.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtHelp.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtHelp.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtHelp.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtHttpServer.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtHttpServer.py deleted file mode 100755 index 790cb11..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtHttpServer.py +++ /dev/null @@ -1,18 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) - -# This seems to be necessary on Windows; on other OSes, it is inferred automatically because the extension is linked -# against the Qt6Concurrent shared library. -hiddenimports += ['PySide6.QtConcurrent'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtLocation.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtLocation.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtLocation.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtMultimedia.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtMultimedia.py deleted file mode 100755 index 0c2d31b..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtMultimedia.py +++ /dev/null @@ -1,19 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) - -# Using PySide6 true_properties ("from __feature__ import true_properties") causes a hidden dependency on -# QtMultimediaWidgets python module: -# https://github.com/qtproject/pyside-pyside-setup/blob/v6.2.2.1/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/mapping.py#L614-L627 -hiddenimports += ['PySide6.QtMultimediaWidgets'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtMultimediaWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtMultimediaWidgets.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtMultimediaWidgets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtNetwork.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtNetwork.py deleted file mode 100755 index a216ecd..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtNetwork.py +++ /dev/null @@ -1,15 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies, pyside6_library_info - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) -binaries += pyside6_library_info.collect_qtnetwork_files() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtNetworkAuth.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtNetworkAuth.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtNetworkAuth.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtNfc.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtNfc.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtNfc.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtOpenGL.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtOpenGL.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtOpenGL.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtOpenGLWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtOpenGLWidgets.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtOpenGLWidgets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtPdf.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtPdf.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtPdf.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtPdfWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtPdfWidgets.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtPdfWidgets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtPositioning.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtPositioning.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtPositioning.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtPrintSupport.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtPrintSupport.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtPrintSupport.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtQml.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtQml.py deleted file mode 100755 index 8b6837d..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtQml.py +++ /dev/null @@ -1,17 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies, pyside6_library_info - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) -qml_binaries, qml_datas = pyside6_library_info.collect_qtqml_files() -binaries += qml_binaries -datas += qml_datas diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtQuick.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtQuick.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtQuick.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtQuick3D.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtQuick3D.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtQuick3D.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtQuickControls2.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtQuickControls2.py deleted file mode 100755 index b405fc6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtQuickControls2.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) - -hiddenimports += ['PySide6.QtQuick'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtQuickWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtQuickWidgets.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtQuickWidgets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtRemoteObjects.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtRemoteObjects.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtRemoteObjects.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtScxml.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtScxml.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtScxml.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtSensors.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtSensors.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtSensors.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtSerialBus.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtSerialBus.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtSerialBus.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtSerialPort.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtSerialPort.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtSerialPort.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtSpatialAudio.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtSpatialAudio.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtSpatialAudio.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtSql.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtSql.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtSql.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtStateMachine.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtStateMachine.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtStateMachine.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtSvg.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtSvg.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtSvg.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtSvgWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtSvgWidgets.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtSvgWidgets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtTest.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtTest.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtTest.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtTextToSpeech.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtTextToSpeech.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtTextToSpeech.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtUiTools.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtUiTools.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtUiTools.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtWebChannel.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtWebChannel.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtWebChannel.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtWebEngineCore.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtWebEngineCore.py deleted file mode 100755 index 06e05f8..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtWebEngineCore.py +++ /dev/null @@ -1,29 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2014-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import \ - add_qt6_dependencies, pyside6_library_info - -# Ensure PySide6 is importable before adding info depending on it. -if pyside6_library_info.version is not None: - # Qt6 prior to 6.2.2 contains a bug that makes it incompatible with the way PyInstaller collects - # QtWebEngine shared libraries and resources. So exit here and now instead of producing a defunct build. - if pyside6_library_info.version < [6, 2, 2]: - raise SystemExit("ERROR: PyInstaller's QtWebEngine support requires Qt6 6.2.2 or later!") - - hiddenimports, binaries, datas = add_qt6_dependencies(__file__) - - # Include helper process executable, translations, and resources. - webengine_binaries, webengine_datas = pyside6_library_info.collect_qtwebengine_files() - binaries += webengine_binaries - datas += webengine_datas - - hiddenimports += ['PySide6.QtPrintSupport'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtWebEngineQuick.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtWebEngineQuick.py deleted file mode 100755 index 19083de..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtWebEngineQuick.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2014-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtWebEngineWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtWebEngineWidgets.py deleted file mode 100755 index 19083de..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtWebEngineWidgets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2014-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtWebSockets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtWebSockets.py deleted file mode 100755 index 49d27d6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtWebSockets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtWidgets.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtWidgets.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtWidgets.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtXml.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtXml.py deleted file mode 100755 index edd5cd1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.QtXml.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.qt import add_qt6_dependencies - -hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.py deleted file mode 100755 index 30e2ee6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-PySide6.py +++ /dev/null @@ -1,28 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import check_requirement -from PyInstaller.utils.hooks.qt import pyside6_library_info, ensure_single_qt_bindings_package - -# Allow only one Qt bindings package to be collected in frozen application. -ensure_single_qt_bindings_package("PySide6") - -# Only proceed if PySide6 can be imported. -if pyside6_library_info.version is not None: - hiddenimports = ['shiboken6', 'inspect'] - - # Starting with PySide6 6.4.0, we need to collect PySide6.support.deprecated for | and & operators to work with - # Qt key and key modifiers enums. See #7249. - if check_requirement("PySide6 >= 6.4.0"): - hiddenimports += ['PySide6.support.deprecated'] - - # Collect required Qt binaries. - binaries = pyside6_library_info.collect_extra_binaries() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-_ctypes.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-_ctypes.py deleted file mode 100755 index d9ccf8c..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-_ctypes.py +++ /dev/null @@ -1,19 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2014, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller import compat - -# During python 3.14 development cycle, ctypes struct/union layout logic has been moved from `_ctypes` extension into -# Python, i.e., `ctypes._layout` module: https://github.com/python/cpython/pull/123352 -# Since this module is referenced only from the `_ctypes` extension, it needs to be added to hidden imports, at least on -# Windows and macOS. -if compat.is_py314: - hiddenimports = ['ctypes._layout'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-_osx_support.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-_osx_support.py deleted file mode 100755 index a3a69d5..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-_osx_support.py +++ /dev/null @@ -1,19 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2025, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# Prevent conditional import of `distutils` in `_osx_support.compiler_fixup()` in python < 3.10 from pulling in -# `distutils`; this function is called only from `distutils` itself, which ensures that the module is available as -# needed. Blocking this import prevents `distutils` (and nowadays `setuptools`) from being pulled into even very -# basic applications when built with python < 3.10. -# -# See: https://github.com/python/cpython/blob/f3994ade31a563d49806cf6a681d1b1115fccaa3/Lib/_osx_support.py#L430-L434 - -excludedimports = ['distutils'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-_pyi_rth_utils.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-_pyi_rth_utils.py deleted file mode 100755 index cbd93aa..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-_pyi_rth_utils.py +++ /dev/null @@ -1,17 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller import compat - -# Exclude submodules specific to non-applicable OSes -excludedimports = [] -if not compat.is_win: - excludedimports += ['_pyi_rth_utils._win32'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-_tkinter.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-_tkinter.py deleted file mode 100755 index 7f21b49..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-_tkinter.py +++ /dev/null @@ -1,22 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.tcl_tk import tcltk_info - - -def hook(hook_api): - # Add all Tcl/Tk data files, based on the `TclTkInfo.data_files`. If Tcl/Tk is unavailable, the list is empty. - # - # NOTE: the list contains 3-element TOC tuples with full destination filenames (because other parts of code, - # specifically splash-screen writer, currently require this format). Therefore, we need to use - # `PostGraphAPI.add_datas` (which supports 3-element TOC tuples); if this was 2-element "hook-style" TOC list, - # we could just assign `datas` global hook variable, without implementing the post-graph `hook()` function. - hook_api.add_datas(tcltk_info.data_files) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-babel.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-babel.py deleted file mode 100755 index 5f03a97..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-babel.py +++ /dev/null @@ -1,24 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import collect_data_files - -# Ensure that .dat files from locale-data sub-directory are collected. -datas = collect_data_files('babel') - -# Unpickling of locale-data/root.dat currently (babel v2.16.0) requires classes from following modules, so ensure that -# they are always collected: -hiddenimports = [ - "babel.dates", - "babel.localedata", - "babel.plural", - "babel.numbers", -] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-difflib.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-difflib.py deleted file mode 100755 index 2416758..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-difflib.py +++ /dev/null @@ -1,13 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2015-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# only required when run as `__main__` -excludedimports = ["doctest"] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-distutils.command.check.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-distutils.command.check.py deleted file mode 100755 index 50a17d4..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-distutils.command.check.py +++ /dev/null @@ -1,13 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# Conditionally imported in this module; should not trigger collection. -excludedimports = ['docutils'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-distutils.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-distutils.py deleted file mode 100755 index c9cd63b..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-distutils.py +++ /dev/null @@ -1,33 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.setuptools import setuptools_info - -hiddenimports = [] - -# From Python 3.6 and later ``distutils.sysconfig`` takes on the same behaviour as regular ``sysconfig`` of moving the -# config vars to a module (see hook-sysconfig.py). It doesn't use a nice `get module name` function like ``sysconfig`` -# does to help us locate it but the module is the same file that ``sysconfig`` uses so we can use the -# ``_get_sysconfigdata_name()`` from regular ``sysconfig``. -try: - import sysconfig - hiddenimports += [sysconfig._get_sysconfigdata_name()] -except AttributeError: - # Either sysconfig has no attribute _get_sysconfigdata_name (i.e., the function does not exist), or this is Windows - # and the _get_sysconfigdata_name() call failed due to missing sys.abiflags attribute. - pass - -# Starting with setuptools 60.0, the vendored distutils overrides the stdlib one (which will be removed in python 3.12 -# anyway), so check if we are using that version. While the distutils override behavior can be controleld via the -# ``SETUPTOOLS_USE_DISTUTILS`` environment variable, the latter may have a different value during the build and at the -# runtime, and so we need to ensure that both stdlib and setuptools variant of distutils are collected. -if setuptools_info.available and setuptools_info.version >= (60, 0): - hiddenimports += ['setuptools._distutils'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-distutils.util.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-distutils.util.py deleted file mode 100755 index 021d459..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-distutils.util.py +++ /dev/null @@ -1,13 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# distutils.util.run_2to3() imports lib2to3. Exclude it as chances are low that it is used by the frozen package. -excludedimports = ['lib2to3.refactor'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.contrib.sessions.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.contrib.sessions.py deleted file mode 100755 index 5d86e6c..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.contrib.sessions.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules('django.contrib.sessions.backends') diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.core.cache.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.core.cache.py deleted file mode 100755 index eb319c7..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.core.cache.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules('django.core.cache.backends') diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.core.mail.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.core.mail.py deleted file mode 100755 index 1cee61c..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.core.mail.py +++ /dev/null @@ -1,25 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -django.core.mail uses part of the email package. -The problem is: when using runserver with autoreload mode, the thread that checks for changed files triggers further -imports within the email package, because of the LazyImporter in email (used in 2.5 for backward compatibility). -We then need to name those modules as hidden imports, otherwise at runtime the autoreload thread will complain -with a traceback. -""" - -hiddenimports = [ - 'email.mime.message', - 'email.mime.image', - 'email.mime.text', - 'email.mime.multipart', - 'email.mime.audio', -] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.core.management.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.core.management.py deleted file mode 100755 index a8566e0..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.core.management.py +++ /dev/null @@ -1,19 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import collect_submodules - -# Module django.core.management.commands.shell imports IPython, but it introduces many other dependencies that are not -# necessary for a simple django project; ignore the IPython module. -excludedimports = ['IPython', 'matplotlib', 'tkinter'] - -# Django requires management modules for the script 'manage.py'. -hiddenimports = collect_submodules('django.core.management.commands') diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.db.backends.mysql.base.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.db.backends.mysql.base.py deleted file mode 100755 index 951899e..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.db.backends.mysql.base.py +++ /dev/null @@ -1,13 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# Compiler module (see class DatabaseOperations) -hiddenimports = ["django.db.backends.mysql.compiler"] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.db.backends.oracle.base.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.db.backends.oracle.base.py deleted file mode 100755 index d50eb97..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.db.backends.oracle.base.py +++ /dev/null @@ -1,12 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -hiddenimports = ["django.db.backends.oracle.compiler"] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.db.backends.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.db.backends.py deleted file mode 100755 index e829fe7..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.db.backends.py +++ /dev/null @@ -1,25 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -import glob -import os - -from PyInstaller.utils.hooks import get_module_file_attribute - -# Compiler (see class BaseDatabaseOperations) -hiddenimports = ['django.db.models.sql.compiler'] - -# Include all available Django backends. -modpath = os.path.dirname(get_module_file_attribute('django.db.backends')) -for fn in glob.glob(os.path.join(modpath, '*')): - if os.path.isdir(fn): - fn = os.path.basename(fn) - hiddenimports.append('django.db.backends.' + fn + '.base') diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.py deleted file mode 100755 index 4a8ee04..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.py +++ /dev/null @@ -1,92 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# Tested with django 2.2 - -import glob -import os - -from PyInstaller import log as logging -from PyInstaller.utils import hooks -from PyInstaller.utils.hooks import django - -logger = logging.getLogger(__name__) - -# Collect everything. Some submodules of django are not importable without considerable external setup. Ignore the -# errors they raise. -datas, binaries, hiddenimports = hooks.collect_all('django', on_error="ignore") - -root_dir = django.django_find_root_dir() -if root_dir: - logger.info('Django root directory %s', root_dir) - # Include imports from the mysite.settings.py module. - settings_py_imports = django.django_dottedstring_imports(root_dir) - # Include all submodules of all imports detected in mysite.settings.py. - for submod in settings_py_imports: - hiddenimports.append(submod) - hiddenimports += hooks.collect_submodules(submod) - # Include main django modules - settings.py, urls.py, wsgi.py. Without them the django server won't run. - package_name = os.path.basename(root_dir) - default_settings_module = f'{package_name}.settings' - settings_module = os.environ.get('DJANGO_SETTINGS_MODULE', default_settings_module) - hiddenimports += [ - # TODO: consider including 'mysite.settings.py' in source code as a data files, - # since users might need to edit this file. - settings_module, - package_name + '.urls', - package_name + '.wsgi', - ] - # Django hiddenimports from the standard Python library. - hiddenimports += [ - 'http.cookies', - 'html.parser', - ] - - # Bundle django DB schema migration scripts as data files. They are necessary for some commands. - logger.info('Collecting Django migration scripts.') - migration_modules = [ - 'django.conf.app_template.migrations', - 'django.contrib.admin.migrations', - 'django.contrib.auth.migrations', - 'django.contrib.contenttypes.migrations', - 'django.contrib.flatpages.migrations', - 'django.contrib.redirects.migrations', - 'django.contrib.sessions.migrations', - 'django.contrib.sites.migrations', - ] - # Include migration scripts of Django-based apps too. - installed_apps = hooks.get_module_attribute(settings_module, 'INSTALLED_APPS') - migration_modules.extend(set(app + '.migrations' for app in installed_apps)) - # Copy migration files. - for mod in migration_modules: - mod_name, bundle_name = mod.split('.', 1) - mod_dir = os.path.dirname(hooks.get_module_file_attribute(mod_name)) - bundle_dir = bundle_name.replace('.', os.sep) - pattern = os.path.join(mod_dir, bundle_dir, '*.py') - files = glob.glob(pattern) - for f in files: - datas.append((f, os.path.join(mod_name, bundle_dir))) - - # Include data files from your Django project found in your django root package. - datas += hooks.collect_data_files(package_name) - - # Include database file if using sqlite. The sqlite database is usually next to the manage.py script. - root_dir_parent = os.path.dirname(root_dir) - # TODO Add more patterns if necessary. - _patterns = ['*.db', 'db.*'] - for p in _patterns: - files = glob.glob(os.path.join(root_dir_parent, p)) - for f in files: - # Place those files next to the executable. - datas.append((f, '.')) - -else: - logger.warning('No django root directory could be found!') diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.template.loaders.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.template.loaders.py deleted file mode 100755 index 18b1374..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-django.template.loaders.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules('django.template.loaders') diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-encodings.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-encodings.py deleted file mode 100755 index a4082e1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-encodings.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules('encodings') diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gevent.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gevent.py deleted file mode 100755 index 40ad953..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gevent.py +++ /dev/null @@ -1,24 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2015-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import collect_all, copy_metadata - -excludedimports = ["gevent.testing", "gevent.tests"] - -datas, binaries, hiddenimports = collect_all( - 'gevent', - filter_submodules=lambda name: ("gevent.testing" not in name or "gevent.tests" not in name), - include_py_files=False, - exclude_datas=["**/tests"] -) - -# Gevent uses ``pkg_resources.require("...")``, which means that all its dependencies must also have their metadata. -datas += copy_metadata('gevent', recursive=True) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.py deleted file mode 100755 index 78e3538..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.py +++ /dev/null @@ -1,26 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller import compat -from packaging.version import Version - -pygobject_version = Version(compat.importlib_metadata.version("pygobject")).release - -hiddenimports = ['gi._error', 'gi._option'] - -# PyGObject 3.50.0 added support for `asyncio`, and attempts to import inside the `_gi` extension. -if pygobject_version >= (3, 50, 0): - hiddenimports += ['asyncio'] - -# PyGobject 3.52.0 added `gi._enum`, which needs to be added to hiddenimports due to being imported from the -# `_gi` extension. -if pygobject_version >= (3, 52, 0): - hiddenimports += ['gi._enum'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Adw.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Adw.py deleted file mode 100755 index 3327e21..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Adw.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('Adw', '1') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.AppIndicator3.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.AppIndicator3.py deleted file mode 100755 index 4b9c894..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.AppIndicator3.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('AppIndicator3', '0.1') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Atk.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Atk.py deleted file mode 100755 index b57ee3f..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Atk.py +++ /dev/null @@ -1,29 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import get_hook_config -from PyInstaller.utils.hooks.gi import GiModuleInfo, collect_glib_translations - - -def hook(hook_api): - module_info = GiModuleInfo('Atk', '1.0') - if not module_info.available: - return - - binaries, datas, hiddenimports = module_info.collect_typelib_data() - - # Collect translations - lang_list = get_hook_config(hook_api, "gi", "languages") - datas += collect_glib_translations('atk10', lang_list) - - hook_api.add_datas(datas) - hook_api.add_binaries(binaries) - hook_api.add_imports(*hiddenimports) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.AyatanaAppIndicator3.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.AyatanaAppIndicator3.py deleted file mode 100755 index 36b178a..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.AyatanaAppIndicator3.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('AyatanaAppIndicator3', '0.1') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Champlain.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Champlain.py deleted file mode 100755 index d48def3..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Champlain.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('Champlain', '0.12') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Clutter.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Clutter.py deleted file mode 100755 index 9ad56a6..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Clutter.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('Clutter', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.DBus.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.DBus.py deleted file mode 100755 index 0580fcb..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.DBus.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('DBus', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GIRepository.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GIRepository.py deleted file mode 100755 index 5c6961a..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GIRepository.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GIRepository', '2.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GLib.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GLib.py deleted file mode 100755 index 6aa236c..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GLib.py +++ /dev/null @@ -1,42 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -import glob -import os - -from PyInstaller.compat import is_win -from PyInstaller.utils.hooks import get_hook_config -from PyInstaller.utils.hooks.gi import GiModuleInfo, collect_glib_share_files, collect_glib_translations - - -def hook(hook_api): - module_info = GiModuleInfo('GLib', '2.0') - if not module_info.available: - return - - binaries, datas, hiddenimports = module_info.collect_typelib_data() - - # Collect translations - lang_list = get_hook_config(hook_api, "gi", "languages") - datas += collect_glib_translations('glib20', lang_list) - - # Collect schemas - datas += collect_glib_share_files('glib-2.0', 'schemas') - - # On Windows, glib needs a spawn helper for g_spawn* API - if is_win: - pattern = os.path.join(module_info.get_libdir(), 'gspawn-*-helper*.exe') - for f in glob.glob(pattern): - binaries.append((f, '.')) - - hook_api.add_datas(datas) - hook_api.add_binaries(binaries) - hook_api.add_imports(*hiddenimports) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GModule.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GModule.py deleted file mode 100755 index 0ccaaaf..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GModule.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GModule', '2.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GObject.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GObject.py deleted file mode 100755 index 2171165..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GObject.py +++ /dev/null @@ -1,19 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -from PyInstaller.utils.hooks import check_requirement -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GObject', '2.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() - # gi._gobject removed from PyGObject in version 3.25.1 - if check_requirement('PyGObject < 3.25.1'): - hiddenimports += ['gi._gobject'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Gdk.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Gdk.py deleted file mode 100755 index 99fbd08..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Gdk.py +++ /dev/null @@ -1,36 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo -from PyInstaller.utils.hooks import get_hook_config - - -def hook(hook_api): - # Use the Gdk version from hook config, if available. If not, try using Gtk version from hook config, so that we - # collect Gdk and Gtk of the same version. - module_versions = get_hook_config(hook_api, 'gi', 'module-versions') - if module_versions: - version = module_versions.get('Gdk') - if not version: - version = module_versions.get('Gtk', '3.0') - else: - version = '3.0' - - module_info = GiModuleInfo('Gdk', version) - if not module_info.available: - return - - binaries, datas, hiddenimports = module_info.collect_typelib_data() - hiddenimports += ['gi._gi_cairo', 'gi.repository.cairo'] - - hook_api.add_datas(datas) - hook_api.add_binaries(binaries) - hook_api.add_imports(*hiddenimports) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GdkPixbuf.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GdkPixbuf.py deleted file mode 100755 index 8126328..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GdkPixbuf.py +++ /dev/null @@ -1,150 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -import glob -import os -import shutil -import subprocess - -from PyInstaller import compat -from PyInstaller.config import CONF # workpath -from PyInstaller.utils.hooks import get_hook_config, logger -from PyInstaller.utils.hooks.gi import GiModuleInfo, collect_glib_translations - -LOADERS_PATH = os.path.join('gdk-pixbuf-2.0', '2.10.0', 'loaders') -LOADER_MODULE_DEST_PATH = "lib/gdk-pixbuf/loaders" -LOADER_CACHE_DEST_PATH = "lib/gdk-pixbuf" # NOTE: some search & replace code depends on / being used on all platforms. - - -def _find_gdk_pixbuf_query_loaders_executable(libdir): - # Distributions either package gdk-pixbuf-query-loaders in the GI libs directory (not on the path), or on the path - # with or without a -x64 suffix, depending on the architecture. - cmds = [ - os.path.join(libdir, 'gdk-pixbuf-2.0', 'gdk-pixbuf-query-loaders'), - 'gdk-pixbuf-query-loaders-64', - 'gdk-pixbuf-query-loaders', - ] - - for cmd in cmds: - cmd_fullpath = shutil.which(cmd) - if cmd_fullpath is not None: - return cmd_fullpath - - return None - - -def _collect_loaders(libdir): - # Assume loader plugins have .so library suffix on all non-Windows platforms - lib_ext = "*.dll" if compat.is_win else "*.so" - - # Find all loaders - loader_libs = [] - pattern = os.path.join(libdir, LOADERS_PATH, lib_ext) - for f in glob.glob(pattern): - loader_libs.append(f) - - # Sometimes the loaders are stored in a different directory from the library (msys2) - if not loader_libs: - pattern = os.path.abspath(os.path.join(libdir, '..', 'lib', LOADERS_PATH, lib_ext)) - for f in glob.glob(pattern): - loader_libs.append(f) - - return loader_libs - - -def _generate_loader_cache(gdk_pixbuf_query_loaders, libdir, loader_libs): - # Run the "gdk-pixbuf-query-loaders" command and capture its standard output providing an updated loader - # cache; then write this output to the loader cache bundled with this frozen application. On all platforms, - # we also move the package structure to point to lib/gdk-pixbuf instead of lib/gdk-pixbuf-2.0/2.10.0 in - # order to make compatible with macOS .app bundle signing. - # - # On macOS we use @executable_path to specify a path relative to the generated bundle. However, on - # non-Windows, we need to rewrite the loader cache because it is not relocatable by default. See - # https://bugzilla.gnome.org/show_bug.cgi?id=737523 - # - # To make it easier to rewrite, we just always write @executable_path, since its significantly easier to - # find/replace at runtime. :) - # - # To permit string munging, decode the encoded bytes output by this command (i.e., enable the - # "universal_newlines" option). - # - # On Fedora, the default loaders cache is /usr/lib64, but the libdir is actually /lib64. To get around this, - # we pass the path to the loader command, and it will create a cache with the right path. - # - # On Windows, the loaders lib directory is relative, starts with 'lib', and uses \\ as path separators - # (escaped \). - cachedata = subprocess.run([gdk_pixbuf_query_loaders, *loader_libs], - check=True, - stdout=subprocess.PIPE, - encoding='utf-8').stdout - - output_lines = [] - prefix = '"' + os.path.join(libdir, 'gdk-pixbuf-2.0', '2.10.0') - plen = len(prefix) - - win_prefix = '"' + '\\\\'.join(['lib', 'gdk-pixbuf-2.0', '2.10.0']) - win_plen = len(win_prefix) - - msys2_prefix = '"' + os.path.abspath(os.path.join(libdir, '..', 'lib', 'gdk-pixbuf-2.0', '2.10.0')) - msys2_plen = len(msys2_prefix) - - # For each line in the updated loader cache... - for line in cachedata.splitlines(): - if line.startswith('#'): - continue - if line.startswith(prefix): - line = '"@executable_path/' + LOADER_CACHE_DEST_PATH + line[plen:] - elif line.startswith(win_prefix): - line = '"' + LOADER_CACHE_DEST_PATH.replace('/', '\\\\') + line[win_plen:] - elif line.startswith(msys2_prefix): - line = ('"' + LOADER_CACHE_DEST_PATH + line[msys2_plen:]).replace('/', '\\\\') - output_lines.append(line) - - return '\n'.join(output_lines) - - -def hook(hook_api): - module_info = GiModuleInfo('GdkPixbuf', '2.0') - if not module_info.available: - return - - binaries, datas, hiddenimports = module_info.collect_typelib_data() - - libdir = module_info.get_libdir() - - # Collect GdkPixbuf loaders and generate loader cache file - gdk_pixbuf_query_loaders = _find_gdk_pixbuf_query_loaders_executable(libdir) - logger.debug("gdk-pixbuf-query-loaders executable: %s", gdk_pixbuf_query_loaders) - if not gdk_pixbuf_query_loaders: - logger.warning("gdk-pixbuf-query-loaders executable not found in GI library directory or in PATH!") - else: - # Find all GdkPixbuf loader modules - loader_libs = _collect_loaders(libdir) - - # Collect discovered loaders - for lib in loader_libs: - binaries.append((lib, LOADER_MODULE_DEST_PATH)) - - # Generate loader cache; we need to store it to CONF['workpath'] so we can collect it as a data file. - cachedata = _generate_loader_cache(gdk_pixbuf_query_loaders, libdir, loader_libs) - cachefile = os.path.join(CONF['workpath'], 'loaders.cache') - with open(cachefile, 'w', encoding='utf-8') as fp: - fp.write(cachedata) - datas.append((cachefile, LOADER_CACHE_DEST_PATH)) - - # Collect translations - lang_list = get_hook_config(hook_api, "gi", "languages") - if gdk_pixbuf_query_loaders: - datas += collect_glib_translations('gdk-pixbuf', lang_list) - - hook_api.add_datas(datas) - hook_api.add_binaries(binaries) - hook_api.add_imports(*hiddenimports) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Gio.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Gio.py deleted file mode 100755 index fe34446..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Gio.py +++ /dev/null @@ -1,68 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2025, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -import glob -import os - -from PyInstaller import compat -import PyInstaller.log as logging -from PyInstaller.utils.hooks.gi import GiModuleInfo - -logger = logging.getLogger(__name__) - -module_info = GiModuleInfo('Gio', '2.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() - - # Find Gio modules - libdir = module_info.get_libdir() - modules_pattern = None - gio_libdir = os.path.join(libdir, 'gio', 'modules') - runtime_path = 'gio_modules' - - lib_ext = '*.so' - if compat.is_win: - lib_ext = '*.dll' - - if not os.path.exists(gio_libdir): - # homebrew/MSYS2 may install the files elsewhere... - gio_libdir = os.path.join(os.path.commonprefix([compat.base_prefix, gio_libdir]), 'lib', 'gio', 'modules') - - if os.path.exists(gio_libdir): - modules_pattern = os.path.join(gio_libdir, lib_ext) - else: - logger.warning('Could not determine Gio modules path!') - - if modules_pattern: - for f in glob.glob(modules_pattern): - binaries.append((f, runtime_path)) - cache_file = os.path.join(gio_libdir, 'giomodule.cache') - if os.path.isfile(cache_file): - datas.append((cache_file, runtime_path)) - else: - # To add a new platform add a new elif above with the proper is_ and proper pattern for finding the - # Gio modules on your platform. - logger.warning('Bundling Gio modules is not supported on your platform.') - - # Bundle the mime cache -- might not be needed on Windows - # -> this is used for content type detection (also used by GdkPixbuf) - # -> gio/xdgmime/xdgmime.c looks for mime/mime.cache in the users home directory, followed by XDG_DATA_DIRS if - # specified in the environment, otherwise it searches /usr/local/share/ and /usr/share/ - if not compat.is_win: - _mime_searchdirs = ['/usr/local/share', '/usr/share'] - if 'XDG_DATA_DIRS' in os.environ: - _mime_searchdirs.insert(0, os.environ['XDG_DATA_DIRS']) - - for sd in _mime_searchdirs: - spath = os.path.join(sd, 'mime', 'mime.cache') - if os.path.exists(spath): - datas.append((spath, 'share/mime')) - break diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Graphene.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Graphene.py deleted file mode 100755 index bfa4d30..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Graphene.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('Graphene', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Gsk.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Gsk.py deleted file mode 100755 index 9229252..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Gsk.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('Gsk', '4.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Gst.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Gst.py deleted file mode 100755 index 939a37b..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Gst.py +++ /dev/null @@ -1,93 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# GStreamer contains a lot of plugins. We need to collect them and bundle them with the exe file. We also need to -# resolve binary dependencies of these GStreamer plugins. - -import pathlib - -from PyInstaller.utils.hooks import get_hook_config, include_or_exclude_file -import PyInstaller.log as logging -from PyInstaller import isolated -from PyInstaller.utils.hooks.gi import GiModuleInfo, collect_glib_share_files, collect_glib_translations - -logger = logging.getLogger(__name__) - - -@isolated.decorate -def _get_gst_plugin_path(): - import os - import gi - gi.require_version('Gst', '1.0') - from gi.repository import Gst - Gst.init(None) - reg = Gst.Registry.get() - plug = reg.find_plugin('coreelements') - path = plug.get_filename() - return os.path.dirname(path) - - -def _format_plugin_pattern(plugin_name): - return f"**/*gst{plugin_name}.*" - - -def hook(hook_api): - module_info = GiModuleInfo('Gst', '1.0') - if not module_info.available: - return - - binaries, datas, hiddenimports = module_info.collect_typelib_data() - hiddenimports += ["gi.repository.Gio"] - - # Collect data files - datas += collect_glib_share_files('gstreamer-1.0') - - # Translations - lang_list = get_hook_config(hook_api, "gi", "languages") - for prog in [ - 'gst-plugins-bad-1.0', - 'gst-plugins-base-1.0', - 'gst-plugins-good-1.0', - 'gst-plugins-ugly-1.0', - 'gstreamer-1.0', - ]: - datas += collect_glib_translations(prog, lang_list) - - # Plugins - try: - plugin_path = _get_gst_plugin_path() - except Exception as e: - logger.warning("Failed to determine gstreamer plugin path: %s", e) - plugin_path = None - - if plugin_path: - plugin_path = pathlib.Path(plugin_path) - - # Obtain optional include/exclude list from hook config - include_list = get_hook_config(hook_api, "gstreamer", "include_plugins") - exclude_list = get_hook_config(hook_api, "gstreamer", "exclude_plugins") - - # Format plugin basenames into filename patterns for matching - if include_list is not None: - include_list = [_format_plugin_pattern(name) for name in include_list] - if exclude_list is not None: - exclude_list = [_format_plugin_pattern(name) for name in exclude_list] - - # The names of GStreamer plugins typically start with libgst (or just gst, depending on the toolchain). We also - # need to account for different extensions that might be used on a particular OS (for example, on macOS, the - # extension may be either .so or .dylib). - for lib_pattern in ['*gst*.dll', '*gst*.dylib', '*gst*.so']: - binaries += [(str(filename), 'gst_plugins') for filename in plugin_path.glob(lib_pattern) - if include_or_exclude_file(filename, include_list, exclude_list)] - - hook_api.add_datas(datas) - hook_api.add_binaries(binaries) - hook_api.add_imports(*hiddenimports) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstAllocators.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstAllocators.py deleted file mode 100755 index 119401a..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstAllocators.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstAllocators', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstApp.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstApp.py deleted file mode 100755 index 7c25a44..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstApp.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstApp', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstAudio.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstAudio.py deleted file mode 100755 index cf18078..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstAudio.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstAudio', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstBadAudio.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstBadAudio.py deleted file mode 100755 index 0f345b9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstBadAudio.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstBadAudio', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstBase.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstBase.py deleted file mode 100755 index ea6187b..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstBase.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstBase', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstCheck.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstCheck.py deleted file mode 100755 index e631995..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstCheck.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstCheck', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstCodecs.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstCodecs.py deleted file mode 100755 index ffa643e..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstCodecs.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstCodecs', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstController.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstController.py deleted file mode 100755 index c928843..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstController.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstController', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstGL.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstGL.py deleted file mode 100755 index 0075eb0..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstGL.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstGL', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstGLEGL.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstGLEGL.py deleted file mode 100755 index a3f557d..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstGLEGL.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstGLEGL', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstGLWayland.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstGLWayland.py deleted file mode 100755 index 6ef146d..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstGLWayland.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstGLWayland', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstGLX11.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstGLX11.py deleted file mode 100755 index dd68570..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstGLX11.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstGLX11', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstInsertBin.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstInsertBin.py deleted file mode 100755 index c7980bc..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstInsertBin.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstInsertBin', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstMpegts.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstMpegts.py deleted file mode 100755 index b690192..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstMpegts.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstMpegts', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstNet.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstNet.py deleted file mode 100755 index 0c268af..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstNet.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstNet', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstPbutils.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstPbutils.py deleted file mode 100755 index 173b695..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstPbutils.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstPbutils', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstPlay.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstPlay.py deleted file mode 100755 index edb6020..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstPlay.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstPlay', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstPlayer.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstPlayer.py deleted file mode 100755 index 80cb93f..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstPlayer.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstPlayer', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstRtp.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstRtp.py deleted file mode 100755 index d18e58d..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstRtp.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstRtp', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstRtsp.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstRtsp.py deleted file mode 100755 index 09382dd..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstRtsp.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstRtsp', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstRtspServer.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstRtspServer.py deleted file mode 100755 index d023c3f..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstRtspServer.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstRtspServer', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstSdp.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstSdp.py deleted file mode 100755 index 2a78e2b..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstSdp.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstSdp', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstTag.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstTag.py deleted file mode 100755 index dbac756..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstTag.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstTag', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstTranscoder.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstTranscoder.py deleted file mode 100755 index 3cc1dcf..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstTranscoder.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstTranscoder', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstVideo.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstVideo.py deleted file mode 100755 index 398b503..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstVideo.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstVideo', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstVulkan.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstVulkan.py deleted file mode 100755 index 588c073..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstVulkan.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstVulkan', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstVulkanWayland.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstVulkanWayland.py deleted file mode 100755 index aaef939..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstVulkanWayland.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstVulkanWayland', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstVulkanXCB.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstVulkanXCB.py deleted file mode 100755 index 2351a13..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstVulkanXCB.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstVulkanXCB', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstWebRTC.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstWebRTC.py deleted file mode 100755 index 9fcac06..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GstWebRTC.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GstWebRTC', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Gtk.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Gtk.py deleted file mode 100755 index 2495b1d..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Gtk.py +++ /dev/null @@ -1,59 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -import os -import os.path - -from PyInstaller.compat import is_win -from PyInstaller.utils.hooks import get_hook_config -from PyInstaller.utils.hooks.gi import GiModuleInfo, collect_glib_etc_files, collect_glib_share_files, \ - collect_glib_translations - - -def hook(hook_api): - module_info = GiModuleInfo('Gtk', '3.0', hook_api=hook_api) # Pass hook_api to read version from hook config - if not module_info.available: - return - - binaries, datas, hiddenimports = module_info.collect_typelib_data() - - # Collect fontconfig data - datas += collect_glib_share_files('fontconfig') - - # Icons, themes, translations - icon_list = get_hook_config(hook_api, "gi", "icons") - if icon_list is not None: - for icon in icon_list: - datas += collect_glib_share_files(os.path.join('icons', icon)) - else: - datas += collect_glib_share_files('icons') - - # Themes - theme_list = get_hook_config(hook_api, "gi", "themes") - if theme_list is not None: - for theme in theme_list: - datas += collect_glib_share_files(os.path.join('themes', theme)) - else: - datas += collect_glib_share_files('themes') - - # Translations - lang_list = get_hook_config(hook_api, "gi", "languages") - datas += collect_glib_translations(f'gtk{module_info.version[0]}0', lang_list) - - # These only seem to be required on Windows - if is_win: - datas += collect_glib_etc_files('fonts') - datas += collect_glib_etc_files('pango') - datas += collect_glib_share_files('fonts') - - hook_api.add_datas(datas) - hook_api.add_binaries(binaries) - hook_api.add_imports(*hiddenimports) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GtkChamplain.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GtkChamplain.py deleted file mode 100755 index 777b620..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GtkChamplain.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GtkChamplain', '0.12') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GtkClutter.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GtkClutter.py deleted file mode 100755 index cc4fcd7..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GtkClutter.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('GtkClutter', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GtkSource.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GtkSource.py deleted file mode 100755 index 5e7efa7..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GtkSource.py +++ /dev/null @@ -1,31 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo, collect_glib_share_files - - -def hook(hook_api): - module_info = GiModuleInfo('GtkSource', '3.0', hook_api=hook_api) # Pass hook_api to read version from hook config - if not module_info.available: - return - - binaries, datas, hiddenimports = module_info.collect_typelib_data() - - # Collect data files - # The data directory name contains verbatim version, e.g.: - # * GtkSourceView-3.0 -> /usr/share/gtksourceview-3.0 - # * GtkSourceView-4 -> /usr/share/gtksourceview-4 - # * GtkSourceView-5 -> /usr/share/gtksourceview-5 - datas += collect_glib_share_files(f'gtksourceview-{module_info.version}') - - hook_api.add_datas(datas) - hook_api.add_binaries(binaries) - hook_api.add_imports(*hiddenimports) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GtkosxApplication.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GtkosxApplication.py deleted file mode 100755 index 3437edf..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.GtkosxApplication.py +++ /dev/null @@ -1,18 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.compat import is_darwin -from PyInstaller.utils.hooks.gi import GiModuleInfo - -if is_darwin: - module_info = GiModuleInfo('GtkosxApplication', '1.0') - if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.HarfBuzz.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.HarfBuzz.py deleted file mode 100755 index 41cef14..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.HarfBuzz.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('HarfBuzz', '0.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.OsmGpsMap.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.OsmGpsMap.py deleted file mode 100755 index 477f0c0..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.OsmGpsMap.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2025, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo("OsmGpsMap", "1.0") -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Pango.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Pango.py deleted file mode 100755 index 3d8b865..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Pango.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('Pango', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.PangoCairo.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.PangoCairo.py deleted file mode 100755 index 7c058fd..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.PangoCairo.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('PangoCairo', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Rsvg.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Rsvg.py deleted file mode 100755 index e3ad6d2..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.Rsvg.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('Rsvg', '2.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.cairo.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.cairo.py deleted file mode 100755 index 71fed30..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.cairo.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('cairo', '1.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.freetype2.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.freetype2.py deleted file mode 100755 index ffea7a1..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.freetype2.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('freetype2', '2.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.xlib.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.xlib.py deleted file mode 100755 index 1c2bde3..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-gi.repository.xlib.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks.gi import GiModuleInfo - -module_info = GiModuleInfo('xlib', '2.0') -if module_info.available: - binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-heapq.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-heapq.py deleted file mode 100755 index 373025f..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-heapq.py +++ /dev/null @@ -1,13 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2015-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# Only required when run as `__main__`. -excludedimports = ["doctest"] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-idlelib.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-idlelib.py deleted file mode 100755 index 505378d..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-idlelib.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('idlelib') diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-importlib_metadata.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-importlib_metadata.py deleted file mode 100755 index 7abf511..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-importlib_metadata.py +++ /dev/null @@ -1,24 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2019-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -importlib_metadata is a library to access the metadata for a Python package. This functionality intends to replace most -uses of pkg_resources entry point API and metadata API. -""" - -from PyInstaller.utils.hooks import copy_metadata - -# Normally, we should never need to use copy_metadata() in a hook since metadata requirements detection is now -# automatic. However, that detection first uses `PyiModuleGraph.get_code_using("importlib_metadata")` to find -# files which `import importlib_metadata` and `get_code_using()` intentionally excludes internal imports. This -# means that importlib_metadata is not scanned for usages of importlib_metadata and therefore when -# importlib_metadata uses its own API to get its version, this goes undetected. Therefore, we must collect its -# metadata manually. -datas = copy_metadata('importlib_metadata') diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-importlib_resources.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-importlib_resources.py deleted file mode 100755 index b43b19b..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-importlib_resources.py +++ /dev/null @@ -1,22 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2019-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -`importlib_resources` is a backport of the 3.9+ module `importlib.resources` -""" - -from PyInstaller.utils.hooks import check_requirement, collect_data_files - -# Prior to v1.2.0, a `version.txt` file is used to set __version__. Later versions use `importlib.metadata`. -if check_requirement("importlib_resources < 1.2.0"): - datas = collect_data_files("importlib_resources", includes=["version.txt"]) - -if check_requirement("importlib_resources >= 1.3.1"): - hiddenimports = ['importlib_resources.trees'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-keyring.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-keyring.py deleted file mode 100755 index acbd5ff..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-keyring.py +++ /dev/null @@ -1,19 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2014-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import collect_submodules, copy_metadata - -# Collect backends -hiddenimports = collect_submodules('keyring.backends') - -# Keyring performs backend plugin discovery using setuptools entry points, which are listed in the metadata. Therefore, -# we need to copy the metadata, otherwise no backends will be found at run-time. -datas = copy_metadata('keyring') diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-kivy.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-kivy.py deleted file mode 100755 index fd01f06..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-kivy.py +++ /dev/null @@ -1,25 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2015-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller import log as logging -from PyInstaller.utils.hooks import check_requirement - -if check_requirement('kivy >= 1.9.1'): - from kivy.tools.packaging.pyinstaller_hooks import (add_dep_paths, get_deps_all, get_factory_modules, kivy_modules) - from kivy.tools.packaging.pyinstaller_hooks import excludedimports, datas # noqa: F401 - - add_dep_paths() - - hiddenimports = get_deps_all()['hiddenimports'] - hiddenimports = list(set(get_factory_modules() + kivy_modules + hiddenimports)) -else: - logger = logging.getLogger(__name__) - logger.warning('Hook disabled because of Kivy version < 1.9.1') diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-lib2to3.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-lib2to3.py deleted file mode 100755 index 83b0f08..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-lib2to3.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This is needed to bundle lib2to3 Grammars files - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('lib2to3') diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-matplotlib.backend_bases.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-matplotlib.backend_bases.py deleted file mode 100755 index f65344c..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-matplotlib.backend_bases.py +++ /dev/null @@ -1,12 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -excludedimports = ['IPython'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-matplotlib.backends.backend_qtagg.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-matplotlib.backends.backend_qtagg.py deleted file mode 100755 index b3067db..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-matplotlib.backends.backend_qtagg.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This module conditionally imports PyQt6: -# https://github.com/matplotlib/matplotlib/blob/9e18a343fb58a2978a8e27df03190ed21c61c343/lib/matplotlib/backends/backend_qtagg.py#L52-L53 -# Suppress this import to prevent PyQt6 from being accidentally pulled in; the actually relevant Qt bindings are -# determined by our hook for `matplotlib.backends.qt_compat` module. -excludedimports = ['PyQt6'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-matplotlib.backends.backend_qtcairo.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-matplotlib.backends.backend_qtcairo.py deleted file mode 100755 index 0b9174b..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-matplotlib.backends.backend_qtcairo.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This module conditionally imports PyQt6: -# https://github.com/matplotlib/matplotlib/blob/9e18a343fb58a2978a8e27df03190ed21c61c343/lib/matplotlib/backends/backend_qtcairo.py#L24-L25 -# Suppress this import to prevent PyQt6 from being accidentally pulled in; the actually relevant Qt bindings are -# determined by our hook for `matplotlib.backends.qt_compat` module. -excludedimports = ['PyQt6'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-matplotlib.backends.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-matplotlib.backends.py deleted file mode 100755 index 935ca80..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-matplotlib.backends.py +++ /dev/null @@ -1,226 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.compat import is_darwin -from PyInstaller.utils.hooks import logger, get_hook_config -from PyInstaller import isolated - - -@isolated.decorate -def _get_configured_default_backend(): - """ - Return the configured default matplotlib backend name, if available as matplotlib.rcParams['backend'] (or overridden - by MPLBACKEND environment variable. If the value of matplotlib.rcParams['backend'] corresponds to the auto-sentinel - object, returns None - """ - import matplotlib - # matplotlib.rcParams overrides the __getitem__ implementation and attempts to determine and load the default - # backend using pyplot.switch_backend(). Therefore, use dict.__getitem__(). - val = dict.__getitem__(matplotlib.rcParams, 'backend') - if isinstance(val, str): - return val - return None - - -@isolated.decorate -def _list_available_mpl_backends(): - """ - Returns the names of all available matplotlib backends. - """ - import matplotlib - return matplotlib.rcsetup.all_backends - - -@isolated.decorate -def _check_mpl_backend_importable(module_name): - """ - Attempts to import the given module name (matplotlib backend module). - - Exceptions are propagated to caller. - """ - __import__(module_name) - - -# Bytecode scanning -def _recursive_scan_code_objects_for_mpl_use(co): - """ - Recursively scan the bytecode for occurrences of matplotlib.use() or mpl.use() calls with const arguments, and - collect those arguments into list of used matplotlib backend names. - """ - - from PyInstaller.depend.bytecode import any_alias, recursive_function_calls - - mpl_use_names = { - *any_alias("matplotlib.use"), - *any_alias("mpl.use"), # matplotlib is commonly aliased as mpl - } - - backends = [] - for calls in recursive_function_calls(co).values(): - for name, args in calls: - # matplotlib.use(backend) or matplotlib.use(backend, force) - # We support only literal arguments. Similarly, kwargs are - # not supported. - if len(args) not in {1, 2} or not isinstance(args[0], str): - continue - if name in mpl_use_names: - backends.append(args[0]) - - return backends - - -def _backend_module_name(name): - """ - Converts matplotlib backend name to its corresponding module name. - - Equivalent to matplotlib.cbook._backend_module_name(). - """ - if name.startswith("module://"): - return name[9:] - return f"matplotlib.backends.backend_{name.lower()}" - - -def _autodetect_used_backends(hook_api): - """ - Returns a list of automatically-discovered matplotlib backends in use, or the name of the default matplotlib - backend. Implements the 'auto' backend selection method. - """ - # Scan the code for matplotlib.use() - modulegraph = hook_api.analysis.graph - mpl_code_objs = modulegraph.get_code_using("matplotlib") - used_backends = [] - for name, co in mpl_code_objs.items(): - co_backends = _recursive_scan_code_objects_for_mpl_use(co) - if co_backends: - logger.info( - "Discovered Matplotlib backend(s) via `matplotlib.use()` call in module %r: %r", name, co_backends - ) - used_backends += co_backends - - # Deduplicate and sort the list of used backends before displaying it. - used_backends = sorted(set(used_backends)) - - if used_backends: - HOOK_CONFIG_DOCS = 'https://pyinstaller.org/en/stable/hooks-config.html#matplotlib-hooks' - logger.info( - "The following Matplotlib backends were discovered by scanning for `matplotlib.use()` calls: %r. If your " - "backend of choice is not in this list, either add a `matplotlib.use()` call to your code, or configure " - "the backend collection via hook options (see: %s).", used_backends, HOOK_CONFIG_DOCS - ) - return used_backends - - # Determine the default matplotlib backend. - # - # Ideally, this would be done by calling ``matplotlib.get_backend()``. However, that function tries to switch to the - # default backend (calling ``matplotlib.pyplot.switch_backend()``), which seems to occasionally fail on our linux CI - # with an error and, on other occasions, returns the headless Agg backend instead of the GUI one (even with display - # server running). Furthermore, using ``matplotlib.get_backend()`` returns headless 'Agg' when display server is - # unavailable, which is not ideal for automated builds. - # - # Therefore, we try to emulate ``matplotlib.get_backend()`` ourselves. First, we try to obtain the configured - # default backend from settings (rcparams and/or MPLBACKEND environment variable). If that is unavailable, we try to - # find the first importable GUI-based backend, using the same list as matplotlib.pyplot.switch_backend() uses for - # automatic backend selection. The difference is that we only test whether the backend module is importable, without - # trying to switch to it. - default_backend = _get_configured_default_backend() # isolated sub-process - if default_backend: - logger.info("Found configured default matplotlib backend: %s", default_backend) - return [default_backend] - - # `QtAgg` supersedes `Qt5Agg`; however, we keep `Qt5Agg` in the candidate list to support older versions of - # matplotlib that do not have `QtAgg`. - candidates = ["QtAgg", "Qt5Agg", "Gtk4Agg", "Gtk3Agg", "TkAgg", "WxAgg"] - if is_darwin: - candidates = ["MacOSX"] + candidates - logger.info("Trying determine the default backend as first importable candidate from the list: %r", candidates) - - for candidate in candidates: - try: - module_name = _backend_module_name(candidate) - _check_mpl_backend_importable(module_name) # NOTE: uses an isolated sub-process. - except Exception: - continue - return [candidate] - - # Fall back to headless Agg backend - logger.info("None of the backend candidates could be imported; falling back to headless Agg!") - return ['Agg'] - - -def _collect_all_importable_backends(hook_api): - """ - Returns a list of all importable matplotlib backends. Implements the 'all' backend selection method. - """ - # List of the human-readable names of all available backends. - backend_names = _list_available_mpl_backends() # NOTE: retrieved in an isolated sub-process. - logger.info("All available matplotlib backends: %r", backend_names) - - # Try to import the module(s). - importable_backends = [] - - # List of backends to exclude; Qt4 is not supported by PyInstaller anymore. - exclude_backends = {'Qt4Agg', 'Qt4Cairo'} - - # Ignore "CocoaAgg" on OSes other than macOS; attempting to import it on other OSes halts the current - # (sub)process without printing output or raising exceptions, preventing reliable detection. Apply the - # same logic for the (newer) "MacOSX" backend. - if not is_darwin: - exclude_backends |= {'CocoaAgg', 'MacOSX'} - - # For safety, attempt to import each backend in an isolated sub-process. - for backend_name in backend_names: - if backend_name in exclude_backends: - logger.info(' Matplotlib backend %r: excluded', backend_name) - continue - - try: - module_name = _backend_module_name(backend_name) - _check_mpl_backend_importable(module_name) # NOTE: uses an isolated sub-process. - except Exception: - # Backend is not importable, for whatever reason. - logger.info(' Matplotlib backend %r: ignored due to import error', backend_name) - continue - - logger.info(' Matplotlib backend %r: added', backend_name) - importable_backends.append(backend_name) - - return importable_backends - - -def hook(hook_api): - # Backend collection setting - backends_method = get_hook_config(hook_api, 'matplotlib', 'backends') - if backends_method is None: - backends_method = 'auto' # default method - - # Select backend(s) - if backends_method == 'auto': - logger.info("Matplotlib backend selection method: automatic discovery of used backends") - backend_names = _autodetect_used_backends(hook_api) - elif backends_method == 'all': - logger.info("Matplotlib backend selection method: collection of all importable backends") - backend_names = _collect_all_importable_backends(hook_api) - else: - logger.info("Matplotlib backend selection method: user-provided name(s)") - if isinstance(backends_method, str): - backend_names = [backends_method] - else: - assert isinstance(backends_method, list), "User-provided backend name(s) must be either a string or a list!" - backend_names = backends_method - - # Deduplicate and sort the list of selected backends before displaying it. - backend_names = sorted(set(backend_names)) - - logger.info("Selected matplotlib backends: %r", backend_names) - - # Set module names as hiddenimports - module_names = [_backend_module_name(backend) for backend in backend_names] # backend name -> module name - hook_api.add_imports(*module_names) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-matplotlib.backends.qt_compat.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-matplotlib.backends.qt_compat.py deleted file mode 100755 index 4e12fff..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-matplotlib.backends.qt_compat.py +++ /dev/null @@ -1,26 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import qt as qtutils - -# This module conditionally imports all Qt bindings. Prevent all available bindings from being pulled in by trying to -# select the most applicable one. -# -# The preference order for this module appears to be: PyQt6, PySide6, PyQt5, PySide2 (or just PyQt5, PySide2 if Qt5 -# bindings are forced). See: -# https://github.com/matplotlib/matplotlib/blob/9e18a343fb58a2978a8e27df03190ed21c61c343/lib/matplotlib/backends/qt_compat.py#L113-L125 -# -# We, however, use the default preference order of the helper function, in order to keep it consistent across multiple -# hooks that use the same helper. -excludedimports = qtutils.exclude_extraneous_qt_bindings( - hook_name="hook-matplotlib.backends.qt_compat", - qt_bindings_order=None, -) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-matplotlib.numerix.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-matplotlib.numerix.py deleted file mode 100755 index 924b400..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-matplotlib.numerix.py +++ /dev/null @@ -1,21 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -The matplotlib.numerix package sneaks these imports in under the radar. -""" - -hiddenimports = [ - 'fft', - 'linear_algebra', - 'random_array', - 'ma', - 'mlab', -] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-matplotlib.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-matplotlib.py deleted file mode 100755 index e628e9b..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-matplotlib.py +++ /dev/null @@ -1,38 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller import isolated -from PyInstaller import compat -from PyInstaller.utils import hooks as hookutils - - -@isolated.decorate -def mpl_data_dir(): - import matplotlib - return matplotlib.get_data_path() - - -datas = [ - (mpl_data_dir(), "matplotlib/mpl-data"), -] - -binaries = [] - -# Windows PyPI wheels for `matplotlib` >= 3.7.0 use `delvewheel`. -# In addition to DLLs from `matplotlib.libs` directory, which should be picked up automatically by dependency analysis -# in contemporary PyInstaller versions, we also need to collect the load-order file. This used to be required for -# python <= 3.7 (that lacked `os.add_dll_directory`), but is also needed for Anaconda python 3.8 and 3.9, where -# `delvewheel` falls back to load-order file codepath due to Anaconda breaking `os.add_dll_directory` implementation. -if compat.is_win and hookutils.check_requirement('matplotlib >= 3.7.0'): - delvewheel_datas, delvewheel_binaries = hookutils.collect_delvewheel_libs_directory('matplotlib') - - datas += delvewheel_datas - binaries += delvewheel_binaries diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-matplotlib.pyplot.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-matplotlib.pyplot.py deleted file mode 100755 index 2f78597..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-matplotlib.pyplot.py +++ /dev/null @@ -1,12 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -excludedimports = ['IPython', "IPython.core.pylabtools"] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-multiprocessing.util.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-multiprocessing.util.py deleted file mode 100755 index b9363ba..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-multiprocessing.util.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# In Python 3.8 mutliprocess.utils has _cleanup_tests() to cleanup multiprocessing resources when multiprocessing tests -# completed. This function import `tests` which is the complete Python test-suite, pulling in many more dependencies, -# e.g., tkinter. - -excludedimports = ['test'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-numpy.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-numpy.py deleted file mode 100755 index d2a49d0..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-numpy.py +++ /dev/null @@ -1,129 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. Additional -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# --- Copyright Disclaimer --- -# -# An earlier copy of this hook has been submitted to the NumPy project, where it was integrated in v1.23.0rc1 -# (https://github.com/numpy/numpy/pull/20745), under terms and conditions outlined in their repository [1]. -# -# A special provision is hereby granted to the NumPy project that allows the NumPy copy of the hook to incorporate the -# changes made to this (PyInstaller's) copy of the hook, subject to their licensing terms as opposed to PyInstaller's -# (stricter) licensing terms. -# -# .. refs: -# -# [1] NumPy's license: https://github.com/numpy/numpy/blob/master/LICENSE.txt - -# NOTE: when comparing the contents of this hook and the NumPy version of the hook (for example, to port changes), keep -# in mind that this copy is PyInstaller-centric - it caters to the version of PyInstaller it is bundled with, but needs -# to account for different behavior of different NumPy versions. In contrast, the NumPy copy of the hook caters to the -# version of NumPy it is bundled with, but should account for behavior differences in different PyInstaller versions. - -# Override the default hook priority so that our copy of hook is used instead of NumPy's one (which has priority 0, -# the default for upstream hooks). -# $PyInstaller-Hook-Priority: 1 - -from PyInstaller import compat -from PyInstaller.utils.hooks import ( - get_installer, - collect_dynamic_libs, -) - -from packaging.version import Version - -numpy_version = Version(compat.importlib_metadata.version("numpy")).release -numpy_installer = get_installer('numpy') - -hiddenimports = [] -datas = [] -binaries = [] - -# Collect shared libraries that are bundled inside the numpy's package directory. With PyInstaller 6.x, the directory -# layout of collected shared libraries should be preserved (to match behavior of the binary dependency analysis). In -# earlier versions of PyInstaller, it was necessary to collect the shared libraries into application's top-level -# directory (because that was also what binary dependency analysis in PyInstaller < 6.0 did). -binaries += collect_dynamic_libs("numpy") - -# Check if we are using Anaconda-packaged numpy -if numpy_installer == 'conda': - # Collect DLLs for NumPy and its dependencies (MKL, OpenBlas, OpenMP, etc.) from the communal Conda bin directory. - from PyInstaller.utils.hooks import conda_support - datas += conda_support.collect_dynamic_libs("numpy", dependencies=True) - -# NumPy 1.26 started using `delvewheel` for its Windows PyPI wheels. While contemporary PyInstaller versions -# automatically pick up DLLs from external `numpy.libs` directory, this does not work on Anaconda python 3.8 and 3.9 -# due to defunct `os.add_dll_directory`, which forces `delvewheel` to use the old load-order file approach. So we need -# to explicitly ensure that load-order file as well as DLLs are collected. -# -# Under contemporary python versions, we might still need to explicitly collect the DLLs from `numpy.libs` directory -# to accommodate the cases when some other package's `.lib` directory (for example, `pandas.libs`) contains a DLL -# with the same name, and binary dependency analysis ends up resolving that one. -# -# The installer check compares against 'conda', because PyPI wheels might be installed by installers other than 'pip' -# (for example, 'uv' - see #9360). -if compat.is_win and numpy_version >= (1, 26) and numpy_installer != 'conda': - from PyInstaller.utils.hooks import collect_delvewheel_libs_directory - datas, binaries = collect_delvewheel_libs_directory("numpy", datas=datas, binaries=binaries) - -# Submodules PyInstaller cannot detect (probably because they are only imported by extension modules, which PyInstaller -# cannot read). -if numpy_version >= (2, 0): - # In v2.0.0, `numpy.core` was renamed to `numpy._core`. - # See https://github.com/numpy/numpy/commit/47b70cbffd672849a5d3b9b6fa6e515700460fd0 - hiddenimports += ['numpy._core._dtype_ctypes', 'numpy._core._multiarray_tests'] -else: - hiddenimports += ['numpy.core._dtype_ctypes'] - - # See https://github.com/numpy/numpy/commit/99104bd2d0557078d7ea9a590129c87dd63df623 - if numpy_version >= (1, 25): - hiddenimports += ['numpy.core._multiarray_tests'] - -# Starting with v2.3.0, we need to add `numpy._core._exceptions` to hiddenimports; in previous versions, this module -# was picked up due to explicit import in `numpy._core._methods`, which was removed as part of cleanup in -# https://github.com/numpy/numpy/commit/a51a4f5c10aa9b7962ff1e7e9b5f9b7d91c51489 -if numpy_version >= (2, 3, 0): - hiddenimports += ['numpy._core._exceptions'] - -# This hidden import was removed from NumPy hook in v1.25.0 (https://github.com/numpy/numpy/pull/22666). According to -# comment in the linked PR, it should have been unnecessary since v1.19. -if compat.is_conda and numpy_version < (1, 19): - hiddenimports += ["six"] - -# Remove testing and building code and packages that are referenced throughout NumPy but are not really dependencies. -excludedimports = [ - "scipy", - "pytest", - "nose", - "f2py", - "setuptools", -] - -# As of v1.22.0, numpy.testing (imported for example by some scipy modules) requires numpy.distutils and distutils. -# This was due to numpy.testing adding import of numpy.testing._private.extbuild, which in turn imported numpy.distutils -# and distutils. These imports were moved into functions that require them in v1.22.2 and v.1.23.0. -# See: https://github.com/numpy/numpy/pull/20831 and https://github.com/numpy/numpy/pull/20906 -# So we can exclude them for all numpy versions except for v1.22.0 and v1.22.1 - the main motivation is to avoid pulling -# in `setuptools` (which nowadays provides its vendored version of `distutils`). -if numpy_version < (1, 22, 0) or numpy_version > (1, 22, 1): - excludedimports += [ - "distutils", - "numpy.distutils", - ] - -# In numpy v2.0.0, numpy.f2py submodule has been added to numpy's `__all__` attribute. Therefore, using -# `from numpy import *` leads to an error if `numpy.f2py` is excluded (seen in scipy 1.14). The exclusion in earlier -# releases was not reported to cause any issues, so keep it around. Although it should be noted that it does break an -# explicit import (i.e., `import numpy.f2py`) from user's code as well, because it prevents collection of other -# submodules from `numpy.f2py`. -if numpy_version < (2, 0): - excludedimports += [ - "numpy.f2py", - ] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pandas.io.clipboard.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pandas.io.clipboard.py deleted file mode 100755 index 2395920..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pandas.io.clipboard.py +++ /dev/null @@ -1,19 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This module conditionally imports PyQt5: -# https://github.com/pandas-dev/pandas/blob/95308514e1221200e4526dfaf248283f3d7ade06/pandas/io/clipboard/__init__.py#L578-L597 -# Suppress this import to prevent PyQt5 from being accidentally pulled in; the actually relevant Qt bindings are -# determined by our hook for `qtpy` module, which contemporary versions of pandas mandate as part of `clipboard` and -# `all` extras: -# https://github.com/pandas-dev/pandas/blob/95308514e1221200e4526dfaf248283f3d7ade06/pyproject.toml#L86 -# https://github.com/pandas-dev/pandas/blob/95308514e1221200e4526dfaf248283f3d7ade06/pyproject.toml#L115 -excludedimports = ['PyQt5'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pandas.io.formats.style.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pandas.io.formats.style.py deleted file mode 100755 index 2a56828..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pandas.io.formats.style.py +++ /dev/null @@ -1,18 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import collect_data_files - -# This module indirectly imports jinja2 -hiddenimports = ['jinja2'] - -# It also requires template file stored in pandas/io/formats/templates -datas = collect_data_files('pandas.io.formats') diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pandas.plotting.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pandas.plotting.py deleted file mode 100755 index 948dd88..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pandas.plotting.py +++ /dev/null @@ -1,18 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import check_requirement - -# Starting with pandas 1.3.0, pandas.plotting._matplotlib is imported via importlib.import_module() and needs to be -# added to hidden imports. But do this only if matplotlib is available in the first place (as it is soft dependency -# of pandas). -if check_requirement('pandas >= 1.3.0') and check_requirement('matplotlib'): - hiddenimports = ['pandas.plotting._matplotlib'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pandas.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pandas.py deleted file mode 100755 index 3b0612a..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pandas.py +++ /dev/null @@ -1,36 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2017-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller import compat -from PyInstaller.utils.hooks import collect_submodules, get_installer - -from packaging.version import Version - -pandas_version = Version(compat.importlib_metadata.version("pandas")).release -pandas_installer = get_installer('pandas') - -datas = [] -binaries = [] - -# Pandas keeps Python extensions loaded with dynamic imports here. -hiddenimports = collect_submodules('pandas._libs') - -# Pandas 1.2.0 and later require cmath hidden import on linux and macOS. On Windows, this is not strictly required, but -# we add it anyway to keep things simple (and future-proof). -if pandas_version >= (1, 2, 0): - hiddenimports += ['cmath'] - -# Pandas 2.1.0 started using `delvewheel` for its Windows PyPI wheels. Ensure that DLLs from `pandas.libs` directory are -# collected regardless of whether binary dependency analysis manages to pick them up or not. See a similar block in the -# `numpy` hook for additional explanation. -if compat.is_win and pandas_version >= (2, 1, 0) and pandas_installer != 'conda': - from PyInstaller.utils.hooks import collect_delvewheel_libs_directory - datas, binaries = collect_delvewheel_libs_directory("pandas", datas=datas, binaries=binaries) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pickle.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pickle.py deleted file mode 100755 index 8d023bb..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pickle.py +++ /dev/null @@ -1,13 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2015-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# Only required when run as `__main__` -excludedimports = ["argparse", "doctest"] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pkg_resources.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pkg_resources.py deleted file mode 100755 index 286671f..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pkg_resources.py +++ /dev/null @@ -1,68 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import collect_submodules, can_import_module -from PyInstaller.utils.hooks.setuptools import setuptools_info - -hiddenimports = [] -excludedimports = ['__main__'] - -# pkg_resources keeps vendored modules in its _vendor subpackage, and does sys.meta_path based import magic to expose -# them as pkg_resources.extern.* -# -# With setuptools >= 71.0, pkg_resources ceased to vendor packages, because vendoring is now done at the setuptools -# level. -if setuptools_info.available and setuptools_info.version < (71, 0, 0): - # The `railroad` package is an optional requirement for `pyparsing`. `pyparsing.diagrams` depends on `railroad`, so - # filter it out when `railroad` is not available. - if can_import_module('railroad'): - hiddenimports += collect_submodules('pkg_resources._vendor') - else: - hiddenimports += collect_submodules( - 'pkg_resources._vendor', filter=lambda name: 'pkg_resources._vendor.pyparsing.diagram' not in name - ) - - # pkg_resources v45.0 dropped support for Python 2 and added this module printing a warning. We could save some - # bytes if we would replace this by a fake module. - if setuptools_info.version >= (45, 0, 0) and setuptools_info.version < (49, 1, 1): - hiddenimports += ['pkg_resources.py2_warn'] - - # As of v60.7, setuptools vendored jaraco and has pkg_resources use it. Currently, the pkg_resources._vendor.jaraco - # namespace package cannot be automatically scanned due to limited support for pure namespace packages in our hook - # utilities. - # - # In setuptools 60.7.0, the vendored jaraco.text package included "Lorem Ipsum.txt" data file, which also has to be - # collected. However, the presence of the data file (and the resulting directory hierarchy) confuses the importer's - # redirection logic; instead of trying to work-around that, tell user to upgrade or downgrade their setuptools. - if setuptools_info.version == (60, 7, 0): - raise SystemExit( - "ERROR: Setuptools 60.7.0 is incompatible with PyInstaller. " - "Downgrade to an earlier version or upgrade to a later version." - ) - # In setuptools 60.7.1, the "Lorem Ipsum.txt" data file was dropped from the vendored jaraco.text package, so we can - # accommodate it with couple of hidden imports. - elif setuptools_info.version >= (60, 7, 1): - hiddenimports += [ - 'pkg_resources._vendor.jaraco.functools', - 'pkg_resources._vendor.jaraco.context', - 'pkg_resources._vendor.jaraco.text', - ] - - # As of setuptools 70.0.0, we need pkg_resources.extern added to hidden imports. - if setuptools_info.version >= (70, 0, 0): - hiddenimports += [ - 'pkg_resources.extern', - ] - -# Some more hidden imports. See: -# https://github.com/pyinstaller/pyinstaller-hooks-contrib/issues/15#issuecomment-663699288 `packaging` can either be -# its own package, or embedded in `pkg_resources._vendor.packaging`, or both. -hiddenimports += collect_submodules('packaging') diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-platform.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-platform.py deleted file mode 100755 index 66aca00..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-platform.py +++ /dev/null @@ -1,27 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -import sys - -excludedimports = [] - -# see https://github.com/python/cpython/blob/3.9/Lib/platform.py#L411 -# This will exclude `plistlib` for sys.platform != 'darwin' -if sys.platform != 'darwin': - excludedimports += ["plistlib"] - -# Avoid collecting `_ios_support`, which in turn triggers unnecessary collection of `libobjc` shared library if the -# latter happens to be available on the build system. -# See https://github.com/pyinstaller/pyinstaller/issues/9333, as well as -# https://github.com/python/cpython/blob/v3.13.0/Lib/platform.py#L508-L521 -# and -# https://github.com/python/cpython/blob/v3.13.0/Lib/_ios_support.py#L13 -if sys.platform != 'ios': - excludedimports += ["_ios_support"] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pygments.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pygments.py deleted file mode 100755 index 529d82b..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pygments.py +++ /dev/null @@ -1,29 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -PyInstaller hook file for Pygments. Tested with version 2.0.2. -""" - -from PyInstaller.utils.hooks import collect_submodules - -# The following applies to pygments version 2.0.2, as reported by ``pip show pygments``. -# -# From pygments.formatters, line 37:: -# -# def _load_formatters(module_name): -# """Load a formatter (and all others in the module too).""" -# mod = __import__(module_name, None, None, ['__all__']) -# -# Therefore, we need all the modules in ``pygments.formatters``. - -hiddenimports = collect_submodules('pygments.formatters') -hiddenimports.extend(collect_submodules('pygments.lexers')) -hiddenimports.extend(collect_submodules('pygments.styles')) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pytz.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pytz.py deleted file mode 100755 index a44d29a..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pytz.py +++ /dev/null @@ -1,20 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import collect_data_files - -# On Linux pytz installed from distribution repository uses zoneinfo from /usr/share/zoneinfo/ and no data files might -# be collected. -datas = collect_data_files('pytz') - -# pytz references pkg_resources in a fall-back codepath that should normally not be reached; add an exclude to prevent -# (now deprecated) pkg_resources from being pulled in the frozen application. -excludedimports = ['pkg_resources'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pytzdata.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pytzdata.py deleted file mode 100755 index e45626c..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-pytzdata.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("pytzdata") diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-qtawesome.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-qtawesome.py deleted file mode 100755 index 9829a03..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-qtawesome.py +++ /dev/null @@ -1,19 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2017-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Hook for QtAwesome (https://github.com/spyder-ide/qtawesome). -Font files and charmaps need to be included with module. -Tested with QtAwesome 0.4.4 and Python 3.6 on macOS 10.12.4. -""" - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('qtawesome') diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-qtpy.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-qtpy.py deleted file mode 100755 index a6ce00c..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-qtpy.py +++ /dev/null @@ -1,25 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import qt as qtutils - -# This module conditionally imports all Qt bindings. Prevent all available bindings from being pulled in by trying to -# select the most applicable one. -# -# The preference order for this module appears to be: PyQt5, PySide2, PyQt6, PySide6. See: -# https://github.com/spyder-ide/qtpy/blob/3238de7a3e038daeb585c1a76fd9a0c4baf22f11/qtpy/__init__.py#L199-L289 -# -# We, however, use the default preference order of the helper function, in order to keep it consistent across multiple -# hooks that use the same helper. -excludedimports = qtutils.exclude_extraneous_qt_bindings( - hook_name="hook-qtpy", - qt_bindings_order=None, -) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scapy.layers.all.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scapy.layers.all.py deleted file mode 100755 index fdcc779..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scapy.layers.all.py +++ /dev/null @@ -1,19 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import collect_submodules - -# The layers to load can be configured using scapy's conf.load_layers. -# from scapy.config import conf; print(conf.load_layers) -# I decided not to use this, but to include all layer modules. The reason is: When building the package, load_layers may -# not include all the layer modules the program will use later. - -hiddenimports = collect_submodules('scapy.layers') diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.io.matlab.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.io.matlab.py deleted file mode 100755 index c69c767..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.io.matlab.py +++ /dev/null @@ -1,13 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# Module scipy.io.matlab allows to parse matlab files. The hidden import is necessary for SciPy 0.11+. -hiddenimports = ['scipy.io.matlab.streams'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.linalg.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.linalg.py deleted file mode 100755 index b1a68b8..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.linalg.py +++ /dev/null @@ -1,13 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# The hidden import is necessary for SciPy 0.16+. -hiddenimports = ['scipy.linalg.cython_blas', 'scipy.linalg.cython_lapack'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.py deleted file mode 100755 index b454cca..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.py +++ /dev/null @@ -1,64 +0,0 @@ -# ----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -# ----------------------------------------------------------------------------- - -import glob -import os -import sysconfig - -from PyInstaller.compat import is_win, is_linux -from PyInstaller.utils.hooks import ( - get_module_file_attribute, - check_requirement, - collect_delvewheel_libs_directory, - collect_submodules, -) - -binaries = [] -datas = [] - -# Package the DLL bundle that official scipy wheels for Windows ship The DLL bundle will either be in extra-dll on -# windows proper and in .libs if installed on a virtualenv created from MinGW (Git-Bash for example) -if is_win: - extra_dll_locations = ['extra-dll', '.libs'] - for location in extra_dll_locations: - dll_glob = os.path.join(os.path.dirname(get_module_file_attribute('scipy')), location, "*.dll") - if glob.glob(dll_glob): - binaries.append((dll_glob, ".")) - -# Handle delvewheel-enabled win32 wheels, which have external scipy.libs directory (scipy >= 0.9.2) -if check_requirement("scipy >= 1.9.2") and is_win: - datas, binaries = collect_delvewheel_libs_directory('scipy', datas=datas, binaries=binaries) - -# collect library-wide utility extension modules -hiddenimports = ['scipy._lib.%s' % m for m in ['messagestream', "_ccallback_c", "_fpumode"]] - -# In scipy 1.14.0, `scipy._lib.array_api_compat.numpy` added a programmatic import of its `.fft` submodule, which needs -# to be added to hiddenimports. -if check_requirement("scipy >= 1.14.0"): - hiddenimports += ['scipy._lib.array_api_compat.numpy.fft'] - -# If scipy is provided by Debian's python3-scipy, its scipy.__config__ submodule is renamed to a dynamically imported -# scipy.__config__${SOABI}__ -# https://salsa.debian.org/python-team/packages/scipy/-/blob/1255922cf7c52b05aa44fb733449953cd9adb815/debian/patches/scipy_config_SOABI.patch -if is_linux and "dist-packages" in get_module_file_attribute("scipy"): - hiddenimports.append('scipy.__config__' + sysconfig.get_config_var('SOABI') + '__') - -# The `scipy._lib.array_api_compat.numpy` module performs a `from numpy import *`; in numpy 2.0.0, `numpy.f2py` was -# added to `numpy.__all__` attribute, but at the same time, the upstream numpy hook adds `numpy.f2py` to -# `excludedimports`. Therefore, the `numpy.f2py` sub-package ends up missing. Due to the way exclusion mechanism works, -# we need to add both `numpy.f2py` and all its submodules to hiddenimports here. -if check_requirement("numpy >= 2.0.0"): - hiddenimports += collect_submodules('numpy.f2py', filter=lambda name: name != 'numpy.f2py.tests') - -# Starting with scipy 1.17.0, the `scipy._cyutility` extension is imported when top-level `scipy` package is imported -# (via import of another extension, `scipy._lib`). -if check_requirement("scipy >= 1.17.0"): - hiddenimports += ['scipy._cyutility'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.sparse.csgraph.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.sparse.csgraph.py deleted file mode 100755 index 9cabdbd..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.sparse.csgraph.py +++ /dev/null @@ -1,13 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# The hidden import is necessary for SciPy 0.11+. -hiddenimports = ['scipy.sparse.csgraph._validation'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.spatial._ckdtree.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.spatial._ckdtree.py deleted file mode 100755 index 00d1a87..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.spatial._ckdtree.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2025, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import is_module_satisfies - -# As of SciPy 1.16.0, `scipy.spatial._ckdtree` extension started to depend on newly-introduced `scipy._cyutility`. -if is_module_satisfies('scipy >= 1.16.0'): - hiddenimports = ['scipy._cyutility'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.spatial.transform.rotation.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.spatial.transform.rotation.py deleted file mode 100755 index 4840cf2..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.spatial.transform.rotation.py +++ /dev/null @@ -1,17 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import check_requirement - -# As of scipy 1.6.0, scipy.spatial.transform.rotation is cython-compiled, so we fail to automatically pick up its -# imports. -if check_requirement("scipy >= 1.6.0"): - hiddenimports = ['scipy.spatial.transform._rotation_groups'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.special._ellip_harm_2.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.special._ellip_harm_2.py deleted file mode 100755 index 5115b02..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.special._ellip_harm_2.py +++ /dev/null @@ -1,30 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Module hook for the `scipy.special._ellip_harm_2` C extension first introduced by SciPy >= 0.15.0. - -See Also ----------- -https://github.com/scipy/scipy/blob/master/scipy/special/_ellip_harm_2.pyx - This C extension's Cython-based implementation. -""" - -# In SciPy >= 0.15.0: -# -# 1. The "scipy.special.__init__" module imports... -# 2. The "scipy.special._ellip_harm" module imports... -# 3. The "scipy.special._ellip_harm_2" C extension imports... -# 4. The "scipy.integrate" package. -# -# The third import is undetectable by PyInstaller and hence explicitly listed. Since "_ellip_harm" and "_ellip_harm_2" -# were first introduced by SciPy 0.15.0, the following hidden import will only be applied for versions of SciPy -# guaranteed to provide these modules and C extensions. -hiddenimports = ['scipy.integrate'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.special._ufuncs.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.special._ufuncs.py deleted file mode 100755 index f94b22e..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.special._ufuncs.py +++ /dev/null @@ -1,25 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import is_module_satisfies - -# Module scipy.io._ufunc depends on some other C/C++ extensions. The hidden import is necessary for SciPy 0.13+. -# Thanks to dyadkin; see issue #826. -hiddenimports = ['scipy.special._ufuncs_cxx'] - -# SciPy 1.13.0 cythonized cdflib; this introduced new `scipy.special._cdflib` extension that is imported from the -# `scipy.special._ufuncs` extension, and thus we need a hidden import here. -if is_module_satisfies('scipy >= 1.13.0'): - hiddenimports += ['scipy.special._cdflib'] - -# SciPy 1.14.0 introduced `scipy.special._special_ufuncs`, which is imported from `scipy.special._ufuncs` extension. -if is_module_satisfies('scipy >= 1.14.0'): - hiddenimports += ['scipy.special._special_ufuncs'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.stats._stats.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.stats._stats.py deleted file mode 100755 index e5f72a0..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scipy.stats._stats.py +++ /dev/null @@ -1,15 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import check_requirement - -if check_requirement("scipy >= 1.5.0"): - hiddenimports = ['scipy.special.cython_special'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scrapy.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scrapy.py deleted file mode 100755 index f110bb0..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-scrapy.py +++ /dev/null @@ -1,18 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# Hook for https://pypi.org/project/Scrapy/ -# https://stackoverflow.com/questions/49085970/no-such-file-or-directory-error-using-pyinstaller-and-scrapy - -from PyInstaller.utils.hooks import collect_data_files, collect_submodules - -datas = collect_data_files('scrapy') -hiddenimports = collect_submodules('scrapy') diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-setuptools._vendor.importlib_metadata.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-setuptools._vendor.importlib_metadata.py deleted file mode 100755 index e7c92d0..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-setuptools._vendor.importlib_metadata.py +++ /dev/null @@ -1,21 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -import fnmatch -from PyInstaller.utils.hooks.setuptools import setuptools_info - -# Collect metadata for setuptools-vendored copy of importlib-metadata, to match the behavior of hook for -# stand-alone version of the package (i.e., `hook-importlib_metadata.py`). - -# Use cached data files list from setuptools_info, and extract relevant bits (to avoid having to call another -# `collect_data_files` and import `setuptools` in isolated process). -datas = [(src_name, dest_name) for src_name, dest_name in setuptools_info.vendored_data - if fnmatch.fnmatch(src_name, "**/setuptools/_vendor/importlib_metadata-*.dist-info/*")] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-setuptools._vendor.jaraco.text.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-setuptools._vendor.jaraco.text.py deleted file mode 100755 index 47e65da..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-setuptools._vendor.jaraco.text.py +++ /dev/null @@ -1,18 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -import fnmatch -from PyInstaller.utils.hooks.setuptools import setuptools_info - -# Use cached data files list from setuptools_info, and extract relevant bits (to avoid having to call another -# `collect_data_files` and import `setuptools` in isolated process). -datas = [(src_name, dest_name) for src_name, dest_name in setuptools_info.vendored_data - if fnmatch.fnmatch(src_name, "**/setuptools/_vendor/jaraco/text/*")] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-setuptools.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-setuptools.py deleted file mode 100755 index 6c2c1bb..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-setuptools.py +++ /dev/null @@ -1,75 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller import compat -from PyInstaller.utils.hooks.setuptools import setuptools_info - -datas = [] - -hiddenimports = [ - # Test case import/test_zipimport2 fails during importing pkg_resources or setuptools when module not present. - 'distutils.command.build_ext', - 'setuptools.msvc', -] - -# Necessary for setuptools on Mac/Unix -if compat.is_unix or compat.is_darwin: - hiddenimports.append('syslog') - -# Prevent the following modules from being collected solely due to reference from anywhere within setuptools (or -# its vendored dependencies). -excludedimports = [ - 'pytest', - 'numpy', # originally from hook-setuptools.msvc - 'docutils', # originally from hool-setuptools._distutils.command.check -] - -# setuptools >= 39.0.0 is "vendoring" its own direct dependencies from "_vendor" to "extern". This also requires -# 'pre_safe_import_module/hook-setuptools.extern.six.moves.py' to make the moves defined in 'setuptools._vendor.six' -# importable under 'setuptools.extern.six'. -# -# With setuptools 71.0.0, the vendored packages are exposed to the outside world by `setuptools._vendor` location being -# appended to `sys.path`, and the `VendorImporter` is gone (i.e., no more mapping to `setuptools.extern`). Since the -# vendored dependencies are now exposed as top-level modules (provided upstream versions are not available, as they -# would take precedence due to `sys.path` ordering), we need pre-safe-import-module hooks that detect when only vendored -# version is available, and add aliases to prevent duplicated collection. For list of vendored packages for which we -# need such pre-safe-import-module hooks, see the code in `PyInstaller.utils.hooks.setuptools`. -# -# The list of submodules from `setuptools._vendor` is now available in `setuptools_info.vendored_modules` (and covers -# all setuptools versions). -# -# NOTE: with setuptools >= 71.0, we do not need to add modules from `setuptools._vendored` to hidden imports anymore, -# because the aliases we set up should ensure that the necessary parts get collected. We still need them for earlier -# versions of setuptools, though. -if setuptools_info.version < (71, 0): - hiddenimports += setuptools_info.vendored_modules - -# The situation with vendored distutils (from `setuptools._distutils`) is a bit more complicated; python >= 3.12 does -# not provide stdlib version of `distutils` anymore, so our corresponding pre-safe-import-module hook sets up aliases. -# In earlier python versions, stdlib version is available as well, and at run-time, we might need both versions present, -# so that whichever is applicable can be used. Therefore, for python < 3.12, we need to add the vendored distuils -# modules to hidden imports. -if setuptools_info.distutils_vendored and not compat.is_py312: - hiddenimports += setuptools_info.distutils_modules - -# With setuptools >= 71.0.0, the vendored packages also have metadata, and might also contain data files that need to -# be collected. The list of corresponding data files is kept cached in `setuptools_info.vendored_data` (to minimize the -# number of times we need to call collect_data_files()). -# -# While it might be tempting to simply collect all data files and be done with it, we actually need to match the -# collection behavior for the stand-alone versions of these packages; i.e., we should collect metadata (and/or data -# files) for the vendored package only if the same data is also collected for stand-alone version. Otherwise, we risk -# inconsistent behavior and potential mismatches; for example, if we collected metadata for vendored package A here, -# but end up collecting stand-alone A, for which we normally do not collect the metadata, then at run-time, we will end -# up with stand-alone copy of A and vendored copy of its metadata being discoverable. -# -# Therefore, if metadata and/or metadata needs to be collected, do it in corresponding sub-package hook (for an example, -# see `hook-setuptools._vendor.jaraco.text.py`). diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-shelve.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-shelve.py deleted file mode 100755 index 1df601a..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-shelve.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# Tested on Windows 7 x64 With Python 3.5 - -hiddenimports = ["dbm.ndbm", "dbm.dumb", "dbm.gnu"] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-shiboken6.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-shiboken6.py deleted file mode 100755 index 17cf0c3..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-shiboken6.py +++ /dev/null @@ -1,17 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller import compat - -# Up until python 3.12, `xxsubtype` was built-in on all OSes. Now it is an extension on non-Windows, and without it, -# shiboken6 initialization segfaults. -if compat.is_py312 and not compat.is_win: - hiddenimports = ['xxsubtype'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-sphinx.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-sphinx.py deleted file mode 100755 index f5a13ac..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-sphinx.py +++ /dev/null @@ -1,41 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import collect_data_files, collect_submodules, eval_statement - -# Sphinx consists of several extensions that are lazily loaded. So collect all submodules to ensure we do not miss -# any of them. -hiddenimports = collect_submodules('sphinx') - -# For each extension in sphinx.application.builtin_extensions that does not come from the sphinx package, do a -# collect_submodules(). We need to do this explicitly because collect_submodules() does not seem to work with -# namespace packages, which precludes us from simply doing hiddenimports += collect_submodules('sphinxcontrib') -builtin_extensions = list( - eval_statement( - """ - from sphinx.application import builtin_extensions - print(builtin_extensions) - """ - ) -) -for extension in builtin_extensions: - if extension.startswith('sphinx.'): - continue # Already collected - hiddenimports += collect_submodules(extension) - -# This is inherited from an earlier version of the hook, and seems to have been required in Sphinx v.1.3.1 era due to -# https://github.com/sphinx-doc/sphinx/blob/b87ce32e7dc09773f9e71305e66e8d6aead53dd1/sphinx/cmdline.py#L173. -# It does not hurt to keep it around, just in case. -hiddenimports += ['locale'] - -# Collect all data files: *.html and *.conf files in ``sphinx.themes``, translation files in ``sphinx.locale``, etc. -# Also collect all data files for the alabaster theme. -datas = collect_data_files('sphinx') + collect_data_files('alabaster') diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-sqlalchemy.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-sqlalchemy.py deleted file mode 100755 index 3aafc50..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-sqlalchemy.py +++ /dev/null @@ -1,88 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -import re -import importlib.util - -from PyInstaller import isolated -from PyInstaller.lib.modulegraph.modulegraph import SourceModule -from PyInstaller.utils.hooks import check_requirement, collect_entry_point, logger - -datas = [] - -# 'sqlalchemy.testing' causes bundling a lot of unnecessary modules. -excludedimports = ['sqlalchemy.testing'] - -# Include most common database bindings some database bindings are detected and include some are not. We should -# explicitly include database backends. -hiddenimports = ['pysqlite2', 'MySQLdb', 'psycopg2', 'sqlalchemy.ext.baked'] - -if check_requirement('sqlalchemy >= 1.4'): - hiddenimports.append("sqlalchemy.sql.default_comparator") - - -@isolated.decorate -def _get_dialect_modules(module_name): - import importlib - module = importlib.import_module(module_name) - return [f"{module_name}.{submodule_name}" for submodule_name in module.__all__] - - -# In SQLAlchemy >= 0.6, the "sqlalchemy.dialects" package provides dialects. -# In SQLAlchemy <= 0.5, the "sqlalchemy.databases" package provides dialects. -if check_requirement('sqlalchemy >= 0.6'): - hiddenimports += _get_dialect_modules("sqlalchemy.dialects") -else: - hiddenimports += _get_dialect_modules("sqlalchemy.databases") - -# Collect additional dialects and plugins that are registered via entry-points, under assumption that they are available -# in the build environment for a reason (i.e., they are used). -for entry_point_name in ('sqlalchemy.dialects', 'sqlalchemy.plugins'): - ep_datas, ep_hiddenimports = collect_entry_point(entry_point_name) - datas += ep_datas - hiddenimports += ep_hiddenimports - - -def hook(hook_api): - """ - SQLAlchemy 0.9 introduced the decorator 'util.dependencies'. This decorator does imports. E.g.: - - @util.dependencies("sqlalchemy.sql.schema") - - This hook scans for included SQLAlchemy modules and then scans those modules for any util.dependencies and marks - those modules as hidden imports. - """ - - if not check_requirement('sqlalchemy >= 0.9'): - return - - # this parser is very simplistic but seems to catch all cases as of V1.1 - depend_regex = re.compile(r'@util.dependencies\([\'"](.*?)[\'"]\)') - - hidden_imports_set = set() - known_imports = set() - for node in hook_api.module_graph.iter_graph(start=hook_api.module): - if isinstance(node, SourceModule) and node.identifier.startswith('sqlalchemy.'): - known_imports.add(node.identifier) - - # Read the source... - with open(node.filename, 'rb') as f: - source_code = f.read() - source_code = importlib.util.decode_source(source_code) - - # ... and scan it - for match in depend_regex.findall(source_code): - hidden_imports_set.add(match) - - hidden_imports_set -= known_imports - if len(hidden_imports_set): - logger.info(" Found %d sqlalchemy hidden imports", len(hidden_imports_set)) - hook_api.add_imports(*list(hidden_imports_set)) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-sqlite3.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-sqlite3.py deleted file mode 100755 index 805bf8f..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-sqlite3.py +++ /dev/null @@ -1,19 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = [] - -# On Windows in Python 3.4 'sqlite3' package might contain tests that are not required in frozen application. -for mod in collect_submodules('sqlite3'): - if not mod.startswith('sqlite3.test'): - hiddenimports.append(mod) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-sysconfig.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-sysconfig.py deleted file mode 100755 index d4331cf..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-sysconfig.py +++ /dev/null @@ -1,29 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -import sys - -# see https://github.com/python/cpython/blob/3.9/Lib/sysconfig.py#L593 -# This will exclude `_osx_support`, `distutils`, `distutils.log` for sys.platform != 'darwin' -if sys.platform != 'darwin': - excludedimports = ["_osx_support"] - -# Python 3.6 uses additional modules like `_sysconfigdata_m_linux_x86_64-linux-gnu`, see -# https://github.com/python/cpython/blob/3.6/Lib/sysconfig.py#L417 -# Note: Some versions of Anaconda backport this feature to before 3.6. See issue #3105. -# Note: on Windows, python.org and Anaconda python provide _get_sysconfigdata_name, but calling it fails due to sys -# module lacking abiflags attribute. It does work on MSYS2/MINGW python, where we need to collect corresponding file. -try: - import sysconfig - hiddenimports = [sysconfig._get_sysconfigdata_name()] -except AttributeError: - # Either sysconfig has no attribute _get_sysconfigdata_name (i.e., the function does not exist), or this is Windows - # and the _get_sysconfigdata_name() call failed due to missing sys.abiflags attribute. - pass diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-wcwidth.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-wcwidth.py deleted file mode 100755 index dc7c2dd..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-wcwidth.py +++ /dev/null @@ -1,14 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2017-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('wcwidth') diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-win32ctypes.core.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-win32ctypes.core.py deleted file mode 100755 index 6971473..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-win32ctypes.core.py +++ /dev/null @@ -1,22 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2020-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# TODO: remove this hook during PyInstaller 4.5 release cycle! - -from PyInstaller.utils.hooks import can_import_module, collect_submodules - -# We need to collect submodules from win32ctypes.core.cffi or win32ctypes.core.ctypes for win32ctypes.core to work. -# Always collect the `ctypes` backend, and add the `cffi` one if `cffi` is available. Having the `ctypes` backend always -# available helps in situations when `cffi` is available in the build environment, but is disabled at run-time or not -# collected (e.g., due to `--exclude cffi`). -hiddenimports = collect_submodules('win32ctypes.core.ctypes') -if can_import_module('cffi'): - hiddenimports += collect_submodules('win32ctypes.core.cffi') diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-xml.dom.domreg.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-xml.dom.domreg.py deleted file mode 100755 index eb7161a..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-xml.dom.domreg.py +++ /dev/null @@ -1,13 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# xml.dom.domreg line 54 -hiddenimports = ['xml.dom.minidom'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-xml.etree.cElementTree.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-xml.etree.cElementTree.py deleted file mode 100755 index 95dc702..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-xml.etree.cElementTree.py +++ /dev/null @@ -1,13 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# cElementTree has a hidden import (Python >=2.5 stdlib version) -hiddenimports = ['xml.etree.ElementTree'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-xml.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-xml.py deleted file mode 100755 index d7776a0..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-xml.py +++ /dev/null @@ -1,12 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -hiddenimports = ['xml.sax.xmlreader', 'xml.sax.expatreader'] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-zope.interface.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-zope.interface.py deleted file mode 100755 index b43d023..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/hook-zope.interface.py +++ /dev/null @@ -1,12 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2015-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -excludedimports = ["unittest"] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/__init__.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/__init__.py deleted file mode 100755 index 792d600..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 87836a4..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-PyQt5.uic.port_v2.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-PyQt5.uic.port_v2.cpython-312.pyc deleted file mode 100644 index c9cd313..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-PyQt5.uic.port_v2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-_pyi_rth_utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-_pyi_rth_utils.cpython-312.pyc deleted file mode 100644 index 26edc32..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-_pyi_rth_utils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-distutils.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-distutils.cpython-312.pyc deleted file mode 100644 index ba43af6..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-distutils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-pyi_splash.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-pyi_splash.cpython-312.pyc deleted file mode 100644 index 73326b8..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-pyi_splash.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-tkinter.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-tkinter.cpython-312.pyc deleted file mode 100644 index 0608bf8..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-tkinter.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/hook-PyQt5.uic.port_v2.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/hook-PyQt5.uic.port_v2.py deleted file mode 100755 index 014c9e2..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/hook-PyQt5.uic.port_v2.py +++ /dev/null @@ -1,15 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_find_module_path(hook_api): - # Forbid imports in the port_v2 directory under Python 3 The code wouldn't import and would crash the build process. - hook_api.search_dirs = [] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/hook-_pyi_rth_utils.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/hook-_pyi_rth_utils.py deleted file mode 100755 index d035df0..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/hook-_pyi_rth_utils.py +++ /dev/null @@ -1,25 +0,0 @@ -# ----------------------------------------------------------------------------- -# Copyright (c) 2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -# ----------------------------------------------------------------------------- -""" -This hook allows discovery and collection of PyInstaller's internal _pyi_rth_utils module that provides utility -functions for run-time hooks. - -The module is implemented in 'PyInstaller/fake-modules/_pyi_rth_utils.py'. -""" - -import os - -from PyInstaller import PACKAGEPATH - - -def pre_find_module_path(api): - module_dir = os.path.join(PACKAGEPATH, 'fake-modules') - api.search_dirs = [module_dir] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/hook-distutils.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/hook-distutils.py deleted file mode 100755 index 0e7e646..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/hook-distutils.py +++ /dev/null @@ -1,46 +0,0 @@ -# ----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -# ----------------------------------------------------------------------------- -""" -`distutils`-specific pre-find module path hook. - -When run from within a virtual environment, this hook changes the `__path__` of the `distutils` package to -that of the system-wide rather than virtual-environment-specific `distutils` package. While the former is suitable for -freezing, the latter is intended for use _only_ from within virtual environments. - -NOTE: this behavior seems to be specific to virtual environments created by (an old?) version of `virtualenv`; it is not -applicable to virtual environments created by the `venv`. -""" - -import pathlib - -from PyInstaller.utils.hooks import logger, get_module_file_attribute - - -def pre_find_module_path(api): - # Absolute path of the system-wide "distutils" package when run from within a venv or None otherwise. - - # opcode is not a virtualenv module, so we can use it to find the stdlib. Technique taken from virtualenv's - # "distutils" package detection at - # https://github.com/pypa/virtualenv/blob/16.3.0/virtualenv_embedded/distutils-init.py#L5 - # As opcode is a module, stdlib path corresponds to the parent directory of its ``__file__`` attribute. - stdlib_path = pathlib.Path(get_module_file_attribute('opcode')).parent.resolve() - # As distutils is a package, we need to consider the grandparent directory of its ``__file__`` attribute. - distutils_path = pathlib.Path(get_module_file_attribute('distutils')).parent.parent.resolve() - - if distutils_path.name == 'setuptools': - logger.debug("distutils: provided by setuptools") - elif distutils_path == stdlib_path: - logger.debug("distutils: provided by stdlib") - else: - # Find this package in stdlib. - stdlib_path = str(stdlib_path) - logger.debug("distutils: virtualenv shim - retargeting to stdlib dir %r", stdlib_path) - api.search_dirs = [stdlib_path] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/hook-pyi_splash.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/hook-pyi_splash.py deleted file mode 100755 index 15f8009..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/hook-pyi_splash.py +++ /dev/null @@ -1,36 +0,0 @@ -# ----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -# ----------------------------------------------------------------------------- -""" -This hook does not move a module that can be installed by a package manager, but points to a PyInstaller internal -module that can be imported into the users python instance. - -The module is implemented in 'PyInstaller/fake-modules/pyi_splash.py'. -""" - -import os - -from PyInstaller import PACKAGEPATH -from PyInstaller.utils.hooks import logger - - -def pre_find_module_path(api): - try: - # Test if a module named 'pyi_splash' is locally installed. This prevents that a potentially required dependency - # is not packed - import pyi_splash # noqa: F401 - except ImportError: - module_dir = os.path.join(PACKAGEPATH, 'fake-modules') - - api.search_dirs = [module_dir] - logger.info('Adding pyi_splash module to application dependencies.') - else: - logger.info('A local module named "pyi_splash" is installed. Use the installed one instead.') - return diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/hook-tkinter.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/hook-tkinter.py deleted file mode 100755 index 1cc5a78..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_find_module_path/hook-tkinter.py +++ /dev/null @@ -1,21 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller import log as logging -from PyInstaller.utils.hooks import tcl_tk - -logger = logging.getLogger(__name__) - - -def pre_find_module_path(hook_api): - if not tcl_tk.tcltk_info.available: - logger.warning("tkinter installation is broken. It will be excluded from the application") - hook_api.search_dirs = [] diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__init__.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__init__.py deleted file mode 100755 index 792d600..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 53a7cbb..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-autocommand.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-autocommand.cpython-312.pyc deleted file mode 100644 index 06ae5ad..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-autocommand.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-backports.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-backports.cpython-312.pyc deleted file mode 100644 index 5afb6cd..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-backports.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-backports.tarfile.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-backports.tarfile.cpython-312.pyc deleted file mode 100644 index f9522ef..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-backports.tarfile.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-distutils.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-distutils.cpython-312.pyc deleted file mode 100644 index 5c348ed..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-distutils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.cpython-312.pyc deleted file mode 100644 index b0b9eb3..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.overrides.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.overrides.cpython-312.pyc deleted file mode 100644 index 2942d15..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.overrides.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Adw.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Adw.cpython-312.pyc deleted file mode 100644 index f814832..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Adw.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.AppIndicator3.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.AppIndicator3.cpython-312.pyc deleted file mode 100644 index bafd7e4..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.AppIndicator3.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Atk.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Atk.cpython-312.pyc deleted file mode 100644 index bfe10b0..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Atk.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.AyatanaAppIndicator3.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.AyatanaAppIndicator3.cpython-312.pyc deleted file mode 100644 index 4128ec7..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.AyatanaAppIndicator3.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Champlain.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Champlain.cpython-312.pyc deleted file mode 100644 index 9e452bb..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Champlain.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Clutter.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Clutter.cpython-312.pyc deleted file mode 100644 index 536fbf7..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Clutter.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.DBus.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.DBus.cpython-312.pyc deleted file mode 100644 index ce03d7d..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.DBus.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GIRepository.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GIRepository.cpython-312.pyc deleted file mode 100644 index 57a470d..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GIRepository.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GLib.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GLib.cpython-312.pyc deleted file mode 100644 index 73cfc25..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GLib.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GModule.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GModule.cpython-312.pyc deleted file mode 100644 index 84852d6..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GModule.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GObject.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GObject.cpython-312.pyc deleted file mode 100644 index a1f3ca9..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GObject.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gdk.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gdk.cpython-312.pyc deleted file mode 100644 index d73d970..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gdk.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GdkPixbuf.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GdkPixbuf.cpython-312.pyc deleted file mode 100644 index a06d17d..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GdkPixbuf.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gio.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gio.cpython-312.pyc deleted file mode 100644 index c78a778..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gio.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Graphene.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Graphene.cpython-312.pyc deleted file mode 100644 index 0786b5d..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Graphene.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gsk.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gsk.cpython-312.pyc deleted file mode 100644 index 607c3c7..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gsk.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gst.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gst.cpython-312.pyc deleted file mode 100644 index 17a1a71..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gst.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstAllocators.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstAllocators.cpython-312.pyc deleted file mode 100644 index b90e02a..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstAllocators.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstApp.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstApp.cpython-312.pyc deleted file mode 100644 index 4717195..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstApp.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstAudio.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstAudio.cpython-312.pyc deleted file mode 100644 index ff4aa33..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstAudio.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstBadAudio.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstBadAudio.cpython-312.pyc deleted file mode 100644 index 52426aa..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstBadAudio.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstBase.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstBase.cpython-312.pyc deleted file mode 100644 index 0c3edd1..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstBase.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstCheck.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstCheck.cpython-312.pyc deleted file mode 100644 index 2d97c2f..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstCheck.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstCodecs.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstCodecs.cpython-312.pyc deleted file mode 100644 index 7b242ce..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstCodecs.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstController.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstController.cpython-312.pyc deleted file mode 100644 index e3e580d..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstController.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstGL.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstGL.cpython-312.pyc deleted file mode 100644 index bf4e1a6..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstGL.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstGLEGL.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstGLEGL.cpython-312.pyc deleted file mode 100644 index c9b63cc..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstGLEGL.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstGLWayland.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstGLWayland.cpython-312.pyc deleted file mode 100644 index ffbe3b9..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstGLWayland.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstGLX11.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstGLX11.cpython-312.pyc deleted file mode 100644 index 706f071..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstGLX11.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstInsertBin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstInsertBin.cpython-312.pyc deleted file mode 100644 index 23a5366..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstInsertBin.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstMpegts.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstMpegts.cpython-312.pyc deleted file mode 100644 index 5b1fe01..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstMpegts.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstNet.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstNet.cpython-312.pyc deleted file mode 100644 index 91fe5b0..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstNet.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstPbutils.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstPbutils.cpython-312.pyc deleted file mode 100644 index 38f4b43..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstPbutils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstPlay.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstPlay.cpython-312.pyc deleted file mode 100644 index 7cf83af..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstPlay.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstPlayer.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstPlayer.cpython-312.pyc deleted file mode 100644 index 887ca38..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstPlayer.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstRtp.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstRtp.cpython-312.pyc deleted file mode 100644 index 7b0fa04..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstRtp.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstRtsp.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstRtsp.cpython-312.pyc deleted file mode 100644 index 20ed74c..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstRtsp.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstRtspServer.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstRtspServer.cpython-312.pyc deleted file mode 100644 index bdc7145..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstRtspServer.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstSdp.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstSdp.cpython-312.pyc deleted file mode 100644 index 46c36f2..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstSdp.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstTag.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstTag.cpython-312.pyc deleted file mode 100644 index 9d3ac06..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstTag.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstTranscoder.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstTranscoder.cpython-312.pyc deleted file mode 100644 index 09c347c..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstTranscoder.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstVideo.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstVideo.cpython-312.pyc deleted file mode 100644 index 3f027d7..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstVideo.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstVulkan.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstVulkan.cpython-312.pyc deleted file mode 100644 index 4a07510..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstVulkan.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstVulkanWayland.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstVulkanWayland.cpython-312.pyc deleted file mode 100644 index 28cca00..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstVulkanWayland.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstVulkanXCB.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstVulkanXCB.cpython-312.pyc deleted file mode 100644 index 9ee7155..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstVulkanXCB.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstWebRTC.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstWebRTC.cpython-312.pyc deleted file mode 100644 index b46fa15..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstWebRTC.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gtk.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gtk.cpython-312.pyc deleted file mode 100644 index 7bfa29e..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gtk.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkChamplain.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkChamplain.cpython-312.pyc deleted file mode 100644 index 067de72..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkChamplain.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkClutter.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkClutter.cpython-312.pyc deleted file mode 100644 index c4c1076..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkClutter.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkSource.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkSource.cpython-312.pyc deleted file mode 100644 index 38eb4b6..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkSource.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkosxApplication.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkosxApplication.cpython-312.pyc deleted file mode 100644 index 67bd7e3..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkosxApplication.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.HarfBuzz.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.HarfBuzz.cpython-312.pyc deleted file mode 100644 index dc8a52a..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.HarfBuzz.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.OsmGpsMap.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.OsmGpsMap.cpython-312.pyc deleted file mode 100644 index e90eb4c..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.OsmGpsMap.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Pango.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Pango.cpython-312.pyc deleted file mode 100644 index 9e067e7..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Pango.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.PangoCairo.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.PangoCairo.cpython-312.pyc deleted file mode 100644 index 22c1e21..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.PangoCairo.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Rsvg.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Rsvg.cpython-312.pyc deleted file mode 100644 index 65d2b84..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Rsvg.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.cairo.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.cairo.cpython-312.pyc deleted file mode 100644 index 5680ad8..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.cairo.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.freetype2.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.freetype2.cpython-312.pyc deleted file mode 100644 index 4c5e548..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.freetype2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.xlib.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.xlib.cpython-312.pyc deleted file mode 100644 index 42a53fd..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.xlib.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-importlib_metadata.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-importlib_metadata.cpython-312.pyc deleted file mode 100644 index f016c68..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-importlib_metadata.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-importlib_resources.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-importlib_resources.cpython-312.pyc deleted file mode 100644 index a7022f9..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-importlib_resources.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-inflect.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-inflect.cpython-312.pyc deleted file mode 100644 index 0a81ba9..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-inflect.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-jaraco.context.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-jaraco.context.cpython-312.pyc deleted file mode 100644 index e233a6b..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-jaraco.context.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-jaraco.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-jaraco.cpython-312.pyc deleted file mode 100644 index 5f1caa4..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-jaraco.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-jaraco.functools.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-jaraco.functools.cpython-312.pyc deleted file mode 100644 index f202db2..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-jaraco.functools.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-jaraco.text.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-jaraco.text.cpython-312.pyc deleted file mode 100644 index 650c2c9..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-jaraco.text.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-more_itertools.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-more_itertools.cpython-312.pyc deleted file mode 100644 index de3af71..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-more_itertools.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-ordered_set.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-ordered_set.cpython-312.pyc deleted file mode 100644 index 81b2b37..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-ordered_set.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-packaging.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-packaging.cpython-312.pyc deleted file mode 100644 index 9a165cd..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-packaging.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-platformdirs.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-platformdirs.cpython-312.pyc deleted file mode 100644 index 75739ab..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-platformdirs.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-setuptools.extern.six.moves.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-setuptools.extern.six.moves.cpython-312.pyc deleted file mode 100644 index 062420d..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-setuptools.extern.six.moves.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-six.moves.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-six.moves.cpython-312.pyc deleted file mode 100644 index b0b33ea..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-six.moves.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-tomli.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-tomli.cpython-312.pyc deleted file mode 100644 index b23f982..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-tomli.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-typeguard.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-typeguard.cpython-312.pyc deleted file mode 100644 index fee5649..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-typeguard.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-typing_extensions.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-typing_extensions.cpython-312.pyc deleted file mode 100644 index f32b4c9..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-typing_extensions.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-urllib3.packages.six.moves.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-urllib3.packages.six.moves.cpython-312.pyc deleted file mode 100644 index f9dd7b9..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-urllib3.packages.six.moves.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-wheel.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-wheel.cpython-312.pyc deleted file mode 100644 index d8584bc..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-wheel.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-zipp.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-zipp.cpython-312.pyc deleted file mode 100644 index a8c0aeb..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-zipp.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-autocommand.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-autocommand.py deleted file mode 100755 index 83c7249..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-autocommand.py +++ /dev/null @@ -1,15 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by -# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module -# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. -from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-backports.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-backports.py deleted file mode 100755 index 3b6a8fc..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-backports.py +++ /dev/null @@ -1,17 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2025, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This top-level namespace package might be provided by setuptools >= 71.0.0, which makes its vendored dependencies -# public by appending path to its `setuptools._vendored` directory to `sys.path`. The following shared -# pre-safe-import-module hook implementation checks whether this is the case, and, depending on situation, either -# sets up aliases to prevent duplicate collection, or extends the search paths. -from PyInstaller.utils.hooks.setuptools import pre_safe_import_module_for_top_level_namespace_packages \ - as pre_safe_import_module # noqa: F401 diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-backports.tarfile.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-backports.tarfile.py deleted file mode 100755 index 83c7249..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-backports.tarfile.py +++ /dev/null @@ -1,15 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by -# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module -# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. -from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-distutils.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-distutils.py deleted file mode 100755 index 7f88845..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-distutils.py +++ /dev/null @@ -1,23 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller import compat -from PyInstaller.utils.hooks.setuptools import setuptools_info - - -def pre_safe_import_module(api): - # `distutils` was removed from from stdlib in python 3.12; if it is available, it is provided by `setuptools`. - # Therefore, we need to create package/module alias entries, which prevent the setuptools._distutils` and its - # submodules from being collected as top-level modules (as `distutils` and its submodules) in addition to being - # collected as their "true" names. - if compat.is_py312 and setuptools_info.distutils_vendored: - for aliased_name, real_vendored_name in setuptools_info.get_distutils_aliases(): - api.add_alias_module(real_vendored_name, aliased_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.overrides.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.overrides.py deleted file mode 100755 index c98573a..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.overrides.py +++ /dev/null @@ -1,26 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2025, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller import compat -from PyInstaller.utils import hooks as hookutils - - -def pre_safe_import_module(api): - if compat.is_linux: - # See comment in the adjacent `hook-gi.py`. - try: - paths = hookutils.get_module_attribute(api.module_name, "__path__") - except Exception: - # Most likely `gi.overrides` cannot be imported. - paths = [] - - for path in paths: - api.append_package_path(path) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.py deleted file mode 100755 index 409007c..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.py +++ /dev/null @@ -1,40 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2022-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller import compat -from PyInstaller.utils import hooks as hookutils - - -def pre_safe_import_module(api): - if compat.is_linux: - # RHEL/Fedora RPM package for GObject introspection is known to split the `gi` package into two locations: - # - /usr/lib64/python3.x/site-packages/gi - # - /usr/lib/python3.x/site-packages/gi - # The `__init__.py` is located in the first directory, while `repository` and `overrides` are located in - # the second, and `__init__.py` dynamically extends the `__path__` during package import, using - # `__path__ = pkgutil.extend_path(__path__, __name__)`. - # The modulegraph has no way of knowing this, so we need extend the package path in this hook. Otherwise, - # only the first location is scanned, and the `gi.repository` ends up missing. - # - # ADDENDUM: it looks like the `gi.overrides` can also be split across both locations, so we need a similar - # hook for `gi.overrides` as well. - # - # NOTE: the `get_package_paths`/`get_package_all_paths` helpers read the paths from package's spec without - # importing the (top-level) package, so they do not catch run-time path modifications. Instead, we use - # `get_module_attribute` to import the package in isolated process and query its `__path__` attribute. - try: - paths = hookutils.get_module_attribute(api.module_name, "__path__") - except Exception: - # Most likely `gi` cannot be imported. - paths = [] - - for path in paths: - api.append_package_path(path) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Adw.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Adw.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Adw.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.AppIndicator3.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.AppIndicator3.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.AppIndicator3.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Atk.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Atk.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Atk.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.AyatanaAppIndicator3.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.AyatanaAppIndicator3.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.AyatanaAppIndicator3.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Champlain.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Champlain.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Champlain.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Clutter.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Clutter.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Clutter.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.DBus.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.DBus.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.DBus.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GIRepository.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GIRepository.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GIRepository.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GLib.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GLib.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GLib.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GModule.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GModule.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GModule.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GObject.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GObject.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GObject.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gdk.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gdk.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gdk.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GdkPixbuf.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GdkPixbuf.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GdkPixbuf.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gio.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gio.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gio.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Graphene.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Graphene.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Graphene.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gsk.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gsk.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gsk.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gst.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gst.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gst.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstAllocators.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstAllocators.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstAllocators.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstApp.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstApp.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstApp.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstAudio.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstAudio.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstAudio.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstBadAudio.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstBadAudio.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstBadAudio.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstBase.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstBase.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstBase.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstCheck.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstCheck.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstCheck.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstCodecs.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstCodecs.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstCodecs.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstController.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstController.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstController.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGL.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGL.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGL.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGLEGL.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGLEGL.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGLEGL.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGLWayland.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGLWayland.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGLWayland.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGLX11.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGLX11.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGLX11.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstInsertBin.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstInsertBin.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstInsertBin.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstMpegts.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstMpegts.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstMpegts.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstNet.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstNet.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstNet.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstPbutils.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstPbutils.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstPbutils.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstPlay.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstPlay.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstPlay.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstPlayer.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstPlayer.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstPlayer.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstRtp.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstRtp.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstRtp.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstRtsp.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstRtsp.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstRtsp.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstRtspServer.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstRtspServer.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstRtspServer.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstSdp.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstSdp.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstSdp.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstTag.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstTag.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstTag.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstTranscoder.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstTranscoder.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstTranscoder.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVideo.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVideo.py deleted file mode 100755 index e75bfee..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVideo.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert - # them to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVulkan.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVulkan.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVulkan.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVulkanWayland.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVulkanWayland.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVulkanWayland.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVulkanXCB.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVulkanXCB.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVulkanXCB.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstWebRTC.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstWebRTC.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstWebRTC.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gtk.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gtk.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gtk.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkChamplain.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkChamplain.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkChamplain.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkClutter.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkClutter.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkClutter.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkSource.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkSource.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkSource.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkosxApplication.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkosxApplication.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkosxApplication.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.HarfBuzz.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.HarfBuzz.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.HarfBuzz.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.OsmGpsMap.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.OsmGpsMap.py deleted file mode 100755 index cb80208..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.OsmGpsMap.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2025, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Pango.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Pango.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Pango.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.PangoCairo.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.PangoCairo.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.PangoCairo.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Rsvg.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Rsvg.py deleted file mode 100755 index a9978ab..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Rsvg.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.cairo.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.cairo.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.cairo.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.freetype2.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.freetype2.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.freetype2.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.xlib.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.xlib.py deleted file mode 100755 index 131ce95..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.xlib.py +++ /dev/null @@ -1,16 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - - -def pre_safe_import_module(api): - # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them - # to RuntimeModules in order for their hooks to be loaded and executed. - api.add_runtime_module(api.module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-importlib_metadata.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-importlib_metadata.py deleted file mode 100755 index 83c7249..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-importlib_metadata.py +++ /dev/null @@ -1,15 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by -# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module -# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. -from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-importlib_resources.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-importlib_resources.py deleted file mode 100755 index 83c7249..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-importlib_resources.py +++ /dev/null @@ -1,15 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by -# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module -# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. -from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-inflect.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-inflect.py deleted file mode 100755 index 83c7249..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-inflect.py +++ /dev/null @@ -1,15 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by -# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module -# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. -from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-jaraco.context.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-jaraco.context.py deleted file mode 100755 index 83c7249..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-jaraco.context.py +++ /dev/null @@ -1,15 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by -# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module -# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. -from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-jaraco.functools.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-jaraco.functools.py deleted file mode 100755 index 83c7249..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-jaraco.functools.py +++ /dev/null @@ -1,15 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by -# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module -# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. -from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-jaraco.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-jaraco.py deleted file mode 100755 index 3b6a8fc..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-jaraco.py +++ /dev/null @@ -1,17 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2025, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This top-level namespace package might be provided by setuptools >= 71.0.0, which makes its vendored dependencies -# public by appending path to its `setuptools._vendored` directory to `sys.path`. The following shared -# pre-safe-import-module hook implementation checks whether this is the case, and, depending on situation, either -# sets up aliases to prevent duplicate collection, or extends the search paths. -from PyInstaller.utils.hooks.setuptools import pre_safe_import_module_for_top_level_namespace_packages \ - as pre_safe_import_module # noqa: F401 diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-jaraco.text.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-jaraco.text.py deleted file mode 100755 index 83c7249..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-jaraco.text.py +++ /dev/null @@ -1,15 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by -# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module -# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. -from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-more_itertools.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-more_itertools.py deleted file mode 100755 index 83c7249..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-more_itertools.py +++ /dev/null @@ -1,15 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by -# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module -# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. -from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-ordered_set.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-ordered_set.py deleted file mode 100755 index 83c7249..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-ordered_set.py +++ /dev/null @@ -1,15 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by -# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module -# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. -from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-packaging.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-packaging.py deleted file mode 100755 index 83c7249..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-packaging.py +++ /dev/null @@ -1,15 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by -# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module -# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. -from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-platformdirs.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-platformdirs.py deleted file mode 100755 index 83c7249..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-platformdirs.py +++ /dev/null @@ -1,15 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by -# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module -# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. -from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-setuptools.extern.six.moves.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-setuptools.extern.six.moves.py deleted file mode 100755 index 5a09a89..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-setuptools.extern.six.moves.py +++ /dev/null @@ -1,39 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller import isolated - -# This is basically a copy of pre_safe_import_module/hook-six.moves.py adopted to setuptools.extern.six resp. -# setuptools._vendor.six. Please see pre_safe_import_module/hook-six.moves.py for documentation. - -# Note that the moves are defined in 'setuptools._vendor.six' but are imported under 'setuptools.extern.six'. - - -def pre_safe_import_module(api): - @isolated.call - def real_to_six_module_name(): - try: - import setuptools._vendor.six as six - except ImportError: - try: - import setuptools.extern.six as six - except ImportError: - return None # unavailable - - return { - moved.mod: 'setuptools.extern.six.moves.' + moved.name - for moved in six._moved_attributes if isinstance(moved, (six.MovedModule, six.MovedAttribute)) - } - - if real_to_six_module_name is not None: - api.add_runtime_package(api.module_name) - for real_module_name, six_module_name in real_to_six_module_name.items(): - api.add_alias_module(real_module_name, six_module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-six.moves.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-six.moves.py deleted file mode 100755 index 1c86669..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-six.moves.py +++ /dev/null @@ -1,62 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller import isolated - - -def pre_safe_import_module(api): - """ - Add the `six.moves` module as a dynamically defined runtime module node and all modules mapped by - `six._SixMetaPathImporter` as aliased module nodes to the passed graph. - - The `six.moves` module is dynamically defined at runtime by the `six` module and hence cannot be imported in the - standard way. Instead, this hook adds a placeholder node for the `six.moves` module to the graph, - which implicitly adds an edge from that node to the node for its parent `six` module. This ensures that the `six` - module will be frozen into the executable. (Phew!) - - `six._SixMetaPathImporter` is a PEP 302-compliant module importer converting imports independent of the current - Python version into imports specific to that version (e.g., under Python 3, from `from six.moves import - tkinter_tix` to `import tkinter.tix`). For each such mapping, this hook adds a corresponding module alias to the - graph allowing PyInstaller to translate the former to the latter. - """ - @isolated.call - def real_to_six_module_name(): - """ - Generate a dictionary from conventional module names to "six.moves" attribute names (e.g., from `tkinter.tix` to - `six.moves.tkinter_tix`). - """ - try: - import six - except ImportError: - return None # unavailable - - # Iterate over the "six._moved_attributes" list rather than the "six._importer.known_modules" dictionary, as - # "urllib"-specific moved modules are overwritten in the latter with unhelpful "LazyModule" objects. If this is - # a moved module or attribute, map the corresponding module. In the case of moved attributes, the attribute's - # module is mapped while the attribute itself is mapped at runtime and hence ignored here. - return { - moved.mod: 'six.moves.' + moved.name - for moved in six._moved_attributes if isinstance(moved, (six.MovedModule, six.MovedAttribute)) - } - - # Add "six.moves" as a runtime package rather than module. Modules cannot physically contain submodules; only - # packages can. In "from"-style import statements (e.g., "from six.moves import queue"), this implies that: - # * Attributes imported from customary modules are guaranteed *NOT* to be submodules. Hence, ModuleGraph justifiably - # ignores these attributes. While some attributes declared by "six.moves" are ignorable non-modules (e.g., - # functions, classes), others are non-ignorable submodules that must be imported. Adding "six.moves" as a runtime - # module causes ModuleGraph to ignore these submodules, which defeats the entire point. - # * Attributes imported from packages could be submodules. To disambiguate non-ignorable submodules from ignorable - # non-submodules (e.g., classes, variables), ModuleGraph first attempts to import these attributes as submodules. - # This is exactly what we want. - if real_to_six_module_name is not None: - api.add_runtime_package(api.module_name) - for real_module_name, six_module_name in real_to_six_module_name.items(): - api.add_alias_module(real_module_name, six_module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-tomli.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-tomli.py deleted file mode 100755 index 83c7249..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-tomli.py +++ /dev/null @@ -1,15 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by -# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module -# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. -from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-typeguard.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-typeguard.py deleted file mode 100755 index 83c7249..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-typeguard.py +++ /dev/null @@ -1,15 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by -# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module -# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. -from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-typing_extensions.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-typing_extensions.py deleted file mode 100755 index 83c7249..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-typing_extensions.py +++ /dev/null @@ -1,15 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by -# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module -# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. -from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-urllib3.packages.six.moves.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-urllib3.packages.six.moves.py deleted file mode 100755 index d257f83..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-urllib3.packages.six.moves.py +++ /dev/null @@ -1,34 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from PyInstaller import isolated - -# This basically is a copy of pre_safe_import_module/hook-six.moves.py adopted to urllib3.packages.six. Please see -# pre_safe_import_module/hook-six.moves.py for documentation. - - -def pre_safe_import_module(api): - @isolated.call - def real_to_six_module_name(): - try: - import urllib3.packages.six as six - except ImportError: - return None # unavailable - - return { - moved.mod: 'urllib3.packages.six.moves.' + moved.name - for moved in six._moved_attributes if isinstance(moved, (six.MovedModule, six.MovedAttribute)) - } - - if real_to_six_module_name is not None: - api.add_runtime_package(api.module_name) - for real_module_name, six_module_name in real_to_six_module_name.items(): - api.add_alias_module(real_module_name, six_module_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-wheel.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-wheel.py deleted file mode 100755 index 83c7249..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-wheel.py +++ /dev/null @@ -1,15 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by -# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module -# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. -from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-zipp.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-zipp.py deleted file mode 100755 index 83c7249..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-zipp.py +++ /dev/null @@ -1,15 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by -# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module -# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. -from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks.dat b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks.dat deleted file mode 100755 index c024452..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks.dat +++ /dev/null @@ -1,23 +0,0 @@ -{ - 'django': ['pyi_rth_django.py'], - 'gi': ['pyi_rth_gi.py'], - 'gi.repository.Gio': ['pyi_rth_gio.py'], - 'gi.repository.GLib': ['pyi_rth_glib.py'], - 'gi.repository.GdkPixbuf': ['pyi_rth_gdkpixbuf.py'], - 'gi.repository.Gtk': ['pyi_rth_gtk.py'], - 'gi.repository.Gst': ['pyi_rth_gstreamer.py'], - 'gst': ['pyi_rth_gstreamer.py'], - 'inspect': ['pyi_rth_inspect.py'], - 'kivy': ['pyi_rth_kivy.py'], - 'kivy.lib.gstplayer': ['pyi_rth_gstreamer.py'], - 'matplotlib': ['pyi_rth_mplconfig.py'], - 'pkgutil': ['pyi_rth_pkgutil.py'], - 'pkg_resources': ['pyi_rth_pkgres.py'], - 'PyQt5': ['pyi_rth_pyqt5.py'], - 'PyQt6': ['pyi_rth_pyqt6.py'], - 'PySide2': ['pyi_rth_pyside2.py'], - 'PySide6': ['pyi_rth_pyside6.py'], - '_tkinter': ['pyi_rth__tkinter.py'], - 'multiprocessing': ['pyi_rth_multiprocessing.py'], - 'setuptools': ['pyi_rth_setuptools.py'], -} diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__init__.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__init__.py deleted file mode 100755 index 792d600..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index bd5ccca..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth__tkinter.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth__tkinter.cpython-312.pyc deleted file mode 100644 index 3a450b1..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth__tkinter.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_django.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_django.cpython-312.pyc deleted file mode 100644 index da6a8e2..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_django.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gdkpixbuf.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gdkpixbuf.cpython-312.pyc deleted file mode 100644 index d35835a..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gdkpixbuf.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gi.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gi.cpython-312.pyc deleted file mode 100644 index b63328e..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gi.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gio.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gio.cpython-312.pyc deleted file mode 100644 index b349d50..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gio.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_glib.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_glib.cpython-312.pyc deleted file mode 100644 index c0a2219..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_glib.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gstreamer.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gstreamer.cpython-312.pyc deleted file mode 100644 index fcb6efa..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gstreamer.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gtk.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gtk.cpython-312.pyc deleted file mode 100644 index a9e5d9d..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gtk.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_inspect.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_inspect.cpython-312.pyc deleted file mode 100644 index f77e8bf..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_inspect.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_kivy.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_kivy.cpython-312.pyc deleted file mode 100644 index 685998e..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_kivy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_mplconfig.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_mplconfig.cpython-312.pyc deleted file mode 100644 index 0c29d05..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_mplconfig.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_multiprocessing.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_multiprocessing.cpython-312.pyc deleted file mode 100644 index 874e936..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_multiprocessing.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pkgres.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pkgres.cpython-312.pyc deleted file mode 100644 index fb229f4..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pkgres.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pkgutil.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pkgutil.cpython-312.pyc deleted file mode 100644 index 20bd4bd..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pkgutil.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pyqt5.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pyqt5.cpython-312.pyc deleted file mode 100644 index 1b72984..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pyqt5.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pyqt6.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pyqt6.cpython-312.pyc deleted file mode 100644 index 3938334..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pyqt6.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pyside2.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pyside2.cpython-312.pyc deleted file mode 100644 index 9f98ccc..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pyside2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pyside6.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pyside6.cpython-312.pyc deleted file mode 100644 index 8eea662..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pyside6.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_setuptools.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_setuptools.cpython-312.pyc deleted file mode 100644 index 2d09d53..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_setuptools.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth__tkinter.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth__tkinter.py deleted file mode 100755 index ae154f8..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth__tkinter.py +++ /dev/null @@ -1,37 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - - -def _pyi_rthook(): - import os - import sys - - # The directory names must match TCL_ROOTNAME and TK_ROOTNAME constants defined in `PyInstaller.utils.hooks.tcl_tk`. - tcldir = os.path.join(sys._MEIPASS, '_tcl_data') - tkdir = os.path.join(sys._MEIPASS, '_tk_data') - - # Notify "tkinter" of data directories. On macOS, we do not collect data directories if system Tcl/Tk framework is - # used. On other OSes, we always collect them, so their absence is considered an error. - is_darwin = sys.platform == 'darwin' - - if os.path.isdir(tcldir): - os.environ["TCL_LIBRARY"] = tcldir - elif not is_darwin: - raise FileNotFoundError('Tcl data directory "%s" not found.' % tcldir) - - if os.path.isdir(tkdir): - os.environ["TK_LIBRARY"] = tkdir - elif not is_darwin: - raise FileNotFoundError('Tk data directory "%s" not found.' % tkdir) - - -_pyi_rthook() -del _pyi_rthook diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_django.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_django.py deleted file mode 100755 index 81243bd..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_django.py +++ /dev/null @@ -1,34 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - -# This Django rthook was tested with Django 1.8.3. - - -def _pyi_rthook(): - import django.utils.autoreload - - _old_restart_with_reloader = django.utils.autoreload.restart_with_reloader - - def _restart_with_reloader(*args): - import sys - a0 = sys.argv.pop(0) - try: - return _old_restart_with_reloader(*args) - finally: - sys.argv.insert(0, a0) - - # Override restart_with_reloader() function, otherwise the app might complain that some commands do not exist; - # e.g., runserver. - django.utils.autoreload.restart_with_reloader = _restart_with_reloader - - -_pyi_rthook() -del _pyi_rthook diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gdkpixbuf.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gdkpixbuf.py deleted file mode 100755 index de8223f..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gdkpixbuf.py +++ /dev/null @@ -1,41 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2015-2023, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - - -def _pyi_rthook(): - import atexit - import os - import sys - import tempfile - - pixbuf_file = os.path.join(sys._MEIPASS, 'lib', 'gdk-pixbuf', 'loaders.cache') - - # If we are not on Windows, we need to rewrite the cache -> we rewrite on macOS to support --onefile mode - if os.path.exists(pixbuf_file) and sys.platform != 'win32': - with open(pixbuf_file, 'rb') as fp: - contents = fp.read() - - # Create a temporary file with the cache and cleverly replace the prefix we injected with the actual path. - fd, pixbuf_file = tempfile.mkstemp() - with os.fdopen(fd, 'wb') as fp: - libpath = os.path.join(sys._MEIPASS, 'lib').encode('utf-8') - fp.write(contents.replace(b'@executable_path/lib', libpath)) - - try: - atexit.register(os.unlink, pixbuf_file) - except OSError: - pass - - os.environ['GDK_PIXBUF_MODULE_FILE'] = pixbuf_file - - -_pyi_rthook() -del _pyi_rthook diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gi.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gi.py deleted file mode 100755 index 3c3b382..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gi.py +++ /dev/null @@ -1,21 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2015-2023, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - - -def _pyi_rthook(): - import os - import sys - - os.environ['GI_TYPELIB_PATH'] = os.path.join(sys._MEIPASS, 'gi_typelibs') - - -_pyi_rthook() -del _pyi_rthook diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gio.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gio.py deleted file mode 100755 index f9fc307..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gio.py +++ /dev/null @@ -1,21 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2015-2023, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - - -def _pyi_rthook(): - import os - import sys - - os.environ['GIO_MODULE_DIR'] = os.path.join(sys._MEIPASS, 'gio_modules') - - -_pyi_rthook() -del _pyi_rthook diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_glib.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_glib.py deleted file mode 100755 index 35bd7f8..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_glib.py +++ /dev/null @@ -1,37 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2015-2023, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - - -def _pyi_rthook(): - import os - import sys - - # Prepend the frozen application's data dir to XDG_DATA_DIRS. We need to avoid overwriting the existing paths in - # order to allow the frozen application to run system-installed applications (for example, launch a web browser via - # the webbrowser module on Linux). Should the user desire complete isolation of the frozen application from the - # system, they need to clean up XDG_DATA_DIRS at the start of their program (i.e., remove all entries but first). - pyi_data_dir = os.path.join(sys._MEIPASS, 'share') - - xdg_data_dirs = os.environ.get('XDG_DATA_DIRS', None) - if xdg_data_dirs: - if pyi_data_dir not in xdg_data_dirs: - xdg_data_dirs = pyi_data_dir + os.pathsep + xdg_data_dirs - else: - xdg_data_dirs = pyi_data_dir - os.environ['XDG_DATA_DIRS'] = xdg_data_dirs - - # Cleanup aux variables - del xdg_data_dirs - del pyi_data_dir - - -_pyi_rthook() -del _pyi_rthook diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gstreamer.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gstreamer.py deleted file mode 100755 index 5663229..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gstreamer.py +++ /dev/null @@ -1,32 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - - -def _pyi_rthook(): - import os - import sys - - # Without this environment variable set to 'no' importing 'gst' causes 100% CPU load. (Tested on macOS.) - os.environ['GST_REGISTRY_FORK'] = 'no' - - gst_plugin_paths = [sys._MEIPASS, os.path.join(sys._MEIPASS, 'gst-plugins')] - os.environ['GST_PLUGIN_PATH'] = os.pathsep.join(gst_plugin_paths) - - # Prevent permission issues on Windows - os.environ['GST_REGISTRY'] = os.path.join(sys._MEIPASS, 'registry.bin') - - # Only use packaged plugins to prevent GStreamer from crashing when it finds plugins from another version which are - # installed system wide. - os.environ['GST_PLUGIN_SYSTEM_PATH'] = '' - - -_pyi_rthook() -del _pyi_rthook diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gtk.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gtk.py deleted file mode 100755 index d6ae21c..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gtk.py +++ /dev/null @@ -1,27 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2015-2023, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - - -def _pyi_rthook(): - import os - import sys - - os.environ['GTK_DATA_PREFIX'] = sys._MEIPASS - os.environ['GTK_EXE_PREFIX'] = sys._MEIPASS - os.environ['GTK_PATH'] = sys._MEIPASS - - # Include these here, as GTK will import pango automatically. - os.environ['PANGO_LIBDIR'] = sys._MEIPASS - os.environ['PANGO_SYSCONFDIR'] = os.path.join(sys._MEIPASS, 'etc') # TODO? - - -_pyi_rthook() -del _pyi_rthook diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_inspect.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_inspect.py deleted file mode 100755 index 2575997..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_inspect.py +++ /dev/null @@ -1,99 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - - -def _pyi_rthook(): - import inspect - import os - import sys - import zipfile - - # Use sys._MEIPASS with normalized path component separator. This is necessary on some platforms (i.e., msys2/mingw - # python on Windows), because we use string comparisons on the paths. - SYS_PREFIX = os.path.normpath(sys._MEIPASS) - BASE_LIBRARY = os.path.join(SYS_PREFIX, "base_library.zip") - - # Obtain the list of modules in base_library.zip, so we can use it in our `_pyi_getsourcefile` implementation. - def _get_base_library_files(filename): - # base_library.zip might not exit - if not os.path.isfile(filename): - return set() - - with zipfile.ZipFile(filename, 'r') as zf: - namelist = zf.namelist() - - return set(os.path.normpath(entry) for entry in namelist) - - base_library_files = _get_base_library_files(BASE_LIBRARY) - - # Provide custom implementation of inspect.getsourcefile() for frozen applications that properly resolves relative - # filenames obtained from object (e.g., inspect stack-frames). See #5963. - # - # Although we are overriding `inspect.getsourcefile` function, we are NOT trying to resolve source file here! - # The main purpose of this implementation is to properly resolve relative file names obtained from `co_filename` - # attribute of code objects (which are, in turn, obtained from in turn are obtained from `frame` and `traceback` - # objects). PyInstaller strips absolute paths from `co_filename` when collecting modules, as the original absolute - # paths are not portable/relocatable anyway. The `inspect` module tries to look up the module that corresponds to - # the code object by comparing modules' `__file__` attribute to the value of `co_filename`. Therefore, our override - # needs to resolve the relative file names (usually having a .py suffix) into absolute module names (which, in the - # frozen application, usually have .pyc suffix). - # - # The `inspect` module retrieves the actual source code using `linecache.getlines()`. If the passed source filename - # does not exist, the underlying implementation end up resolving the module, and obtains the source via loader's - # `get_source` method. So for modules in the PYZ archive, it ends up calling `get_source` implementation on our - # `PyiFrozenLoader`. For modules in `base_library.zip`, it ends up calling `get_source` on python's own - # `zipimport.zipimporter`; to properly handle out-of-zip source files, we therefore need to monkey-patch - # `get_source` with our own override that translates the in-zip .pyc filename into out-of-zip .py file location - # and loads the source (this override is done in `pyimod02_importers` module). - # - # The above-described fallback takes place if the .pyc file does not exist on filesystem - if this ever becomes - # a problem, we could consider monkey-patching `linecache.updatecache` (and possibly `checkcache`) to translate - # .pyc paths in `sys._MEIPASS` and `base_library.zip` into .py paths in `sys._MEIPASS` before calling the original - # implementation. - _orig_inspect_getsourcefile = inspect.getsourcefile - - def _pyi_getsourcefile(object): - filename = inspect.getfile(object) - filename = os.path.normpath(filename) # Ensure path component separators are normalized. - if not os.path.isabs(filename): - # Check if given filename matches the basename of __main__'s __file__. - main_file = getattr(sys.modules['__main__'], '__file__', None) - if main_file and filename == os.path.basename(main_file): - return main_file - - # If the relative filename does not correspond to the frozen entry-point script, convert it to the absolute - # path in either `sys._MEIPASS/base_library.zip` or `sys._MEIPASS`, whichever applicable. - # - # The modules in `sys._MEIPASS/base_library.zip` are handled by python's `zipimport.zipimporter`, and have - # their __file__ attribute point to the .pyc file in the archive. So we match the behavior, in order to - # facilitate matching via __file__ attribute and use of loader's `get_source`, as per the earlier comment - # block. - # - # The modules in PYZ archive are handled by our `PyFrozenLoader`, which now sets the module's __file__ - # attribute to point to where .py files would be. Therefore, we can directly merge SYS_PREFIX and filename - # (and if the source .py file exists, it will be loaded directly from filename, without the intermediate - # loader look-up). - pyc_filename = filename + 'c' - if pyc_filename in base_library_files: - return os.path.normpath(os.path.join(BASE_LIBRARY, pyc_filename)) - return os.path.normpath(os.path.join(SYS_PREFIX, filename)) - elif filename.startswith(SYS_PREFIX): - # If filename is already an absolute file path pointing into application's top-level directory, return it - # as-is and prevent any further processing. - return filename - # Use original implementation as a fallback. - return _orig_inspect_getsourcefile(object) - - inspect.getsourcefile = _pyi_getsourcefile - - -_pyi_rthook() -del _pyi_rthook diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_kivy.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_kivy.py deleted file mode 100755 index 0846401..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_kivy.py +++ /dev/null @@ -1,24 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2015-2023, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - - -def _pyi_rthook(): - import os - import sys - - root = os.path.join(sys._MEIPASS, 'kivy_install') - - os.environ['KIVY_DATA_DIR'] = os.path.join(root, 'data') - os.environ['KIVY_MODULES_DIR'] = os.path.join(root, 'modules') - - -_pyi_rthook() -del _pyi_rthook diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_mplconfig.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_mplconfig.py deleted file mode 100755 index 93fec80..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_mplconfig.py +++ /dev/null @@ -1,46 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - -# matplotlib will create $HOME/.matplotlib folder in user's home directory. In this directory there is fontList.cache -# file which lists paths to matplotlib fonts. -# -# When you run your onefile exe for the first time it's extracted to for example "_MEIxxxxx" temp directory and -# fontList.cache file is created with fonts paths pointing to this directory. -# -# Second time you run your exe new directory is created "_MEIyyyyy" but fontList.cache file still points to previous -# directory which was deleted. And then you will get error like: -# -# RuntimeError: Could not open facefile -# -# We need to force matplotlib to recreate config directory every time you run your app. - - -def _pyi_rthook(): - import atexit - import os - import shutil - - import _pyi_rth_utils.tempfile # PyInstaller's run-time hook utilities module - - # Isolate matplotlib's config dir into temporary directory. - # Use our replacement for `tempfile.mkdtemp` function that properly restricts access to directory on all platforms. - configdir = _pyi_rth_utils.tempfile.secure_mkdtemp() - os.environ['MPLCONFIGDIR'] = configdir - - try: - # Remove temp directory at application exit and ignore any errors. - atexit.register(shutil.rmtree, configdir, ignore_errors=True) - except OSError: - pass - - -_pyi_rthook() -del _pyi_rthook diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_multiprocessing.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_multiprocessing.py deleted file mode 100755 index f596d93..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_multiprocessing.py +++ /dev/null @@ -1,55 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2017-2023, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - - -def _pyi_rthook(): - import sys - - import multiprocessing - import multiprocessing.spawn - - from subprocess import _args_from_interpreter_flags - - # Prevent `spawn` from trying to read `__main__` in from the main script - multiprocessing.process.ORIGINAL_DIR = None - - def _freeze_support(): - # We want to catch the two processes that are spawned by the multiprocessing code: - # - the semaphore tracker, which cleans up named semaphores in the `spawn` multiprocessing mode - # - the fork server, which keeps track of worker processes in the `forkserver` mode. - # Both of these processes are started by spawning a new copy of the running executable, passing it the flags - # from `_args_from_interpreter_flags` and then "-c" and an import statement. - # Look for those flags and the import statement, then `exec()` the code ourselves. - - if ( - len(sys.argv) >= 2 and sys.argv[-2] == '-c' and sys.argv[-1].startswith( - ('from multiprocessing.resource_tracker import main', 'from multiprocessing.forkserver import main') - ) and set(sys.argv[1:-2]) == set(_args_from_interpreter_flags()) - ): - exec(sys.argv[-1]) - sys.exit() - - if multiprocessing.spawn.is_forking(sys.argv): - kwds = {} - for arg in sys.argv[2:]: - name, value = arg.split('=') - if value == 'None': - kwds[name] = None - else: - kwds[name] = int(value) - multiprocessing.spawn.spawn_main(**kwds) - sys.exit() - - multiprocessing.freeze_support = multiprocessing.spawn.freeze_support = _freeze_support - - -_pyi_rthook() -del _pyi_rthook diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgres.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgres.py deleted file mode 100755 index fe59194..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgres.py +++ /dev/null @@ -1,178 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - -# To make pkg_resources work with frozen modules, we need to set the 'Provider' class for PyiFrozenLoader. -# This class decides where to look for resources and other stuff. -# -# 'pkg_resources.NullProvider' is dedicated to abitrary PEP302 loaders, such as our PyiFrozenLoader. It uses method -# __loader__.get_data() in methods pkg_resources.resource_string() and pkg_resources.resource_stream(). -# -# We provide PyiFrozenProvider, which subclasses the NullProvider and implements _has(), _isdir(), and _listdir() -# methods, which are needed for pkg_resources.resource_exists(), resource_isdir(), and resource_listdir() to work. We -# cannot use the DefaultProvider, because it provides filesystem-only implementations (and overrides _get() with a -# filesystem-only one), whereas our provider needs to also support embedded resources. -# -# The PyiFrozenProvider allows querying/listing both PYZ-embedded and on-filesystem resources in a frozen package. The -# results are typically combined for both types of resources (e.g., when listing a directory or checking whether a -# resource exists). When the order of precedence matters, the PYZ-embedded resources take precedence over the -# on-filesystem ones, to keep the behavior consistent with the actual file content retrieval via _get() method (which in -# turn uses PyiFrozenLoader's get_data() method). For example, when checking whether a resource is a directory via -# _isdir(), a PYZ-embedded file will take precedence over a potential on-filesystem directory. Also, in contrast to -# unfrozen packages, the frozen ones do not contain source .py files, which are therefore absent from content listings. - - -def _pyi_rthook(): - import os - import pathlib - import sys - import warnings - - with warnings.catch_warnings(): - warnings.filterwarnings( - "ignore", - category=UserWarning, - message="pkg_resources is deprecated", - ) - import pkg_resources - - import pyimod02_importers # PyInstaller's bootstrap module - - SYS_PREFIX = pathlib.PurePath(sys._MEIPASS) - - class _TocFilesystem: - """ - A prefix tree implementation for embedded filesystem reconstruction. - - NOTE: as of PyInstaller 6.0, the embedded PYZ archive cannot contain data files anymore. Instead, it contains - only .pyc modules - which are by design not returned by `PyiFrozenProvider`. So this implementation has been - reduced to supporting only directories implied by collected packages. - """ - def __init__(self, tree_node): - self._tree = tree_node - - def _get_tree_node(self, path): - path = pathlib.PurePath(path) - current = self._tree - for component in path.parts: - if component not in current: - return None - current = current[component] - return current - - def path_exists(self, path): - node = self._get_tree_node(path) - return isinstance(node, dict) # Directory only - - def path_isdir(self, path): - node = self._get_tree_node(path) - return isinstance(node, dict) # Directory only - - def path_listdir(self, path): - node = self._get_tree_node(path) - if not isinstance(node, dict): - return [] # Non-existent or file - # Return only sub-directories - return [entry_name for entry_name, entry_data in node.items() if isinstance(entry_data, dict)] - - class PyiFrozenProvider(pkg_resources.NullProvider): - """ - Custom pkg_resources provider for PyiFrozenLoader. - """ - def __init__(self, module): - super().__init__(module) - - # Get top-level path; if "module" corresponds to a package, we need the path to the package itself. - # If "module" is a submodule in a package, we need the path to the parent package. - # - # This is equivalent to `pkg_resources.NullProvider.module_path`, except we construct a `pathlib.PurePath` - # for easier manipulation. - # - # NOTE: the path is NOT resolved for symbolic links, as neither are paths that are passed by `pkg_resources` - # to `_has`, `_isdir`, `_listdir` (they are all anchored to `module_path`, which in turn is just - # `os.path.dirname(module.__file__)`. As `__file__` returned by `PyiFrozenLoader` is always anchored to - # `sys._MEIPASS`, we do not have to worry about cross-linked directories in macOS .app bundles, where the - # resolved `__file__` could be either in the `Contents/Frameworks` directory (the "true" `sys._MEIPASS`), or - # in the `Contents/Resources` directory due to cross-linking. - self._pkg_path = pathlib.PurePath(module.__file__).parent - - # Construct _TocFilesystem on top of pre-computed prefix tree provided by pyimod02_importers. - self.embedded_tree = _TocFilesystem(pyimod02_importers.get_pyz_toc_tree()) - - def _normalize_path(self, path): - # Avoid using `Path.resolve`, because it resolves symlinks. This is undesirable, because the pure path in - # `self._pkg_path` does not have symlinks resolved, so comparison between the two would be faulty. Instead, - # use `os.path.normpath` to normalize the path and get rid of any '..' elements (the path itself should - # already be absolute). - return pathlib.Path(os.path.normpath(path)) - - def _is_relative_to_package(self, path): - return path == self._pkg_path or self._pkg_path in path.parents - - def _has(self, path): - # Prevent access outside the package. - path = self._normalize_path(path) - if not self._is_relative_to_package(path): - return False - - # Check the filesystem first to avoid unnecessarily computing the relative path... - if path.exists(): - return True - rel_path = path.relative_to(SYS_PREFIX) - return self.embedded_tree.path_exists(rel_path) - - def _isdir(self, path): - # Prevent access outside the package. - path = self._normalize_path(path) - if not self._is_relative_to_package(path): - return False - - # Embedded resources have precedence over filesystem... - rel_path = path.relative_to(SYS_PREFIX) - node = self.embedded_tree._get_tree_node(rel_path) - if node is None: - return path.is_dir() # No match found; try the filesystem. - else: - # str = file, dict = directory - return not isinstance(node, str) - - def _listdir(self, path): - # Prevent access outside the package. - path = self._normalize_path(path) - if not self._is_relative_to_package(path): - return [] - - # Relative path for searching embedded resources. - rel_path = path.relative_to(SYS_PREFIX) - # List content from embedded filesystem... - content = self.embedded_tree.path_listdir(rel_path) - # ... as well as the actual one. - if path.is_dir(): - # Use os.listdir() to avoid having to convert Path objects to strings... Also make sure to de-duplicate - # the results. - path = str(path) # not is_py36 - content = list(set(content + os.listdir(path))) - return content - - pkg_resources.register_loader_type(pyimod02_importers.PyiFrozenLoader, PyiFrozenProvider) - - # With our PyiFrozenFinder now being a path entry finder, it effectively replaces python's FileFinder. So we need - # to register it with `pkg_resources.find_on_path` to allow metadata to be found on filesystem. - pkg_resources.register_finder(pyimod02_importers.PyiFrozenFinder, pkg_resources.find_on_path) - - # For the above change to fully take effect, we need to re-initialize pkg_resources's master working set (since the - # original one was built with assumption that sys.path entries are handled by python's FileFinder). - # See https://github.com/pypa/setuptools/issues/373 - if hasattr(pkg_resources, '_initialize_master_working_set'): - pkg_resources._initialize_master_working_set() - - -_pyi_rthook() -del _pyi_rthook diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgutil.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgutil.py deleted file mode 100755 index e619d54..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgutil.py +++ /dev/null @@ -1,64 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- -# -# The run-time hook provides a custom module iteration function for our PyiFrozenFinder, which allows -# `pkgutil.iter_modules()` to return entries for modules that are embedded in the PYZ archive. The non-embedded modules -# (binary extensions, modules collected as only source .py files, etc.) are enumerated using the `fallback_finder` -# provided by `PyiFrozenFinder` (which typically would be the python's `FileFinder`). -def _pyi_rthook(): - import pkgutil - - import pyimod02_importers # PyInstaller's bootstrap module - - # This could, in fact, be implemented as `iter_modules()` method of the `PyiFrozenFinder`. However, we want to - # avoid importing `pkgutil` in that bootstrap module (i.e., for the `pkgutil.iter_importer_modules()` call on the - # fallback finder). - def _iter_pyi_frozen_finder_modules(finder, prefix=''): - # Fetch PYZ TOC tree from pyimod02_importers - pyz_toc_tree = pyimod02_importers.get_pyz_toc_tree() - - # Finder has already pre-computed the package prefix implied by the search path. Use it to find the starting - # node in the prefix tree. - if finder._pyz_entry_prefix: - pkg_name_parts = finder._pyz_entry_prefix.split('.') - else: - pkg_name_parts = [] - - tree_node = pyz_toc_tree - for pkg_name_part in pkg_name_parts: - tree_node = tree_node.get(pkg_name_part) - if not isinstance(tree_node, dict): - # This check handles two cases: - # a) path does not exist (`tree_node` is `None`) - # b) path corresponds to a module instead of a package (`tree_node` is a leaf node (`str`)). - tree_node = {} - break - - # Dump the contents of the tree node. - for entry_name, entry_data in tree_node.items(): - is_pkg = isinstance(entry_data, dict) - yield prefix + entry_name, is_pkg - - # If our finder has a fall-back finder available, iterate its modules as well. By using the public - # `fallback_finder` attribute, we force creation of the fallback finder as necessary. - # NOTE: we do not care about potential duplicates here, because `pkgutil.iter_modules()` itself - # keeps track of yielded names for purposes of de-duplication. - if finder.fallback_finder is not None: - yield from pkgutil.iter_importer_modules(finder.fallback_finder, prefix) - - pkgutil.iter_importer_modules.register( - pyimod02_importers.PyiFrozenFinder, - _iter_pyi_frozen_finder_modules, - ) - - -_pyi_rthook() -del _pyi_rthook diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyqt5.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyqt5.py deleted file mode 100755 index fa388e8..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyqt5.py +++ /dev/null @@ -1,68 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2014-2023, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - -# The path to Qt's components may not default to the wheel layout for self-compiled PyQt5 installations. Mandate the -# wheel layout. See ``utils/hooks/qt.py`` for more details. - - -def _pyi_rthook(): - import os - import sys - - from _pyi_rth_utils import is_macos_app_bundle, prepend_path_to_environment_variable - from _pyi_rth_utils import qt as qt_rth_utils - - # Ensure this is the only Qt bindings package in the application. - qt_rth_utils.ensure_single_qt_bindings_package("PyQt5") - - # Try PyQt5 5.15.4-style path first... - pyqt_path = os.path.join(sys._MEIPASS, 'PyQt5', 'Qt5') - if not os.path.isdir(pyqt_path): - # ... and fall back to the older version - pyqt_path = os.path.join(sys._MEIPASS, 'PyQt5', 'Qt') - - os.environ['QT_PLUGIN_PATH'] = os.path.join(pyqt_path, 'plugins') - - if is_macos_app_bundle: - # Special handling for macOS .app bundles. To satisfy codesign requirements, we are forced to split `qml` - # directory into two parts; one that keeps only binaries (rooted in `Contents/Frameworks`) and one that keeps - # only data files (rooted in `Contents/Resources), with files from one directory tree being symlinked to the - # other to maintain illusion of a single mixed-content directory. As Qt seems to compute the identifier of its - # QML components based on location of the `qmldir` file w.r.t. the registered QML import paths, we need to - # register both paths, because the `qmldir` file for a component could be reached via either directory tree. - pyqt_path_res = os.path.normpath( - os.path.join(sys._MEIPASS, '..', 'Resources', os.path.relpath(pyqt_path, sys._MEIPASS)) - ) - os.environ['QML2_IMPORT_PATH'] = os.pathsep.join([ - os.path.join(pyqt_path_res, 'qml'), - os.path.join(pyqt_path, 'qml'), - ]) - else: - os.environ['QML2_IMPORT_PATH'] = os.path.join(pyqt_path, 'qml') - - # Back in the day, this was required because PyQt5 5.12.3 explicitly checked that `Qt5Core.dll` was in `PATH` - # (see #4293), and contemporary PyInstaller versions collected that DLL to `sys._MEIPASS`. - # - # Nowadays, we add `sys._MEIPASS` to `PATH` in order to ensure that `QtNetwork` can discover OpenSSL DLLs that might - # have been collected there (i.e., when they were not shipped with the package, and were collected from an external - # location). - if sys.platform.startswith('win'): - prepend_path_to_environment_variable(sys._MEIPASS, 'PATH') - - # Qt bindings package installed via PyPI wheels typically ensures that its bundled Qt is relocatable, by creating - # embedded `qt.conf` file during its initialization. This run-time generated qt.conf dynamically sets the Qt prefix - # path to the package's Qt directory. For bindings packages that do not create embedded `qt.conf` during their - # initialization (for example, conda-installed packages), try to perform this step ourselves. - qt_rth_utils.create_embedded_qt_conf("PyQt5", pyqt_path) - - -_pyi_rthook() -del _pyi_rthook diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyqt6.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyqt6.py deleted file mode 100755 index d3ed0cd..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyqt6.py +++ /dev/null @@ -1,70 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - -# The path to Qt's components may not default to the wheel layout for self-compiled PyQt6 installations. Mandate the -# wheel layout. See ``utils/hooks/qt.py`` for more details. - - -def _pyi_rthook(): - import os - import sys - - from _pyi_rth_utils import is_macos_app_bundle, prepend_path_to_environment_variable - from _pyi_rth_utils import qt as qt_rth_utils - - # Ensure this is the only Qt bindings package in the application. - qt_rth_utils.ensure_single_qt_bindings_package("PyQt6") - - # Try PyQt6 6.0.3-style path first... - pyqt_path = os.path.join(sys._MEIPASS, 'PyQt6', 'Qt6') - if not os.path.isdir(pyqt_path): - # ... and fall back to the older version. - pyqt_path = os.path.join(sys._MEIPASS, 'PyQt6', 'Qt') - - os.environ['QT_PLUGIN_PATH'] = os.path.join(pyqt_path, 'plugins') - - if is_macos_app_bundle: - # Special handling for macOS .app bundles. To satisfy codesign requirements, we are forced to split `qml` - # directory into two parts; one that keeps only binaries (rooted in `Contents/Frameworks`) and one that keeps - # only data files (rooted in `Contents/Resources), with files from one directory tree being symlinked to the - # other to maintain illusion of a single mixed-content directory. As Qt seems to compute the identifier of its - # QML components based on location of the `qmldir` file w.r.t. the registered QML import paths, we need to - # register both paths, because the `qmldir` file for a component could be reached via either directory tree. - pyqt_path_res = os.path.normpath( - os.path.join(sys._MEIPASS, '..', 'Resources', os.path.relpath(pyqt_path, sys._MEIPASS)) - ) - os.environ['QML2_IMPORT_PATH'] = os.pathsep.join([ - os.path.join(pyqt_path_res, 'qml'), - os.path.join(pyqt_path, 'qml'), - ]) - else: - os.environ['QML2_IMPORT_PATH'] = os.path.join(pyqt_path, 'qml') - - # Add `sys._MEIPASS` to `PATH` in order to ensure that `QtNetwork` can discover OpenSSL DLLs that might have been - # collected there (i.e., when they were not shipped with the package, and were collected from an external location). - if sys.platform.startswith('win'): - prepend_path_to_environment_variable(sys._MEIPASS, 'PATH') - - # For macOS POSIX builds, we need to add `sys._MEIPASS` to `DYLD_LIBRARY_PATH` so that QtNetwork can discover - # OpenSSL dynamic libraries for its `openssl` TLS backend. This also prevents fallback to external locations, such - # as Homebrew. For .app bundles, this is unnecessary because `QtNetwork` explicitly searches `Contents/Frameworks`. - if sys.platform == 'darwin' and not is_macos_app_bundle: - prepend_path_to_environment_variable(sys._MEIPASS, 'DYLD_LIBRARY_PATH') - - # Qt bindings package installed via PyPI wheels typically ensures that its bundled Qt is relocatable, by creating - # embedded `qt.conf` file during its initialization. This run-time generated qt.conf dynamically sets the Qt prefix - # path to the package's Qt directory. For bindings packages that do not create embedded `qt.conf` during their - # initialization (for example, conda-installed packages), try to perform this step ourselves. - qt_rth_utils.create_embedded_qt_conf("PyQt6", pyqt_path) - - -_pyi_rthook() -del _pyi_rthook diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyside2.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyside2.py deleted file mode 100755 index 3aca93b..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyside2.py +++ /dev/null @@ -1,63 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - -# The path to Qt's components may not default to the wheel layout for self-compiled PySide2 installations. Mandate the -# wheel layout. See ``utils/hooks/qt.py`` for more details. - - -def _pyi_rthook(): - import os - import sys - - from _pyi_rth_utils import is_macos_app_bundle, prepend_path_to_environment_variable - from _pyi_rth_utils import qt as qt_rth_utils - - # Ensure this is the only Qt bindings package in the application. - qt_rth_utils.ensure_single_qt_bindings_package("PySide2") - - if sys.platform.startswith('win'): - pyqt_path = os.path.join(sys._MEIPASS, 'PySide2') - else: - pyqt_path = os.path.join(sys._MEIPASS, 'PySide2', 'Qt') - - os.environ['QT_PLUGIN_PATH'] = os.path.join(pyqt_path, 'plugins') - - if is_macos_app_bundle: - # Special handling for macOS .app bundles. To satisfy codesign requirements, we are forced to split `qml` - # directory into two parts; one that keeps only binaries (rooted in `Contents/Frameworks`) and one that keeps - # only data files (rooted in `Contents/Resources), with files from one directory tree being symlinked to the - # other to maintain illusion of a single mixed-content directory. As Qt seems to compute the identifier of its - # QML components based on location of the `qmldir` file w.r.t. the registered QML import paths, we need to - # register both paths, because the `qmldir` file for a component could be reached via either directory tree. - pyqt_path_res = os.path.normpath( - os.path.join(sys._MEIPASS, '..', 'Resources', os.path.relpath(pyqt_path, sys._MEIPASS)) - ) - os.environ['QML2_IMPORT_PATH'] = os.pathsep.join([ - os.path.join(pyqt_path_res, 'qml'), - os.path.join(pyqt_path, 'qml'), - ]) - else: - os.environ['QML2_IMPORT_PATH'] = os.path.join(pyqt_path, 'qml') - - # Add `sys._MEIPASS` to `PATH` in order to ensure that `QtNetwork` can discover OpenSSL DLLs that might have been - # collected there (i.e., when they were not shipped with the package, and were collected from an external location). - if sys.platform.startswith('win'): - prepend_path_to_environment_variable(sys._MEIPASS, 'PATH') - - # Qt bindings package installed via PyPI wheels typically ensures that its bundled Qt is relocatable, by creating - # embedded `qt.conf` file during its initialization. This run-time generated qt.conf dynamically sets the Qt prefix - # path to the package's Qt directory. For bindings packages that do not create embedded `qt.conf` during their - # initialization (for example, conda-installed packages), try to perform this step ourselves. - qt_rth_utils.create_embedded_qt_conf("PySide2", pyqt_path) - - -_pyi_rthook() -del _pyi_rthook diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyside6.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyside6.py deleted file mode 100755 index 73db137..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyside6.py +++ /dev/null @@ -1,69 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - -# The path to Qt's components may not default to the wheel layout for self-compiled PySide6 installations. Mandate the -# wheel layout. See ``utils/hooks/qt.py`` for more details. - - -def _pyi_rthook(): - import os - import sys - - from _pyi_rth_utils import is_macos_app_bundle, prepend_path_to_environment_variable - from _pyi_rth_utils import qt as qt_rth_utils - - # Ensure this is the only Qt bindings package in the application. - qt_rth_utils.ensure_single_qt_bindings_package("PySide6") - - if sys.platform.startswith('win'): - pyqt_path = os.path.join(sys._MEIPASS, 'PySide6') - else: - pyqt_path = os.path.join(sys._MEIPASS, 'PySide6', 'Qt') - - os.environ['QT_PLUGIN_PATH'] = os.path.join(pyqt_path, 'plugins') - - if is_macos_app_bundle: - # Special handling for macOS .app bundles. To satisfy codesign requirements, we are forced to split `qml` - # directory into two parts; one that keeps only binaries (rooted in `Contents/Frameworks`) and one that keeps - # only data files (rooted in `Contents/Resources), with files from one directory tree being symlinked to the - # other to maintain illusion of a single mixed-content directory. As Qt seems to compute the identifier of its - # QML components based on location of the `qmldir` file w.r.t. the registered QML import paths, we need to - # register both paths, because the `qmldir` file for a component could be reached via either directory tree. - pyqt_path_res = os.path.normpath( - os.path.join(sys._MEIPASS, '..', 'Resources', os.path.relpath(pyqt_path, sys._MEIPASS)) - ) - os.environ['QML2_IMPORT_PATH'] = os.pathsep.join([ - os.path.join(pyqt_path_res, 'qml'), - os.path.join(pyqt_path, 'qml'), - ]) - else: - os.environ['QML2_IMPORT_PATH'] = os.path.join(pyqt_path, 'qml') - - # Add `sys._MEIPASS` to `PATH` in order to ensure that `QtNetwork` can discover OpenSSL DLLs that might have been - # collected there (i.e., when they were not shipped with the package, and were collected from an external location). - if sys.platform.startswith('win'): - prepend_path_to_environment_variable(sys._MEIPASS, 'PATH') - - # For macOS POSIX builds, we need to add `sys._MEIPASS` to `DYLD_LIBRARY_PATH` so that QtNetwork can discover - # OpenSSL dynamic libraries for its `openssl` TLS backend. This also prevents fallback to external locations, such - # as Homebrew. For .app bundles, this is unnecessary because `QtNetwork` explicitly searches `Contents/Frameworks`. - if sys.platform == 'darwin' and not is_macos_app_bundle: - prepend_path_to_environment_variable(sys._MEIPASS, 'DYLD_LIBRARY_PATH') - - # Qt bindings package installed via PyPI wheels typically ensures that its bundled Qt is relocatable, by creating - # embedded `qt.conf` file during its initialization. This run-time generated qt.conf dynamically sets the Qt prefix - # path to the package's Qt directory. For bindings packages that do not create embedded `qt.conf` during their - # initialization (for example, conda-installed packages), try to perform this step ourselves. - qt_rth_utils.create_embedded_qt_conf("PySide6", pyqt_path) - - -_pyi_rthook() -del _pyi_rthook diff --git a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_setuptools.py b/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_setuptools.py deleted file mode 100755 index 0a3ffb8..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/hooks/rthooks/pyi_rth_setuptools.py +++ /dev/null @@ -1,37 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2022-2023, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - -# This runtime hook performs the equivalent of the distutils-precedence.pth from the setuptools package; -# it registers a special meta finder that diverts import of distutils to setuptools._distutils, if available. - - -def _pyi_rthook(): - def _install_setuptools_distutils_hack(): - import os - import setuptools - - # We need to query setuptools version at runtime, because the default value for SETUPTOOLS_USE_DISTUTILS - # has changed at version 60.0 from "stdlib" to "local", and we want to mimic that behavior. - setuptools_major = int(setuptools.__version__.split('.')[0]) - default_value = "stdlib" if setuptools_major < 60 else "local" - - if os.environ.get("SETUPTOOLS_USE_DISTUTILS", default_value) == "local": - import _distutils_hack - _distutils_hack.add_shim() - - try: - _install_setuptools_distutils_hack() - except Exception: - pass - - -_pyi_rthook() -del _pyi_rthook diff --git a/venv/lib/python3.12/site-packages/PyInstaller/isolated/__init__.py b/venv/lib/python3.12/site-packages/PyInstaller/isolated/__init__.py deleted file mode 100755 index 3016e7d..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/isolated/__init__.py +++ /dev/null @@ -1,31 +0,0 @@ -# ----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) or, at the user's discretion, the MIT License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception OR MIT) -# ----------------------------------------------------------------------------- -""" -PyInstaller hooks typically will need to import the package which they are written for but doing so may manipulate -globals such as :data:`sys.path` or :data:`os.environ` in ways that affect the build. For example, on Windows, -Qt's binaries are added to then loaded via ``PATH`` in such a way that if you import multiple Qt variants in one -session then there is no guarantee which variant's binaries each variant will get! - -To get around this, PyInstaller does any such tasks in an isolated Python subprocess and ships a -:mod:`PyInstaller.isolated` submodule to do so in hooks. :: - - from PyInstaller import isolated - -This submodule provides: - -* :func:`isolated.call() ` to evaluate functions in isolation. -* :func:`@isolated.decorate ` to mark a function as always called in isolation. -* :class:`isolated.Python() ` to efficiently call many functions in a single child instance of Python. - -""" - -# flake8: noqa -from ._parent import Python, call, decorate, SubprocessDiedError diff --git a/venv/lib/python3.12/site-packages/PyInstaller/isolated/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/isolated/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 5dfc2de..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/isolated/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/isolated/__pycache__/_child.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/isolated/__pycache__/_child.cpython-312.pyc deleted file mode 100644 index f62fe68..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/isolated/__pycache__/_child.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/isolated/__pycache__/_parent.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/isolated/__pycache__/_parent.cpython-312.pyc deleted file mode 100644 index f1ef11c..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/isolated/__pycache__/_parent.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/isolated/_child.py b/venv/lib/python3.12/site-packages/PyInstaller/isolated/_child.py deleted file mode 100755 index 0709b68..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/isolated/_child.py +++ /dev/null @@ -1,101 +0,0 @@ -# ----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) or, at the user's discretion, the MIT License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception OR MIT) -# ----------------------------------------------------------------------------- -""" -The child process to be invoked by IsolatedPython(). - -This file is to be run directly with pipe handles for reading from and writing to the parent process as command line -arguments. - -""" - -import sys -import os -import types -from marshal import loads, dumps -from base64 import b64encode, b64decode -from traceback import format_exception - -if os.name == "nt": - from msvcrt import open_osfhandle - - def _open(osf_handle, mode): - # Convert system file handles to file descriptors before opening them. - return open(open_osfhandle(osf_handle, 0), mode) -else: - _open = open - - -def run_next_command(read_fh, write_fh): - """ - Listen to **read_fh** for the next function to run. Write the result to **write_fh**. - """ - - # Check the first line of input. Receiving an empty line is the signal that there are no more tasks to be ran. - first_line = read_fh.readline() - if first_line == b"\n": - # It's time to end this child process - return False - - # There are 5 lines to read: The function's code, its default args, its default kwargs, its args, and its kwargs. - code = loads(b64decode(first_line.strip())) - _defaults = loads(b64decode(read_fh.readline().strip())) - _kwdefaults = loads(b64decode(read_fh.readline().strip())) - args = loads(b64decode(read_fh.readline().strip())) - kwargs = loads(b64decode(read_fh.readline().strip())) - - try: - # Define the global namespace available to the function. - GLOBALS = {"__builtins__": __builtins__, "__isolated__": True} - # Reconstruct the function. - function = types.FunctionType(code, GLOBALS) - function.__defaults__ = _defaults - function.__kwdefaults__ = _kwdefaults - - # Run it. - output = function(*args, **kwargs) - - # Verify that the output is serialise-able (i.e. no custom types or module or function references) here so that - # it's caught if it fails. - marshalled = dumps((True, output)) - - except BaseException as ex: - # An exception happened whilst either running the function or serialising its output. Send back a string - # version of the traceback (unfortunately raw traceback objects are not marshal-able) and a boolean to say - # that it failed. - tb_lines = format_exception(type(ex), ex, ex.__traceback__) - if tb_lines[0] == "Traceback (most recent call last):\n": - # This particular line is distracting. Get rid of it. - tb_lines = tb_lines[1:] - marshalled = dumps((False, "".join(tb_lines).rstrip())) - - # Send the output (return value or traceback) back to the parent. - write_fh.write(b64encode(marshalled)) - write_fh.write(b"\n") - write_fh.flush() - - # Signal that an instruction was ran (successfully or otherwise). - return True - - -if __name__ == '__main__': - # Mark this process as PyInstaller's isolated subprocess; this makes attempts at spawning further isolated - # subprocesses via `PyInstaller.isolated` from this process no-op. - sys._pyi_isolated_subprocess = True - - read_from_parent, write_to_parent = map(int, sys.argv[1:]) - - with _open(read_from_parent, "rb") as read_fh: - with _open(write_to_parent, "wb") as write_fh: - sys.path = loads(b64decode(read_fh.readline())) - - # Keep receiving and running instructions until the parent sends the signal to stop. - while run_next_command(read_fh, write_fh): - pass diff --git a/venv/lib/python3.12/site-packages/PyInstaller/isolated/_parent.py b/venv/lib/python3.12/site-packages/PyInstaller/isolated/_parent.py deleted file mode 100755 index 0998e93..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/isolated/_parent.py +++ /dev/null @@ -1,437 +0,0 @@ -# ----------------------------------------------------------------------------- -# Copyright (c) 2021-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) or, at the user's discretion, the MIT License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception OR MIT) -# ----------------------------------------------------------------------------- - -import os -from pathlib import Path -from marshal import loads, dumps -from base64 import b64encode, b64decode -import functools -import subprocess -import sys - -from PyInstaller import compat -from PyInstaller import log as logging - -logger = logging.getLogger(__name__) - -# WinAPI bindings for Windows-specific codepath -if os.name == "nt": - import msvcrt - import ctypes - import ctypes.wintypes - - # CreatePipe - class SECURITY_ATTRIBUTES(ctypes.Structure): - _fields_ = [ - ("nLength", ctypes.wintypes.DWORD), - ("lpSecurityDescriptor", ctypes.wintypes.LPVOID), - ("bInheritHandle", ctypes.wintypes.BOOL), - ] - - HANDLE_FLAG_INHERIT = 0x0001 - - LPSECURITY_ATTRIBUTES = ctypes.POINTER(SECURITY_ATTRIBUTES) - - CreatePipe = ctypes.windll.kernel32.CreatePipe - CreatePipe.argtypes = [ - ctypes.POINTER(ctypes.wintypes.HANDLE), - ctypes.POINTER(ctypes.wintypes.HANDLE), - LPSECURITY_ATTRIBUTES, - ctypes.wintypes.DWORD, - ] - CreatePipe.restype = ctypes.wintypes.BOOL - - # CloseHandle - CloseHandle = ctypes.windll.kernel32.CloseHandle - CloseHandle.argtypes = [ctypes.wintypes.HANDLE] - CloseHandle.restype = ctypes.wintypes.BOOL - -CHILD_PY = Path(__file__).with_name("_child.py") - - -def create_pipe(read_handle_inheritable, write_handle_inheritable): - """ - Create a one-way pipe for sending data to child processes. - - Args: - read_handle_inheritable: - A boolean flag indicating whether the handle corresponding to the read end-point of the pipe should be - marked as inheritable by subprocesses. - write_handle_inheritable: - A boolean flag indicating whether the handle corresponding to the write end-point of the pipe should be - marked as inheritable by subprocesses. - - Returns: - A read/write pair of file descriptors (which are just integers) on posix or system file handles on Windows. - - The pipe may be used either by this process or subprocesses of this process but not globally. - """ - return _create_pipe_impl(read_handle_inheritable, write_handle_inheritable) - - -def close_pipe_endpoint(pipe_handle): - """ - Close the file descriptor (posix) or handle (Windows) belonging to a pipe. - """ - return _close_pipe_endpoint_impl(pipe_handle) - - -if os.name == "nt": - - def _create_pipe_impl(read_handle_inheritable, write_handle_inheritable): - # Use WinAPI CreatePipe function to create the pipe. Python's os.pipe() does the same, but wraps the resulting - # handles into inheritable file descriptors (https://github.com/python/cpython/issues/77046). Instead, we want - # just handles, and will set the inheritable flag on corresponding handle ourselves. - read_handle = ctypes.wintypes.HANDLE() - write_handle = ctypes.wintypes.HANDLE() - - # SECURITY_ATTRIBUTES with inherit handle set to True - security_attributes = SECURITY_ATTRIBUTES() - security_attributes.nLength = ctypes.sizeof(security_attributes) - security_attributes.bInheritHandle = True - security_attributes.lpSecurityDescriptor = None - - # CreatePipe() - succeeded = CreatePipe( - ctypes.byref(read_handle), # hReadPipe - ctypes.byref(write_handle), # hWritePipe - ctypes.byref(security_attributes), # lpPipeAttributes - 0, # nSize - ) - if not succeeded: - raise ctypes.WinError() - - # Set inheritable flags. Instead of binding and using SetHandleInformation WinAPI function, we can use - # os.set_handle_inheritable(). - os.set_handle_inheritable(read_handle.value, read_handle_inheritable) - os.set_handle_inheritable(write_handle.value, write_handle_inheritable) - - return read_handle.value, write_handle.value - - def _close_pipe_endpoint_impl(pipe_handle): - succeeded = CloseHandle(pipe_handle) - if not succeeded: - raise ctypes.WinError() -else: - - def _create_pipe_impl(read_fd_inheritable, write_fd_inheritable): - # Create pipe, using os.pipe() - read_fd, write_fd = os.pipe() - - # The default behaviour of pipes is that they are process specific. I.e., they can only be used by this - # process to talk to itself. Setting inheritable flags means that child processes may also use these pipes. - os.set_inheritable(read_fd, read_fd_inheritable) - os.set_inheritable(write_fd, write_fd_inheritable) - - return read_fd, write_fd - - def _close_pipe_endpoint_impl(pipe_fd): - os.close(pipe_fd) - - -def child(read_from_parent: int, write_to_parent: int): - """ - Spawn a Python subprocess sending it the two file descriptors it needs to talk back to this parent process. - """ - if os.name != 'nt': - # Explicitly disabling close_fds is a requirement for making file descriptors inheritable by child processes. - extra_kwargs = { - "env": _subprocess_env(), - "close_fds": False, - } - else: - # On Windows, we can use subprocess.STARTUPINFO to explicitly pass the list of file handles to be inherited, - # so we can avoid disabling close_fds - extra_kwargs = { - "env": _subprocess_env(), - "close_fds": True, - "startupinfo": subprocess.STARTUPINFO(lpAttributeList={"handle_list": [read_from_parent, write_to_parent]}) - } - - # Run the _child.py script directly passing it the two file descriptors it needs to talk back to the parent. - cmd, options = compat.__wrap_python([str(CHILD_PY), str(read_from_parent), str(write_to_parent)], extra_kwargs) - - # I'm intentionally leaving stdout and stderr alone so that print() can still be used for emergency debugging and - # unhandled errors in the child are still visible. - return subprocess.Popen(cmd, **options) - - -def _subprocess_env(): - """ - Define the environment variables to be readable in a child process. - """ - from PyInstaller.config import CONF - python_path = CONF["pathex"] - if "PYTHONPATH" in os.environ: - python_path = python_path + [os.environ["PYTHONPATH"]] - env = os.environ.copy() - env["PYTHONPATH"] = os.pathsep.join(python_path) - return env - - -class SubprocessDiedError(RuntimeError): - pass - - -class Python: - """ - Start and connect to a separate Python subprocess. - - This is the lowest level of public API provided by this module. The advantage of using this class directly is - that it allows multiple functions to be evaluated in a single subprocess, making it faster than multiple calls to - :func:`call`. - - The ``strict_mode`` argument controls behavior when the child process fails to shut down; if strict mode is enabled, - an error is raised, otherwise only warning is logged. If the value of ``strict_mode`` is ``None``, the value of - ``PyInstaller.compat.strict_collect_mode`` is used (which in turn is controlled by the - ``PYINSTALLER_STRICT_COLLECT_MODE`` environment variable. - - Examples: - To call some predefined functions ``x = foo()``, ``y = bar("numpy")`` and ``z = bazz(some_flag=True)`` all using - the same isolated subprocess use:: - - with isolated.Python() as child: - x = child.call(foo) - y = child.call(bar, "numpy") - z = child.call(bazz, some_flag=True) - - """ - def __init__(self, strict_mode=None): - self._child = None - - # Re-use the compat.strict_collect_mode and its PYINSTALLER_STRICT_COLLECT_MODE environment variable for - # default strict-mode setting. - self._strict_mode = strict_mode if strict_mode is not None else compat.strict_collect_mode - - # Check if we are already running in PyInstaller's isolated subprocess, to prevent further nesting. - self._already_isolated = getattr(sys, '_pyi_isolated_subprocess', False) - - def __enter__(self): - # No-op if already running in an isolated subprocess. - if self._already_isolated: - return self - - # We need two pipes. One for the child to send data to the parent. The (write) end-point passed to the - # child needs to be marked as inheritable. - read_from_child, write_to_parent = create_pipe(False, True) - # And one for the parent to send data to the child. The (read) end-point passed to the child needs to be - # marked as inheritable. - read_from_parent, write_to_child = create_pipe(True, False) - - # Spawn a Python subprocess sending it the two file descriptors it needs to talk back to this parent process. - self._child = child(read_from_parent, write_to_parent) - - # Close the end-points that were inherited by the child. - close_pipe_endpoint(read_from_parent) - close_pipe_endpoint(write_to_parent) - del read_from_parent - del write_to_parent - - # Open file handles to talk to the child. This should fully transfer ownership of the underlying file - # descriptor to the opened handle; so when we close the latter, the former should be closed as well. - if os.name == 'nt': - # On Windows, we must first open file descriptor on top of the handle using _open_osfhandle (which - # python wraps in msvcrt.open_osfhandle). According to MSDN, this transfers the ownership of the - # underlying file handle to the file descriptors; i.e., they are both closed when the file descriptor - # is closed). - self._write_handle = os.fdopen(msvcrt.open_osfhandle(write_to_child, 0), "wb") - self._read_handle = os.fdopen(msvcrt.open_osfhandle(read_from_child, 0), "rb") - else: - self._write_handle = os.fdopen(write_to_child, "wb") - self._read_handle = os.fdopen(read_from_child, "rb") - - self._send(sys.path) - - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - # No-op if already running in an isolated subprocess. - if self._already_isolated: - return - - if exc_type and issubclass(exc_type, SubprocessDiedError): - self._write_handle.close() - self._read_handle.close() - del self._read_handle, self._write_handle - self._child = None - return - # Send the signal (a blank line) to the child to tell it that it's time to stop. - self._write_handle.write(b"\n") - self._write_handle.flush() - - # Wait for the child process to exit. The timeout is necessary for corner cases when the sub-process fails to - # exit (such as due to dangling non-daemon threads; see #7290). At this point, the subprocess already did all - # its work, so it should be safe to terminate. And as we expect it to shut down quickly (or not at all), the - # timeout is relatively short. - # - # In strict build mode, we raise an error when the subprocess fails to exit on its own, but do so only after - # we attempt to kill the subprocess, to avoid leaving zombie processes. - shutdown_error = False - - try: - self._child.wait(timeout=5) - except subprocess.TimeoutExpired: - logger.warning("Timed out while waiting for the child process to exit!") - shutdown_error = True - self._child.kill() - try: - self._child.wait(timeout=15) - except subprocess.TimeoutExpired: - logger.warning("Timed out while waiting for the child process to be killed!") - # Give up and fall through - - # Close the handles. This should also close the underlying file descriptors. - self._write_handle.close() - self._read_handle.close() - del self._read_handle, self._write_handle - - self._child = None - - # Raise an error in strict mode, after all clean-up has been performed. - if shutdown_error and self._strict_mode: - raise RuntimeError("Timed out while waiting for the child process to exit!") - - def call(self, function, *args, **kwargs): - """ - Call a function in the child Python. Retrieve its return value. Usage of this method is identical to that - of the :func:`call` function. - """ - # If already running in an isolated subprocess, directly execute the function. - if self._already_isolated: - return function(*args, **kwargs) - - if self._child is None: - raise RuntimeError("An isolated.Python object must be used in a 'with' clause.") - - self._send(function.__code__, function.__defaults__, function.__kwdefaults__, args, kwargs) - - # Read a single line of output back from the child. This contains if the function worked and either its return - # value or a traceback. This will block indefinitely until it receives a '\n' byte. - try: - ok, output = loads(b64decode(self._read_handle.readline())) - except (EOFError, BrokenPipeError): - # Subprocess appears to have died in an unhandleable way (e.g. SIGSEV). Raise an error. - raise SubprocessDiedError( - f"Child process died calling {function.__name__}() with args={args} and " - f"kwargs={kwargs}. Its exit code was {self._child.wait()}." - ) from None - - # If all went well, then ``output`` is the return value. - if ok: - return output - - # Otherwise an error happened and ``output`` is a string-ified stacktrace. Raise an error appending the - # stacktrace. Having the output in this order gives a nice fluent transition from parent to child in the stack - # trace. - raise RuntimeError(f"Child process call to {function.__name__}() failed with:\n" + output) - - def _send(self, *objects): - for object in objects: - self._write_handle.write(b64encode(dumps(object))) - self._write_handle.write(b"\n") - # Flushing is very important. Without it, the data is not sent but forever sits in a buffer so that the child is - # forever waiting for its data and the parent in turn is forever waiting for the child's response. - self._write_handle.flush() - - -def call(function, *args, **kwargs): - r""" - Call a function with arguments in a separate child Python. Retrieve its return value. - - Args: - function: - The function to send and invoke. - *args: - **kwargs: - Positional and keyword arguments to send to the function. These must be simple builtin types - not custom - classes. - Returns: - The return value of the function. Again, these must be basic types serialisable by :func:`marshal.dumps`. - Raises: - RuntimeError: - Any exception which happens inside an isolated process is caught and reraised in the parent process. - - To use, define a function which returns the information you're looking for. Any imports it requires must happen in - the body of the function. For example, to safely check the output of ``matplotlib.get_data_path()`` use:: - - # Define a function to be ran in isolation. - def get_matplotlib_data_path(): - import matplotlib - return matplotlib.get_data_path() - - # Call it with isolated.call(). - get_matplotlib_data_path = isolated.call(matplotlib_data_path) - - For single use functions taking no arguments like the above you can abuse the decorator syntax slightly to define - and execute a function in one go. :: - - >>> @isolated.call - ... def matplotlib_data_dir(): - ... import matplotlib - ... return matplotlib.get_data_path() - >>> matplotlib_data_dir - '/home/brenainn/.pyenv/versions/3.9.6/lib/python3.9/site-packages/matplotlib/mpl-data' - - Functions may take positional and keyword arguments and return most generic Python data types. :: - - >>> def echo_parameters(*args, **kwargs): - ... return args, kwargs - >>> isolated.call(echo_parameters, 1, 2, 3) - (1, 2, 3), {} - >>> isolated.call(echo_parameters, foo=["bar"]) - (), {'foo': ['bar']} - - Notes: - To make a function behave differently if it's isolated, check for the ``__isolated__`` global. :: - - if globals().get("__isolated__", False): - # We're inside a child process. - ... - else: - # This is the master process. - ... - - """ - with Python() as isolated: - return isolated.call(function, *args, **kwargs) - - -def decorate(function): - """ - Decorate a function so that it is always called in an isolated subprocess. - - Examples: - - To use, write a function then prepend ``@isolated.decorate``. :: - - @isolated.decorate - def add_1(x): - '''Add 1 to ``x``, displaying the current process ID.''' - import os - print(f"Process {os.getpid()}: Adding 1 to {x}.") - return x + 1 - - The resultant ``add_1()`` function can now be called as you would a - normal function and it'll automatically use a subprocess. - - >>> add_1(4) - Process 4920: Adding 1 to 4. - 5 - >>> add_1(13.2) - Process 4928: Adding 1 to 13.2. - 14.2 - - """ - @functools.wraps(function) - def wrapped(*args, **kwargs): - return call(function, *args, **kwargs) - - return wrapped diff --git a/venv/lib/python3.12/site-packages/PyInstaller/lib/README.rst b/venv/lib/python3.12/site-packages/PyInstaller/lib/README.rst deleted file mode 100755 index a09f6d5..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/lib/README.rst +++ /dev/null @@ -1,49 +0,0 @@ -Custom modifications of 3rd party libraries -=========================================== - -NOTE: PyInstaller does not extend PYTHONPATH (sys.path) with this directory -that contains bundled 3rd party libraries. - -Some users complained that PyInstaller failed because their apps were using -too old versions of some libraries that PyInstaller uses too and that's why -extending sys.path was dropped. - -All libraries are tweaked to be importable as:: - - from PyInstaller.lib.LIB_NAME import xyz - -In libraries replace imports like:: - - from altgraph import y - from modulegraph import z - -with relative prefix:: - - from ..altgraph import y - from ..modulegraph import z - - -altgraph ----------- - -- add fixed version string to ./altgraph/__init__.py:: - - # For PyInstaller/lib/ define the version here, since there is no - # package-resource. - __version__ = '0.13' - - -modulegraph ------------ - -https://bitbucket.org/ronaldoussoren/modulegraph/downloads - -- TODO Use official modulegraph version when following issue is resolved and pull request merged - https://bitbucket.org/ronaldoussoren/modulegraph/issues/28/__main__-module-being-analyzed-for-wheel - -- add fixed version string to ./modulegraph/__init__.py:: - - # For PyInstaller/lib/ define the version here, since there is no - # package-resource. - __version__ = '0.13' - diff --git a/venv/lib/python3.12/site-packages/PyInstaller/lib/__init__.py b/venv/lib/python3.12/site-packages/PyInstaller/lib/__init__.py deleted file mode 100755 index 792d600..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/lib/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# diff --git a/venv/lib/python3.12/site-packages/PyInstaller/lib/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/lib/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 8c57db1..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/lib/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/__init__.py b/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/__init__.py deleted file mode 100755 index 9446169..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = '0.17' diff --git a/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/__main__.py b/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/__main__.py deleted file mode 100755 index ea4670b..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/__main__.py +++ /dev/null @@ -1,89 +0,0 @@ -import sys -import os -import argparse -from .modulegraph import ModuleGraph - - -def parse_arguments(): - parser = argparse.ArgumentParser( - conflict_handler='resolve', prog='%s -mmodulegraph' % ( - os.path.basename(sys.executable))) - parser.add_argument( - '-d', action='count', dest='debug', default=1, - help='Increase debug level') - parser.add_argument( - '-q', action='store_const', dest='debug', const=0, - help='Clear debug level') - parser.add_argument( - '-m', '--modules', action='store_true', - dest='domods', default=False, - help='arguments are module names, not script files') - parser.add_argument( - '-x', metavar='NAME', action='append', dest='excludes', - default=[], help='Add NAME to the excludes list') - parser.add_argument( - '-p', action='append', metavar='PATH', dest='addpath', default=[], - help='Add PATH to the module search path') - parser.add_argument( - '-g', '--dot', action='store_const', dest='output', const='dot', - help='Output a .dot graph') - parser.add_argument( - '-h', '--html', action='store_const', - dest='output', const='html', help='Output a HTML file') - parser.add_argument( - 'scripts', metavar='SCRIPT', nargs='+', help='scripts to analyse') - - opts = parser.parse_args() - return opts - - -def create_graph(scripts, domods, debuglevel, excludes, path_extras): - # Set the path based on sys.path and the script directory - path = sys.path[:] - - if domods: - del path[0] - else: - path[0] = os.path.dirname(scripts[0]) - - path = path_extras + path - if debuglevel > 1: - print("path:", file=sys.stderr) - for item in path: - print(" ", repr(item), file=sys.stderr) - - # Create the module finder and turn its crank - mf = ModuleGraph(path, excludes=excludes, debug=debuglevel) - for arg in scripts: - if domods: - if arg[-2:] == '.*': - mf.import_hook(arg[:-2], None, ["*"]) - else: - mf.import_hook(arg) - else: - mf.add_script(arg) - return mf - - -def output_graph(output_format, mf): - if output_format == 'dot': - mf.graphreport() - elif output_format == 'html': - mf.create_xref() - else: - mf.report() - - -def main(): - opts = parse_arguments() - mf = create_graph( - opts.scripts, opts.domods, opts.debug, - opts.excludes, opts.addpath) - output_graph(opts.output, mf) - - -if __name__ == '__main__': # pragma: no cover - try: - main() - except KeyboardInterrupt: - print("\n[interrupt]") diff --git a/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 5acfb93..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/__pycache__/__main__.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/__pycache__/__main__.cpython-312.pyc deleted file mode 100644 index 7961c74..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/__pycache__/__main__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/__pycache__/find_modules.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/__pycache__/find_modules.cpython-312.pyc deleted file mode 100644 index 70c51d0..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/__pycache__/find_modules.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/__pycache__/modulegraph.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/__pycache__/modulegraph.cpython-312.pyc deleted file mode 100644 index e88b8da..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/__pycache__/modulegraph.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/__pycache__/util.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/__pycache__/util.cpython-312.pyc deleted file mode 100644 index 3b5407a..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/__pycache__/util.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/find_modules.py b/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/find_modules.py deleted file mode 100755 index b383b28..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/find_modules.py +++ /dev/null @@ -1,61 +0,0 @@ -""" -modulegraph.find_modules - High-level module dependency finding interface -========================================================================= - -History -........ - -Originally (loosely) based on code in py2exe's build_exe.py by Thomas Heller. -""" -import os -import pkgutil - -from .modulegraph import Alias - -def get_implies(): - def _xml_etree_modules(): - import xml.etree - return [ - f"xml.etree.{module_name}" - for _, module_name, is_package in pkgutil.iter_modules(xml.etree.__path__) - if not is_package - ] - - result = { - # imports done from C code in built-in and/or extension modules - # (untrackable by modulegraph). - "_curses": ["curses"], - "posix": ["resource"], - "gc": ["time"], - "time": ["_strptime"], - "datetime": ["time"], - "parser": ["copyreg"], - "codecs": ["encodings"], - "_sre": ["copy", "re"], - "zipimport": ["zlib"], - - # _frozen_importlib is part of the interpreter itself - "_frozen_importlib": None, - - # os.path is an alias for a platform specific module, - # ensure that the graph shows this. - "os.path": Alias(os.path.__name__), - - # Python >= 3.2: - "_datetime": ["time", "_strptime"], - "_json": ["json.decoder"], - "_pickle": ["codecs", "copyreg", "_compat_pickle"], - "_posixsubprocess": ["gc"], - "_ssl": ["socket"], - - # Python >= 3.3: - "_elementtree": ["pyexpat"] + _xml_etree_modules(), - - # This is not C extension, but it uses __import__ - "anydbm": ["dbhash", "gdbm", "dbm", "dumbdbm", "whichdb"], - - # Known package aliases - "wxPython.wx": Alias('wx'), - } - - return result diff --git a/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/modulegraph.py b/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/modulegraph.py deleted file mode 100755 index a3699cc..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/modulegraph.py +++ /dev/null @@ -1,3107 +0,0 @@ -""" -Find modules used by a script, using bytecode analysis. - -Based on the stdlib modulefinder by Thomas Heller and Just van Rossum, -but uses a graph data structure and 2.3 features - -XXX: Verify all calls to _import_hook (and variants) to ensure that -imports are done in the right way. -""" -#FIXME: To decrease the likelihood of ModuleGraph exceeding the recursion limit -#and hence unpredictably raising fatal exceptions, increase the recursion -#limit at PyInstaller startup (i.e., in the -#PyInstaller.building.build_main.build() function). For details, see: -# https://github.com/pyinstaller/pyinstaller/issues/1919#issuecomment-216016176 - -import ast -import os -import pkgutil -import sys -import types -import re -from collections import deque, namedtuple, defaultdict -import urllib.request -import warnings -import importlib.util -import importlib.machinery - -# The logic in PyInstaller.compat ensures that these are available and -# of correct version. -if sys.version_info >= (3, 10): - import importlib.metadata as importlib_metadata -else: - import importlib_metadata - -# The latest version of altgraph at the time of writing (v0.17.4) still -# uses pkg_resources to query its own version. With setuptools >= 80.9.0, -# this triggers deprecation warnings. In 2025-11-30, pkg_resources will be -# removed altogether. Give altgraph just enough of a mocked pkg_resources that -# it can still be imported. -try: - _pkg_resources_not_imported = object() - _old_pkg_resources = sys.modules.get("pkg_resources", _pkg_resources_not_imported) - sys.modules["pkg_resources"] = fake_pkg_resources = types.SimpleNamespace() - fake_pkg_resources.require = lambda name: [importlib_metadata.distribution(name)] - - from altgraph.ObjectGraph import ObjectGraph - from altgraph import GraphError -finally: - if _old_pkg_resources is not _pkg_resources_not_imported: - sys.modules["pkg_resources"] = _old_pkg_resources - else: - del sys.modules["pkg_resources"] - -from . import util - - -class BUILTIN_MODULE: - def is_package(fqname): - return False - - -class NAMESPACE_PACKAGE: - def __init__(self, namespace_dirs): - self.namespace_dirs = namespace_dirs - - def is_package(self, fqname): - return True - - -#FIXME: Leverage this rather than magic numbers below. -ABSOLUTE_OR_RELATIVE_IMPORT_LEVEL = -1 -""" -Constant instructing the builtin `__import__()` function to attempt both -absolute and relative imports. -""" - - -#FIXME: Leverage this rather than magic numbers below. -ABSOLUTE_IMPORT_LEVEL = 0 -""" -Constant instructing the builtin `__import__()` function to attempt only -absolute imports. -""" - - -#FIXME: Leverage this rather than magic numbers below. -DEFAULT_IMPORT_LEVEL = ABSOLUTE_IMPORT_LEVEL -""" -Constant instructing the builtin `__import__()` function to attempt the default -import style specific to the active Python interpreter. - -Specifically, under: - -* Python 2, this defaults to attempting both absolute and relative imports. -* Python 3, this defaults to attempting only absolute imports. -""" - - -class InvalidRelativeImportError (ImportError): - pass - - -def _path_from_importerror(exc, default): - # This is a hack, but sadly enough the necessary information - # isn't available otherwise. - m = re.match(r'^No module named (\S+)$', str(exc)) - if m is not None: - return m.group(1) - - return default - - -#FIXME: What is this? Do we actually need this? This appears to provide -#significantly more fine-grained metadata than PyInstaller will ever require. -#It consumes a great deal of space (slots or no slots), since we store an -#instance of this class for each edge of the graph. -class DependencyInfo (namedtuple("DependencyInfo", - ["conditional", "function", "tryexcept", "fromlist"])): - __slots__ = () - - def _merged(self, other): - if (not self.conditional and not self.function and not self.tryexcept) \ - or (not other.conditional and not other.function and not other.tryexcept): - return DependencyInfo( - conditional=False, - function=False, - tryexcept=False, - fromlist=self.fromlist and other.fromlist) - - else: - return DependencyInfo( - conditional=self.conditional or other.conditional, - function=self.function or other.function, - tryexcept=self.tryexcept or other.tryexcept, - fromlist=self.fromlist and other.fromlist) - - -#FIXME: Shift the following Node class hierarchy into a new -#"PyInstaller.lib.modulegraph.node" module. This module is much too long. -#FIXME: Refactor "_deferred_imports" from a tuple into a proper lightweight -#class leveraging "__slots__". If not for backward compatibility, we'd just -#leverage a named tuple -- but this should do just as well. -#FIXME: Move the "packagepath" attribute into the "Package" class. Only -#packages define the "__path__" special attribute. The codebase currently -#erroneously tests whether "module.packagepath is not None" to determine -#whether a node is a package or not. However, "isinstance(module, Package)" is -#a significantly more reliable test. Refactor the former into the latter. -class Node: - """ - Abstract base class (ABC) of all objects added to a `ModuleGraph`. - - Attributes - ---------- - code : codeobject - Code object of the pure-Python module corresponding to this graph node - if any _or_ `None` otherwise. - graphident : str - Synonym of `identifier` required by the `ObjectGraph` superclass of the - `ModuleGraph` class. For readability, the `identifier` attribute should - typically be used instead. - filename : str - Absolute path of this graph node's corresponding module, package, or C - extension if any _or_ `None` otherwise. - identifier : str - Fully-qualified name of this graph node's corresponding module, - package, or C extension. - packagepath : str - List of the absolute paths of all directories comprising this graph - node's corresponding package. If this is a: - * Non-namespace package, this list contains exactly one path. - * Namespace package, this list contains one or more paths. - _deferred_imports : list - List of all target modules imported by the source module corresponding - to this graph node whole importations have been deferred for subsequent - processing in between calls to the `_ModuleGraph._scan_code()` and - `_ModuleGraph._process_imports()` methods for this source module _or_ - `None` otherwise. Each element of this list is a 3-tuple - `(have_star, _safe_import_hook_args, _safe_import_hook_kwargs)` - collecting the importation of a target module from this source module - for subsequent processing, where: - * `have_star` is a boolean `True` only if this is a `from`-style star - import (e.g., resembling `from {target_module_name} import *`). - * `_safe_import_hook_args` is a (typically non-empty) sequence of all - positional arguments to be passed to the `_safe_import_hook()` method - to add this importation to the graph. - * `_safe_import_hook_kwargs` is a (typically empty) dictionary of all - keyword arguments to be passed to the `_safe_import_hook()` method - to add this importation to the graph. - Unlike functional languages, Python imposes a maximum depth on the - interpreter stack (and hence recursion). On breaching this depth, - Python raises a fatal `RuntimeError` exception. Since `ModuleGraph` - parses imports recursively rather than iteratively, this depth _was_ - commonly breached before the introduction of this list. Python - environments installing a large number of modules (e.g., Anaconda) were - particularly susceptible. Why? Because `ModuleGraph` concurrently - descended through both the abstract syntax trees (ASTs) of all source - modules being parsed _and_ the graph of all target modules imported by - these source modules being built. The stack thus consisted of - alternating layers of AST and graph traversal. To unwind such - alternation and effectively halve the stack depth, `ModuleGraph` now - descends through the abstract syntax tree (AST) of each source module - being parsed and adds all importations originating within this module - to this list _before_ descending into the graph of these importations. - See pyinstaller/pyinstaller/#1289 for further details. - _global_attr_names : set - Set of the unqualified names of all global attributes (e.g., classes, - variables) defined in the pure-Python module corresponding to this - graph node if any _or_ the empty set otherwise. This includes the names - of all attributes imported via `from`-style star imports from other - existing modules (e.g., `from {target_module_name} import *`). This - set is principally used to differentiate the non-ignorable importation - of non-existent submodules in a package from the ignorable importation - of existing global attributes defined in that package's pure-Python - `__init__` submodule in `from`-style imports (e.g., `bar` in - `from foo import bar`, which may be either a submodule or attribute of - `foo`), as such imports ambiguously allow both. This set is _not_ used - to differentiate submodules from attributes in `import`-style imports - (e.g., `bar` in `import foo.bar`, which _must_ be a submodule of - `foo`), as such imports unambiguously allow only submodules. - _starimported_ignored_module_names : set - Set of the fully-qualified names of all existing unparsable modules - that the existing parsable module corresponding to this graph node - attempted to perform one or more "star imports" from. If this module - either does _not_ exist or does but is unparsable, this is the empty - set. Equivalently, this set contains each fully-qualified name - `{trg_module_name}` for which: - * This module contains an import statement of the form - `from {trg_module_name} import *`. - * The module whose name is `{trg_module_name}` exists but is _not_ - parsable by `ModuleGraph` (e.g., due to _not_ being pure-Python). - **This set is currently defined but otherwise ignored.** - _submodule_basename_to_node : dict - Dictionary mapping from the unqualified name of each submodule - contained by the parent module corresponding to this graph node to that - submodule's graph node. If this dictionary is non-empty, this parent - module is typically but _not_ always a package (e.g., the non-package - `os` module containing the `os.path` submodule). - """ - - __slots__ = [ - 'code', - 'filename', - 'graphident', - 'identifier', - 'packagepath', - '_deferred_imports', - '_global_attr_names', - '_starimported_ignored_module_names', - '_submodule_basename_to_node', - ] - - def __init__(self, identifier): - """ - Initialize this graph node. - - Parameters - ---------- - identifier : str - Fully-qualified name of this graph node's corresponding module, - package, or C extension. - """ - - self.code = None - self.filename = None - self.graphident = identifier - self.identifier = identifier - self.packagepath = None - self._deferred_imports = None - self._global_attr_names = set() - self._starimported_ignored_module_names = set() - self._submodule_basename_to_node = dict() - - - def is_global_attr(self, attr_name): - """ - `True` only if the pure-Python module corresponding to this graph node - defines a global attribute (e.g., class, variable) with the passed - name. - - If this module is actually a package, this method instead returns - `True` only if this package's pure-Python `__init__` submodule defines - such a global attribute. In this case, note that this package may still - contain an importable submodule of the same name. Callers should - attempt to import this attribute as a submodule of this package - _before_ assuming this attribute to be an ignorable global. See - "Examples" below for further details. - - Parameters - ---------- - attr_name : str - Unqualified name of the attribute to be tested. - - Returns - ---------- - bool - `True` only if this module defines this global attribute. - - Examples - ---------- - Consider a hypothetical module `foo` containing submodules `bar` and - `__init__` where the latter assigns `bar` to be a global variable - (possibly star-exported via the special `__all__` global variable): - - >>> # In "foo.__init__": - >>> bar = 3.1415 - - Python 2 and 3 both permissively permit this. This method returns - `True` in this case (i.e., when called on the `foo` package's graph - node, passed the attribute name `bar`) despite the importability of the - `foo.bar` submodule. - """ - - return attr_name in self._global_attr_names - - - def is_submodule(self, submodule_basename): - """ - `True` only if the parent module corresponding to this graph node - contains the submodule with the passed name. - - If `True`, this parent module is typically but _not_ always a package - (e.g., the non-package `os` module containing the `os.path` submodule). - - Parameters - ---------- - submodule_basename : str - Unqualified name of the submodule to be tested. - - Returns - ---------- - bool - `True` only if this parent module contains this submodule. - """ - - return submodule_basename in self._submodule_basename_to_node - - - def add_global_attr(self, attr_name): - """ - Record the global attribute (e.g., class, variable) with the passed - name to be defined by the pure-Python module corresponding to this - graph node. - - If this module is actually a package, this method instead records this - attribute to be defined by this package's pure-Python `__init__` - submodule. - - Parameters - ---------- - attr_name : str - Unqualified name of the attribute to be added. - """ - - self._global_attr_names.add(attr_name) - - - def add_global_attrs_from_module(self, target_module): - """ - Record all global attributes (e.g., classes, variables) defined by the - target module corresponding to the passed graph node to also be defined - by the source module corresponding to this graph node. - - If the source module is actually a package, this method instead records - these attributes to be defined by this package's pure-Python `__init__` - submodule. - - Parameters - ---------- - target_module : Node - Graph node of the target module to import attributes from. - """ - - self._global_attr_names.update(target_module._global_attr_names) - - - def add_submodule(self, submodule_basename, submodule_node): - """ - Add the submodule with the passed name and previously imported graph - node to the parent module corresponding to this graph node. - - This parent module is typically but _not_ always a package (e.g., the - non-package `os` module containing the `os.path` submodule). - - Parameters - ---------- - submodule_basename : str - Unqualified name of the submodule to add to this parent module. - submodule_node : Node - Graph node of this submodule. - """ - - self._submodule_basename_to_node[submodule_basename] = submodule_node - - - def get_submodule(self, submodule_basename): - """ - Graph node of the submodule with the passed name in the parent module - corresponding to this graph node. - - If this parent module does _not_ contain this submodule, an exception - is raised. Else, this parent module is typically but _not_ always a - package (e.g., the non-package `os` module containing the `os.path` - submodule). - - Parameters - ---------- - module_basename : str - Unqualified name of the submodule to retrieve. - - Returns - ---------- - Node - Graph node of this submodule. - """ - - return self._submodule_basename_to_node[submodule_basename] - - - def get_submodule_or_none(self, submodule_basename): - """ - Graph node of the submodule with the passed unqualified name in the - parent module corresponding to this graph node if this module contains - this submodule _or_ `None`. - - This parent module is typically but _not_ always a package (e.g., the - non-package `os` module containing the `os.path` submodule). - - Parameters - ---------- - submodule_basename : str - Unqualified name of the submodule to retrieve. - - Returns - ---------- - Node - Graph node of this submodule if this parent module contains this - submodule _or_ `None`. - """ - - return self._submodule_basename_to_node.get(submodule_basename) - - - def remove_global_attr_if_found(self, attr_name): - """ - Record the global attribute (e.g., class, variable) with the passed - name if previously recorded as defined by the pure-Python module - corresponding to this graph node to be subsequently undefined by the - same module. - - If this module is actually a package, this method instead records this - attribute to be undefined by this package's pure-Python `__init__` - submodule. - - This method is intended to be called on globals previously defined by - this module that are subsequently undefined via the `del` built-in by - this module, thus "forgetting" or "undoing" these globals. - - For safety, there exists no corresponding `remove_global_attr()` - method. While defining this method is trivial, doing so would invite - `KeyError` exceptions on scanning valid Python that lexically deletes a - global in a scope under this module's top level (e.g., in a function) - _before_ defining this global at this top level. Since `ModuleGraph` - cannot and should not (re)implement a full-blown Python interpreter, - ignoring out-of-order deletions is the only sane policy. - - Parameters - ---------- - attr_name : str - Unqualified name of the attribute to be removed. - """ - - if self.is_global_attr(attr_name): - self._global_attr_names.remove(attr_name) - - def __eq__(self, other): - try: - otherIdent = getattr(other, 'graphident') - except AttributeError: - return False - - return self.graphident == otherIdent - - def __ne__(self, other): - try: - otherIdent = getattr(other, 'graphident') - except AttributeError: - return True - - return self.graphident != otherIdent - - def __lt__(self, other): - try: - otherIdent = getattr(other, 'graphident') - except AttributeError: - return NotImplemented - - return self.graphident < otherIdent - - def __le__(self, other): - try: - otherIdent = getattr(other, 'graphident') - except AttributeError: - return NotImplemented - - return self.graphident <= otherIdent - - def __gt__(self, other): - try: - otherIdent = getattr(other, 'graphident') - except AttributeError: - return NotImplemented - - return self.graphident > otherIdent - - def __ge__(self, other): - try: - otherIdent = getattr(other, 'graphident') - except AttributeError: - return NotImplemented - - return self.graphident >= otherIdent - - def __hash__(self): - return hash(self.graphident) - - def infoTuple(self): - return (self.identifier,) - - def __repr__(self): - return '%s%r' % (type(self).__name__, self.infoTuple()) - - -class Alias(str): - """ - Placeholder aliasing an existing source module to a non-existent target - module (i.e., the desired alias). - - For obscure reasons, this class subclasses `str`. Each instance of this - class is the fully-qualified name of the existing source module being - aliased. Unlike the related `AliasNode` class, instances of this class are - _not_ actual nodes and hence _not_ added to the graph; they only facilitate - communication between the `ModuleGraph.alias_module()` and - `ModuleGraph.find_node()` methods. - """ - - -class AliasNode(Node): - """ - Graph node representing the aliasing of an existing source module under a - non-existent target module name (i.e., the desired alias). - """ - - def __init__(self, name, node=None): - """ - Initialize this alias. - - Parameters - ---------- - name : str - Fully-qualified name of the non-existent target module to be - created (as an alias of the existing source module). - node : Node - Graph node of the existing source module being aliased. Optional; - if not provided here, the attributes from referred node should - be copied later using `copyAttributesFromReferredNode` method. - """ - super(AliasNode, self).__init__(name) - - # Copy attributes from referred node, if provided - self.copyAttributesFromReferredNode(node) - - def copyAttributesFromReferredNode(self, node): - """ - Copy a subset of attributes from referred node (source module) into this target alias. - """ - # FIXME: Why only some? Why not *EVERYTHING* except "graphident", which - # must remain equal to "name" for lookup purposes? This is, after all, - # an alias. The idea is for the two nodes to effectively be the same. - for attr_name in ( - 'identifier', 'packagepath', - '_global_attr_names', '_starimported_ignored_module_names', - '_submodule_basename_to_node'): - if hasattr(node, attr_name): - setattr(self, attr_name, getattr(node, attr_name)) - - def infoTuple(self): - return (self.graphident, self.identifier) - - -class BadModule(Node): - pass - - -class ExcludedModule(BadModule): - pass - - -class MissingModule(BadModule): - pass - - -class InvalidRelativeImport (BadModule): - def __init__(self, relative_path, from_name): - identifier = relative_path - if relative_path.endswith('.'): - identifier += from_name - else: - identifier += '.' + from_name - super(InvalidRelativeImport, self).__init__(identifier) - self.relative_path = relative_path - self.from_name = from_name - - def infoTuple(self): - return (self.relative_path, self.from_name) - - -class Script(Node): - def __init__(self, filename): - super(Script, self).__init__(filename) - self.filename = filename - - def infoTuple(self): - return (self.filename,) - - -class BaseModule(Node): - def __init__(self, name, filename=None, path=None): - super(BaseModule, self).__init__(name) - self.filename = filename - self.packagepath = path - - def infoTuple(self): - return tuple(filter(None, (self.identifier, self.filename, self.packagepath))) - - -class BuiltinModule(BaseModule): - pass - - -class SourceModule(BaseModule): - pass - - -class InvalidSourceModule(SourceModule): - pass - - -class CompiledModule(BaseModule): - pass - - -class InvalidCompiledModule(BaseModule): - pass - - -class Extension(BaseModule): - pass - - -class Package(BaseModule): - """ - Graph node representing a non-namespace package. - """ - pass - - -class ExtensionPackage(Extension, Package): - """ - Graph node representing a package where the __init__ module is an extension - module. - """ - pass - - -class NamespacePackage(Package): - """ - Graph node representing a namespace package. - """ - pass - - -class RuntimeModule(BaseModule): - """ - Graph node representing a non-package Python module dynamically defined at - runtime. - - Most modules are statically defined on-disk as standard Python files. - Some modules, however, are dynamically defined in-memory at runtime - (e.g., `gi.repository.Gst`, dynamically defined by the statically - defined `gi.repository.__init__` module). - - This node represents such a runtime module. Since this is _not_ a package, - all attempts to import submodules from this module in `from`-style import - statements (e.g., the `queue` submodule in `from six.moves import queue`) - will be silently ignored. - - To ensure that the parent package of this module if any is also imported - and added to the graph, this node is typically added to the graph by - calling the `ModuleGraph.add_module()` method. - """ - pass - - -class RuntimePackage(Package): - """ - Graph node representing a non-namespace Python package dynamically defined - at runtime. - - Most packages are statically defined on-disk as standard subdirectories - containing `__init__.py` files. Some packages, however, are dynamically - defined in-memory at runtime (e.g., `six.moves`, dynamically defined by - the statically defined `six` module). - - This node represents such a runtime package. All attributes imported from - this package in `from`-style import statements that are submodules of this - package (e.g., the `queue` submodule in `from six.moves import queue`) will - be imported rather than ignored. - - To ensure that the parent package of this package if any is also imported - and added to the graph, this node is typically added to the graph by - calling the `ModuleGraph.add_module()` method. - """ - pass - - -#FIXME: Safely removable. We don't actually use this anywhere. After removing -#this class, remove the corresponding entry from "compat". -class FlatPackage(BaseModule): - def __init__(self, *args, **kwds): - warnings.warn( - "This class will be removed in a future version of modulegraph", - DeprecationWarning) - super(FlatPackage, *args, **kwds) - - -#FIXME: Safely removable. We don't actually use this anywhere. After removing -#this class, remove the corresponding entry from "compat". -class ArchiveModule(BaseModule): - def __init__(self, *args, **kwds): - warnings.warn( - "This class will be removed in a future version of modulegraph", - DeprecationWarning) - super(FlatPackage, *args, **kwds) - - -# HTML templates for ModuleGraph generator -header = """\ - - - - - %(TITLE)s - - - -

%(TITLE)s

""" -entry = """ -
- - %(CONTENT)s -
""" -contpl = """%(NAME)s %(TYPE)s""" -contpl_linked = """\ -%(NAME)s -%(TYPE)s""" -imports = """\ -
-%(HEAD)s: - %(LINKS)s -
-""" -footer = """ - -""" - - -def _ast_names(names): - result = [] - for nm in names: - if isinstance(nm, ast.alias): - result.append(nm.name) - else: - result.append(nm) - - result = [r for r in result if r != '__main__'] - return result - - -def uniq(seq): - """Remove duplicates from a list, preserving order""" - # Taken from https://stackoverflow.com/questions/480214 - seen = set() - seen_add = seen.add - return [x for x in seq if not (x in seen or seen_add(x))] - - -DEFAULT_IMPORT_LEVEL = 0 - - -class _Visitor(ast.NodeVisitor): - def __init__(self, graph, module): - self._graph = graph - self._module = module - self._level = DEFAULT_IMPORT_LEVEL - self._in_if = [False] - self._in_def = [False] - self._in_tryexcept = [False] - - @property - def in_if(self): - return self._in_if[-1] - - @property - def in_def(self): - return self._in_def[-1] - - @property - def in_tryexcept(self): - return self._in_tryexcept[-1] - - - def _collect_import(self, name, fromlist, level): - have_star = False - if fromlist is not None: - fromlist = uniq(fromlist) - if '*' in fromlist: - fromlist.remove('*') - have_star = True - - # Record this import as originating from this module for subsequent - # handling by the _process_imports() method. - self._module._deferred_imports.append( - (have_star, - (name, self._module, fromlist, level), - {'edge_attr': DependencyInfo( - conditional=self.in_if, - tryexcept=self.in_tryexcept, - function=self.in_def, - fromlist=False)})) - - - def visit_Import(self, node): - for nm in _ast_names(node.names): - self._collect_import(nm, None, self._level) - - def visit_ImportFrom(self, node): - level = node.level if node.level != 0 else self._level - self._collect_import(node.module or '', _ast_names(node.names), level) - - def visit_If(self, node): - self._in_if.append(True) - self.generic_visit(node) - self._in_if.pop() - - def visit_FunctionDef(self, node): - self._in_def.append(True) - self.generic_visit(node) - self._in_def.pop() - - visit_AsyncFunctionDef = visit_FunctionDef - - def visit_Try(self, node): - self._in_tryexcept.append(True) - self.generic_visit(node) - self._in_tryexcept.pop() - - def visit_TryExcept(self, node): - self._in_tryexcept.append(True) - self.generic_visit(node) - self._in_tryexcept.pop() - - def visit_Expression(self, node): - # Expression node's cannot contain import statements or - # other nodes that are relevant for us. - pass - - # Expression isn't actually used as such in AST trees, - # therefore define visitors for all kinds of expression nodes. - visit_BoolOp = visit_Expression - visit_BinOp = visit_Expression - visit_UnaryOp = visit_Expression - visit_Lambda = visit_Expression - visit_IfExp = visit_Expression - visit_Dict = visit_Expression - visit_Set = visit_Expression - visit_ListComp = visit_Expression - visit_SetComp = visit_Expression - visit_ListComp = visit_Expression - visit_GeneratorExp = visit_Expression - visit_Compare = visit_Expression - visit_Yield = visit_Expression - visit_YieldFrom = visit_Expression - visit_Await = visit_Expression - visit_Call = visit_Expression - visit_Await = visit_Expression - - -class ModuleGraph(ObjectGraph): - """ - Directed graph whose nodes represent modules and edges represent - dependencies between these modules. - """ - - - def createNode(self, cls, name, *args, **kw): - m = self.find_node(name) - - if m is None: - #assert m is None, m - m = super(ModuleGraph, self).createNode(cls, name, *args, **kw) - - return m - - - def __init__(self, path=None, excludes=(), replace_paths=(), implies=(), graph=None, debug=0): - super(ModuleGraph, self).__init__(graph=graph, debug=debug) - if path is None: - path = sys.path - self.path = path - self.lazynodes = {} - # excludes is stronger than implies - self.lazynodes.update(dict(implies)) - for m in excludes: - self.lazynodes[m] = None - self.replace_paths = replace_paths - - # Maintain own list of package path mappings in the scope of Modulegraph - # object. - self._package_path_map = {} - - # Legacy namespace-package paths. Initialized by scan_legacy_namespace_packages. - self._legacy_ns_packages = {} - - def scan_legacy_namespace_packages(self): - """ - Resolve extra package `__path__` entries for legacy setuptools-based - namespace packages, by reading `namespace_packages.txt` from dist - metadata. - """ - legacy_ns_packages = defaultdict(lambda: set()) - - for dist in importlib_metadata.distributions(): - ns_packages = dist.read_text("namespace_packages.txt") - if ns_packages is None: - continue - ns_packages = ns_packages.splitlines() - # Obtain path to dist metadata directory - dist_path = getattr(dist, '_path') - if dist_path is None: - continue - for package_name in ns_packages: - path = os.path.join( - str(dist_path.parent), # might be zipfile.Path if in zipped .egg - *package_name.split('.'), - ) - legacy_ns_packages[package_name].add(path) - - # Convert into dictionary of lists - self._legacy_ns_packages = { - package_name: list(paths) - for package_name, paths in legacy_ns_packages.items() - } - - def implyNodeReference(self, node, other, edge_data=None): - """ - Create a reference from the passed source node to the passed other node, - implying the former to depend upon the latter. - - While the source node _must_ be an existing graph node, the target node - may be either an existing graph node _or_ a fully-qualified module name. - In the latter case, the module with that name and all parent packages of - that module will be imported _without_ raising exceptions and for each - newly imported module or package: - - * A new graph node will be created for that module or package. - * A reference from the passed source node to that module or package will - be created. - - This method allows dependencies between Python objects _not_ importable - with standard techniques (e.g., module aliases, C extensions). - - Parameters - ---------- - node : str - Graph node for this reference's source module or package. - other : {Node, str} - Either a graph node _or_ fully-qualified name for this reference's - target module or package. - """ - - if isinstance(other, Node): - self._updateReference(node, other, edge_data) - else: - if isinstance(other, tuple): - raise ValueError(other) - others = self._safe_import_hook(other, node, None) - for other in others: - self._updateReference(node, other, edge_data) - - def outgoing(self, fromnode): - """ - Yield all nodes that `fromnode` dependes on (that is, - all modules that `fromnode` imports. - """ - - node = self.find_node(fromnode) - out_edges, _ = self.get_edges(node) - return out_edges - - getReferences = outgoing - - def incoming(self, tonode, collapse_missing_modules=True): - node = self.find_node(tonode) - _, in_edges = self.get_edges(node) - - if collapse_missing_modules: - for n in in_edges: - if isinstance(n, MissingModule): - for n in self.incoming(n, False): - yield n - - else: - yield n - - else: - for n in in_edges: - yield n - - getReferers = incoming - - def hasEdge(self, fromnode, tonode): - """ Return True iff there is an edge from 'fromnode' to 'tonode' """ - fromnode = self.find_node(fromnode) - tonode = self.find_node(tonode) - - return self.graph.edge_by_node(fromnode, tonode) is not None - - def foldReferences(self, packagenode): - """ - Create edges to/from `packagenode` based on the edges to/from all - submodules of that package _and_ then hide the graph nodes - corresponding to those submodules. - """ - - pkg = self.find_node(packagenode) - - for n in self.nodes(): - if not n.identifier.startswith(pkg.identifier + '.'): - continue - - iter_out, iter_inc = self.get_edges(n) - for other in iter_out: - if other.identifier.startswith(pkg.identifier + '.'): - continue - - if not self.hasEdge(pkg, other): - # Ignore circular dependencies - self._updateReference(pkg, other, 'pkg-internal-import') - - for other in iter_inc: - if other.identifier.startswith(pkg.identifier + '.'): - # Ignore circular dependencies - continue - - if not self.hasEdge(other, pkg): - self._updateReference(other, pkg, 'pkg-import') - - self.graph.hide_node(n) - - # TODO: unfoldReferences(pkg) that restore the submodule nodes and - # removes 'pkg-import' and 'pkg-internal-import' edges. Care should - # be taken to ensure that references are correct if multiple packages - # are folded and then one of them in unfolded - - def _updateReference(self, fromnode, tonode, edge_data): - try: - ed = self.edgeData(fromnode, tonode) - except (KeyError, GraphError): # XXX: Why 'GraphError' - return self.add_edge(fromnode, tonode, edge_data) - - if not (isinstance(ed, DependencyInfo) and isinstance(edge_data, DependencyInfo)): - self.updateEdgeData(fromnode, tonode, edge_data) - else: - self.updateEdgeData(fromnode, tonode, ed._merged(edge_data)) - - def add_edge(self, fromnode, tonode, edge_data='direct'): - """ - Create a reference from fromnode to tonode - """ - return super(ModuleGraph, self).createReference(fromnode, tonode, edge_data=edge_data) - - createReference = add_edge - - def find_node(self, name, create_nspkg=True): - """ - Graph node uniquely identified by the passed fully-qualified module - name if this module has been added to the graph _or_ `None` otherwise. - - If (in order): - - . A namespace package with this identifier exists _and_ the passed - `create_nspkg` parameter is `True`, this package will be - instantiated and returned. - . A lazy node with this identifier and: - * No dependencies exists, this node will be instantiated and - returned. - * Dependencies exists, this node and all transitive dependencies of - this node be instantiated and this node returned. - . A non-lazy node with this identifier exists, this node will be - returned as is. - - Parameters - ---------- - name : str - Fully-qualified name of the module whose graph node is to be found. - create_nspkg : bool - Ignored. - - Returns - ---------- - Node - Graph node of this module if added to the graph _or_ `None` - otherwise. - """ - - data = super(ModuleGraph, self).findNode(name) - - if data is not None: - return data - - if name in self.lazynodes: - deps = self.lazynodes.pop(name) - - if deps is None: - # excluded module - m = self.createNode(ExcludedModule, name) - elif isinstance(deps, Alias): - # NOTE: the AliasNode must be created and added to graph - # before trying to create the referred node; that might - # (due to recursive import analysis) lead to another - # attempt to resolve the aliased node (and if there is - # a real node that we are trying to shadow with the alias, - # that will end up added to the graph and prevent the - # alias node from being added). - m = self.createNode(AliasNode, name) - - # Create the referred node. - other = self._safe_import_hook(deps, None, None).pop() - - # Copy attributes; this used to be done by AliasNode - # constructor, back when referred node was created before - # the AliasNode (and could thus be passed to its constructor). - m.copyAttributesFromReferredNode(other) - - self.implyNodeReference(m, other) - else: - m = self._safe_import_hook(name, None, None).pop() - for dep in deps: - self.implyNodeReference(m, dep) - - return m - - return None - - findNode = find_node - iter_graph = ObjectGraph.flatten - - def add_script(self, pathname, caller=None): - """ - Create a node by path (not module name). It is expected to be a Python - source file, and will be scanned for dependencies. - """ - self.msg(2, "run_script", pathname) - - pathname = os.path.realpath(pathname) - m = self.find_node(pathname) - if m is not None: - return m - - with open(pathname, 'rb') as fp: - contents = fp.read() - contents = importlib.util.decode_source(contents) - - co_ast = compile(contents, pathname, 'exec', ast.PyCF_ONLY_AST, True) - co = compile(co_ast, pathname, 'exec', 0, True) - m = self.createNode(Script, pathname) - self._updateReference(caller, m, None) - n = self._scan_code(m, co, co_ast) - self._process_imports(n) - m.code = co - if self.replace_paths: - m.code = self._replace_paths_in_code(m.code) - return m - - - #FIXME: For safety, the "source_module" parameter should default to the - #root node of the current graph if unpassed. This parameter currently - #defaults to None, thus disconnected modules imported in this manner (e.g., - #hidden imports imported by depend.analysis.initialize_modgraph()). - def import_hook( - self, - target_module_partname, - source_module=None, - target_attr_names=None, - level=DEFAULT_IMPORT_LEVEL, - edge_attr=None, - ): - """ - Import the module with the passed name, all parent packages of this - module, _and_ all submodules and attributes in this module with the - passed names from the previously imported caller module signified by - the passed graph node. - - Unlike most import methods (e.g., `_safe_import_hook()`), this method - is designed to be publicly called by both external and internal - callers and hence is public. - - Parameters - ---------- - target_module_partname : str - Partially-qualified name of the target module to be imported. See - `_safe_import_hook()` for further details. - source_module : Node - Graph node for the previously imported **source module** (i.e., - module containing the `import` statement triggering the call to - this method) _or_ `None` if this module is to be imported in a - "disconnected" manner. **Passing `None` is _not_ recommended.** - Doing so produces a disconnected graph in which the graph node - created for the module to be imported will be disconnected and - hence unreachable from all other nodes -- which frequently causes - subtle issues in external callers (namely PyInstaller, which - silently ignores unreachable nodes). - target_attr_names : list - List of the unqualified names of all submodules and attributes to - be imported from the module to be imported if this is a "from"- - style import (e.g., `[encode_base64, encode_noop]` for the import - `from email.encoders import encode_base64, encode_noop`) _or_ - `None` otherwise. - level : int - Whether to perform an absolute or relative import. See - `_safe_import_hook()` for further details. - - Returns - ---------- - list - List of the graph nodes created for all modules explicitly imported - by this call, including the passed module and all submodules listed - in `target_attr_names` _but_ excluding all parent packages - implicitly imported by this call. If `target_attr_names` is `None` - or the empty list, this is guaranteed to be a list of one element: - the graph node created for the passed module. - - Raises - ---------- - ImportError - If the target module to be imported is unimportable. - """ - self.msg(3, "_import_hook", target_module_partname, source_module, source_module, level) - - source_package = self._determine_parent(source_module) - target_package, target_module_partname = self._find_head_package( - source_package, target_module_partname, level) - - self.msgin(4, "load_tail", target_package, target_module_partname) - - submodule = target_package - while target_module_partname: - i = target_module_partname.find('.') - if i < 0: - i = len(target_module_partname) - head, target_module_partname = target_module_partname[ - :i], target_module_partname[i+1:] - mname = "%s.%s" % (submodule.identifier, head) - submodule = self._safe_import_module(head, mname, submodule) - - if submodule is None: - # FIXME: Why do we no longer return a MissingModule instance? - # result = self.createNode(MissingModule, mname) - self.msgout(4, "raise ImportError: No module named", mname) - raise ImportError("No module named " + repr(mname)) - - self.msgout(4, "load_tail ->", submodule) - - target_module = submodule - target_modules = [target_module] - - # If this is a "from"-style import *AND* this target module is - # actually a package, import all submodules of this package specified - # by the "import" half of this import (e.g., the submodules "bar" and - # "car" of the target package "foo" in "from foo import bar, car"). - # - # If this target module is a non-package, it could still contain - # importable submodules (e.g., the non-package `os` module containing - # the `os.path` submodule). In this case, these submodules are already - # imported by this target module's pure-Python code. Since our import - # scanner already detects such imports, these submodules need *NOT* be - # reimported here. - if target_attr_names and isinstance(target_module, - (Package, AliasNode)): - for target_submodule in self._import_importable_package_submodules( - target_module, target_attr_names): - if target_submodule not in target_modules: - target_modules.append(target_submodule) - - # Add an edge from this source module to each target module. - for target_module in target_modules: - self._updateReference( - source_module, target_module, edge_data=edge_attr) - - return target_modules - - - def _determine_parent(self, caller): - """ - Determine the package containing a node. - """ - self.msgin(4, "determine_parent", caller) - - parent = None - if caller: - pname = caller.identifier - - if isinstance(caller, Package): - parent = caller - - elif '.' in pname: - pname = pname[:pname.rfind('.')] - parent = self.find_node(pname) - - elif caller.packagepath: - # XXX: I have no idea why this line - # is necessary. - parent = self.find_node(pname) - - self.msgout(4, "determine_parent ->", parent) - return parent - - - def _find_head_package( - self, - source_package, - target_module_partname, - level=DEFAULT_IMPORT_LEVEL): - """ - Import the target package providing the target module with the passed - name to be subsequently imported from the previously imported source - package corresponding to the passed graph node. - - Parameters - ---------- - source_package : Package - Graph node for the previously imported **source package** (i.e., - package containing the module containing the `import` statement - triggering the call to this method) _or_ `None` if this module is - to be imported in a "disconnected" manner. **Passing `None` is - _not_ recommended.** See the `_import_hook()` method for further - details. - target_module_partname : str - Partially-qualified name of the target module to be imported. See - `_safe_import_hook()` for further details. - level : int - Whether to perform absolute or relative imports. See the - `_safe_import_hook()` method for further details. - - Returns - ---------- - (target_package, target_module_tailname) - 2-tuple describing the imported target package, where: - * `target_package` is the graph node created for this package. - * `target_module_tailname` is the unqualified name of the target - module to be subsequently imported (e.g., `text` when passed a - `target_module_partname` of `email.mime.text`). - - Raises - ---------- - ImportError - If the package to be imported is unimportable. - """ - self.msgin(4, "find_head_package", source_package, target_module_partname, level) - - #FIXME: Rename all local variable names to something sensible. No, - #"p_fqdn" is not a sensible name. - - # If this target module is a submodule... - if '.' in target_module_partname: - target_module_headname, target_module_tailname = ( - target_module_partname.split('.', 1)) - # Else, this target module is a top-level module. - else: - target_module_headname = target_module_partname - target_module_tailname = '' - - # If attempting both absolute and relative imports... - if level == ABSOLUTE_OR_RELATIVE_IMPORT_LEVEL: - if source_package: - target_package_name = source_package.identifier + '.' + target_module_headname - else: - target_package_name = target_module_headname - # Else if attempting only absolute imports... - elif level == ABSOLUTE_IMPORT_LEVEL: - target_package_name = target_module_headname - - # Absolute import, ignore the parent - source_package = None - # Else if attempting only relative imports... - else: - if source_package is None: - self.msg(2, "Relative import outside of package") - raise InvalidRelativeImportError( - "Relative import outside of package (name=%r, parent=%r, level=%r)" % ( - target_module_partname, source_package, level)) - - for i in range(level - 1): - if '.' not in source_package.identifier: - self.msg(2, "Relative import outside of package") - raise InvalidRelativeImportError( - "Relative import outside of package (name=%r, parent=%r, level=%r)" % ( - target_module_partname, source_package, level)) - - p_fqdn = source_package.identifier.rsplit('.', 1)[0] - new_parent = self.find_node(p_fqdn) - if new_parent is None: - #FIXME: Repetition detected. Exterminate. Exterminate. - self.msg(2, "Relative import outside of package") - raise InvalidRelativeImportError( - "Relative import outside of package (name=%r, parent=%r, level=%r)" % ( - target_module_partname, source_package, level)) - - assert new_parent is not source_package, ( - new_parent, source_package) - source_package = new_parent - - if target_module_headname: - target_package_name = ( - source_package.identifier + '.' + target_module_headname) - else: - target_package_name = source_package.identifier - - # Graph node of this target package. - target_package = self._safe_import_module( - target_module_headname, target_package_name, source_package) - - # If this target package is *NOT* importable and a source package was - # passed, attempt to import this target package as an absolute import. - # - # ADDENDUM: but do this only if the passed "level" is either - # ABSOLUTE_IMPORT_LEVEL (0) or ABSOLUTE_OR_RELATIVE_IMPORT_LEVEL (-1). - # Otherwise, an attempt at relative import of a missing sub-module - # (from .module import something) might pull in an unrelated - # but eponymous top-level module, which should not happen. - if target_package is None and source_package is not None and level <= ABSOLUTE_IMPORT_LEVEL: - target_package_name = target_module_headname - source_package = None - - # Graph node for the target package, again. - target_package = self._safe_import_module( - target_module_headname, target_package_name, source_package) - - # If this target package is importable, return this package. - if target_package is not None: - self.msgout(4, "find_head_package ->", (target_package, target_module_tailname)) - return target_package, target_module_tailname - - # Else, raise an exception. - self.msgout(4, "raise ImportError: No module named", target_package_name) - raise ImportError("No module named " + target_package_name) - - - - - #FIXME: Refactor from a generator yielding graph nodes into a non-generator - #returning a list or tuple of all yielded graph nodes. This method is only - #called once above and the return value of that call is only iterated over - #as a list or tuple. There's no demonstrable reason for this to be a - #generator. Generators are great for their intended purposes (e.g., as - #continuations). This isn't one of those purposes. - def _import_importable_package_submodules(self, package, attr_names): - """ - Generator importing and yielding each importable submodule (of the - previously imported package corresponding to the passed graph node) - whose unqualified name is in the passed list. - - Elements of this list that are _not_ importable submodules of this - package are either: - - * Ignorable attributes (e.g., classes, globals) defined at the top - level of this package's `__init__` submodule, which will be ignored. - * Else, unignorable unimportable submodules, in which case an - exception is raised. - - Parameters - ---------- - package : Package - Graph node of the previously imported package containing the - modules to be imported and yielded. - - attr_names : list - List of the unqualified names of all attributes of this package to - attempt to import as submodules. This list will be internally - converted into a set, safely ignoring any duplicates in this list - (e.g., reducing the "from"-style import - `from foo import bar, car, far, bar, car, far` to merely - `from foo import bar, car, far`). - - Yields - ---------- - Node - Graph node created for the currently imported submodule. - - Raises - ---------- - ImportError - If any attribute whose name is in `attr_names` is neither: - * An importable submodule of this package. - * An ignorable global attribute (e.g., class, variable) defined at - the top level of this package's `__init__` submodule. - In this case, this attribute _must_ be an unimportable submodule of - this package. - """ - - # Ignore duplicate submodule names in the passed list. - attr_names = set(attr_names) - self.msgin(4, "_import_importable_package_submodules", package, attr_names) - - #FIXME: This test *SHOULD* be superfluous and hence safely removable. - #The higher-level _scan_bytecode() and _collect_import() methods - #already guarantee "*" characters to be removed from fromlists. - if '*' in attr_names: - attr_names.update(self._find_all_submodules(package)) - attr_names.remove('*') - - # self.msg(4, '_import_importable_package_submodules (global attrs)', package.identifier, package._global_attr_names) - - # For the name of each attribute to be imported from this package... - for attr_name in attr_names: - # self.msg(4, '_import_importable_package_submodules (fromlist attr)', package.identifier, attr_name) - - # Graph node of this attribute if this attribute is a previously - # imported module or None otherwise. - submodule = package.get_submodule_or_none(attr_name) - - # If this attribute is *NOT* a previously imported module, attempt - # to import this attribute as a submodule of this package. - if submodule is None: - # Fully-qualified name of this submodule. - submodule_name = package.identifier + '.' + attr_name - - # Graph node of this submodule if importable or None otherwise. - submodule = self._safe_import_module( - attr_name, submodule_name, package) - - # If this submodule is unimportable... - if submodule is None: - # If this attribute is a global (e.g., class, variable) - # defined at the top level of this package's "__init__" - # submodule, this importation is safely ignorable. Do so - # and skip to the next attribute. - # - # This behaviour is non-conformant with Python behaviour, - # which is bad, but is required to sanely handle all - # possible edge cases, which is good. In Python, a global - # attribute defined at the top level of a package's - # "__init__" submodule shadows a submodule of the same name - # in that package. Attempting to import that submodule - # instead imports that attribute; thus, that submodule is - # effectively unimportable. In this method and elsewhere, - # that submodule is tested for first and hence shadows that - # attribute -- the opposite logic. Attempts to import that - # attribute are mistakenly seen as attempts to import that - # submodule! Why? - # - # Edge cases. PyInstaller (and by extension ModuleGraph) - # only cares about module imports. Global attribute imports - # are parsed only as the means to this ends and are - # otherwise ignorable. The cost of erroneously shadowing: - # - # * Submodules by attributes is significant. Doing so - # prevents such submodules from being frozen and hence - # imported at application runtime. - # * Attributes by submodules is insignificant. Doing so - # could erroneously freeze such submodules despite their - # never being imported at application runtime. However, - # ModuleGraph is incapable of determining with certainty - # that Python logic in another module other than the - # "__init__" submodule containing these attributes does - # *NOT* delete these attributes and hence unshadow these - # submodules, which would then become importable at - # runtime and require freezing. Hence, ModuleGraph *MUST* - # permissively assume submodules of the same name as - # attributes to be unshadowed elsewhere and require - # freezing -- even if they do not. - # - # It is practically difficult (albeit technically feasible) - # for ModuleGraph to determine whether or not the target - # attribute names of "from"-style import statements (e.g., - # "bar" and "car" in "from foo import bar, car") refer to - # non-ignorable submodules or ignorable non-module globals - # during opcode scanning. Distinguishing these two cases - # during opcode scanning would require a costly call to the - # _find_module() method, which would subsequently be - # repeated during import-graph construction. This could be - # ameliorated with caching, which itself would require - # costly space consumption and developer time. - # - # Since opcode scanning fails to distinguish these two - # cases, this and other methods subsequently called at - # import-graph construction time (e.g., - # _safe_import_hook()) must do so. Since submodules of the - # same name as attributes must assume to be unshadowed - # elsewhere and require freezing, the only solution is to - # attempt to import an attribute as a non-ignorable module - # *BEFORE* assuming an attribute to be an ignorable - # non-module. Which is what this and other methods do. - # - # See Package.is_global_attr() for similar discussion. - if package.is_global_attr(attr_name): - self.msg(4, '_import_importable_package_submodules: ignoring from-imported global', package.identifier, attr_name) - continue - # Else, this attribute is an unimportable submodule. Since - # this is *NOT* safely ignorable, raise an exception. - else: - raise ImportError("No module named " + submodule_name) - - # Yield this submodule's graph node to the caller. - yield submodule - - self.msgin(4, "_import_importable_package_submodules ->") - - - def _find_all_submodules(self, m): - if not m.packagepath: - return - # 'suffixes' used to be a list hardcoded to [".py", ".pyc", ".pyo"]. - # But we must also collect Python extension modules - although - # we cannot separate normal dlls from Python extensions. - for path in m.packagepath: - try: - names = os.listdir(path) - except (os.error, IOError): - self.msg(2, "can't list directory", path) - continue - for name in names: - for suffix in importlib.machinery.all_suffixes(): - if path.endswith(suffix): - name = os.path.basename(path)[:-len(suffix)] - break - else: - continue - if name != '__init__': - yield name - - - def alias_module(self, src_module_name, trg_module_name): - """ - Alias the source module to the target module with the passed names. - - This method ensures that the next call to findNode() given the target - module name will resolve this alias. This includes importing and adding - a graph node for the source module if needed as well as adding a - reference from the target to source module. - - Parameters - ---------- - src_module_name : str - Fully-qualified name of the existing **source module** (i.e., the - module being aliased). - trg_module_name : str - Fully-qualified name of the non-existent **target module** (i.e., - the alias to be created). - """ - self.msg(3, 'alias_module "%s" -> "%s"' % (src_module_name, trg_module_name)) - # print('alias_module "%s" -> "%s"' % (src_module_name, trg_module_name)) - assert isinstance(src_module_name, str), '"%s" not a module name.' % str(src_module_name) - assert isinstance(trg_module_name, str), '"%s" not a module name.' % str(trg_module_name) - - # If the target module has already been added to the graph as either a - # non-alias or as a different alias, raise an exception. - trg_module = self.find_node(trg_module_name) - if trg_module is not None and not ( - isinstance(trg_module, AliasNode) and - trg_module.identifier == src_module_name): - raise ValueError( - 'Target module "%s" already imported as "%s".' % ( - trg_module_name, trg_module)) - - # See findNode() for details. - self.lazynodes[trg_module_name] = Alias(src_module_name) - - - def add_module(self, module): - """ - Add the passed module node to the graph if not already added. - - If that module has a parent module or package with a previously added - node, this method also adds a reference from this module node to its - parent node and adds this module node to its parent node's namespace. - - This high-level method wraps the low-level `addNode()` method, but is - typically _only_ called by graph hooks adding runtime module nodes. For - all other node types, the `import_module()` method should be called. - - Parameters - ---------- - module : BaseModule - Graph node of the module to be added. - """ - self.msg(3, 'add_module', module) - - # If no node exists for this module, add such a node. - module_added = self.find_node(module.identifier) - if module_added is None: - self.addNode(module) - else: - assert module == module_added, 'New module %r != previous %r.' % (module, module_added) - - # If this module has a previously added parent, reference this module to - # its parent and add this module to its parent's namespace. - parent_name, _, module_basename = module.identifier.rpartition('.') - if parent_name: - parent = self.find_node(parent_name) - if parent is None: - self.msg(4, 'add_module parent not found:', parent_name) - else: - self.add_edge(module, parent) - parent.add_submodule(module_basename, module) - - - def append_package_path(self, package_name, directory): - """ - Modulegraph does a good job at simulating Python's, but it can not - handle packagepath '__path__' modifications packages make at runtime. - - Therefore there is a mechanism whereby you can register extra paths - in this map for a package, and it will be honored. - - NOTE: This method has to be called before a package is resolved by - modulegraph. - - Parameters - ---------- - module : str - Fully-qualified module name. - directory : str - Absolute or relative path of the directory to append to the - '__path__' attribute. - """ - - paths = self._package_path_map.setdefault(package_name, []) - paths.append(directory) - - - def _safe_import_module( - self, module_partname, module_name, parent_module): - """ - Create a new graph node for the module with the passed name under the - parent package signified by the passed graph node _without_ raising - `ImportError` exceptions. - - If this module has already been imported, this module's existing graph - node will be returned; else if this module is importable, a new graph - node will be added for this module and returned; else this module is - unimportable, in which case `None` will be returned. Like the - `_safe_import_hook()` method, this method does _not_ raise - `ImportError` exceptions when this module is unimportable. - - Parameters - ---------- - module_partname : str - Unqualified name of the module to be imported (e.g., `text`). - module_name : str - Fully-qualified name of this module (e.g., `email.mime.text`). - parent_module : Package - Graph node of the previously imported parent module containing this - submodule _or_ `None` if this is a top-level module (i.e., - `module_name` contains no `.` delimiters). This parent module is - typically but _not_ always a package (e.g., the `os.path` submodule - contained by the `os` module). - - Returns - ---------- - Node - Graph node created for this module _or_ `None` if this module is - unimportable. - """ - self.msgin(3, "safe_import_module", module_partname, module_name, parent_module) - - # If this module has *NOT* already been imported, do so. - module = self.find_node(module_name) - if module is None: - # List of the absolute paths of all directories to be searched for - # this module. This effectively defaults to "sys.path". - search_dirs = None - - # If this module has a parent package... - if parent_module is not None: - # ...with a list of the absolute paths of all directories - # comprising this package, prefer that to "sys.path". - if parent_module.packagepath is not None: - search_dirs = parent_module.packagepath - # Else, something is horribly wrong. Return emptiness. - else: - self.msgout(3, "safe_import_module -> None (parent_parent.packagepath is None)") - return None - - try: - pathname, loader = self._find_module( - module_partname, search_dirs, parent_module) - except ImportError as exc: - self.msgout(3, "safe_import_module -> None (%r)" % exc) - return None - - (module, co) = self._load_module(module_name, pathname, loader) - if co is not None: - try: - if isinstance(co, ast.AST): - co_ast = co - co = compile(co_ast, pathname, 'exec', 0, True) - else: - co_ast = None - n = self._scan_code(module, co, co_ast) - self._process_imports(n) - - if self.replace_paths: - co = self._replace_paths_in_code(co) - module.code = co - except SyntaxError: - self.msg( - 1, "safe_import_module: SyntaxError in ", pathname, - ) - cls = InvalidSourceModule - module = self.createNode(cls, module_name) - - # If this is a submodule rather than top-level module... - if parent_module is not None: - self.msg(4, "safe_import_module create reference", module, "->", parent_module) - - # Add an edge from this submodule to its parent module. - self._updateReference( - module, parent_module, edge_data=DependencyInfo( - conditional=False, - fromlist=False, - function=False, - tryexcept=False, - )) - - # Add this submodule to its parent module. - parent_module.add_submodule(module_partname, module) - - # Return this module. - self.msgout(3, "safe_import_module ->", module) - return module - - def _load_module(self, fqname, pathname, loader): - from importlib._bootstrap_external import ExtensionFileLoader - self.msgin(2, "load_module", fqname, pathname, - loader.__class__.__name__) - partname = fqname.rpartition(".")[-1] - - if loader.is_package(partname): - if isinstance(loader, NAMESPACE_PACKAGE): - # This is a PEP-420 namespace package. - m = self.createNode(NamespacePackage, fqname) - m.filename = '-' - m.packagepath = loader.namespace_dirs[:] # copy for safety - else: - # Regular package. - # - # NOTE: this might be a legacy setuptools (pkg_resources) - # based namespace package (with __init__.py, but calling - # `pkg_resources.declare_namespace(__name__)`). To properly - # handle the case when such a package is split across - # multiple locations, we need to resolve the package - # paths via metadata. - ns_pkgpaths = self._legacy_ns_packages.get(fqname, []) - - if isinstance(loader, ExtensionFileLoader): - m = self.createNode(ExtensionPackage, fqname) - else: - m = self.createNode(Package, fqname) - m.filename = pathname - # PEP-302-compliant loaders return the pathname of the - # `__init__`-file, not the package directory. - assert os.path.basename(pathname).startswith('__init__.') - m.packagepath = [os.path.dirname(pathname)] + ns_pkgpaths - - # As per comment at top of file, simulate runtime packagepath - # additions - m.packagepath = m.packagepath + self._package_path_map.get( - fqname, []) - - if isinstance(m, NamespacePackage): - return (m, None) - - co = None - if loader is BUILTIN_MODULE: - cls = BuiltinModule - elif isinstance(loader, ExtensionFileLoader): - cls = Extension - - # Look for accompanying .py or .pyi file, which might allow - # us to perform basic import analysis for the extension. - def _co_from_accompanying_source(extension_filename): - path = os.path.dirname(extension_filename) - basename = os.path.basename(extension_filename).split('.')[0] - - for ext in {'.py', '.pyi'}: - src_filename = os.path.join(path, basename + ext) - if not os.path.isfile(src_filename): - continue - - try: - with open(src_filename, 'rb') as fp: - src = fp.read() - co = compile(src, src_filename, 'exec', ast.PyCF_ONLY_AST, True) - return co - except Exception as e: - pass - - co = _co_from_accompanying_source(pathname) - else: - try: - src = loader.get_source(partname) - except (UnicodeDecodeError, SyntaxError) as e: - # The `UnicodeDecodeError` is typically raised here when the - # source file contains non-ASCII characters in some local - # encoding that is different from UTF-8, but fails to - # declare it via PEP361 encoding header. Python seems to - # be able to load and run such module, but we cannot retrieve - # the source for it via the `loader.get_source()`. - # - # The `UnicodeDecoreError` in turn triggers a `SyntaxError` - # when such invalid character appears on the first line of - # the source file (and interrupts the scan for PEP361 - # encoding header). - # - # In such cases, we try to fall back to reading the source - # as raw data file. - - # If `SyntaxError` was not raised during handling of - # a `UnicodeDecodeError`, it was likely a genuine syntax - # error, so re-raise it. - if isinstance(e, SyntaxError): - if not isinstance(e.__context__, UnicodeDecodeError): - raise - - self.msg(2, "load_module: failed to obtain source for " - f"{partname}: {e}! Falling back to reading as " - "raw data!") - - path = loader.get_filename(partname) - src = loader.get_data(path) - - if src is not None: - try: - co = compile(src, pathname, 'exec', ast.PyCF_ONLY_AST, True) - cls = SourceModule - except SyntaxError: - co = None - cls = InvalidSourceModule - except Exception as exc: # FIXME: more specific? - cls = InvalidSourceModule - self.msg(2, "load_module: InvalidSourceModule", pathname, - exc) - else: - # no src available - try: - co = loader.get_code(partname) - cls = (CompiledModule if co is not None - else InvalidCompiledModule) - except Exception as exc: # FIXME: more specific? - self.msg(2, "load_module: InvalidCompiledModule, " - "Cannot load code", pathname, exc) - cls = InvalidCompiledModule - - m = self.createNode(cls, fqname) - m.filename = pathname - - self.msgout(2, "load_module ->", m) - return (m, co) - - def _safe_import_hook( - self, target_module_partname, source_module, target_attr_names, - level=DEFAULT_IMPORT_LEVEL, edge_attr=None): - """ - Import the module with the passed name and all parent packages of this - module from the previously imported caller module signified by the - passed graph node _without_ raising `ImportError` exceptions. - - This method wraps the lowel-level `_import_hook()` method. On catching - an `ImportError` exception raised by that method, this method creates - and adds a `MissingNode` instance describing the unimportable module to - the graph instead. - - Parameters - ---------- - target_module_partname : str - Partially-qualified name of the module to be imported. If `level` - is: - * `ABSOLUTE_OR_RELATIVE_IMPORT_LEVEL` (e.g., the Python 2 default) - or a positive integer (e.g., an explicit relative import), the - fully-qualified name of this module is the concatenation of the - fully-qualified name of the caller module's package and this - parameter. - * `ABSOLUTE_IMPORT_LEVEL` (e.g., the Python 3 default), this name - is already fully-qualified. - * A non-negative integer (e.g., `1`), this name is typically the - empty string. In this case, this is a "from"-style relative - import (e.g., "from . import bar") and the fully-qualified name - of this module is dynamically resolved by import machinery. - source_module : Node - Graph node for the previously imported **caller module** (i.e., - module containing the `import` statement triggering the call to - this method) _or_ `None` if this module is to be imported in a - "disconnected" manner. **Passing `None` is _not_ recommended.** - Doing so produces a disconnected graph in which the graph node - created for the module to be imported will be disconnected and - hence unreachable from all other nodes -- which frequently causes - subtle issues in external callers (e.g., PyInstaller, which - silently ignores unreachable nodes). - target_attr_names : list - List of the unqualified names of all submodules and attributes to - be imported via a `from`-style import statement from this target - module if any (e.g., the list `[encode_base64, encode_noop]` for - the import `from email.encoders import encode_base64, encode_noop`) - _or_ `None` otherwise. Ignored unless `source_module` is the graph - node of a package (i.e., is an instance of the `Package` class). - Why? Because: - * Consistency. The `_import_importable_package_submodules()` - method accepts a similar list applicable only to packages. - * Efficiency. Unlike packages, modules cannot physically contain - submodules. Hence, any target module imported via a `from`-style - import statement as an attribute from another target parent - module must itself have been imported in that target parent - module. The import statement responsible for that import must - already have been previously parsed by `ModuleGraph`, in which - case that target module will already be frozen by PyInstaller. - These imports are safely ignorable here. - level : int - Whether to perform an absolute or relative import. This parameter - corresponds exactly to the parameter of the same name accepted by - the `__import__()` built-in: "The default is -1 which indicates - both absolute and relative imports will be attempted. 0 means only - perform absolute imports. Positive values for level indicate the - number of parent directories to search relative to the directory of - the module calling `__import__()`." Defaults to -1 under Python 2 - and 0 under Python 3. Since this default depends on the major - version of the current Python interpreter, depending on this - default can result in unpredictable and non-portable behaviour. - Callers are strongly recommended to explicitly pass this parameter - rather than implicitly accept this default. - - Returns - ---------- - list - List of the graph nodes created for all modules explicitly imported - by this call, including the passed module and all submodules listed - in `target_attr_names` _but_ excluding all parent packages - implicitly imported by this call. If `target_attr_names` is either - `None` or the empty list, this is guaranteed to be a list of one - element: the graph node created for the passed module. As above, - `MissingNode` instances are created for all unimportable modules. - """ - self.msg(3, "_safe_import_hook", target_module_partname, source_module, target_attr_names, level) - - def is_swig_candidate(): - return (source_module is not None and - target_attr_names is None and - level == ABSOLUTE_IMPORT_LEVEL and - type(source_module) is SourceModule and - target_module_partname == - '_' + source_module.identifier.rpartition('.')[2]) - - def is_swig_wrapper(source_module): - with open(source_module.filename, 'rb') as fp: - contents = fp.read() - contents = importlib.util.decode_source(contents) - first_line = contents.splitlines()[0] if contents else '' - self.msg(5, 'SWIG wrapper candidate first line: %r' % (first_line)) - return "automatically generated by SWIG" in first_line - - - # List of the graph nodes created for all target modules both - # imported by and returned from this call, whose: - # - # * First element is the graph node for the core target module - # specified by the "target_module_partname" parameter. - # * Remaining elements are the graph nodes for all target submodules - # specified by the "target_attr_names" parameter. - target_modules = None - - # True if this is a Python 2-style implicit relative import of a - # SWIG-generated C extension. False if we checked and it is not SWIG. - # None if we haven't checked yet. - is_swig_import = None - - # Attempt to import this target module in the customary way. - try: - target_modules = self.import_hook( - target_module_partname, source_module, - target_attr_names=None, level=level, edge_attr=edge_attr) - # Failing that, defer to custom module importers handling non-standard - # import schemes (namely, SWIG). - except InvalidRelativeImportError: - self.msgout(2, "Invalid relative import", level, - target_module_partname, target_attr_names) - result = [] - for sub in target_attr_names or '*': - m = self.createNode(InvalidRelativeImport, - '.' * level + target_module_partname, sub) - self._updateReference(source_module, m, edge_data=edge_attr) - result.append(m) - return result - except ImportError as msg: - # If this is an absolute top-level import under Python 3 and if the - # name to be imported is the caller's name prefixed by "_", this - # could be a SWIG-generated Python 2-style implicit relative import. - # SWIG-generated files contain functions named swig_import_helper() - # importing dynamic libraries residing in the same directory. For - # example, a SWIG-generated caller module "csr.py" might resemble: - # - # # This file was automatically generated by SWIG (http://www.swig.org). - # ... - # def swig_import_helper(): - # ... - # try: - # fp, pathname, description = imp.find_module('_csr', - # [dirname(__file__)]) - # except ImportError: - # import _csr - # return _csr - # - # While there exists no reasonable means for modulegraph to parse - # the call to imp.find_module(), the subsequent implicit relative - # import is trivially parsable. This import is prohibited under - # Python 3, however, and thus parsed only if the caller's file is - # parsable plaintext (as indicated by a filetype of ".py") and the - # first line of this file is the above SWIG header comment. - # - # The constraint that this library's name be the caller's name - # prefixed by '_' is explicitly mandated by SWIG and thus a - # reliable indicator of "SWIG-ness". The SWIG documentation states: - # "When linking the module, the name of the output file has to match - # the name of the module prefixed by an underscore." - # - # Only source modules (e.g., ".py"-suffixed files) are SWIG import - # candidates. All other node types are safely ignorable. - if is_swig_candidate(): - self.msg( - 4, - 'SWIG import candidate (name=%r, caller=%r, level=%r)' % ( - target_module_partname, source_module, level)) - is_swig_import = is_swig_wrapper(source_module) - if is_swig_import: - # Convert this Python 2-compliant implicit relative - # import prohibited by Python 3 into a Python - # 3-compliant explicit relative "from"-style import for - # the duration of this function call by overwriting the - # original parameters passed to this call. - target_attr_names = [target_module_partname] - target_module_partname = '' - level = 1 - self.msg(2, - 'SWIG import (caller=%r, fromlist=%r, level=%r)' - % (source_module, target_attr_names, level)) - # Import this target SWIG C extension's package. - try: - target_modules = self.import_hook( - target_module_partname, source_module, - target_attr_names=None, - level=level, - edge_attr=edge_attr) - except ImportError as msg: - self.msg(2, "SWIG ImportError:", str(msg)) - - # If this module remains unimportable... - if target_modules is None: - self.msg(2, "ImportError:", str(msg)) - - # Add this module as a MissingModule node. - target_module = self.createNode( - MissingModule, - _path_from_importerror(msg, target_module_partname)) - self._updateReference( - source_module, target_module, edge_data=edge_attr) - - # Initialize this list to this node. - target_modules = [target_module] - - # Ensure that the above logic imported exactly one target module. - assert len(target_modules) == 1, ( - 'Expected import_hook() to' - 'return only one module but received: {}'.format(target_modules)) - - # Target module imported above. - target_module = target_modules[0] - - if isinstance(target_module, MissingModule) \ - and is_swig_import is None and is_swig_candidate() \ - and is_swig_wrapper(source_module): - # if this possible swig C module was previously imported from - # a python module other than its corresponding swig python - # module, then it may have been considered a MissingModule. - # Try to reimport it now. For details see pull-request #2578 - # and issue #1522. - # - # If this module was takes as a SWIG candidate above, but failed - # to import, this would be a MissingModule, too. Thus check if - # this was the case (is_swig_import would be not None) to avoid - # recursion error. If `is_swig_import` is None and we are still a - # swig candidate then that means we haven't properly imported this - # swig module yet so do that below. - # - # Remove the MissingModule node from the graph so that we can - # attempt a reimport and avoid collisions. This node should be - # fine to remove because the proper module will be imported and - # added to the graph in the next line (call to _safe_import_hook). - self.removeNode(target_module) - # Reimport the SWIG C module relative to the wrapper - target_modules = self._safe_import_hook( - target_module_partname, source_module, - target_attr_names=None, level=1, edge_attr=edge_attr) - # return the output regardless because it would just be - # duplicating the processing below - return target_modules - - if isinstance(edge_attr, DependencyInfo): - edge_attr = edge_attr._replace(fromlist=True) - - # If this is a "from"-style import *AND* this target module is a - # package, import all attributes listed by the "import" clause of this - # import that are submodules of this package. If this target module is - # *NOT* a package, these attributes are always ignorable globals (e.g., - # classes, variables) defined at the top level of this module. - # - # If this target module is a non-package, it could still contain - # importable submodules (e.g., the non-package `os` module containing - # the `os.path` submodule). In this case, these submodules are already - # imported by this target module's pure-Python code. Since our import - # scanner already detects these imports, these submodules need *NOT* be - # reimported here. (Doing so would be harmless but inefficient.) - if target_attr_names and isinstance(target_module, - (Package, AliasNode)): - # For the name of each attribute imported from this target package - # into this source module... - for target_submodule_partname in target_attr_names: - #FIXME: Is this optimization *REALLY* an optimization or at all - #necessary? The findNode() method called below should already - #be heavily optimized, in which case this optimization here is - #premature, senseless, and should be eliminated. - - # If this attribute is a previously imported submodule of this - # target module, optimize this edge case. - if target_module.is_submodule(target_submodule_partname): - # Graph node for this submodule. - target_submodule = target_module.get_submodule( - target_submodule_partname) - - #FIXME: What? Shouldn't "target_submodule" *ALWAYS* be - #non-None here? Assert this to be non-None instead. - if target_submodule is not None: - #FIXME: Why does duplication matter? List searches are - #mildly expensive. - - # If this submodule has not already been added to the - # list of submodules to be returned, do so. - if target_submodule not in target_modules: - self._updateReference( - source_module, - target_submodule, - edge_data=edge_attr) - target_modules.append(target_submodule) - continue - - # Fully-qualified name of this submodule. - target_submodule_name = ( - target_module.identifier + '.' + target_submodule_partname) - - # Graph node of this submodule if previously imported or None. - target_submodule = self.find_node(target_submodule_name) - - # If this submodule has not been imported, do so as if this - # submodule were the only attribute listed by the "import" - # clause of this import (e.g., as "from foo import bar" rather - # than "from foo import car, far, bar"). - if target_submodule is None: - # Attempt to import this submodule. - try: - # Ignore the list of graph nodes returned by this - # method. If both this submodule's package and this - # submodule are importable, this method returns a - # 2-element list whose second element is this - # submodule's graph node. However, if this submodule's - # package is importable but this submodule is not, - # this submodule is either: - # - # * An ignorable global attribute defined at the top - # level of this package's "__init__" submodule. In - # this case, this method returns a 1-element list - # without raising an exception. - # * A non-ignorable unimportable submodule. In this - # case, this method raises an "ImportError". - # - # While the first two cases are disambiguatable by the - # length of this list, doing so would render this code - # dependent on import_hook() details subject to change. - # Instead, call findNode() to decide the truthiness. - self.import_hook( - target_module_partname, source_module, - target_attr_names=[target_submodule_partname], - level=level, - edge_attr=edge_attr) - - # Graph node of this submodule imported by the prior - # call if importable or None otherwise. - target_submodule = self.find_node(target_submodule_name) - - # If this submodule does not exist, this *MUST* be an - # ignorable global attribute defined at the top level - # of this package's "__init__" submodule. - if target_submodule is None: - # Assert this to actually be the case. - assert target_module.is_global_attr( - target_submodule_partname), ( - 'No global named {} in {}.__init__'.format( - target_submodule_partname, - target_module.identifier)) - - # Skip this safely ignorable importation to the - # next attribute. See similar logic in the body of - # _import_importable_package_submodules(). - self.msg(4, '_safe_import_hook', 'ignoring imported non-module global', target_module.identifier, target_submodule_partname) - continue - - # If this is a SWIG C extension, instruct PyInstaller - # to freeze this extension under its unqualified rather - # than qualified name (e.g., as "_csr" rather than - # "scipy.sparse.sparsetools._csr"), permitting the - # implicit relative import in its parent SWIG module to - # successfully find this extension. - if is_swig_import: - # If a graph node with this name already exists, - # avoid collisions by emitting an error instead. - if self.find_node(target_submodule_partname): - self.msg( - 2, - 'SWIG import error: %r basename %r ' - 'already exists' % ( - target_submodule_name, - target_submodule_partname)) - else: - self.msg( - 4, - 'SWIG import renamed from %r to %r' % ( - target_submodule_name, - target_submodule_partname)) - target_submodule.identifier = ( - target_submodule_partname) - # If this submodule is unimportable, add a MissingModule. - except ImportError as msg: - self.msg(2, "ImportError:", str(msg)) - target_submodule = self.createNode( - MissingModule, target_submodule_name) - - # Add this submodule to its package. - target_module.add_submodule( - target_submodule_partname, target_submodule) - if target_submodule is not None: - self._updateReference( - target_module, target_submodule, edge_data=edge_attr) - self._updateReference( - source_module, target_submodule, edge_data=edge_attr) - - if target_submodule not in target_modules: - target_modules.append(target_submodule) - - # Return the list of all target modules imported by this call. - return target_modules - - - def _scan_code( - self, - module, - module_code_object, - module_code_object_ast=None): - """ - Parse and add all import statements from the passed code object of the - passed source module to this graph, recursively. - - **This method is at the root of all `ModuleGraph` recursion.** - Recursion begins here and ends when all import statements in all code - objects of all modules transitively imported by the source module - passed to the first call to this method have been added to the graph. - Specifically, this method: - - 1. If the passed `module_code_object_ast` parameter is non-`None`, - parses all import statements from this object. - 2. Else, parses all import statements from the passed - `module_code_object` parameter. - 1. For each such import statement: - 1. Adds to this `ModuleGraph` instance: - 1. Nodes for all target modules of these imports. - 1. Directed edges from this source module to these target - modules. - 2. Recursively calls this method with these target modules. - - Parameters - ---------- - module : Node - Graph node of the module to be parsed. - module_code_object : PyCodeObject - Code object providing this module's disassembled Python bytecode. - Ignored unless `module_code_object_ast` is `None`. - module_code_object_ast : optional[ast.AST] - Optional abstract syntax tree (AST) of this module if any or `None` - otherwise. Defaults to `None`, in which case the passed - `module_code_object` is parsed instead. - Returns - ---------- - module : Node - Graph node of the module to be parsed. - """ - - # For safety, guard against multiple scans of the same module by - # resetting this module's list of deferred target imports. - module._deferred_imports = [] - - # Parse all imports from this module *BEFORE* adding these imports to - # the graph. If an AST is provided, parse that rather than this - # module's code object. - if module_code_object_ast is not None: - # Parse this module's AST for imports. - self._scan_ast(module, module_code_object_ast) - - # Parse this module's code object for all relevant non-imports - # (e.g., global variable declarations and undeclarations). - self._scan_bytecode( - module, module_code_object, is_scanning_imports=False) - # Else, parse this module's code object for imports. - else: - self._scan_bytecode( - module, module_code_object, is_scanning_imports=True) - - return module - - def _scan_ast(self, module, module_code_object_ast): - """ - Parse and add all import statements from the passed abstract syntax - tree (AST) of the passed source module to this graph, non-recursively. - - Parameters - ---------- - module : Node - Graph node of the module to be parsed. - module_code_object_ast : ast.AST - Abstract syntax tree (AST) of this module to be parsed. - """ - - visitor = _Visitor(self, module) - visitor.visit(module_code_object_ast) - - #FIXME: Optimize. Global attributes added by this method are tested by - #other methods *ONLY* for packages, implying this method should scan and - #handle opcodes pertaining to global attributes (e.g., - #"STORE_NAME", "DELETE_GLOBAL") only if the passed "module" - #object is an instance of the "Package" class. For all other module types, - #these opcodes should simply be ignored. - # - #After doing so, the "Node._global_attr_names" attribute and all methods - #using this attribute (e.g., Node.is_global()) should be moved from the - #"Node" superclass to the "Package" subclass. - def _scan_bytecode( - self, module, module_code_object, is_scanning_imports): - """ - Parse and add all import statements from the passed code object of the - passed source module to this graph, non-recursively. - - This method parses all reasonably parsable operations (i.e., operations - that are both syntactically and semantically parsable _without_ - requiring Turing-complete interpretation) directly or indirectly - involving module importation from this code object. This includes: - - * `IMPORT_NAME`, denoting an import statement. Ignored unless - the passed `is_scanning_imports` parameter is `True`. - * `STORE_NAME` and `STORE_GLOBAL`, denoting the - declaration of a global attribute (e.g., class, variable) in this - module. This method stores each such declaration for subsequent - lookup. While global attributes are usually irrelevant to import - parsing, they remain the only means of distinguishing erroneous - non-ignorable attempts to import non-existent submodules of a package - from successful ignorable attempts to import existing global - attributes of a package's `__init__` submodule (e.g., the `bar` in - `from foo import bar`, which is either a non-ignorable submodule of - `foo` or an ignorable global attribute of `foo.__init__`). - * `DELETE_NAME` and `DELETE_GLOBAL`, denoting the - undeclaration of a previously declared global attribute in this - module. - - Since `ModuleGraph` is _not_ intended to replicate the behaviour of a - full-featured Turing-complete Python interpreter, this method ignores - operations that are _not_ reasonably parsable from this code object -- - even those directly or indirectly involving module importation. This - includes: - - * `STORE_ATTR(namei)`, implementing `TOS.name = TOS1`. If `TOS` is the - name of a target module currently imported into the namespace of the - passed source module, this opcode would ideally be parsed to add that - global attribute to that target module. Since this addition only - conditionally occurs on the importation of this source module and - execution of the code branch in this module performing this addition, - however, that global _cannot_ be unconditionally added to that target - module. In short, only Turing-complete behaviour suffices. - * `DELETE_ATTR(namei)`, implementing `del TOS.name`. If `TOS` is the - name of a target module currently imported into the namespace of the - passed source module, this opcode would ideally be parsed to remove - that global attribute from that target module. Again, however, only - Turing-complete behaviour suffices. - - Parameters - ---------- - module : Node - Graph node of the module to be parsed. - module_code_object : PyCodeObject - Code object of the module to be parsed. - is_scanning_imports : bool - `True` only if this method is parsing import statements from - `IMPORT_NAME` opcodes. If `False`, no import statements will be - parsed. This parameter is typically: - * `True` when parsing this module's code object for such imports. - * `False` when parsing this module's abstract syntax tree (AST) - (rather than code object) for such imports. In this case, that - parsing will have already parsed import statements, which this - parsing must avoid repeating. - """ - level = None - fromlist = None - - # 'deque' is a list-like container with fast appends, pops on - # either end, and automatically discarding elements too much. - prev_insts = deque(maxlen=2) - for inst in util.iterate_instructions(module_code_object): - if not inst: - continue - # If this is an import statement originating from this module, - # parse this import. - # - # Note that the related "IMPORT_FROM" opcode need *NOT* be parsed. - # "IMPORT_NAME" suffices. For further details, see - # http://probablyprogramming.com/2008/04/14/python-import_name - if inst.opname == 'IMPORT_NAME': - # If this method is ignoring import statements, skip to the - # next opcode. - if not is_scanning_imports: - continue - - # Python >=2.5: LOAD_CONST flags, LOAD_CONST names, IMPORT_NAME name - # - # Python 3.14 split LOAD_CONST into LOAD_CONST, LOAD_CONST_IMMORTAL, - # and LOAD_SMALL_INT. The former two can be used to load the names, - # while LOAD_SMALL_INT can be also used to load the flags. - if sys.version_info >= (3, 14): - assert prev_insts[-2].opname in {'LOAD_CONST', 'LOAD_CONST_IMMORTAL', 'LOAD_SMALL_INT'} - assert prev_insts[-1].opname in {'LOAD_CONST', 'LOAD_CONST_IMMORTAL'} - else: - assert prev_insts[-2].opname == 'LOAD_CONST' - assert prev_insts[-1].opname == 'LOAD_CONST' - - level = prev_insts[-2].argval - fromlist = prev_insts[-1].argval - - assert fromlist is None or type(fromlist) is tuple - target_module_partname = inst.argval - - #FIXME: The exact same logic appears in _collect_import(), - #which isn't particularly helpful. Instead, defer this logic - #until later by: - # - #* Refactor the "_deferred_imports" list to contain 2-tuples - # "(_safe_import_hook_args, _safe_import_hook_kwargs)" rather - # than 3-tuples "(have_star, _safe_import_hook_args, - # _safe_import_hook_kwargs)". - #* Stop prepending these tuples by a "have_star" boolean both - # here, in _collect_import(), and in _process_imports(). - #* Shift the logic below to _process_imports(). - #* Remove the same logic from _collect_import(). - have_star = False - if fromlist is not None: - fromlist = uniq(fromlist) - if '*' in fromlist: - fromlist.remove('*') - have_star = True - - # Record this import as originating from this module for - # subsequent handling by the _process_imports() method. - module._deferred_imports.append(( - have_star, - (target_module_partname, module, fromlist, level), - {} - )) - - elif inst.opname in ('STORE_NAME', 'STORE_GLOBAL'): - # If this is the declaration of a global attribute (e.g., - # class, variable) in this module, store this declaration for - # subsequent lookup. See method docstring for further details. - # - # Global attributes are usually irrelevant to import parsing, but - # remain the only means of distinguishing erroneous non-ignorable - # attempts to import non-existent submodules of a package from - # successful ignorable attempts to import existing global - # attributes of a package's "__init__" submodule (e.g., the "bar" - # in "from foo import bar", which is either a non-ignorable - # submodule of "foo" or an ignorable global attribute of - # "foo.__init__"). - name = inst.argval - module.add_global_attr(name) - - elif inst.opname in ('DELETE_NAME', 'DELETE_GLOBAL'): - # If this is the undeclaration of a previously declared global - # attribute (e.g., class, variable) in this module, remove that - # declaration to prevent subsequent lookup. See method docstring - # for further details. - name = inst.argval - module.remove_global_attr_if_found(name) - - prev_insts.append(inst) - - - def _process_imports(self, source_module): - """ - Graph all target modules whose importations were previously parsed from - the passed source module by a prior call to the `_scan_code()` method - and methods call by that method (e.g., `_scan_ast()`, - `_scan_bytecode()`, `_scan_bytecode_stores()`). - - Parameters - ---------- - source_module : Node - Graph node of the source module to graph target imports for. - """ - - # If this source module imported no target modules, noop. - if not source_module._deferred_imports: - return - - # For each target module imported by this source module... - for have_star, import_info, kwargs in source_module._deferred_imports: - # Graph node of the target module specified by the "from" portion - # of this "from"-style star import (e.g., an import resembling - # "from {target_module_name} import *") or ignored otherwise. - target_modules = self._safe_import_hook(*import_info, **kwargs) - if not target_modules: - # If _safe_import_hook suppressed the module, quietly drop it. - # Do not create an ExcludedModule instance, because that might - # completely suppress the module whereas it might need to be - # included due to reference from another module (that does - # not exclude it via hook). - continue - target_module = target_modules[0] - - # If this is a "from"-style star import, process this import. - if have_star: - #FIXME: Sadly, the current approach to importing attributes - #from "from"-style star imports is... simplistic. This should - #be revised as follows. If this target module is: - # - #* A package: - # * Whose "__init__" submodule defines the "__all__" global - # attribute, only attributes listed by this attribute should - # be imported. - # * Else, *NO* attributes should be imported. - #* A non-package: - # * Defining the "__all__" global attribute, only attributes - # listed by this attribute should be imported. - # * Else, only public attributes whose names are *NOT* - # prefixed by "_" should be imported. - source_module.add_global_attrs_from_module(target_module) - - source_module._starimported_ignored_module_names.update( - target_module._starimported_ignored_module_names) - - # If this target module has no code object and hence is - # unparsable, record its name for posterity. - if target_module.code is None: - target_module_name = import_info[0] - source_module._starimported_ignored_module_names.add( - target_module_name) - - # For safety, prevent these imports from being reprocessed. - source_module._deferred_imports = None - - - def _find_module(self, name, path, parent=None): - """ - 3-tuple describing the physical location of the module with the passed - name if this module is physically findable _or_ raise `ImportError`. - - This high-level method wraps the low-level `modulegraph.find_module()` - function with additional support for graph-based module caching. - - Parameters - ---------- - name : str - Fully-qualified name of the Python module to be found. - path : list - List of the absolute paths of all directories to search for this - module _or_ `None` if the default path list `self.path` is to be - searched. - parent : Node - Package containing this module if this module is a submodule of a - package _or_ `None` if this is a top-level module. - - Returns - ---------- - (filename, loader) - See `modulegraph._find_module()` for details. - - Raises - ---------- - ImportError - If this module is _not_ found. - """ - - if parent is not None: - # assert path is not None - fullname = parent.identifier + '.' + name - else: - fullname = name - - node = self.find_node(fullname) - if node is not None: - self.msg(3, "find_module: already included?", node) - raise ImportError(name) - - if path is None: - if name in sys.builtin_module_names: - return (None, BUILTIN_MODULE) - - path = self.path - - return self._find_module_path(fullname, name, path) - - - def _find_module_path(self, fullname, module_name, search_dirs): - """ - 3-tuple describing the physical location of the module with the passed - name if this module is physically findable _or_ raise `ImportError`. - - This low-level function is a variant on the standard `imp.find_module()` - function with additional support for: - - * Multiple search paths. The passed list of absolute paths will be - iteratively searched for the first directory containing a file - corresponding to this module. - * Compressed (e.g., zipped) packages. - - For efficiency, the higher level `ModuleGraph._find_module()` method - wraps this function with support for module caching. - - Parameters - ---------- - module_name : str - Fully-qualified name of the module to be found. - search_dirs : list - List of the absolute paths of all directories to search for this - module (in order). Searching will halt at the first directory - containing this module. - - Returns - ---------- - (filename, loader) - 2-tuple describing the physical location of this module, where: - * `filename` is the absolute path of this file. - * `loader` is the import loader. - In case of a namespace package, this is a NAMESPACE_PACKAGE - instance - - Raises - ---------- - ImportError - If this module is _not_ found. - """ - self.msgin(4, "_find_module_path <-", fullname, search_dirs) - - # Top-level 2-tuple to be returned. - path_data = None - - # List of the absolute paths of all directories comprising the - # namespace package to which this module belongs if any. - namespace_dirs = [] - - try: - for search_dir in search_dirs: - # PEP 302-compliant importer making loaders for this directory. - importer = pkgutil.get_importer(search_dir) - - # If this directory is not importable, continue. - if importer is None: - # self.msg(4, "_find_module_path importer not found", search_dir) - continue - - # Get the PEP 302-compliant loader object loading this module. - # - # If this importer defines the PEP 451-compliant find_spec() - # method, use that, and obtain loader from spec. This should - # be available on python >= 3.4. - if hasattr(importer, 'find_spec'): - loader = None - spec = importer.find_spec(module_name) - if spec is not None: - loader = spec.loader - namespace_dirs.extend(spec.submodule_search_locations or []) - # Else if this importer defines the PEP 302-compliant find_loader() - # method, use that. - elif hasattr(importer, 'find_loader'): - loader, loader_namespace_dirs = importer.find_loader( - module_name) - namespace_dirs.extend(loader_namespace_dirs) - # Else if this importer defines the Python 2-specific - # find_module() method, fall back to that. Despite the method - # name, this method returns a loader rather than a module. - elif hasattr(importer, 'find_module'): - loader = importer.find_module(module_name) - # Else, raise an exception. - else: - raise ImportError( - "Module %r importer %r loader unobtainable" % (module_name, importer)) - - # If this module is not loadable from this directory, continue. - if loader is None: - # self.msg(4, "_find_module_path loader not found", search_dir) - continue - - # Absolute path of this module. If this module resides in a - # compressed archive, this is the absolute path of this module - # after extracting this module from that archive and hence - # should not exist; else, this path should typically exist. - pathname = None - - # If this loader defines the PEP 302-compliant get_filename() - # method, preferably call that method first. Most if not all - # loaders (including zipimporter objects) define this method. - if hasattr(loader, 'get_filename'): - pathname = loader.get_filename(module_name) - # Else if this loader provides a "path" attribute, defer to that. - elif hasattr(loader, 'path'): - pathname = loader.path - # Else, raise an exception. - else: - raise ImportError( - "Module %r loader %r path unobtainable" % (module_name, loader)) - - # If no path was found, this is probably a namespace package. In - # such case, continue collecting namespace directories. - if pathname is None: - self.msg(4, "_find_module_path path not found", pathname) - continue - - # Return such metadata. - path_data = (pathname, loader) - break - # Else if this is a namespace package, return such metadata. - else: - if namespace_dirs: - path_data = (namespace_dirs[0], - NAMESPACE_PACKAGE(namespace_dirs)) - except UnicodeDecodeError as exc: - self.msgout(1, "_find_module_path -> unicode error", exc) - # Ensure that exceptions are logged, as this function is typically - # called by the import_module() method which squelches ImportErrors. - except Exception as exc: - self.msgout(4, "_find_module_path -> exception", exc) - raise - - # If this module was not found, raise an exception. - self.msgout(4, "_find_module_path ->", path_data) - if path_data is None: - raise ImportError("No module named " + repr(module_name)) - - return path_data - - - def create_xref(self, out=None): - global header, footer, entry, contpl, contpl_linked, imports - if out is None: - out = sys.stdout - scripts = [] - mods = [] - for mod in self.iter_graph(): - name = os.path.basename(mod.graphident) - if isinstance(mod, Script): - scripts.append((name, mod)) - else: - mods.append((name, mod)) - scripts.sort() - mods.sort() - scriptnames = [sn for sn, m in scripts] - scripts.extend(mods) - mods = scripts - - title = "modulegraph cross reference for " + ', '.join(scriptnames) - print(header % {"TITLE": title}, file=out) - - def sorted_namelist(mods): - lst = [os.path.basename(mod.graphident) for mod in mods if mod] - lst.sort() - return lst - for name, m in mods: - content = "" - if isinstance(m, BuiltinModule): - content = contpl % {"NAME": name, - "TYPE": "(builtin module)"} - elif isinstance(m, Extension): - content = contpl % {"NAME": name, - "TYPE": "%s" % m.filename} - else: - url = urllib.request.pathname2url(m.filename or "") - content = contpl_linked % {"NAME": name, "URL": url, - 'TYPE': m.__class__.__name__} - oute, ince = map(sorted_namelist, self.get_edges(m)) - if oute: - links = [] - for n in oute: - links.append(""" %s\n""" % (n, n)) - # #8226 = bullet-point; can't use html-entities since the - # test-suite uses xml.etree.ElementTree.XMLParser, which - # does't supprot them. - links = " • ".join(links) - content += imports % {"HEAD": "imports", "LINKS": links} - if ince: - links = [] - for n in ince: - links.append(""" %s\n""" % (n, n)) - # #8226 = bullet-point; can't use html-entities since the - # test-suite uses xml.etree.ElementTree.XMLParser, which - # does't supprot them. - links = " • ".join(links) - content += imports % {"HEAD": "imported by", "LINKS": links} - print(entry % {"NAME": name, "CONTENT": content}, file=out) - print(footer, file=out) - - def itergraphreport(self, name='G', flatpackages=()): - # XXX: Can this be implemented using Dot()? - nodes = list(map(self.graph.describe_node, self.graph.iterdfs(self))) - describe_edge = self.graph.describe_edge - edges = deque() - packagenodes = set() - packageidents = {} - nodetoident = {} - inpackages = {} - mainedges = set() - - # XXX - implement - flatpackages = dict(flatpackages) - - def nodevisitor(node, data, outgoing, incoming): - if not isinstance(data, Node): - return {'label': str(node)} - #if isinstance(d, (ExcludedModule, MissingModule, BadModule)): - # return None - s = ' ' + type(data).__name__ - for i, v in enumerate(data.infoTuple()[:1], 1): - s += '| %s' % (i, v) - return {'label': s, 'shape': 'record'} - - - def edgevisitor(edge, data, head, tail): - # XXX: This method nonsense, the edge - # data is never initialized. - if data == 'orphan': - return {'style': 'dashed'} - elif data == 'pkgref': - return {'style': 'dotted'} - return {} - - yield 'digraph %s {\ncharset="UTF-8";\n' % (name,) - attr = dict(rankdir='LR', concentrate='true') - cpatt = '%s="%s"' - for item in attr.items(): - yield '\t%s;\n' % (cpatt % item,) - - # find all packages (subgraphs) - for (node, data, outgoing, incoming) in nodes: - nodetoident[node] = getattr(data, 'graphident', None) - if isinstance(data, Package): - packageidents[data.graphident] = node - inpackages[node] = set([node]) - packagenodes.add(node) - - # create sets for subgraph, write out descriptions - for (node, data, outgoing, incoming) in nodes: - # update edges - for edge in (describe_edge(e) for e in outgoing): - edges.append(edge) - - # describe node - yield '\t"%s" [%s];\n' % ( - node, - ','.join([ - (cpatt % item) for item in - nodevisitor(node, data, outgoing, incoming).items() - ]), - ) - - inside = inpackages.get(node) - if inside is None: - inside = inpackages[node] = set() - ident = nodetoident[node] - if ident is None: - continue - pkgnode = packageidents.get(ident[:ident.rfind('.')]) - if pkgnode is not None: - inside.add(pkgnode) - - graph = [] - subgraphs = {} - for key in packagenodes: - subgraphs[key] = [] - - while edges: - edge, data, head, tail = edges.popleft() - if ((head, tail)) in mainedges: - continue - mainedges.add((head, tail)) - tailpkgs = inpackages[tail] - common = inpackages[head] & tailpkgs - if not common and tailpkgs: - usepkgs = sorted(tailpkgs) - if len(usepkgs) != 1 or usepkgs[0] != tail: - edges.append((edge, data, head, usepkgs[0])) - edges.append((edge, 'pkgref', usepkgs[-1], tail)) - continue - if common: - common = common.pop() - if tail == common: - edges.append((edge, data, tail, head)) - elif head == common: - subgraphs[common].append((edge, 'pkgref', head, tail)) - else: - edges.append((edge, data, common, head)) - edges.append((edge, data, common, tail)) - - else: - graph.append((edge, data, head, tail)) - - def do_graph(edges, tabs): - edgestr = tabs + '"%s" -> "%s" [%s];\n' - # describe edge - for (edge, data, head, tail) in edges: - attribs = edgevisitor(edge, data, head, tail) - yield edgestr % ( - head, - tail, - ','.join([(cpatt % item) for item in attribs.items()]), - ) - - for g, edges in subgraphs.items(): - yield '\tsubgraph "cluster_%s" {\n' % (g,) - yield '\t\tlabel="%s";\n' % (nodetoident[g],) - for s in do_graph(edges, '\t\t'): - yield s - yield '\t}\n' - - for s in do_graph(graph, '\t'): - yield s - - yield '}\n' - - def graphreport(self, fileobj=None, flatpackages=()): - if fileobj is None: - fileobj = sys.stdout - fileobj.writelines(self.itergraphreport(flatpackages=flatpackages)) - - def report(self): - """Print a report to stdout, listing the found modules with their - paths, as well as modules that are missing, or seem to be missing. - """ - print() - print("%-15s %-25s %s" % ("Class", "Name", "File")) - print("%-15s %-25s %s" % ("-----", "----", "----")) - for m in sorted(self.iter_graph(), key=lambda n: n.graphident): - if isinstance(m, AliasNode): - print("%-15s %-25s %s" % (type(m).__name__, m.graphident, m.identifier)) - else: - print("%-15s %-25s %s" % (type(m).__name__, m.graphident, m.filename or "")) - - def _replace_paths_in_code(self, co): - new_filename = original_filename = os.path.normpath(co.co_filename) - for f, r in self.replace_paths: - f = os.path.join(f, '') - r = os.path.join(r, '') - if original_filename.startswith(f): - new_filename = r + original_filename[len(f):] - break - - else: - return co - - consts = list(co.co_consts) - for i in range(len(consts)): - if isinstance(consts[i], type(co)): - consts[i] = self._replace_paths_in_code(consts[i]) - - return co.replace(co_consts=tuple(consts), co_filename=new_filename) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/util.py b/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/util.py deleted file mode 100755 index dab8c06..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/lib/modulegraph/util.py +++ /dev/null @@ -1,21 +0,0 @@ -import dis -import inspect - - -def iterate_instructions(code_object): - """Delivers the byte-code instructions as a continuous stream. - - Yields `dis.Instruction`. After each code-block (`co_code`), `None` is - yielded to mark the end of the block and to interrupt the steam. - """ - # The arg extension the EXTENDED_ARG opcode represents is automatically handled by get_instructions() but the - # instruction is left in. Get rid of it to make subsequent parsing easier/safer. - yield from (i for i in dis.get_instructions(code_object) if i.opname != "EXTENDED_ARG") - - yield None - - # For each constant in this code object that is itself a code object, - # parse this constant in the same manner. - for constant in code_object.co_consts: - if inspect.iscode(constant): - yield from iterate_instructions(constant) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/loader/__init__.py b/venv/lib/python3.12/site-packages/PyInstaller/loader/__init__.py deleted file mode 100755 index 792d600..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/loader/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# diff --git a/venv/lib/python3.12/site-packages/PyInstaller/loader/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/loader/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index c5772bb..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/loader/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/loader/__pycache__/pyiboot01_bootstrap.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/loader/__pycache__/pyiboot01_bootstrap.cpython-312.pyc deleted file mode 100644 index 53caf12..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/loader/__pycache__/pyiboot01_bootstrap.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/loader/__pycache__/pyimod01_archive.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/loader/__pycache__/pyimod01_archive.cpython-312.pyc deleted file mode 100644 index 04d1dbc..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/loader/__pycache__/pyimod01_archive.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/loader/__pycache__/pyimod02_importers.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/loader/__pycache__/pyimod02_importers.cpython-312.pyc deleted file mode 100644 index d3ca21b..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/loader/__pycache__/pyimod02_importers.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/loader/__pycache__/pyimod03_ctypes.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/loader/__pycache__/pyimod03_ctypes.cpython-312.pyc deleted file mode 100644 index f73a357..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/loader/__pycache__/pyimod03_ctypes.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/loader/__pycache__/pyimod04_pywin32.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/loader/__pycache__/pyimod04_pywin32.cpython-312.pyc deleted file mode 100644 index d3abe0e..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/loader/__pycache__/pyimod04_pywin32.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/loader/pyiboot01_bootstrap.py b/venv/lib/python3.12/site-packages/PyInstaller/loader/pyiboot01_bootstrap.py deleted file mode 100755 index b0da1dd..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/loader/pyiboot01_bootstrap.py +++ /dev/null @@ -1,95 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -#-- Start bootstrap process -# Only python built-in modules can be used. - -import sys - -import pyimod02_importers - -# Extend Python import machinery by adding PEP302 importers to sys.meta_path. -pyimod02_importers.install() - -#-- Bootstrap process is complete. -# We can use other python modules (e.g. os) - -import os # noqa: E402 - -# Let other python modules know that the code is running in frozen mode. -if not hasattr(sys, 'frozen'): - sys.frozen = True - -# sys._MEIPASS is now set in the bootloader. Hooray. - -# Python 3 C-API function Py_SetPath() resets sys.prefix to empty string. Python 2 was using PYTHONHOME for sys.prefix. -# Let's do the same for Python 3. -sys.prefix = sys._MEIPASS -sys.exec_prefix = sys.prefix - -# Python 3.3+ defines also sys.base_prefix. Let's set them too. -sys.base_prefix = sys.prefix -sys.base_exec_prefix = sys.exec_prefix - -# Some packages behave differently when running inside virtual environment. E.g., IPython tries to append path -# VIRTUAL_ENV to sys.path. For the frozen app we want to prevent this behavior. -VIRTENV = 'VIRTUAL_ENV' -if VIRTENV in os.environ: - # On some platforms (e.g., AIX) 'os.unsetenv()' is unavailable and deleting the var from os.environ does not - # delete it from the environment. - os.environ[VIRTENV] = '' - del os.environ[VIRTENV] - -# Ensure sys.path contains absolute paths. Otherwise, import of other python modules will fail when current working -# directory is changed by the frozen application. -python_path = [] -for pth in sys.path: - python_path.append(os.path.abspath(pth)) - sys.path = python_path - -# At least on Windows, Python seems to hook up the codecs on this import, so it is not enough to just package up all -# the encodings. -# -# It was also reported that without 'encodings' module, the frozen executable fails to load in some configurations: -# http://www.pyinstaller.org/ticket/651 -# -# Importing 'encodings' module in a run-time hook is not enough, since some run-time hooks require this module, and the -# order of running the code from the run-time hooks is not defined. -try: - import encodings # noqa: F401 -except ImportError: - pass - -# In the Python interpreter 'warnings' module is imported when 'sys.warnoptions' is not empty. Mimic this behavior. -if sys.warnoptions: - import warnings # noqa: F401 - -# Install the hooks for ctypes -import pyimod03_ctypes # noqa: E402 - -pyimod03_ctypes.install() - -# Install the hooks for pywin32 (Windows only) -if sys.platform.startswith('win'): - import pyimod04_pywin32 - pyimod04_pywin32.install() - -# Apply a hack for metadata that was collected from (unzipped) python eggs; the EGG-INFO directories are collected into -# their parent directories (my_package-version.egg/EGG-INFO), and for metadata to be discoverable by -# `importlib.metadata`, the .egg directory needs to be in `sys.path`. The deprecated `pkg_resources` does not have this -# limitation, and seems to work as long as the .egg directory's parent directory (in our case `sys._MEIPASS` is in -# `sys.path`. -for entry in os.listdir(sys._MEIPASS): - entry = os.path.join(sys._MEIPASS, entry) - if not os.path.isdir(entry): - continue - if entry.endswith('.egg'): - sys.path.append(entry) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/loader/pyimod01_archive.py b/venv/lib/python3.12/site-packages/PyInstaller/loader/pyimod01_archive.py deleted file mode 100755 index 2d70254..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/loader/pyimod01_archive.py +++ /dev/null @@ -1,140 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# **NOTE** This module is used during bootstrap. -# Import *ONLY* builtin modules or modules that are collected into the base_library.zip archive. -# List of built-in modules: sys.builtin_module_names -# List of modules collected into base_library.zip: PyInstaller.compat.PY3_BASE_MODULES - -import os -import struct -import marshal -import zlib - -# In Python3, the MAGIC_NUMBER value is available in the importlib module. However, in the bootstrap phase we cannot use -# importlib directly, but rather its frozen variant. -import _frozen_importlib - -PYTHON_MAGIC_NUMBER = _frozen_importlib._bootstrap_external.MAGIC_NUMBER - -# Type codes for PYZ PYZ entries -PYZ_ITEM_MODULE = 0 -PYZ_ITEM_PKG = 1 -PYZ_ITEM_DATA = 2 # deprecated; PYZ does not contain any data entries anymore -PYZ_ITEM_NSPKG = 3 # PEP-420 namespace package - - -class ArchiveReadError(RuntimeError): - pass - - -class ZlibArchiveReader: - """ - Reader for PyInstaller's PYZ (ZlibArchive) archive. The archive is used to store collected byte-compiled Python - modules, as individually-compressed entries. - """ - _PYZ_MAGIC_PATTERN = b'PYZ\0' - - def __init__(self, filename, start_offset=None, check_pymagic=False): - self._filename = filename - self._start_offset = start_offset - - self.toc = {} - - # If no offset is given, try inferring it from filename - if start_offset is None: - self._filename, self._start_offset = self._parse_offset_from_filename(filename) - - # Parse header and load TOC. Standard header contains 12 bytes: PYZ magic pattern, python bytecode magic - # pattern, and offset to TOC (32-bit integer). It might be followed by additional fields, depending on - # implementation version. - with open(self._filename, "rb") as fp: - # Read PYZ magic pattern, located at the start of the file - fp.seek(self._start_offset, os.SEEK_SET) - - magic = fp.read(len(self._PYZ_MAGIC_PATTERN)) - if magic != self._PYZ_MAGIC_PATTERN: - raise ArchiveReadError("PYZ magic pattern mismatch!") - - # Read python magic/version number - pymagic = fp.read(len(PYTHON_MAGIC_NUMBER)) - if check_pymagic and pymagic != PYTHON_MAGIC_NUMBER: - raise ArchiveReadError("Python magic pattern mismatch!") - - # Read TOC offset - toc_offset, *_ = struct.unpack('!i', fp.read(4)) - - # Load TOC - fp.seek(self._start_offset + toc_offset, os.SEEK_SET) - self.toc = dict(marshal.load(fp)) - - @staticmethod - def _parse_offset_from_filename(filename): - """ - Parse the numeric offset from filename, stored as: `/path/to/file?offset`. - """ - offset = 0 - - idx = filename.rfind('?') - if idx == -1: - return filename, offset - - try: - offset = int(filename[idx + 1:]) - filename = filename[:idx] # Remove the offset from filename - except ValueError: - # Ignore spurious "?" in the path (for example, like in Windows UNC \\?\). - pass - - return filename, offset - - def extract(self, name, raw=False): - """ - Extract data from entry with the given name. - - If the entry belongs to a module or a package, the data is loaded (unmarshaled) into code object. To retrieve - raw data, set `raw` flag to True. - """ - # Look up entry - entry = self.toc.get(name) - if entry is None: - raise KeyError(f"No entry named {name!r} found in the archive!") - - typecode, entry_offset, entry_length = entry - - # PEP-420 namespace package does not have a data blob. - if typecode == PYZ_ITEM_NSPKG: - return None - - # Read data blob - try: - with open(self._filename, "rb") as fp: - fp.seek(self._start_offset + entry_offset) - obj = fp.read(entry_length) - except FileNotFoundError: - # We open the archive file each time we need to read from it, to avoid locking the file by keeping it open. - # This allows executable to be deleted or moved (renamed) while it is running, which is useful in certain - # scenarios (e.g., automatic update that replaces the executable). The caveat is that once the executable is - # renamed, we cannot read from its embedded PYZ archive anymore. In such case, exit with informative - # message. - raise SystemExit( - f"ERROR: {self._filename} appears to have been moved or deleted since this application was launched. " - "Continouation from this state is impossible. Exiting now." - ) - - try: - obj = zlib.decompress(obj) - if typecode in (PYZ_ITEM_MODULE, PYZ_ITEM_PKG) and not raw: - obj = marshal.loads(obj) - except EOFError as e: - raise ImportError(f"Failed to unmarshal PYZ entry {name!r}!") from e - - return obj diff --git a/venv/lib/python3.12/site-packages/PyInstaller/loader/pyimod02_importers.py b/venv/lib/python3.12/site-packages/PyInstaller/loader/pyimod02_importers.py deleted file mode 100755 index 68c22bc..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/loader/pyimod02_importers.py +++ /dev/null @@ -1,781 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -PEP-302 and PEP-451 importers for frozen applications. -""" - -# **NOTE** This module is used during bootstrap. -# Import *ONLY* builtin modules or modules that are collected into the base_library.zip archive. -# List of built-in modules: sys.builtin_module_names -# List of modules collected into base_library.zip: PyInstaller.compat.PY3_BASE_MODULES - -import sys -import os -import io - -import _frozen_importlib -import _thread - -import pyimod01_archive - -if sys.flags.verbose and sys.stderr: - - def trace(msg, *a): - sys.stderr.write(msg % a) - sys.stderr.write("\n") -else: - - def trace(msg, *a): - pass - - -def _decode_source(source_bytes): - """ - Decode bytes representing source code and return the string. Universal newline support is used in the decoding. - Based on CPython's implementation of the same functionality: - https://github.com/python/cpython/blob/3.9/Lib/importlib/_bootstrap_external.py#L679-L688 - """ - # Local import to avoid including `tokenize` and its dependencies in `base_library.zip` - from tokenize import detect_encoding - source_bytes_readline = io.BytesIO(source_bytes).readline - encoding = detect_encoding(source_bytes_readline) - newline_decoder = io.IncrementalNewlineDecoder(decoder=None, translate=True) - return newline_decoder.decode(source_bytes.decode(encoding[0])) - - -# Global instance of PYZ archive reader. Initialized by install(). -pyz_archive = None - -# Some runtime hooks might need to traverse available frozen package/module hierarchy to simulate filesystem. -# Such traversals can be efficiently implemented using a prefix tree (trie), whose computation we defer until first -# access. -_pyz_tree_lock = _thread.RLock() -_pyz_tree = None - - -def get_pyz_toc_tree(): - global _pyz_tree - - with _pyz_tree_lock: - if _pyz_tree is None: - _pyz_tree = _build_pyz_prefix_tree(pyz_archive) - return _pyz_tree - - -# Populate list of unresolved (original) and resolved paths to top-level directory, used when trying to determine -# relative path. -_TOP_LEVEL_DIRECTORY_PATHS = [] - -# Original sys._MEIPASS value; ensure separators are normalized (e.g., when using msys2 python). -_TOP_LEVEL_DIRECTORY = os.path.normpath(sys._MEIPASS) -_TOP_LEVEL_DIRECTORY_PATHS.append(_TOP_LEVEL_DIRECTORY) - -# Fully resolve sys._MEIPASS in case its location is symlinked at some level; for example, system temporary directory -# (used by onefile builds) is usually a symbolic link under macOS. -_RESOLVED_TOP_LEVEL_DIRECTORY = os.path.realpath(_TOP_LEVEL_DIRECTORY) -if os.path.normcase(_RESOLVED_TOP_LEVEL_DIRECTORY) != os.path.normcase(_TOP_LEVEL_DIRECTORY): - _TOP_LEVEL_DIRECTORY_PATHS.append(_RESOLVED_TOP_LEVEL_DIRECTORY) - -# If we are running as macOS .app bundle, compute the alternative top-level directory path as well. -_is_macos_app_bundle = False -if sys.platform == 'darwin' and _TOP_LEVEL_DIRECTORY.endswith("Contents/Frameworks"): - _is_macos_app_bundle = True - - _ALTERNATIVE_TOP_LEVEL_DIRECTORY = os.path.join( - os.path.dirname(_TOP_LEVEL_DIRECTORY), - 'Resources', - ) - _TOP_LEVEL_DIRECTORY_PATHS.append(_ALTERNATIVE_TOP_LEVEL_DIRECTORY) - - _RESOLVED_ALTERNATIVE_TOP_LEVEL_DIRECTORY = os.path.join( - os.path.dirname(_RESOLVED_TOP_LEVEL_DIRECTORY), - 'Resources', - ) - if _RESOLVED_ALTERNATIVE_TOP_LEVEL_DIRECTORY != _ALTERNATIVE_TOP_LEVEL_DIRECTORY: - _TOP_LEVEL_DIRECTORY_PATHS.append(_RESOLVED_ALTERNATIVE_TOP_LEVEL_DIRECTORY) - - -# Helper for computing PYZ prefix tree -def _build_pyz_prefix_tree(pyz_archive): - tree = dict() - for entry_name, entry_data in pyz_archive.toc.items(): - name_components = entry_name.split('.') - typecode = entry_data[0] - current = tree - if typecode in {pyimod01_archive.PYZ_ITEM_PKG, pyimod01_archive.PYZ_ITEM_NSPKG}: - # Package; create new dictionary node for its modules - for name_component in name_components: - current = current.setdefault(name_component, {}) - else: - # Module; create the leaf node (empty string) - for name_component in name_components[:-1]: - current = current.setdefault(name_component, {}) - current[name_components[-1]] = '' - return tree - - -class PyiFrozenFinder: - """ - PyInstaller's frozen path entry finder for specific search path. - - Per-path instances allow us to properly translate the given module name ("fullname") into full PYZ entry name. - For example, with search path being `sys._MEIPASS`, the module "mypackage.mod" would translate to "mypackage.mod" - in the PYZ archive. However, if search path was `sys._MEIPASS/myotherpackage/_vendored` (for example, if - `myotherpacakge` added this path to `sys.path`), then "mypackage.mod" would need to translate to - "myotherpackage._vendored.mypackage.mod" in the PYZ archive. - """ - def __repr__(self): - return f"{self.__class__.__name__}({self._path})" - - @classmethod - def path_hook(cls, path): - trace(f"PyInstaller: running path finder hook for path: {path!r}") - try: - finder = cls(path) - trace("PyInstaller: hook succeeded") - return finder - except Exception as e: - trace(f"PyInstaller: hook failed: {e}") - raise - - def __init__(self, path): - self._path = path # Store original path, as given. - self._pyz_archive = pyz_archive - - # Compute relative path to the top-level application directory. Do not try to resolve the path itself, because - # it might contain symbolic links in parts other than the prefix that corresponds to the top-level application - # directory. See #8994 for an example (files symlinked from a common directory outside of the top-level - # application directory). Instead, try to compute relative path w.r.t. the original and the resolved top-level - # application directory. - for top_level_path in _TOP_LEVEL_DIRECTORY_PATHS: - try: - relative_path = os.path.relpath(path, top_level_path) - except ValueError: - continue # Failed to compute relative path w.r.t. the given top-level directory path. - - if relative_path.startswith('..'): - continue # Relative path points outside of the given top-level directory. - - break # Successful match; stop here. - else: - raise ImportError("Failed to determine relative path w.r.t. top-level application directory.") - - # Ensure that path does not point to a file on filesystem. Strictly speaking, we should be checking that the - # given path is a valid directory, but that would need to check both PYZ and filesystem. So for now, limit the - # check to catch paths pointing to file, because that breaks `runpy.run_path()`, as per #8767. - if os.path.isfile(path): - raise ImportError("only directories are supported") - - if relative_path == '.': - self._pyz_entry_prefix = '' - else: - self._pyz_entry_prefix = '.'.join(relative_path.split(os.path.sep)) - - def _compute_pyz_entry_name(self, fullname): - """ - Convert module fullname into PYZ entry name, subject to the prefix implied by this finder's search path. - """ - tail_module = fullname.rpartition('.')[2] - - if self._pyz_entry_prefix: - return self._pyz_entry_prefix + "." + tail_module - else: - return tail_module - - @property - def fallback_finder(self): - """ - Opportunistically create a *fallback finder* using `sys.path_hooks` entries that are located *after* our hook. - The main goal of this exercise is to obtain an instance of python's FileFinder, but in theory any other hook - that comes after ours is eligible to be a fallback. - - Having this fallback allows our finder to "cooperate" with python's FileFinder, as if the two were a single - finder, which allows us to work around the python's PathFinder permitting only one finder instance per path - without subclassing FileFinder. - """ - if hasattr(self, '_fallback_finder'): - return self._fallback_finder - - # Try to instantiate fallback finder - our_hook_found = False - - self._fallback_finder = None - for idx, hook in enumerate(sys.path_hooks): - if hook == self.path_hook: - our_hook_found = True - continue # Our hook - - if not our_hook_found: - continue # Skip hooks before our hook - - try: - self._fallback_finder = hook(self._path) - break - except ImportError: - pass - - return self._fallback_finder - - def _find_fallback_spec(self, fullname, target): - """ - Attempt to find the spec using fallback finder, which is opportunistically created here. Typically, this would - be python's FileFinder, which can discover specs for on-filesystem modules, such as extension modules and - modules that are collected only as source .py files. - - Having this fallback allows our finder to "cooperate" with python's FileFinder, as if the two were a single - finder, which allows us to work around the python's PathFinder permitting only one finder instance per path - without subclassing FileFinder. - """ - if not hasattr(self, '_fallback_finder'): - self._fallback_finder = self._get_fallback_finder() - - if self._fallback_finder is None: - return None - - return self._fallback_finder.find_spec(fullname, target) - - #-- Core PEP451 finder functionality, modeled after importlib.abc.PathEntryFinder - # https://docs.python.org/3/library/importlib.html#importlib.abc.PathEntryFinder - def invalidate_caches(self): - """ - A method which, when called, should invalidate any internal cache used by the finder. Used by - importlib.invalidate_caches() when invalidating the caches of all finders on sys.meta_path. - - https://docs.python.org/3/library/importlib.html#importlib.abc.MetaPathFinder.invalidate_caches - """ - # We do not use any caches, but if we have created a fallback finder, propagate the function call. - # NOTE: use getattr() with _fallback_finder attribute, in order to avoid unnecessary creation of the - # fallback finder in case when it does not exist yet. - fallback_finder = getattr(self, '_fallback_finder', None) - if fallback_finder is not None: - if hasattr(fallback_finder, 'invalidate_caches'): - fallback_finder.invalidate_caches() - - def find_spec(self, fullname, target=None): - """ - A method for finding a spec for the specified module. The finder will search for the module only within the - path entry to which it is assigned. If a spec cannot be found, None is returned. When passed in, target is a - module object that the finder may use to make a more educated guess about what spec to return. - - https://docs.python.org/3/library/importlib.html#importlib.abc.PathEntryFinder.find_spec - """ - trace(f"{self}: find_spec: called with fullname={fullname!r}, target={fullname!r}") - - # Convert fullname to PYZ entry name. - pyz_entry_name = self._compute_pyz_entry_name(fullname) - - # Try looking up the entry in the PYZ archive - entry_data = self._pyz_archive.toc.get(pyz_entry_name) - if entry_data is None: - # Entry not found - try using fallback finder (for example, python's own FileFinder) to resolve on-disk - # resources, such as extension modules and modules that are collected only as source .py files. - trace(f"{self}: find_spec: {fullname!r} not found in PYZ...") - - if self.fallback_finder is not None: - trace(f"{self}: find_spec: attempting resolve using fallback finder {self.fallback_finder!r}.") - fallback_spec = self.fallback_finder.find_spec(fullname, target) - trace(f"{self}: find_spec: fallback finder returned spec: {fallback_spec!r}.") - return fallback_spec - else: - trace(f"{self}: find_spec: fallback finder is not available.") - - return None - - # Entry found - typecode = entry_data[0] - trace(f"{self}: find_spec: found {fullname!r} in PYZ as {pyz_entry_name!r}, typecode={typecode}") - - if typecode == pyimod01_archive.PYZ_ITEM_NSPKG: - # PEP420 namespace package - # We can use regular list for submodule_search_locations; the caller (i.e., python's PathFinder) takes care - # of constructing _NamespacePath from it. - spec = _frozen_importlib.ModuleSpec(fullname, None) - spec.submodule_search_locations = [ - # NOTE: since we are using sys._MEIPASS as prefix, we need to construct path from resolved PYZ entry - # name (equivalently, we could combine `self._path` and last part of `fullname`). - os.path.join(sys._MEIPASS, pyz_entry_name.replace('.', os.path.sep)), - ] - return spec - - is_package = typecode == pyimod01_archive.PYZ_ITEM_PKG - - # Instantiate frozen loader for the module - loader = PyiFrozenLoader( - name=fullname, - pyz_archive=self._pyz_archive, - pyz_entry_name=pyz_entry_name, - is_package=is_package, - ) - - # Resolve full filename, as if the module/package was located on filesystem. This is done by the loader. - origin = loader.path - - # Construct spec for module, using all collected information. - spec = _frozen_importlib.ModuleSpec( - fullname, - loader, - is_package=is_package, - origin=origin, - ) - - # Make the import machinery set __file__. - # PEP 451 says: "has_location" is true if the module is locatable. In that case the spec's origin is used - # as the location and __file__ is set to spec.origin. If additional location information is required - # (e.g., zipimport), that information may be stored in spec.loader_state. - spec.has_location = True - - # Set submodule_search_locations for packages. Seems to be required for importlib_resources from 3.2.0; - # see issue #5395. - if is_package: - spec.submodule_search_locations = [os.path.dirname(origin)] - - return spec - - # The following methods are part of legacy PEP302 finder interface. They have been deprecated since python 3.4, - # and removed in python 3.12. Provide compatibility shims to accommodate code that might still be using them. - if sys.version_info[:2] < (3, 12): - - def find_loader(self, fullname): - """ - A legacy method for finding a loader for the specified module. Returns a 2-tuple of (loader, portion) where - portion is a sequence of file system locations contributing to part of a namespace package. The loader may - be None while specifying portion to signify the contribution of the file system locations to a namespace - package. An empty list can be used for portion to signify the loader is not part of a namespace package. If - loader is None and portion is the empty list then no loader or location for a namespace package were found - (i.e. failure to find anything for the module). - - Deprecated since python 3.4, removed in 3.12. - """ - # Based on: - # https://github.com/python/cpython/blob/v3.11.9/Lib/importlib/_bootstrap_external.py#L1587-L1600 - spec = self.find_spec(fullname) - if spec is None: - return None, [] - return spec.loader, spec.submodule_search_locations or [] - - def find_module(self, fullname): - """ - A concrete implementation of Finder.find_module() which is equivalent to self.find_loader(fullname)[0]. - - Deprecated since python 3.4, removed in 3.12. - """ - # Based on: - # https://github.com/python/cpython/blob/v3.11.9/Lib/importlib/_bootstrap_external.py#L1585 - # https://github.com/python/cpython/blob/v3.11.9/Lib/importlib/_bootstrap_external.py#L622-L639 - # - loader, portions = self.find_loader(fullname) - return loader - - -# Helper for enforcing module name in PyiFrozenLoader methods. -def _check_name(method): - def _check_name_wrapper(self, name, *args, **kwargs): - if self.name != name: - raise ImportError(f'loader for {self.name} cannot handle {name}', name=name) - return method(self, name, *args, **kwargs) - - return _check_name_wrapper - - -class PyiFrozenLoader: - """ - PyInstaller's frozen loader for modules in the PYZ archive, which are discovered by PyiFrozenFinder. - - Since this loader is instantiated only from PyiFrozenFinder and since each loader instance is tied to a specific - module, the fact that the loader was instantiated serves as the proof that the module exists in the PYZ archive. - Hence, we can avoid any additional validation in the implementation of the loader's methods. - """ - def __init__(self, name, pyz_archive, pyz_entry_name, is_package): - # Store the reference to PYZ archive (for code object retrieval), as well as full PYZ entry name - # and typecode, all of which are passed from the PyiFrozenFinder. - self._pyz_archive = pyz_archive - self._pyz_entry_name = pyz_entry_name - self._is_package = is_package - - # Compute the module file path, as if module was located on filesystem. - # - # Rather than returning path to the .pyc file, return the path to .py file - which might actually exist, if it - # was explicitly collected into the frozen application). This improves compliance with - # https://docs.python.org/3/library/importlib.html#importlib.abc.ExecutionLoader.get_filename - # as well as general compatibility with 3rd party code that blindly assumes that module's file path points to - # the source .py file. - # - # NOTE: since we are using sys._MEIPASS as prefix, we need to construct path from full PYZ entry name - # (so that a module with `name`=`jaraco.text` and `pyz_entry_name`=`setuptools._vendor.jaraco.text` - # ends up with path set to `sys._MEIPASS/setuptools/_vendor/jaraco/text/__init__.pyc` instead of - # `sys._MEIPASS/jaraco/text/__init__.pyc`). - if is_package: - module_file = os.path.join(sys._MEIPASS, pyz_entry_name.replace('.', os.path.sep), '__init__.py') - else: - module_file = os.path.join(sys._MEIPASS, pyz_entry_name.replace('.', os.path.sep) + '.py') - - # These properties are defined as part of importlib.abc.FileLoader. They are used by our implementation - # (e.g., module name validation, get_filename(), get_source(), get_resource_reader()), and might also be used - # by 3rd party code that naively expects to be dealing with a FileLoader instance. - self.name = name # The name of the module the loader can handle. - self.path = module_file # Path to the file of the module - - #-- Core PEP451 loader functionality as defined by importlib.abc.Loader - # https://docs.python.org/3/library/importlib.html#importlib.abc.Loader - def create_module(self, spec): - """ - A method that returns the module object to use when importing a module. This method may return None, indicating - that default module creation semantics should take place. - - https://docs.python.org/3/library/importlib.html#importlib.abc.Loader.create_module - """ - return None - - def exec_module(self, module): - """ - A method that executes the module in its own namespace when a module is imported or reloaded. The module - should already be initialized when exec_module() is called. When this method exists, create_module() - must be defined. - - https://docs.python.org/3/library/importlib.html#importlib.abc.Loader.exec_module - """ - spec = module.__spec__ - bytecode = self.get_code(spec.name) # NOTE: get_code verifies that `spec.name` matches `self.name`! - if bytecode is None: - raise RuntimeError(f"Failed to retrieve bytecode for {spec.name!r}!") - - # Set by the import machinery - assert hasattr(module, '__file__') - - # If `submodule_search_locations` is not None, this is a package; set __path__. - if spec.submodule_search_locations is not None: - module.__path__ = spec.submodule_search_locations - - exec(bytecode, module.__dict__) - - # The following method is part of legacy PEP302 loader interface. It has been deprecated since python 3.4, and - # slated for removal in python 3.12, although that has not happened yet. Provide compatibility shim to accommodate - # code that might still be using it. - if True: - - @_check_name - def load_module(self, fullname): - """ - A legacy method for loading a module. If the module cannot be loaded, ImportError is raised, otherwise the - loaded module is returned. - - Deprecated since python 3.4, slated for removal in 3.12 (but still present in python's own FileLoader in - both v3.12.4 and v3.13.0rc1). - """ - # Based on: - # https://github.com/python/cpython/blob/v3.11.9/Lib/importlib/_bootstrap_external.py#L942-L945 - import importlib._bootstrap as _bootstrap - return _bootstrap._load_module_shim(self, fullname) - - #-- PEP302 protocol extensions as defined by importlib.abc.ExecutionLoader - # https://docs.python.org/3/library/importlib.html#importlib.abc.ExecutionLoader - @_check_name - def get_filename(self, fullname): - """ - A method that is to return the value of __file__ for the specified module. If no path is available, ImportError - is raised. - - If source code is available, then the method should return the path to the source file, regardless of whether a - bytecode was used to load the module. - - https://docs.python.org/3/library/importlib.html#importlib.abc.ExecutionLoader.get_filename - """ - return self.path - - #-- PEP302 protocol extensions as defined by importlib.abc.InspectLoader - # https://docs.python.org/3/library/importlib.html#importlib.abc.InspectLoader - @_check_name - def get_code(self, fullname): - """ - Return the code object for a module, or None if the module does not have a code object (as would be the case, - for example, for a built-in module). Raise an ImportError if loader cannot find the requested module. - - https://docs.python.org/3/library/importlib.html#importlib.abc.InspectLoader.get_code - """ - return self._pyz_archive.extract(self._pyz_entry_name) - - @_check_name - def get_source(self, fullname): - """ - A method to return the source of a module. It is returned as a text string using universal newlines, translating - all recognized line separators into '\n' characters. Returns None if no source is available (e.g. a built-in - module). Raises ImportError if the loader cannot find the module specified. - - https://docs.python.org/3/library/importlib.html#importlib.abc.InspectLoader.get_source - """ - # The `path` attribute (which is also returned from `get_filename()`) already points to where the source .py - # file should exist, if it is available. - filename = self.path - - try: - # Read in binary mode, then decode - with open(filename, 'rb') as fp: - source_bytes = fp.read() - return _decode_source(source_bytes) - except FileNotFoundError: - pass - - # Source code is unavailable. - return None - - @_check_name - def is_package(self, fullname): - """ - A method to return a true value if the module is a package, a false value otherwise. ImportError is raised if - the loader cannot find the module. - - https://docs.python.org/3/library/importlib.html#importlib.abc.InspectLoader.is_package - """ - return self._is_package - - #-- PEP302 protocol extensions as dfined by importlib.abc.ResourceLoader - # https://docs.python.org/3/library/importlib.html#importlib.abc.ResourceLoader - def get_data(self, path): - """ - A method to return the bytes for the data located at path. Loaders that have a file-like storage back-end that - allows storing arbitrary data can implement this abstract method to give direct access to the data stored. - OSError is to be raised if the path cannot be found. The path is expected to be constructed using a module’s - __file__ attribute or an item from a package’s __path__. - - https://docs.python.org/3/library/importlib.html#importlib.abc.ResourceLoader.get_data - """ - # Try to fetch the data from the filesystem. Since __file__ attribute works properly, just try to open the file - # and read it. - with open(path, 'rb') as fp: - return fp.read() - - #-- Support for `importlib.resources`. - @_check_name - def get_resource_reader(self, fullname): - """ - Return resource reader compatible with `importlib.resources`. - """ - return PyiFrozenResourceReader(self) - - -class PyiFrozenResourceReader: - """ - Resource reader for importlib.resources / importlib_resources support. - - Supports only on-disk resources, which should cover the typical use cases, i.e., the access to data files; - PyInstaller collects data files onto filesystem, and as of v6.0.0, the embedded PYZ archive is guaranteed - to contain only .pyc modules. - - When listing resources, source .py files will not be listed as they are not collected by default. Similarly, - sub-directories that contained only .py files are not reconstructed on filesystem, so they will not be listed, - either. If access to .py files is required for whatever reason, they need to be explicitly collected as data files - anyway, which will place them on filesystem and make them appear as resources. - - For on-disk resources, we *must* return path compatible with pathlib.Path() in order to avoid copy to a temporary - file, which might break under some circumstances, e.g., metpy with importlib_resources back-port, due to: - https://github.com/Unidata/MetPy/blob/a3424de66a44bf3a92b0dcacf4dff82ad7b86712/src/metpy/plots/wx_symbols.py#L24-L25 - (importlib_resources tries to use 'fonts/wx_symbols.ttf' as a temporary filename suffix, which fails as it contains - a separator). - - Furthermore, some packages expect files() to return either pathlib.Path or zipfile.Path, e.g., - https://github.com/tensorflow/datasets/blob/master/tensorflow_datasets/core/utils/resource_utils.py#L81-L97 - This makes implementation of mixed support for on-disk and embedded resources using importlib.abc.Traversable - protocol rather difficult. - - So in order to maximize compatibility with unfrozen behavior, the below implementation is basically equivalent of - importlib.readers.FileReader from python 3.10: - https://github.com/python/cpython/blob/839d7893943782ee803536a47f1d4de160314f85/Lib/importlib/readers.py#L11 - and its underlying classes, importlib.abc.TraversableResources and importlib.abc.ResourceReader: - https://github.com/python/cpython/blob/839d7893943782ee803536a47f1d4de160314f85/Lib/importlib/abc.py#L422 - https://github.com/python/cpython/blob/839d7893943782ee803536a47f1d4de160314f85/Lib/importlib/abc.py#L312 - """ - def __init__(self, loader): - # Local import to avoid including `pathlib` and its dependencies in `base_library.zip` - import pathlib - # This covers both modules and (regular) packages. Note that PEP-420 namespace packages are not handled by this - # resource reader (since they are not handled by PyiFrozenLoader, which uses this reader). - self.path = pathlib.Path(loader.path).parent - - def open_resource(self, resource): - return self.files().joinpath(resource).open('rb') - - def resource_path(self, resource): - return str(self.path.joinpath(resource)) - - def is_resource(self, path): - return self.files().joinpath(path).is_file() - - def contents(self): - return (item.name for item in self.files().iterdir()) - - def files(self): - return self.path - - -class PyiFrozenEntryPointLoader: - """ - A special loader that enables retrieval of the code-object for the __main__ module. - """ - def __repr__(self): - return self.__class__.__name__ - - def get_code(self, fullname): - if fullname == '__main__': - # Special handling for __main__ module; the bootloader should store code object to _pyi_main_co - # attribute of the module. - return sys.modules['__main__']._pyi_main_co - - raise ImportError(f'{self} cannot handle module {fullname!r}') - - -def install(): - """ - Install PyInstaller's frozen finders/loaders/importers into python's import machinery. - """ - # Setup PYZ archive reader. - # - # The bootloader should store the path to PYZ archive (the path to the PKG archive and the offset within it; for - # executable-embedded archive, this is for example /path/executable_name?117568) into _pyinstaller_pyz - # attribute of the sys module. - global pyz_archive - - if not hasattr(sys, '_pyinstaller_pyz'): - raise RuntimeError("Bootloader did not set sys._pyinstaller_pyz!") - - try: - pyz_archive = pyimod01_archive.ZlibArchiveReader(sys._pyinstaller_pyz, check_pymagic=True) - except Exception as e: - raise RuntimeError("Failed to setup PYZ archive reader!") from e - - delattr(sys, '_pyinstaller_pyz') - - # On Windows, there is finder called `_frozen_importlib.WindowsRegistryFinder`, which looks for Python module - # locations in Windows registry. The frozen application should not look for those, so remove this finder - # from `sys.meta_path`. - for entry in sys.meta_path: - if getattr(entry, '__name__', None) == 'WindowsRegistryFinder': - sys.meta_path.remove(entry) - break - - # Insert our hook for `PyiFrozenFinder` into `sys.path_hooks`. Place it after `zipimporter`, if available. - for idx, entry in enumerate(sys.path_hooks): - if getattr(entry, '__name__', None) == 'zipimporter': - trace(f"PyInstaller: inserting our finder hook at index {idx + 1} in sys.path_hooks.") - sys.path_hooks.insert(idx + 1, PyiFrozenFinder.path_hook) - break - else: - trace("PyInstaller: zipimporter hook not found in sys.path_hooks! Prepending our finder hook to the list.") - sys.path_hooks.insert(0, PyiFrozenFinder.path_hook) - - # Monkey-patch `zipimporter.get_source` to allow loading out-of-zip source .py files for modules that are - # in `base_library.zip`. - _patch_zipimporter_get_source() - - # Python might have already created a `FileFinder` for `sys._MEIPASS`. Remove the entry from path importer cache, - # so that next loading attempt creates `PyiFrozenFinder` instead. This could probably be avoided altogether if - # we refrained from adding `sys._MEIPASS` to `sys.path` until our importer hooks is in place. - sys.path_importer_cache.pop(sys._MEIPASS, None) - - # Set the PyiFrozenEntryPointLoader as loader for __main__, in order for python to treat __main__ as a module - # instead of a built-in, and to allow its code object to be retrieved. - try: - sys.modules['__main__'].__loader__ = PyiFrozenEntryPointLoader() - except Exception: - pass - - # Apply hack for python >= 3.11 and its frozen stdlib modules. - if sys.version_info >= (3, 11): - _fixup_frozen_stdlib() - - -# A hack for python >= 3.11 and its frozen stdlib modules. Unless `sys._stdlib_dir` is set, these modules end up -# missing __file__ attribute, which causes problems with 3rd party code. At the time of writing, python interpreter -# configuration API does not allow us to influence `sys._stdlib_dir` - it always resets it to `None`. Therefore, -# we manually set the path, and fix __file__ attribute on modules. -def _fixup_frozen_stdlib(): - import _imp # built-in - - # If sys._stdlib_dir is None or empty, override it with sys._MEIPASS - if not sys._stdlib_dir: - try: - sys._stdlib_dir = sys._MEIPASS - except AttributeError: - pass - - # The sys._stdlib_dir set above should affect newly-imported python-frozen modules. However, most of them have - # been already imported during python initialization and our bootstrap, so we need to retroactively fix their - # __file__ attribute. - for module_name, module in sys.modules.items(): - if not _imp.is_frozen(module_name): - continue - - is_pkg = _imp.is_frozen_package(module_name) - - # Determine "real" name from __spec__.loader_state. - loader_state = module.__spec__.loader_state - - orig_name = loader_state.origname - if is_pkg: - orig_name += '.__init__' - - # We set suffix to .pyc to be consistent with our PyiFrozenLoader. - filename = os.path.join(sys._MEIPASS, *orig_name.split('.')) + '.pyc' - - # Fixup the __file__ attribute - if not hasattr(module, '__file__'): - try: - module.__file__ = filename - except AttributeError: - pass - - # Fixup the loader_state.filename - # Except for _frozen_importlib (importlib._bootstrap), whose loader_state.filename appears to be left at - # None in python. - if loader_state.filename is None and orig_name != 'importlib._bootstrap': - loader_state.filename = filename - - -# Monkey-patch the `get_source` implementation of python's `zipimport.zipimporter` with our custom implementation that -# looks up for source files in top-level application directory instead of within the zip file. This allows us to collect -# source .py files for modules that are collected in the `base_library.zip` in the same way as for modules in the PYZ -# archive. -def _patch_zipimporter_get_source(): - import zipimport - - _orig_get_source = zipimport.zipimporter.get_source - - def _get_source(self, fullname): - # Call original implementation first, in case we are dealing with a zip file other than `base_library.zip` (or - # if the source .py file is actually in there, for whatever reason). This also implicitly validates the module - # name, as it raises exception if module does not exist and returns None if module exists but the source code - # is not present in the archive. - source = _orig_get_source(self, fullname) - if source is not None: - return source - - # Our override should apply only to `base_library.zip`. - if os.path.basename(self.archive) != 'base_library.zip': - return None - - # Translate module/package name into .py filename in the top-level application directory. - if self.is_package(fullname): - filename = os.path.join(*fullname.split('.'), '__init__.py') - else: - filename = os.path.join(*fullname.split('.')) + '.py' - filename = os.path.join(_RESOLVED_TOP_LEVEL_DIRECTORY, filename) - - try: - # Read in binary mode, then decode - with open(filename, 'rb') as fp: - source_bytes = fp.read() - return _decode_source(source_bytes) - except FileNotFoundError: - pass - - # Source code is unavailable. - return None - - zipimport.zipimporter.get_source = _get_source diff --git a/venv/lib/python3.12/site-packages/PyInstaller/loader/pyimod03_ctypes.py b/venv/lib/python3.12/site-packages/PyInstaller/loader/pyimod03_ctypes.py deleted file mode 100755 index ccb9c8d..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/loader/pyimod03_ctypes.py +++ /dev/null @@ -1,131 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License with exception -# for distributing bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -#----------------------------------------------------------------------------- -""" -Hooks to make ctypes.CDLL, .PyDLL, etc. look in sys._MEIPASS first. -""" - -import sys - - -def install(): - """ - Install the hooks. - - This must be done from a function as opposed to at module-level, because when the module is imported/executed, - the import machinery is not completely set up yet. - """ - - import os - - try: - import ctypes - except ImportError: - # ctypes is not included in the frozen application - return - - def _frozen_name(name): - # If the given (file)name does not exist, fall back to searching for its basename in sys._MEIPASS, where - # PyInstaller usually collects shared libraries. - if name and not os.path.isfile(name): - frozen_name = os.path.join(sys._MEIPASS, os.path.basename(name)) - if os.path.isfile(frozen_name): - name = frozen_name - return name - - class PyInstallerImportError(OSError): - def __init__(self, name): - self.msg = ( - "Failed to load dynlib/dll %r. Most likely this dynlib/dll was not found when the application " - "was frozen." % name - ) - self.args = (self.msg,) - - class PyInstallerCDLL(ctypes.CDLL): - def __init__(self, name, *args, **kwargs): - name = _frozen_name(name) - try: - super().__init__(name, *args, **kwargs) - except Exception as base_error: - raise PyInstallerImportError(name) from base_error - - ctypes.CDLL = PyInstallerCDLL - ctypes.cdll = ctypes.LibraryLoader(PyInstallerCDLL) - - class PyInstallerPyDLL(ctypes.PyDLL): - def __init__(self, name, *args, **kwargs): - name = _frozen_name(name) - try: - super().__init__(name, *args, **kwargs) - except Exception as base_error: - raise PyInstallerImportError(name) from base_error - - ctypes.PyDLL = PyInstallerPyDLL - ctypes.pydll = ctypes.LibraryLoader(PyInstallerPyDLL) - - if sys.platform.startswith('win'): - - class PyInstallerWinDLL(ctypes.WinDLL): - def __init__(self, name, *args, **kwargs): - name = _frozen_name(name) - try: - super().__init__(name, *args, **kwargs) - except Exception as base_error: - raise PyInstallerImportError(name) from base_error - - ctypes.WinDLL = PyInstallerWinDLL - ctypes.windll = ctypes.LibraryLoader(PyInstallerWinDLL) - - class PyInstallerOleDLL(ctypes.OleDLL): - def __init__(self, name, *args, **kwargs): - name = _frozen_name(name) - try: - super().__init__(name, *args, **kwargs) - except Exception as base_error: - raise PyInstallerImportError(name) from base_error - - ctypes.OleDLL = PyInstallerOleDLL - ctypes.oledll = ctypes.LibraryLoader(PyInstallerOleDLL) - - try: - import ctypes.util - except ImportError: - # ctypes.util is not included in the frozen application - return - - # Same implementation as ctypes.util.find_library, except it prepends sys._MEIPASS to the search directories. - def pyinstaller_find_library(name): - if name in ('c', 'm'): - return ctypes.util.find_msvcrt() - # See MSDN for the REAL search order. - search_dirs = [sys._MEIPASS] + os.environ['PATH'].split(os.pathsep) - for directory in search_dirs: - fname = os.path.join(directory, name) - if os.path.isfile(fname): - return fname - if fname.lower().endswith(".dll"): - continue - fname = fname + ".dll" - if os.path.isfile(fname): - return fname - return None - - ctypes.util.find_library = pyinstaller_find_library - - -# On macOS insert sys._MEIPASS in the first position of the list of paths that ctypes uses to search for libraries. -# -# Note: 'ctypes' module will NOT be bundled with every app because code in this module is not scanned for module -# dependencies. It is safe to wrap 'ctypes' module into 'try/except ImportError' block. -if sys.platform.startswith('darwin'): - try: - from ctypes.macholib import dyld - dyld.DEFAULT_LIBRARY_FALLBACK.insert(0, sys._MEIPASS) - except ImportError: - # Do nothing when module 'ctypes' is not available. - pass diff --git a/venv/lib/python3.12/site-packages/PyInstaller/loader/pyimod04_pywin32.py b/venv/lib/python3.12/site-packages/PyInstaller/loader/pyimod04_pywin32.py deleted file mode 100755 index b635d75..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/loader/pyimod04_pywin32.py +++ /dev/null @@ -1,56 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License with exception -# for distributing bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -#----------------------------------------------------------------------------- -""" -Set search path for pywin32 DLLs. Due to the large number of pywin32 modules, we use a single loader-level script -instead of per-module runtime hook scripts. -""" - -import os -import sys - - -def install(): - # Sub-directories containing extensions. In original python environment, these are added to `sys.path` by the - # `pywin32.pth` so the extensions end up treated as top-level modules. We attempt to preserve the directory - # layout, so we need to add these directories to `sys.path` ourselves. - pywin32_ext_paths = ('win32', 'pythonwin') - pywin32_ext_paths = [os.path.join(sys._MEIPASS, pywin32_ext_path) for pywin32_ext_path in pywin32_ext_paths] - pywin32_ext_paths = [path for path in pywin32_ext_paths if os.path.isdir(path)] - sys.path.extend(pywin32_ext_paths) - - # Additional handling of `pywin32_system32` DLL directory - pywin32_system32_path = os.path.join(sys._MEIPASS, 'pywin32_system32') - - if not os.path.isdir(pywin32_system32_path): - # Either pywin32 is not collected, or we are dealing with version that does not use the pywin32_system32 - # sub-directory. In the latter case, the pywin32 DLLs should be in `sys._MEIPASS`, and nothing - # else needs to be done here. - return - - # Add the DLL directory to `sys.path`. - # This is necessary because `__import_pywin32_system_module__` from `pywintypes` module assumes that in a frozen - # application, the pywin32 DLLs (`pythoncom3X.dll` and `pywintypes3X.dll`) that are normally found in - # `pywin32_system32` sub-directory in `sys.path` (site-packages, really) are located directly in `sys.path`. - # This obviously runs afoul of our attempts at preserving the directory layout and placing them in the - # `pywin32_system32` sub-directory instead of the top-level application directory. - sys.path.append(pywin32_system32_path) - - # Add the DLL directory to DLL search path using os.add_dll_directory(). - # This allows extensions from win32 directory (e.g., win32api, win32crypt) to be loaded on their own without - # importing pywintypes first. The extensions are linked against pywintypes3X.dll. - os.add_dll_directory(pywin32_system32_path) - - # Add the DLL directory to PATH. This is necessary under certain versions of - # Anaconda python, where `os.add_dll_directory` does not work. - path = os.environ.get('PATH', None) - if not path: - path = pywin32_system32_path - else: - path = pywin32_system32_path + os.pathsep + path - os.environ['PATH'] = path diff --git a/venv/lib/python3.12/site-packages/PyInstaller/log.py b/venv/lib/python3.12/site-packages/PyInstaller/log.py deleted file mode 100755 index 7c5b5ce..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/log.py +++ /dev/null @@ -1,64 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Logging module for PyInstaller. -""" - -__all__ = ['getLogger', 'INFO', 'WARN', 'DEBUG', 'TRACE', 'ERROR', 'FATAL', 'DEPRECATION'] - -import os -import logging -from logging import DEBUG, ERROR, FATAL, INFO, WARN, getLogger - -TRACE = DEBUG - 5 -logging.addLevelName(TRACE, 'TRACE') -DEPRECATION = WARN + 5 -logging.addLevelName(DEPRECATION, 'DEPRECATION') -LEVELS = { - 'TRACE': TRACE, - 'DEBUG': DEBUG, - 'INFO': INFO, - 'WARN': WARN, - 'DEPRECATION': DEPRECATION, - 'ERROR': ERROR, - 'FATAL': FATAL, -} - -FORMAT = '%(relativeCreated)d %(levelname)s: %(message)s' -_env_level = os.environ.get("PYI_LOG_LEVEL", "INFO") -try: - level = LEVELS[_env_level.upper()] -except KeyError: - raise SystemExit(f"ERROR: Invalid PYI_LOG_LEVEL value '{_env_level}'. Should be one of {list(LEVELS)}.") -logging.basicConfig(format=FORMAT, level=level) -logger = getLogger('PyInstaller') - - -def __add_options(parser): - parser.add_argument( - '--log-level', - choices=LEVELS, - metavar="LEVEL", - dest='loglevel', - help='Amount of detail in build-time console messages. LEVEL may be one of %s (default: INFO). ' - 'Also settable via and overrides the PYI_LOG_LEVEL environment variable.' % ', '.join(LEVELS), - ) - - -def __process_options(parser, opts): - if opts.loglevel: - try: - level = opts.loglevel.upper() - _level = LEVELS[level] - except KeyError: - parser.error('Unknown log level `%s`' % opts.loglevel) - logger.setLevel(_level) - os.environ["PYI_LOG_LEVEL"] = level diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/__init__.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/__init__.py deleted file mode 100755 index 792d600..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index dcd7f93..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/__pycache__/conftest.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/__pycache__/conftest.cpython-312.pyc deleted file mode 100644 index 33e2e64..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/__pycache__/conftest.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/__pycache__/misc.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/__pycache__/misc.cpython-312.pyc deleted file mode 100644 index 08f1a24..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/__pycache__/misc.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/__pycache__/osx.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/__pycache__/osx.cpython-312.pyc deleted file mode 100644 index 3a06991..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/__pycache__/osx.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/__pycache__/run_tests.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/__pycache__/run_tests.cpython-312.pyc deleted file mode 100644 index da62c7a..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/__pycache__/run_tests.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/__pycache__/tests.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/__pycache__/tests.cpython-312.pyc deleted file mode 100644 index 58484b6..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/__pycache__/tests.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/__init__.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/__init__.py deleted file mode 100755 index 792d600..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index a7e512d..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/__pycache__/archive_viewer.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/__pycache__/archive_viewer.cpython-312.pyc deleted file mode 100644 index 74e7a01..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/__pycache__/archive_viewer.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/__pycache__/bindepend.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/__pycache__/bindepend.cpython-312.pyc deleted file mode 100644 index af52f05..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/__pycache__/bindepend.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/__pycache__/grab_version.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/__pycache__/grab_version.cpython-312.pyc deleted file mode 100644 index 71e01fd..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/__pycache__/grab_version.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/__pycache__/makespec.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/__pycache__/makespec.cpython-312.pyc deleted file mode 100644 index 9938358..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/__pycache__/makespec.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/__pycache__/set_version.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/__pycache__/set_version.cpython-312.pyc deleted file mode 100644 index 0689c61..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/__pycache__/set_version.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/archive_viewer.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/archive_viewer.py deleted file mode 100755 index 24d3fc5..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/archive_viewer.py +++ /dev/null @@ -1,271 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Viewer for PyInstaller-generated archives. -""" - -import argparse -import os -import sys - -import PyInstaller.log -from PyInstaller.archive.readers import CArchiveReader, ZlibArchiveReader - -try: - from argcomplete import autocomplete -except ImportError: - - def autocomplete(parser): - return None - - -class ArchiveViewer: - def __init__(self, filename, interactive_mode, recursive_mode, brief_mode): - self.filename = filename - self.interactive_mode = interactive_mode - self.recursive_mode = recursive_mode - self.brief_mode = brief_mode - - self.stack = [] - - # Recursive mode implies non-interactive mode - if self.recursive_mode: - self.interactive_mode = False - - def main(self): - # Open top-level (initial) archive - archive = self._open_toplevel_archive(self.filename) - archive_name = os.path.basename(self.filename) - self.stack.append((archive_name, archive)) - - # Not-interactive mode - if not self.interactive_mode: - return self._non_interactive_processing() - - # Interactive mode; show top-level archive - self._show_archive_contents(archive_name, archive) - - # Interactive command processing - while True: - # Read command - try: - tokens = input('? ').split(None, 1) - except EOFError: - # Ctrl-D - print(file=sys.stderr) # Clear line. - break - - # Print usage? - if not tokens: - self._print_usage() - continue - - # Process - command = tokens[0].upper() - if command == 'Q': - break - elif command == 'U': - self._move_up_the_stack() - elif command == 'O': - self._open_embedded_archive(*tokens[1:]) - elif command == 'X': - self._extract_file(*tokens[1:]) - elif command == 'S': - archive_name, archive = self.stack[-1] - self._show_archive_contents(archive_name, archive) - else: - self._print_usage() - - def _non_interactive_processing(self): - archive_count = 0 - - while self.stack: - archive_name, archive = self.stack.pop() - archive_count += 1 - - if archive_count > 1: - print("") - self._show_archive_contents(archive_name, archive) - - if not self.recursive_mode: - continue - - # Scan for embedded archives - if isinstance(archive, CArchiveReader): - for name, (*_, typecode) in archive.toc.items(): - if typecode == 'z': - try: - embedded_archive = archive.open_embedded_archive(name) - except Exception as e: - print(f"Could not open embedded archive {name!r}: {e}", file=sys.stderr) - self.stack.append((name, embedded_archive)) - - def _print_usage(self): - print("U: go up one level", file=sys.stderr) - print("O : open embedded archive with given name", file=sys.stderr) - print("X : extract file with given name", file=sys.stderr) - print("S: list the contents of current archive again", file=sys.stderr) - print("Q: quit", file=sys.stderr) - - def _move_up_the_stack(self): - if len(self.stack) > 1: - self.stack.pop() - archive_name, archive = self.stack[-1] - self._show_archive_contents(archive_name, archive) - else: - print("Already in the top archive!", file=sys.stderr) - - def _open_toplevel_archive(self, filename): - if not os.path.isfile(filename): - print(f"Archive {filename} does not exist!", file=sys.stderr) - sys.exit(1) - - if filename[-4:].lower() == '.pyz': - return ZlibArchiveReader(filename) - return CArchiveReader(filename) - - def _open_embedded_archive(self, archive_name=None): - # Ask for name if not provided - if not archive_name: - archive_name = input('Open name? ') - archive_name = archive_name.strip() - - # No name given; abort - if not archive_name: - return - - # Open the embedded archive - _, parent_archive = self.stack[-1] - - if not hasattr(parent_archive, 'open_embedded_archive'): - print("Archive does not support embedded archives!", file=sys.stderr) - return - - try: - archive = parent_archive.open_embedded_archive(archive_name) - except Exception as e: - print(f"Could not open embedded archive {archive_name!r}: {e}", file=sys.stderr) - return - - # Add to stack and display contents - self.stack.append((archive_name, archive)) - self._show_archive_contents(archive_name, archive) - - def _extract_file(self, name=None): - # Ask for name if not provided - if not name: - name = input('Extract name? ') - name = name.strip() - - # Archive - archive_name, archive = self.stack[-1] - - # Retrieve data - try: - if isinstance(archive, CArchiveReader): - data = archive.extract(name) - elif isinstance(archive, ZlibArchiveReader): - data = archive.extract(name, raw=True) - if data is None: - raise ValueError("Entry has no associated data!") - else: - raise NotImplementedError(f"Extraction from archive type {type(archive)} not implemented!") - except Exception as e: - print(f"Failed to extract data for entry {name!r} from {archive_name!r}: {e}", file=sys.stderr) - return - - # Write to file - filename = input('Output filename? ') - if not filename: - print(repr(data)) - else: - with open(filename, 'wb') as fp: - fp.write(data) - - def _show_archive_contents(self, archive_name, archive): - if isinstance(archive, CArchiveReader): - if archive.options: - print(f"Options in {archive_name!r} (PKG/CArchive):") - for option in archive.options: - print(f" {option}") - print(f"Contents of {archive_name!r} (PKG/CArchive):") - if self.brief_mode: - for name in archive.toc.keys(): - print(f" {name}") - else: - print(" position, length, uncompressed_length, is_compressed, typecode, name") - for name, (position, length, uncompressed_length, is_compressed, typecode) in archive.toc.items(): - print(f" {position}, {length}, {uncompressed_length}, {is_compressed}, {typecode!r}, {name!r}") - elif isinstance(archive, ZlibArchiveReader): - print(f"Contents of {archive_name!r} (PYZ):") - if self.brief_mode: - for name in archive.toc.keys(): - print(f" {name}") - else: - print(" typecode, position, length, name") - for name, (typecode, position, length) in archive.toc.items(): - print(f" {typecode}, {position}, {length}, {name!r}") - else: - print(f"Contents of {name} (unknown)") - print(f"FIXME: implement content listing for archive type {type(archive)}!") - - -def run(): - parser = argparse.ArgumentParser() - parser.add_argument( - '-l', - '--list', - default=False, - action='store_true', - dest='listing_mode', - help='List the archive contents and exit (default: %(default)s).', - ) - parser.add_argument( - '-r', - '--recursive', - default=False, - action='store_true', - dest='recursive', - help='Recursively print an archive log (default: %(default)s). Implies --list.', - ) - parser.add_argument( - '-b', - '--brief', - default=False, - action='store_true', - dest='brief', - help='When displaying archive contents, show only file names. (default: %(default)s).', - ) - PyInstaller.log.__add_options(parser) - parser.add_argument( - 'filename', - metavar='pyi_archive', - help="PyInstaller archive to process.", - ) - - autocomplete(parser) - args = parser.parse_args() - PyInstaller.log.__process_options(parser, args) - - try: - viewer = ArchiveViewer( - filename=args.filename, - interactive_mode=not args.listing_mode, - recursive_mode=args.recursive, - brief_mode=args.brief, - ) - viewer.main() - except KeyboardInterrupt: - raise SystemExit("Aborted by user.") - - -if __name__ == '__main__': - run() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/bindepend.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/bindepend.py deleted file mode 100755 index ebd5fdf..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/bindepend.py +++ /dev/null @@ -1,58 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Show dll dependencies of executable files or other dynamic libraries. -""" - -import argparse -import glob - -import PyInstaller.depend.bindepend -import PyInstaller.log - -try: - from argcomplete import autocomplete -except ImportError: - - def autocomplete(parser): - return None - - -def run(): - parser = argparse.ArgumentParser() - PyInstaller.log.__add_options(parser) - parser.add_argument( - 'filenames', - nargs='+', - metavar='executable-or-dynamic-library', - help="executables or dynamic libraries for which the dependencies should be shown", - ) - - autocomplete(parser) - args = parser.parse_args() - PyInstaller.log.__process_options(parser, args) - - # Suppress all informative messages from the dependency code. - PyInstaller.log.getLogger('PyInstaller.build.bindepend').setLevel(PyInstaller.log.WARN) - - try: - for input_filename_or_pattern in args.filenames: - for filename in glob.glob(input_filename_or_pattern): - print(f"{filename}:") - for lib_name, lib_path in sorted(PyInstaller.depend.bindepend.get_imports(filename)): - print(f" {lib_name} => {lib_path}") - print("") - except KeyboardInterrupt: - raise SystemExit("Aborted by user request.") - - -if __name__ == '__main__': - run() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/grab_version.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/grab_version.py deleted file mode 100755 index f8e1193..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/grab_version.py +++ /dev/null @@ -1,59 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -import argparse -import codecs - -try: - from argcomplete import autocomplete -except ImportError: - - def autocomplete(parser): - return None - - -def run(): - parser = argparse.ArgumentParser( - epilog=( - 'The printed output may be saved to a file, edited and used as the input for a version resource on any of ' - 'the executable targets in a PyInstaller .spec file.' - ) - ) - parser.add_argument( - 'exe_file', - metavar='exe-file', - help="full pathname of a Windows executable", - ) - parser.add_argument( - 'out_filename', - metavar='out-filename', - nargs='?', - default='file_version_info.txt', - help="filename where the grabbed version info will be saved", - ) - - autocomplete(parser) - args = parser.parse_args() - - try: - from PyInstaller.utils.win32 import versioninfo - info = versioninfo.read_version_info_from_executable(args.exe_file) - if not info: - raise SystemExit("ERROR: VersionInfo resource not found in exe") - with codecs.open(args.out_filename, 'w', 'utf-8') as fp: - fp.write(str(info)) - print(f"Version info written to: {args.out_filename!r}") - except KeyboardInterrupt: - raise SystemExit("Aborted by user request.") - - -if __name__ == '__main__': - run() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/makespec.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/makespec.py deleted file mode 100755 index 6225759..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/makespec.py +++ /dev/null @@ -1,61 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Automatically build a spec file containing the description of the project. -""" - -import argparse -import os - -import PyInstaller.building.makespec -import PyInstaller.log - -try: - from argcomplete import autocomplete -except ImportError: - - def autocomplete(parser): - return None - - -def generate_parser(): - p = argparse.ArgumentParser() - PyInstaller.building.makespec.__add_options(p) - PyInstaller.log.__add_options(p) - p.add_argument( - 'scriptname', - nargs='+', - ) - return p - - -def run(): - p = generate_parser() - autocomplete(p) - args = p.parse_args() - PyInstaller.log.__process_options(p, args) - - # Split pathex by using the path separator. - temppaths = args.pathex[:] - args.pathex = [] - for p in temppaths: - args.pathex.extend(p.split(os.pathsep)) - - try: - name = PyInstaller.building.makespec.main(args.scriptname, **vars(args)) - print('Wrote %s.' % name) - print('Now run pyinstaller.py to build the executable.') - except KeyboardInterrupt: - raise SystemExit("Aborted by user request.") - - -if __name__ == '__main__': - run() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/set_version.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/set_version.py deleted file mode 100755 index b936692..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/cliutils/set_version.py +++ /dev/null @@ -1,51 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -import argparse -import os - -try: - from argcomplete import autocomplete -except ImportError: - - def autocomplete(parser): - return None - - -def run(): - parser = argparse.ArgumentParser() - parser.add_argument( - 'info_file', - metavar='info-file', - help="text file containing version info", - ) - parser.add_argument( - 'exe_file', - metavar='exe-file', - help="full pathname of a Windows executable", - ) - autocomplete(parser) - args = parser.parse_args() - - info_file = os.path.abspath(args.info_file) - exe_file = os.path.abspath(args.exe_file) - - try: - from PyInstaller.utils.win32 import versioninfo - info = versioninfo.load_version_info_from_text_file(info_file) - versioninfo.write_version_info_to_executable(exe_file, info) - print(f"Version info written to: {exe_file!r}") - except KeyboardInterrupt: - raise SystemExit("Aborted by user request.") - - -if __name__ == '__main__': - run() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/conftest.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/conftest.py deleted file mode 100755 index a62b15d..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/conftest.py +++ /dev/null @@ -1,578 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -import contextlib -import copy -import glob -import logging -import os -import re -import shutil -import subprocess -import sys -import time - -# Set a handler for the root-logger to inhibit 'basicConfig()' (called in PyInstaller.log) is setting up a stream -# handler writing to stderr. This avoids log messages to be written (and captured) twice: once on stderr and -# once by pytests's caplog. -logging.getLogger().addHandler(logging.NullHandler()) - -# psutil is used for process tree clean-up on time-out when running the test frozen application. If unavailable -# (for example, on cygwin), we fall back to trying to terminate only the main application process. -try: - import psutil # noqa: E402 -except ModuleNotFoundError: - psutil = None - -import pytest # noqa: E402 - -from PyInstaller import __main__ as pyi_main # noqa: E402 -from PyInstaller import configure # noqa: E402 -from PyInstaller.compat import is_cygwin, is_darwin, is_win # noqa: E402 -from PyInstaller.depend.analysis import initialize_modgraph # noqa: E402 -from PyInstaller.archive.readers import pkg_archive_contents # noqa: E402 -from PyInstaller.utils.tests import gen_sourcefile # noqa: E402 -from PyInstaller.utils.win32 import winutils # noqa: E402 - -# Timeout for running the executable. If executable does not exit in this time, it is interpreted as a test failure. -_EXE_TIMEOUT = 3 * 60 # In sec. -# All currently supported platforms -SUPPORTED_OSES = {"darwin", "linux", "win32"} -# Have pyi_builder fixure clean-up the temporary directories of successful tests. Controlled by environment variable. -_PYI_BUILDER_CLEANUP = os.environ.get("PYI_BUILDER_CLEANUP", "1") == "1" - -# Fixtures -# -------- - - -def pytest_runtest_setup(item): - """ - Markers to skip tests based on the current platform. - https://pytest.org/en/stable/example/markers.html#marking-platform-specific-tests-with-pytest - - Available markers: see pytest.ini markers - - @pytest.mark.darwin (macOS) - - @pytest.mark.linux (GNU/Linux) - - @pytest.mark.win32 (Windows) - """ - supported_platforms = SUPPORTED_OSES.intersection(mark.name for mark in item.iter_markers()) - plat = sys.platform - if supported_platforms and plat not in supported_platforms: - pytest.skip(f"does not run on {plat}") - - -@pytest.hookimpl(tryfirst=True, hookwrapper=True) -def pytest_runtest_makereport(item, call): - # Execute all other hooks to obtain the report object. - outcome = yield - rep = outcome.get_result() - - # Set a report attribute for each phase of a call, which can be "setup", "call", "teardown". - setattr(item, f"rep_{rep.when}", rep) - - -# Return the base directory which contains the current test module. -def _get_base_dir(request): - return request.path.resolve().parent # pathlib.Path instance - - -# Directory with Python scripts for functional tests. -def _get_script_dir(request): - return _get_base_dir(request) / 'scripts' - - -# Directory with testing modules used in some tests. -def _get_modules_dir(request): - return _get_base_dir(request) / 'modules' - - -# Directory with .toc log files. -def _get_logs_dir(request): - return _get_base_dir(request) / 'logs' - - -# Return the directory where data for tests is located. -def _get_data_dir(request): - return _get_base_dir(request) / 'data' - - -# Directory with .spec files used in some tests. -def _get_spec_dir(request): - return _get_base_dir(request) / 'specs' - - -@pytest.fixture -def spec_dir(request): - """ - Return the directory where the test spec-files reside. - """ - return _get_spec_dir(request) - - -@pytest.fixture -def script_dir(request): - """ - Return the directory where the test scripts reside. - """ - return _get_script_dir(request) - - -# A fixture that copies test's data directory into test's temporary directory. The data directory is assumed to be -# `data/{test-name}` found next to the .py file that contains test. -@pytest.fixture -def data_dir( - # The request object for this test. Used to infer name of the test and location of the source .py file. - # See - # https://pytest.org/latest/builtin.html#_pytest.python.FixtureRequest - # and - # https://pytest.org/latest/fixture.html#fixtures-can-introspect-the-requesting-test-context. - request, - # The tmp_path object for this test. See: https://pytest.org/latest/tmp_path.html. - tmp_path -): - # Strip the leading 'test_' from the test's name. - test_name = request.function.__name__[5:] - - # Copy to data dir and return the path. - source_data_dir = _get_data_dir(request) / test_name - tmp_data_dir = tmp_path / 'data' - # Copy the data. - shutil.copytree(source_data_dir, tmp_data_dir) - # Return the temporary data directory, so that the copied data can now be used. - return tmp_data_dir - - -class AppBuilder: - def __init__(self, tmp_path, request, bundle_mode): - self._tmp_path = tmp_path - self._request = request - self._mode = bundle_mode - self._spec_dir = tmp_path - self._dist_dir = tmp_path / 'dist' - self._build_dir = tmp_path / 'build' - self._is_spec = False - - def test_spec(self, specfile, *args, **kwargs): - """ - Test a Python script that is referenced in the supplied .spec file. - """ - __tracebackhide__ = True - specfile = _get_spec_dir(self._request) / specfile - # 'test_script' should handle .spec properly as script. - self._is_spec = True - return self.test_script(specfile, *args, **kwargs) - - def test_source(self, source, *args, **kwargs): - """ - Test a Python script given as source code. - - The source will be written into a file named like the test-function. This file will then be passed to - `test_script`. If you need other related file, e.g., as `.toc`-file for testing the content, put it at at the - normal place. Just mind to take the basnename from the test-function's name. - - :param script: Source code to create executable from. This will be saved into a temporary file which is then - passed on to `test_script`. - - :param test_id: Test-id for parametrized tests. If given, it will be appended to the script filename, separated - by two underscores. - - All other arguments are passed straight on to `test_script`. - """ - __tracebackhide__ = True - # For parametrized test append the test-id. - scriptfile = gen_sourcefile(self._tmp_path, source, kwargs.setdefault('test_id')) - del kwargs['test_id'] - return self.test_script(scriptfile, *args, **kwargs) - - def _display_message(self, step_name, message): - # Print the given message to both stderr and stdout, and it with APP-BUILDER to make it clear where it - # originates from. - print(f'[APP-BUILDER:{step_name}] {message}', file=sys.stdout) - print(f'[APP-BUILDER:{step_name}] {message}', file=sys.stderr) - - def test_script( - self, script, pyi_args=None, app_name=None, app_args=None, runtime=None, run_from_path=False, **kwargs - ): - """ - Main method to wrap all phases of testing a Python script. - - :param script: Name of script to create executable from. - :param pyi_args: Additional arguments to pass to PyInstaller when creating executable. - :param app_name: Name of the executable. This is equivalent to argument --name=APPNAME. - :param app_args: Additional arguments to pass to - :param runtime: Time in seconds how long to keep executable running. - :param toc_log: List of modules that are expected to be bundled with the executable. - """ - __tracebackhide__ = True - - # Skip interactive tests (the ones with `runtime` set) if `psutil` is unavailable, as we need it to properly - # clean up the process tree. - if runtime and psutil is None: - pytest.skip('Interactive tests require psutil for proper cleanup.') - - if pyi_args is None: - pyi_args = [] - if app_args is None: - app_args = [] - - if app_name: - if not self._is_spec: - pyi_args.extend(['--name', app_name]) - else: - # Derive name from script name. - app_name = os.path.splitext(os.path.basename(script))[0] - - # Relative path means that a script from _script_dir is referenced. - if not os.path.isabs(script): - script = _get_script_dir(self._request) / script - self.script = str(script) # might be a pathlib.Path at this point! - assert os.path.exists(self.script), f'Script {self.script!r} not found.' - - self._display_message('TEST-SCRIPT', 'Starting build...') - if not self._test_building(args=pyi_args): - pytest.fail(f'Building of {script} failed.') - - self._display_message('TEST-SCRIPT', 'Build finished, now running executable...') - self._test_executables(app_name, args=app_args, runtime=runtime, run_from_path=run_from_path, **kwargs) - self._display_message('TEST-SCRIPT', 'Running executable finished.') - - def _test_executables(self, name, args, runtime, run_from_path, **kwargs): - """ - Run created executable to make sure it works. - - Multipackage-tests generate more than one exe-file and all of them have to be run. - - :param args: CLI options to pass to the created executable. - :param runtime: Time in seconds how long to keep the executable running. - - :return: Exit code of the executable. - """ - __tracebackhide__ = True - exes = self._find_executables(name) - # Empty list means that PyInstaller probably failed to create any executable. - assert exes != [], 'No executable file was found.' - for exe in exes: - # Try to find .toc log file. .toc log file has the same basename as exe file. - toc_log = os.path.splitext(os.path.basename(exe))[0] + '.toc' - toc_log = _get_logs_dir(self._request) / toc_log - if toc_log.exists(): - if not self._examine_executable(exe, toc_log): - pytest.fail(f'Matching .toc of {exe} failed.') - retcode = self._run_executable(exe, args, run_from_path, runtime) - if retcode != kwargs.get('retcode', 0): - pytest.fail(f'Running exe {exe} failed with return-code {retcode}.') - - def _find_executables(self, name): - """ - Search for all executables generated by the testcase. - - If the test-case is called e.g. 'test_multipackage1', this is searching for each of 'test_multipackage1.exe' - and 'multipackage1_?.exe' in both one-file- and one-dir-mode. - - :param name: Name of the executable to look for. - - :return: List of executables - """ - exes = [] - onedir_pt = str(self._dist_dir / name / name) - onefile_pt = str(self._dist_dir / name) - patterns = [ - onedir_pt, - onefile_pt, - # Multipackage one-dir - onedir_pt + '_?', - # Multipackage one-file - onefile_pt + '_?' - ] - # For Windows append .exe extension to patterns. - if is_win: - patterns = [pt + '.exe' for pt in patterns] - # For macOS append pattern for .app bundles. - if is_darwin: - # e.g: ./dist/name.app/Contents/MacOS/name - app_bundle_pt = str(self._dist_dir / f'{name}.app' / 'Contents' / 'MacOS' / name) - patterns.append(app_bundle_pt) - # Apply file patterns. - for pattern in patterns: - for prog in glob.glob(pattern): - if os.path.isfile(prog): - exes.append(prog) - return exes - - def _run_executable(self, prog, args, run_from_path, runtime): - """ - Run executable created by PyInstaller. - - :param args: CLI options to pass to the created executable. - """ - # Run the test in a clean environment to make sure they're really self-contained. - prog_env = copy.deepcopy(os.environ) - prog_env['PATH'] = '' - del prog_env['PATH'] - # For Windows we need to keep minimal PATH for successful running of some tests. - if is_win: - # Minimum Windows PATH is in most cases: C:\Windows\system32;C:\Windows - prog_env['PATH'] = os.pathsep.join(winutils.get_system_path()) - # Same for Cygwin - if /usr/bin is not in PATH, cygwin1.dll cannot be discovered. - if is_cygwin: - prog_env['PATH'] = os.pathsep.join(['/usr/local/bin', '/usr/bin']) - # On macOS, we similarly set up minimal PATH with system directories, in case utilities from there are used by - # tested python code (for example, matplotlib >= 3.9.0 uses `system_profiler` that is found in /usr/sbin). - if is_darwin: - # The following paths are registered when application is launched via Finder, and are a subset of what is - # typically available in the shell. - prog_env['PATH'] = os.pathsep.join(['/usr/bin', '/bin', '/usr/sbin', '/sbin']) - - exe_path = prog - if run_from_path: - # Run executable in the temp directory. Add the directory containing the executable to $PATH. Basically, - # pretend we are a shell executing the program from $PATH. - prog_cwd = str(self._tmp_path) - prog_name = os.path.basename(prog) - prog_env['PATH'] = os.pathsep.join([prog_env.get('PATH', ''), os.path.dirname(prog)]) - - else: - # Run executable in the directory where it is. - prog_cwd = os.path.dirname(prog) - # The executable will be called with argv[0] as relative not absolute path. - prog_name = os.path.join(os.curdir, os.path.basename(prog)) - - args = [prog_name] + args - # Using sys.stdout/sys.stderr for subprocess fixes printing messages in Windows command prompt. Py.test is then - # able to collect stdout/sterr messages and display them if a test fails. - return self._run_executable_(args, exe_path, prog_env, prog_cwd, runtime) - - def _run_executable_(self, args, exe_path, prog_env, prog_cwd, runtime): - # Use psutil.Popen, if available; otherwise, fall back to subprocess.Popen - popen_implementation = subprocess.Popen if psutil is None else psutil.Popen - - # Run the executable - self._display_message('RUN-EXE', f'Running {exe_path!r}, args: {args!r}') - start_time = time.time() - process = popen_implementation(args, executable=exe_path, env=prog_env, cwd=prog_cwd) - - # Wait for the process to finish. If no run-time (= timeout) is specified, we expect the process to exit on - # its own, and use global _EXE_TIMEOUT. If run-time is specified, we expect the application to be running - # for at least the specified amount of time, which is useful in "interactive" test applications that are not - # expected exit on their own. - stdout = stderr = None - try: - timeout = runtime if runtime else _EXE_TIMEOUT - stdout, stderr = process.communicate(timeout=timeout) - elapsed = time.time() - start_time - retcode = process.returncode - self._display_message( - 'RUN-EXE', f'Process exited on its own after {elapsed:.1f} seconds with return code {retcode}.' - ) - except (subprocess.TimeoutExpired) if psutil is None else (psutil.TimeoutExpired, subprocess.TimeoutExpired): - if runtime: - # When 'runtime' is set, the expired timeout is a good sign that the executable was running successfully - # for the specified time. - self._display_message('RUN-EXE', f'Process reached expected run-time of {runtime} seconds.') - retcode = 0 - else: - # Executable is still running and it is not interactive. Clean up the process tree, and fail the test. - self._display_message('RUN-EXE', f'Timeout while running executable (timeout: {timeout} seconds)!') - retcode = 1 - - if psutil is None: - # We are using subprocess.Popen(). Without psutil, we have no access to process tree; this poses a - # problem for onefile builds, where we would need to first kill the child (main application) process, - # and let the onefile parent perform its cleanup. As a best-effort approach, we can first call - # process.terminate(); on POSIX systems, this sends SIGTERM to the parent process, and in most - # situations, the bootloader will forward it to the child process. Then wait 5 seconds, and call - # process.kill() if necessary. On Windows, however, both process.terminate() and process.kill() do - # the same. Therefore, we should avoid running "interactive" tests with expected run-time if we do - # not have psutil available. - try: - self._display_message('RUN-EXE', 'Stopping the process using Popen.terminate()...') - process.terminate() - stdout, stderr = process.communicate(timeout=5) - self._display_message('RUN-EXE', 'Process stopped.') - except subprocess.TimeoutExpired: - # Kill the process. - try: - self._display_message('RUN-EXE', 'Stopping the process using Popen.kill()...') - process.kill() - # process.communicate() waits for end-of-file, which may never arrive if there is a child - # process still alive. Nothing we can really do about it here, so add a short timeout and - # display a warning. - stdout, stderr = process.communicate(timeout=1) - self._display_message('RUN-EXE', 'Process stopped.') - except subprocess.TimeoutExpired: - self._display_message('RUN-EXE', 'Failed to stop the process (or its child process(es))!') - else: - # We are using psutil.Popen(). First, force-kill all child processes; in onefile mode, this includes - # the application process, whose termination should trigger cleanup and exit of the parent onefile - # process. - self._display_message('RUN-EXE', 'Stopping child processes...') - for child_process in list(process.children(recursive=True)): - with contextlib.suppress(psutil.NoSuchProcess): - self._display_message('RUN-EXE', f'Stopping child process {child_process.pid}...') - child_process.kill() - - # Give the main process 5 seconds to exit on its own (to accommodate cleanup in onefile mode). - try: - self._display_message('RUN-EXE', f'Waiting for main process ({process.pid}) to stop...') - stdout, stderr = process.communicate(timeout=5) - self._display_message('RUN-EXE', 'Process stopped on its own.') - except (psutil.TimeoutExpired, subprocess.TimeoutExpired): - # End of the line - kill the main process. - self._display_message('RUN-EXE', 'Stopping the process using Popen.kill()...') - with contextlib.suppress(psutil.NoSuchProcess): - process.kill() - # Try to retrieve stdout/stderr - but keep a short timeout, just in case... - try: - stdout, stderr = process.communicate(timeout=1) - self._display_message('RUN-EXE', 'Process stopped.') - except (psutil.TimeoutExpired, subprocess.TimeoutExpire): - self._display_message('RUN-EXE', 'Failed to stop the process (or its child process(es))!') - - self._display_message('RUN-EXE', f'Done! Return code: {retcode}') - - return retcode - - def _test_building(self, args): - """ - Run building of test script. - - :param args: additional CLI options for PyInstaller. - - Return True if build succeeded False otherwise. - """ - if self._is_spec: - default_args = [ - '--distpath', str(self._dist_dir), - '--workpath', str(self._build_dir), - '--log-level', 'INFO', - ] # yapf: disable - else: - default_args = [ - '--debug=bootloader', - '--noupx', - '--specpath', str(self._spec_dir), - '--distpath', str(self._dist_dir), - '--workpath', str(self._build_dir), - '--path', str(_get_modules_dir(self._request)), - '--log-level', 'INFO', - ] # yapf: disable - - # Choose bundle mode. - if self._mode == 'onedir': - default_args.append('--onedir') - elif self._mode == 'onefile': - default_args.append('--onefile') - # if self._mode is None then just the spec file was supplied. - - pyi_args = [self.script, *default_args, *args] - # TODO: fix return code in running PyInstaller programmatically. - PYI_CONFIG = configure.get_config() - # Override CACHEDIR for PyInstaller; relocate cache into `self._tmp_path`. - PYI_CONFIG['cachedir'] = str(self._tmp_path) - - pyi_main.run(pyi_args, PYI_CONFIG) - retcode = 0 - - return retcode == 0 - - def _examine_executable(self, exe, toc_log): - """ - Compare log files (now used mostly by multipackage test_name). - - :return: True if .toc files match - """ - self._display_message('EXAMINE-EXE', f'Matching against TOC log: {str(toc_log)!r}') - fname_list = pkg_archive_contents(exe) - with open(toc_log, 'r', encoding='utf-8') as f: - pattern_list = eval(f.read()) - # Alphabetical order of patterns. - pattern_list.sort() - missing = [] - for pattern in pattern_list: - for fname in fname_list: - if re.match(pattern, fname): - self._display_message('EXAMINE-EXE', f'Entry found: {pattern!r} --> {fname!r}') - break - else: - # No matching entry found - missing.append(pattern) - self._display_message('EXAMINE-EXE', f'Entry MISSING: {pattern!r}') - - # We expect the missing list to be empty - return not missing - - -# Scope 'session' should keep the object unchanged for whole tests. This fixture caches basic module graph dependencies -# that are same for every executable. -@pytest.fixture(scope='session') -def pyi_modgraph(): - # Explicitly set the log level since the plugin `pytest-catchlog` (un-) sets the root logger's level to NOTSET for - # the setup phase, which will lead to TRACE messages been written out. - import PyInstaller.log as logging - logging.logger.setLevel(logging.DEBUG) - initialize_modgraph() - - -# Run by default test as onedir and onefile. -@pytest.fixture(params=['onedir', 'onefile']) -def pyi_builder(tmp_path, monkeypatch, request, pyi_modgraph): - # Save/restore environment variable PATH. - monkeypatch.setenv('PATH', os.environ['PATH']) - # PyInstaller or a test case might manipulate 'sys.path'. Reset it for every test. - monkeypatch.syspath_prepend(None) - # Set current working directory to - monkeypatch.chdir(tmp_path) - # Clean up configuration and force PyInstaller to do a clean configuration for another app/test. The value is same - # as the original value. - monkeypatch.setattr('PyInstaller.config.CONF', {'pathex': []}) - - yield AppBuilder(tmp_path, request, request.param) - - # Clean up the temporary directory of a successful test - if _PYI_BUILDER_CLEANUP and request.node.rep_setup.passed and request.node.rep_call.passed: - if tmp_path.exists(): - shutil.rmtree(tmp_path, ignore_errors=True) - - -# Fixture for .spec based tests. With .spec it does not make sense to differentiate onefile/onedir mode. -@pytest.fixture -def pyi_builder_spec(tmp_path, request, monkeypatch, pyi_modgraph): - # Save/restore environment variable PATH. - monkeypatch.setenv('PATH', os.environ['PATH']) - # Set current working directory to - monkeypatch.chdir(tmp_path) - # PyInstaller or a test case might manipulate 'sys.path'. Reset it for every test. - monkeypatch.syspath_prepend(None) - # Clean up configuration and force PyInstaller to do a clean configuration for another app/test. The value is same - # as the original value. - monkeypatch.setattr('PyInstaller.config.CONF', {'pathex': []}) - - yield AppBuilder(tmp_path, request, None) - - # Clean up the temporary directory of a successful test - if _PYI_BUILDER_CLEANUP and request.node.rep_setup.passed and request.node.rep_call.passed: - if tmp_path.exists(): - shutil.rmtree(tmp_path, ignore_errors=True) - - -@pytest.fixture -def pyi_windowed_builder(pyi_builder: AppBuilder): - """A pyi_builder equivalent for testing --windowed applications.""" - - # psutil.Popen() somehow bypasses an application's windowed/console mode so that any application built in - # --windowed mode but invoked with psutil still receives valid std{in,out,err} handles and behaves exactly like - # a console application. In short, testing windowed mode with psutil is a null test. We must instead use subprocess. - - def _run_executable_(args, exe_path, prog_env, prog_cwd, runtime): - return subprocess.run([exe_path, *args], env=prog_env, cwd=prog_cwd, timeout=runtime).returncode - - pyi_builder._run_executable_ = _run_executable_ - yield pyi_builder diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/__init__.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/__init__.py deleted file mode 100755 index 0470263..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/__init__.py +++ /dev/null @@ -1,1348 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -from __future__ import annotations - -import copy -import os -import textwrap -import fnmatch -from pathlib import Path -from collections import deque -from typing import Callable - -import packaging.requirements - -from PyInstaller import HOMEPATH, compat -from PyInstaller import log as logging -from PyInstaller.depend.imphookapi import PostGraphAPI -from PyInstaller import isolated -from PyInstaller.compat import importlib_metadata - -logger = logging.getLogger(__name__) - -# These extensions represent Python executables and should therefore be ignored when collecting data files. -# NOTE: .dylib files are not Python executable and should not be in this list. -PY_IGNORE_EXTENSIONS = set(compat.ALL_SUFFIXES) - -# Some hooks need to save some values. This is the dict that can be used for that. -# -# When running tests this variable should be reset before every test. -# -# For example the 'wx' module needs variable 'wxpubsub'. This tells PyInstaller which protocol of the wx module -# should be bundled. -hook_variables = {} - - -def __exec_python_cmd(cmd, env=None, capture_stdout=True): - """ - Executes an externally spawned Python interpreter. If capture_stdout is set to True, returns anything that was - emitted in the standard output as a single string. Otherwise, returns the exit code. - """ - # 'PyInstaller.config' cannot be imported as other top-level modules. - from PyInstaller.config import CONF - if env is None: - env = {} - # Update environment. Defaults to 'os.environ' - pp_env = copy.deepcopy(os.environ) - pp_env.update(env) - # Prepend PYTHONPATH with pathex. - # Some functions use some PyInstaller code in subprocess, so add PyInstaller HOMEPATH to sys.path as well. - pp = os.pathsep.join(CONF['pathex'] + [HOMEPATH]) - - # PYTHONPATH might be already defined in the 'env' argument or in the original 'os.environ'. Prepend it. - if 'PYTHONPATH' in pp_env: - pp = os.pathsep.join([pp_env.get('PYTHONPATH'), pp]) - pp_env['PYTHONPATH'] = pp - - if capture_stdout: - txt = compat.exec_python(*cmd, env=pp_env) - return txt.strip() - else: - return compat.exec_python_rc(*cmd, env=pp_env) - - -def __exec_statement(statement, capture_stdout=True): - statement = textwrap.dedent(statement) - cmd = ['-c', statement] - return __exec_python_cmd(cmd, capture_stdout=capture_stdout) - - -def exec_statement(statement: str): - """ - Execute a single Python statement in an externally-spawned interpreter, and return the resulting standard output - as a string. - - Examples:: - - tk_version = exec_statement("from _tkinter import TK_VERSION; print(TK_VERSION)") - - mpl_data_dir = exec_statement("import matplotlib; print(matplotlib.get_data_path())") - datas = [ (mpl_data_dir, "") ] - - Notes: - As of v5.0, usage of this function is discouraged in favour of the - new :mod:`PyInstaller.isolated` module. - - """ - return __exec_statement(statement, capture_stdout=True) - - -def exec_statement_rc(statement: str): - """ - Executes a Python statement in an externally spawned interpreter, and returns the exit code. - """ - return __exec_statement(statement, capture_stdout=False) - - -def eval_statement(statement: str): - """ - Execute a single Python statement in an externally-spawned interpreter, and :func:`eval` its output (if any). - - Example:: - - databases = eval_statement(''' - import sqlalchemy.databases - print(sqlalchemy.databases.__all__) - ''') - for db in databases: - hiddenimports.append("sqlalchemy.databases." + db) - - Notes: - As of v5.0, usage of this function is discouraged in favour of the - new :mod:`PyInstaller.isolated` module. - - """ - txt = exec_statement(statement).strip() - if not txt: - # Return an empty string, which is "not true" but is iterable. - return '' - return eval(txt) - - -@isolated.decorate -def get_pyextension_imports(module_name: str): - """ - Return list of modules required by binary (C/C++) Python extension. - - Python extension files ends with .so (Unix) or .pyd (Windows). It is almost impossible to analyze binary extension - and its dependencies. - - Module cannot be imported directly. - - Let's at least try import it in a subprocess and observe the difference in module list from sys.modules. - - This function could be used for 'hiddenimports' in PyInstaller hooks files. - """ - import sys - import importlib - - original = set(sys.modules.keys()) - - # When importing this module - sys.modules gets updated. - importlib.import_module(module_name) - - # Find and return which new modules have been loaded. - return list(set(sys.modules.keys()) - original - {module_name}) - - -def get_homebrew_path(formula: str = ''): - """ - Return the homebrew path to the requested formula, or the global prefix when called with no argument. - - Returns the path as a string or None if not found. - """ - import subprocess - brewcmd = ['brew', '--prefix'] - path = None - if formula: - brewcmd.append(formula) - dbgstr = 'homebrew formula "%s"' % formula - else: - dbgstr = 'homebrew prefix' - try: - path = subprocess.check_output(brewcmd).strip() - logger.debug('Found %s at "%s"' % (dbgstr, path)) - except OSError: - logger.debug('Detected homebrew not installed') - except subprocess.CalledProcessError: - logger.debug('homebrew formula "%s" not installed' % formula) - if path: - return path.decode('utf8') # macOS filenames are UTF-8 - else: - return None - - -def remove_prefix(string: str, prefix: str): - """ - This function removes the given prefix from a string, if the string does indeed begin with the prefix; otherwise, - it returns the original string. - """ - if string.startswith(prefix): - return string[len(prefix):] - else: - return string - - -def remove_suffix(string: str, suffix: str): - """ - This function removes the given suffix from a string, if the string does indeed end with the suffix; otherwise, - it returns the original string. - """ - # Special case: if suffix is empty, string[:0] returns ''. So, test for a non-empty suffix. - if suffix and string.endswith(suffix): - return string[:-len(suffix)] - else: - return string - - -# TODO: Do we really need a helper for this? This is pretty trivially obvious. -def remove_file_extension(filename: str): - """ - This function returns filename without its extension. - - For Python C modules it removes even whole '.cpython-34m.so' etc. - """ - for suff in compat.EXTENSION_SUFFIXES: - if filename.endswith(suff): - return filename[0:filename.rfind(suff)] - # Fallback to ordinary 'splitext'. - return os.path.splitext(filename)[0] - - -def can_import_module(module_name: str): - """ - Check if the specified module can be imported. - - Intended as a silent module availability check, as it does not print ModuleNotFoundError traceback to stderr when - the module is unavailable. - - Parameters - ---------- - module_name : str - Fully-qualified name of the module. - - Returns - ---------- - bool - Boolean indicating whether the module can be imported or not. - """ - - # Run the check in isolated sub-process, so we can gracefully handle cases when importing the module ends up - # crashing python interpreter. - @isolated.decorate - def _can_import_module(module_name): - try: - __import__(module_name) - return True - except Exception: - return False - - try: - return _can_import_module(module_name) - except isolated.SubprocessDiedError: - return False - - -# TODO: Replace most calls to exec_statement() with calls to this function. -def get_module_attribute(module_name: str, attr_name: str): - """ - Get the string value of the passed attribute from the passed module if this attribute is defined by this module - _or_ raise `AttributeError` otherwise. - - Since modules cannot be directly imported during analysis, this function spawns a subprocess importing this module - and returning the string value of this attribute in this module. - - Parameters - ---------- - module_name : str - Fully-qualified name of this module. - attr_name : str - Name of the attribute in this module to be retrieved. - - Returns - ---------- - str - String value of this attribute. - - Raises - ---------- - AttributeError - If this attribute is undefined. - """ - @isolated.decorate - def _get_module_attribute(module_name, attr_name): - import importlib - module = importlib.import_module(module_name) - return getattr(module, attr_name) - - # Return AttributeError on any kind of errors, to preserve old behavior. - try: - return _get_module_attribute(module_name, attr_name) - except Exception as e: - raise AttributeError(f"Failed to retrieve attribute {attr_name} from module {module_name}") from e - - -def get_module_file_attribute(package: str): - """ - Get the absolute path to the specified module or package. - - Modules and packages *must not* be directly imported in the main process during the analysis. Therefore, to - avoid leaking the imports, this function uses an isolated subprocess when it needs to import the module and - obtain its ``__file__`` attribute. - - Parameters - ---------- - package : str - Fully-qualified name of module or package. - - Returns - ---------- - str - Absolute path of this module. - """ - # First, try to use 'importlib.util.find_spec' and obtain loader from the spec (and filename from the loader). - # It is the fastest way, but does not work on certain modules in pywin32 that replace all module attributes with - # those of the .dll. In addition, we need to avoid it for submodules/subpackages, because it ends up importing - # their parent package, which would cause an import leak during the analysis. - filename: str | None = None - if '.' not in package: - try: - import importlib.util - loader = importlib.util.find_spec(package).loader - filename = loader.get_filename(package) - # Apparently in the past, ``None`` could be returned for built-in ``datetime`` module. Just in case this - # is still possible, return only if filename is valid. - if filename: - return filename - except (ImportError, AttributeError, TypeError, ValueError): - pass - - # Second attempt: try to obtain module/package's __file__ attribute in an isolated subprocess. - @isolated.decorate - def _get_module_file_attribute(package): - # First, try to use 'importlib.util.find_spec' and obtain loader from the spec (and filename from the loader). - # This should return the filename even if the module or package cannot be imported (e.g., a C-extension module - # with missing dependencies). - try: - import importlib.util - loader = importlib.util.find_spec(package).loader - filename = loader.get_filename(package) - # Safe-guard against ``None`` being returned (see comment in the non-isolated codepath). - if filename: - return filename - except (ImportError, AttributeError, TypeError, ValueError): - pass - - # Fall back to import attempt - import importlib - p = importlib.import_module(package) - return p.__file__ - - # The old behavior was to return ImportError (and that is what the test are also expecting...). - try: - filename = _get_module_file_attribute(package) - except Exception as e: - raise ImportError(f"Failed to obtain the __file__ attribute of package/module {package}!") from e - - return filename - - -def get_pywin32_module_file_attribute(module_name): - """ - Get the absolute path of the PyWin32 DLL specific to the PyWin32 module with the passed name (`pythoncom` - or `pywintypes`). - - On import, each PyWin32 module: - - * Imports a DLL specific to that module. - * Overwrites the values of all module attributes with values specific to that DLL. This includes that module's - `__file__` attribute, which then provides the absolute path of that DLL. - - This function imports the module in isolated subprocess and retrieves its `__file__` attribute. - """ - - # NOTE: we cannot use `get_module_file_attribute` as it does not account for the __file__ rewriting magic - # done by the module. Use `get_module_attribute` instead. - return get_module_attribute(module_name, '__file__') - - -def check_requirement(requirement: str): - """ - Check if a :pep:`0508` requirement is satisfied. Usually used to check if a package distribution is installed, - or if it is installed and satisfies the specified version requirement. - - Parameters - ---------- - requirement : str - Requirement string in :pep:`0508` format. - - Returns - ---------- - bool - Boolean indicating whether the requirement is satisfied or not. - - Examples - -------- - - :: - - # Assume Pillow 10.0.0 is installed. - >>> from PyInstaller.utils.hooks import check_requirement - >>> check_requirement('Pillow') - True - >>> check_requirement('Pillow < 9.0') - False - >>> check_requirement('Pillow >= 9.0, < 11.0') - True - """ - parsed_requirement = packaging.requirements.Requirement(requirement) - - # Fetch the actual version of the specified dist - try: - version = importlib_metadata.version(parsed_requirement.name) - except importlib_metadata.PackageNotFoundError: - return False # Not available at all - - # If specifier is not given, the only requirement is that dist is available - if not parsed_requirement.specifier: - return True - - # Parse specifier, and compare version. Enable pre-release matching, - # because we need "package >= 2.0.0" to match "2.5.0b1". - return parsed_requirement.specifier.contains(version, prereleases=True) - - -# Keep the `is_module_satisfies` as an alias for backwards compatibility with existing hooks. The old fallback -# to module version check does not work any more, though. -def is_module_satisfies( - requirements: str, - version: None = None, - version_attr: None = None, -): - """ - A compatibility wrapper for :func:`check_requirement`, intended for backwards compatibility with existing hooks. - - In contrast to original implementation from PyInstaller < 6, this implementation only checks the specified - :pep:`0508` requirement string; i.e., it tries to retrieve the distribution metadata, and compare its version - against optional version specifier(s). It does not attempt to fall back to checking the module's version attribute, - nor does it support ``version`` and ``version_attr`` arguments. - - Parameters - ---------- - requirements : str - Requirements string passed to the :func:`check_requirement`. - version : None - Deprecated and unsupported. Must be ``None``. - version_attr : None - Deprecated and unsupported. Must be ``None``. - - Returns - ---------- - bool - Boolean indicating whether the requirement is satisfied or not. - - Raises - ---------- - ValueError - If either ``version`` or ``version_attr`` are specified and are not None. - """ - if version is not None: - raise ValueError("Calling is_module_satisfies with version argument is not supported anymore.") - if version_attr is not None: - raise ValueError("Calling is_module_satisfies with version argument_attr is not supported anymore.") - return check_requirement(requirements) - - -def is_package(module_name: str): - """ - Check if a Python module is really a module or is a package containing other modules, without importing anything - in the main process. - - :param module_name: Module name to check. - :return: True if module is a package else otherwise. - """ - def _is_package(module_name: str): - """ - Determines whether the given name represents a package or not. If the name represents a top-level module or - a package, it is not imported. If the name represents a sub-module or a sub-package, its parent is imported. - In such cases, this function should be called from an isolated suprocess. - - NOTE: the fallback check for `__init__.py` is there because `_distutils_hack.DistutilsMetaFinder` from - `setuptools` does not set spec.submodule_search_locations for `distutils` / `setuptools._distutils` even though - it is a package. The alternative would be to always perform full import, and check for the `__path__` attribute, - but that would also always require full isolation. - """ - try: - import importlib.util - spec = importlib.util.find_spec(module_name) - return bool(spec.submodule_search_locations) or spec.origin.endswith('__init__.py') - except Exception: - return False - - # For top-level packages/modules, we can perform check in the main process; otherwise, we need to isolate the - # call to prevent import leaks in the main process. - if '.' not in module_name: - return _is_package(module_name) - else: - return isolated.call(_is_package, module_name) - - -def get_all_package_paths(package: str): - """ - Given a package name, return all paths associated with the package. Typically, packages have a single location - path, but PEP 420 namespace packages may be split across multiple locations. Returns an empty list if the specified - package is not found or is not a package. - """ - def _get_package_paths(package: str): - """ - Retrieve package path(s), as advertised by submodule_search_paths attribute of the spec obtained via - importlib.util.find_spec(package). If the name represents a top-level package, the package is not imported. - If the name represents a sub-module or a sub-package, its parent is imported. In such cases, this function - should be called from an isolated suprocess. Returns an empty list if specified package is not found or is not - a package. - """ - try: - import importlib.util - spec = importlib.util.find_spec(package) - if not spec or not spec.submodule_search_locations: - return [] - return [str(path) for path in spec.submodule_search_locations] - except Exception: - return [] - - # For top-level packages/modules, we can perform check in the main process; otherwise, we need to isolate the - # call to prevent import leaks in the main process. - if '.' not in package: - pkg_paths = _get_package_paths(package) - else: - pkg_paths = isolated.call(_get_package_paths, package) - - return pkg_paths - - -def package_base_path(package_path: str, package: str): - """ - Given a package location path and package name, return the package base path, i.e., the directory in which the - top-level package is located. For example, given the path ``/abs/path/to/python/libs/pkg/subpkg`` and - package name ``pkg.subpkg``, the function returns ``/abs/path/to/python/libs``. - """ - return remove_suffix(package_path, package.replace('.', os.sep)) # Base directory - - -def get_package_paths(package: str): - """ - Given a package, return the path to packages stored on this machine and also returns the path to this particular - package. For example, if pkg.subpkg lives in /abs/path/to/python/libs, then this function returns - ``(/abs/path/to/python/libs, /abs/path/to/python/libs/pkg/subpkg)``. - - NOTE: due to backwards compatibility, this function returns only one package path along with its base directory. - In case of PEP 420 namespace package with multiple location, only first location is returned. To obtain all - package paths, use the ``get_all_package_paths`` function and obtain corresponding base directories using the - ``package_base_path`` helper. - """ - pkg_paths = get_all_package_paths(package) - if not pkg_paths: - raise ValueError(f"Package '{package}' does not exist or is not a package!") - - if len(pkg_paths) > 1: - logger.warning( - "get_package_paths - package %s has multiple paths (%r); returning only first one!", package, pkg_paths - ) - - pkg_dir = pkg_paths[0] - pkg_base = package_base_path(pkg_dir, package) - - return pkg_base, pkg_dir - - -def collect_submodules( - package: str, - filter: Callable[[str], bool] = lambda name: True, - on_error: str = "warn once", -): - """ - List all submodules of a given package. - - Arguments: - package: - An ``import``-able package. - filter: - Filter the submodules found: A callable that takes a submodule name and returns True if it should be - included. - on_error: - The action to take when a submodule fails to import. May be any of: - - - raise: Errors are reraised and terminate the build. - - warn: Errors are downgraded to warnings. - - warn once: The first error issues a warning but all - subsequent errors are ignored to minimise *stderr pollution*. This - is the default. - - ignore: Skip all errors. Don't warn about anything. - Returns: - All submodules to be assigned to ``hiddenimports`` in a hook. - - This function is intended to be used by hook scripts, not by main PyInstaller code. - - Examples:: - - # Collect all submodules of Sphinx don't contain the word ``test``. - hiddenimports = collect_submodules( - "Sphinx", ``filter=lambda name: 'test' not in name) - - .. versionchanged:: 4.5 - Add the **on_error** parameter. - - """ - # Accept only strings as packages. - if not isinstance(package, str): - raise TypeError('package must be a str') - if on_error not in ("ignore", "warn once", "warn", "raise"): - raise ValueError( - f"Invalid on-error action '{on_error}': Must be one of ('ignore', 'warn once', 'warn', 'raise')" - ) - - logger.debug('Collecting submodules for %s', package) - - # Skip a module which is not a package. - if not is_package(package): - logger.debug('collect_submodules - %s is not a package.', package) - # If module is importable, return its name in the list, in order to keep behavior consistent with the - # one we have for packages (i.e., we include the package in the list of returned names) - if can_import_module(package): - return [package] - return [] - - # Determine the filesystem path(s) to the specified package. - package_submodules = [] - - todo = deque() - todo.append(package) - - with isolated.Python() as isolated_python: - while todo: - # Scan the given (sub)package - name = todo.pop() - modules, subpackages, on_error = isolated_python.call(_collect_submodules, name, on_error) - - # Add modules to the list of all submodules - package_submodules += [module for module in modules if filter(module)] - - # Add sub-packages to deque for subsequent recursion - for subpackage_name in subpackages: - if filter(subpackage_name): - todo.append(subpackage_name) - - package_submodules = sorted(package_submodules) - - logger.debug("collect_submodules - found submodules: %s", package_submodules) - return package_submodules - - -# This function is called in an isolated sub-process via `isolated.Python.call`. -def _collect_submodules(name, on_error): - import sys - import pkgutil - from traceback import format_exception_only - - from PyInstaller.utils.hooks import logger - - logger.debug("collect_submodules - scanning (sub)package %s", name) - - modules = [] - subpackages = [] - - # Resolve package location(s) - try: - __import__(name) - except Exception as ex: - # Catch all errors and either raise, warn, or ignore them as determined by the *on_error* parameter. - if on_error in ("warn", "warn once"): - from PyInstaller.log import logger - ex = "".join(format_exception_only(type(ex), ex)).strip() - logger.warning(f"Failed to collect submodules for '{name}' because importing '{name}' raised: {ex}") - if on_error == "warn once": - on_error = "ignore" - return modules, subpackages, on_error - elif on_error == "raise": - raise ImportError(f"Unable to load subpackage '{name}'.") from ex - - # Do not attempt to recurse into package if it did not make it into sys.modules. - if name not in sys.modules: - return modules, subpackages, on_error - - # Or if it does not have __path__ attribute. - paths = getattr(sys.modules[name], '__path__', None) or [] - if not paths: - return modules, subpackages, on_error - - # Package was successfully imported - include it in the list of modules. - modules.append(name) - - # Iterate package contents - logger.debug("collect_submodules - scanning (sub)package %s in location(s): %s", name, paths) - for importer, name, ispkg in pkgutil.iter_modules(paths, name + '.'): - if not ispkg: - modules.append(name) - else: - subpackages.append(name) - - return modules, subpackages, on_error - - -def is_module_or_submodule(name: str, mod_or_submod: str): - """ - This helper function is designed for use in the ``filter`` argument of :func:`collect_submodules`, by returning - ``True`` if the given ``name`` is a module or a submodule of ``mod_or_submod``. - - Examples: - - The following excludes ``foo.test`` and ``foo.test.one`` but not ``foo.testifier``. :: - - collect_submodules('foo', lambda name: not is_module_or_submodule(name, 'foo.test'))`` - """ - return name.startswith(mod_or_submod + '.') or name == mod_or_submod - - -# Patterns of dynamic library filenames that might be bundled with some installed Python packages. -PY_DYLIB_PATTERNS = [ - '*.dll', - '*.dylib', - 'lib*.so', -] - - -def collect_dynamic_libs(package: str, destdir: str | None = None, search_patterns: list = PY_DYLIB_PATTERNS): - """ - This function produces a list of (source, dest) of dynamic library files that reside in package. Its output can be - directly assigned to ``binaries`` in a hook script. The package parameter must be a string which names the package. - - :param destdir: Relative path to ./dist/APPNAME where the libraries should be put. - :param search_patterns: List of dynamic library filename patterns to collect. - """ - logger.debug('Collecting dynamic libraries for %s' % package) - - # Accept only strings as packages. - if not isinstance(package, str): - raise TypeError('package must be a str') - - # Skip a module which is not a package. - if not is_package(package): - logger.warning( - "collect_dynamic_libs - skipping library collection for module '%s' as it is not a package.", package - ) - return [] - - pkg_dirs = get_all_package_paths(package) - dylibs = [] - for pkg_dir in pkg_dirs: - pkg_base = package_base_path(pkg_dir, package) - # Recursively glob for all file patterns in the package directory - for pattern in search_patterns: - files = Path(pkg_dir).rglob(pattern) - for source in files: - # Produce the tuple ('/abs/path/to/source/mod/submod/file.pyd', 'mod/submod') - if destdir: - # Put libraries in the specified target directory. - dest = destdir - else: - # Preserve original directory hierarchy. - dest = source.parent.relative_to(pkg_base) - logger.debug(' %s, %s' % (source, dest)) - dylibs.append((str(source), str(dest))) - - return dylibs - - -def collect_data_files( - package: str, - include_py_files: bool = False, - subdir: str | os.PathLike | None = None, - excludes: list | None = None, - includes: list | None = None, -): - r""" - This function produces a list of ``(source, dest)`` entries for data files that reside in ``package``. - Its output can be directly assigned to ``datas`` in a hook script; for example, see ``hook-sphinx.py``. - The data files are all files that are not shared libraries / binary python extensions (based on extension - check) and are not python source (.py) files or byte-compiled modules (.pyc). Collection of the .py and .pyc - files can be toggled via the ``include_py_files`` flag. - Parameters: - - - The ``package`` parameter is a string which names the package. - - By default, python source files and byte-compiled modules (files with ``.py`` and ``.pyc`` suffix) are not - collected; setting the ``include_py_files`` argument to ``True`` collects these files as well. This is typically - used when a package requires source .py files to be available; for example, JIT compilation used in - deep-learning frameworks, code that requires access to .py files (for example, to check their date), or code - that tries to extend `sys.path` with subpackage paths in a way that is incompatible with PyInstaller's frozen - importer.. However, in contemporary PyInstaller versions, the preferred way of collecting source .py files is by - using the **module collection mode** setting (which enables collection of source .py files in addition to or - in lieu of collecting byte-compiled modules into PYZ archive). - - The ``subdir`` argument gives a subdirectory relative to ``package`` to search, which is helpful when submodules - are imported at run-time from a directory lacking ``__init__.py``. - - The ``excludes`` argument contains a sequence of strings or Paths. These provide a list of - `globs `_ - to exclude from the collected data files; if a directory matches the provided glob, all files it contains will - be excluded as well. All elements must be relative paths, which are relative to the provided package's path - (/ ``subdir`` if provided). - - Therefore, ``*.txt`` will exclude only ``.txt`` files in ``package``\ 's path, while ``**/*.txt`` will exclude - all ``.txt`` files in ``package``\ 's path and all its subdirectories. Likewise, ``**/__pycache__`` will exclude - all files contained in any subdirectory named ``__pycache__``. - - The ``includes`` function like ``excludes``, but only include matching paths. ``excludes`` override - ``includes``: a file or directory in both lists will be excluded. - - This function does not work on zipped Python eggs. - - This function is intended to be used by hook scripts, not by main PyInstaller code. - """ - logger.debug('Collecting data files for %s' % package) - - # Accept only strings as packages. - if not isinstance(package, str): - raise TypeError('package must be a str') - - # Skip a module which is not a package. - if not is_package(package): - logger.warning("collect_data_files - skipping data collection for module '%s' as it is not a package.", package) - return [] - - # Make sure the excludes are a list; this also makes a copy, so we don't modify the original. - excludes = list(excludes) if excludes else [] - # These excludes may contain directories which need to be searched. - excludes_len = len(excludes) - # Including py files means don't exclude them. This pattern will search any directories for containing files, so - # do not modify ``excludes_len``. - if not include_py_files: - excludes += ['**/*' + s for s in compat.ALL_SUFFIXES] - else: - # include_py_files should collect only .py and .pyc files, and not the extensions / shared libs. - excludes += ['**/*' + s for s in compat.ALL_SUFFIXES if s not in {'.py', '.pyc'}] - - # Never, ever, collect .pyc files from __pycache__. - excludes.append('**/__pycache__/*.pyc') - - # If not specified, include all files. Follow the same process as the excludes. - includes = list(includes) if includes else ["**/*"] - includes_len = len(includes) - - # A helper function to glob the in/ex "cludes", adding a wildcard to refer to all files under a subdirectory if a - # subdirectory is matched by the first ``clude_len`` patterns. Otherwise, it in/excludes the matched file. - # **This modifies** ``cludes``. - def clude_walker( - # Package directory to scan - pkg_dir, - # A list of paths relative to ``pkg_dir`` to in/exclude. - cludes, - # The number of ``cludes`` for which matching directories should be searched for all files under them. - clude_len, - # True if the list is includes, False for excludes. - is_include - ): - for i, c in enumerate(cludes): - for g in Path(pkg_dir).glob(c): - # The path obtained from `pathlib.Path.glob()` should already be an instance of `pathlib.Path`; however, - # under msys2/mingw python 3.13, it uses inconsistent mix of POSIX-style separators (for base part) and - # Windows separators (for the globbed part), which causes issues further down the road. Explicitly - # constructing a `Path` instance seems to normalize the separators and works around the problem. - g = Path(g) - if g.is_dir(): - # Only files are sources. Subdirectories are not. - if i < clude_len: - # In/exclude all files under a matching subdirectory. - cludes.append(str((g / "**/*").relative_to(pkg_dir))) - else: - # In/exclude a matching file. - sources.add(g) if is_include else sources.discard(g) - - # Obtain all paths for the specified package, and process each path independently. - datas = [] - - pkg_dirs = get_all_package_paths(package) - for pkg_dir in pkg_dirs: - sources = set() # Reset sources set - - pkg_base = package_base_path(pkg_dir, package) - if subdir: - pkg_dir = os.path.join(pkg_dir, subdir) - - # Process the package path with clude walker - clude_walker(pkg_dir, includes, includes_len, True) - clude_walker(pkg_dir, excludes, excludes_len, False) - - # Transform the sources into tuples for ``datas``. - datas += [(str(s), str(s.parent.relative_to(pkg_base))) for s in sources] - - logger.debug("collect_data_files - Found files: %s", datas) - return datas - - -def collect_system_data_files(path: str, destdir: str | os.PathLike | None = None, include_py_files: bool = False): - """ - This function produces a list of (source, dest) non-Python (i.e., data) files that reside somewhere on the system. - Its output can be directly assigned to ``datas`` in a hook script. - - This function is intended to be used by hook scripts, not by main PyInstaller code. - """ - # Accept only strings as paths. - if not isinstance(path, str): - raise TypeError('path must be a str') - - # Walk through all file in the given package, looking for data files. - datas = [] - for dirpath, dirnames, files in os.walk(path): - for f in files: - extension = os.path.splitext(f)[1] - if include_py_files or (extension not in PY_IGNORE_EXTENSIONS): - # Produce the tuple: (/abs/path/to/source/mod/submod/file.dat, mod/submod/destdir) - source = os.path.join(dirpath, f) - dest = str(Path(dirpath).relative_to(path)) - if destdir is not None: - dest = os.path.join(destdir, dest) - datas.append((source, dest)) - - return datas - - -def copy_metadata(package_name: str, recursive: bool = False): - """ - Collect distribution metadata so that ``importlib.metadata.distribution()`` or ``pkg_resources.get_distribution()`` - can find it. - - This function returns a list to be assigned to the ``datas`` global variable. This list instructs PyInstaller to - copy the metadata for the given package to the frozen application's data directory. - - Parameters - ---------- - package_name : str - Specifies the name of the package for which metadata should be copied. - recursive : bool - If true, collect metadata for the package's dependencies too. This enables use of - ``importlib.metadata.requires('package')`` or ``pkg_resources.require('package')`` inside the frozen - application. - - Returns - ------- - list - This should be assigned to ``datas``. - - Examples - -------- - >>> from PyInstaller.utils.hooks import copy_metadata - >>> copy_metadata('sphinx') - [('c:\\python27\\lib\\site-packages\\Sphinx-1.3.2.dist-info', - 'Sphinx-1.3.2.dist-info')] - - - Some packages rely on metadata files accessed through the ``importlib.metadata`` (or the now-deprecated - ``pkg_resources``) module. PyInstaller does not collect these metadata files by default. - If a package fails without the metadata (either its own, or of another package that it depends on), you can use this - function in a hook to collect the corresponding metadata files into the frozen application. The tuples in the - returned list contain two strings. The first is the full path to the package's metadata directory on the system. The - second is the destination name, which typically corresponds to the basename of the metadata directory. Adding these - tuples the the ``datas`` hook global variable, the metadata is collected into top-level application directory (where - it is usually searched for). - - .. versionchanged:: 4.3.1 - - Prevent ``dist-info`` metadata folders being renamed to ``egg-info`` which broke ``pkg_resources.require`` with - *extras* (see :issue:`#3033`). - - .. versionchanged:: 4.4.0 - - Add the **recursive** option. - """ - from collections import deque - - todo = deque([package_name]) - done = set() - out = [] - - while todo: - package_name = todo.pop() - if package_name in done: - continue - - dist = importlib_metadata.distribution(package_name) - - # We support only `importlib_metadata.PathDistribution`, since we need to rely on its private `_path` attribute - # to obtain the path to metadata file/directory. But we need to account for possible sub-classes and vendored - # variants (`setuptools._vendor.importlib_metadata.PathDistribution`), so just check that `_path` is available. - if not hasattr(dist, '_path'): - raise RuntimeError( - f"Unsupported distribution type {type(dist)} for {package_name} - does not have _path attribute" - ) - src_path = dist._path - - # We expect the `_path` attribute to be an instance of `pathlib.Path`. This assumption is violated when the - # package happens to be installed as a zipped egg. In such case, `_path` is an instance of either `zipp.Path` - # (when using `importlib.metadata` from `importlib-metadata`, which in turn uses 3rd party `zipp` package) or - # `zipfile.Path` (when using stdlib's `importlib.metadata`). While we could attempt to read the metadata - # from the zip, we dropped geberal support for zipped eggs from PyInstaller in 6.0, so raise an error. - if not isinstance(src_path, Path): - # NOTE: `src_path.parent` is also an instance of `zipfile.Path` or `zipp.Path`, and calling its `is_file()` - # method returns False, because the root of zip file is (rightfully) considered a directory. Therefore, we - # convert the path to `pathlib.Path` by taking the parent of `src_path.parent` (which turns out to be a - # `pathlib.Path`) and add to it the name of the `src_path.parent` (the name of .egg file). - try: - src_parent = src_path.parent.parent / src_path.parent.name - except Exception: - src_parent = src_path.parent - - if src_parent.is_file() and src_parent.name.endswith('.egg'): - raise RuntimeError( - f"Cannot collect metadata from path {str(src_path)!r}, which appears to be inside a zipped egg. " - f"PyInstaller >= 6.0 does not support zipped eggs anymore. Please reinstall {package_name!r} " - "using modern package installation method instead of deprecated 'python setup.py install'. " - "For example, if you are using pip package manager:\n" - "1. uninstall the zipped egg:\n" - f" pip uninstall {package_name}\n" - "2. make sure pip and its dependencies are up-to-date:\n" - " python -m pip install --upgrade pip setuptools\n" - "3. install the package:\n" - f" pip install {package_name}\n" - "To install a package from source, pass the path to the source directory to 'pip install' command." - ) - else: - # Generic message for unforeseen cases. - raise RuntimeError( - f"Cannot collect metadata from path {src_path!r}, which is of unsupported type {type(src_path)}." - ) - - if src_path.is_dir(): - # The metadata is stored in a directory (.egg-info, .dist-info), so collect the whole directory. If the - # package is installed as an egg, the metadata directory is ([...]/package_name-version.egg/EGG-INFO), - # and requires special handling (as of PyInstaller v6, we support only non-zipped eggs). - if src_path.name == 'EGG-INFO' and src_path.parent.name.endswith('.egg'): - dest_path = os.path.join(*src_path.parts[-2:]) - else: - dest_path = src_path.name - elif src_path.is_file(): - # The metadata is stored in a single file. Collect it into top-level application directory. - # The .egg-info file is commonly used by Debian/Ubuntu when packaging python packages. - dest_path = '.' - else: - raise RuntimeError( - f"Distribution metadata path {src_path!r} for {package_name} is neither file nor directory!" - ) - - # Hack for metadata from packages vendored by setuptools >= 71. If source path is rooted in setuptools/_vendor, - # prepend the same to the destination path and avoid collecting into top-level directory. - if src_path.parent.name == '_vendor' and src_path.parent.parent.name == 'setuptools': - dest_path = os.path.join('setuptools', '_vendor', dest_path) - - out.append((str(src_path), str(dest_path))) - - if not recursive: - return out - done.add(package_name) - - # Process requirements; `importlib.metadata` has no API for parsing requirements, so we need to use - # `packaging.requirements`. This is necessary to discard requirements with markers that do not match the - # environment (e.g., `python_version`, `sys_platform`). - requirements = [packaging.requirements.Requirement(req) for req in dist.requires or []] - requirements = [req.name for req in requirements if req.marker is None or req.marker.evaluate()] - - todo += requirements - - return out - - -def get_installer(dist_name: str): - """ - Try to find which package manager installed the specified distribution (e.g., pip, conda, rpm) by reading INSTALLER - file from distribution's metadata. - - If the specified distribution does not exist, fall back to treating the passed name as importable package/module - name, and attempt to look up its associated distribution name; this matches the behavior of implementation found - in older PyInstaller versions (<= v6.12.0). - - :param dist_name: Name of distribution to look up - :return: Name of package manager or None - - .. versionchanged:: 6.13 - The passed name is now first treated as a distribution name (direct look-up), and only if that fails, it is - treated as importable package/module name. - """ - - # First, perform direct look-up via the passed name, treating it as distribution name. - try: - dist = importlib_metadata.distribution(dist_name) - installer_text = dist.read_text('INSTALLER') - if installer_text is not None: - return installer_text.strip() - else: - # Distribution exists, but does not have an INSTALLER file; stop the search here. - return None - except importlib_metadata.PackageNotFoundError: - pass - - # Fall back to treating the passed name as importable package/module name, and try to resolve its associated - # distribution name (e.g., enchant -> pyenchant). This requires distributions to explicitly list their top-level - # importable names in `top_level.txt` file in metadata, or `importlib.metadata` that can inferring top-level - # importable names (available in stdlib for python >= 3.11, or in importlib-metadata >= 4.8.1). - module_name = dist_name - pkg_to_dist = importlib_metadata.packages_distributions() - dist_names = pkg_to_dist.get(module_name) - - # A namespace package might result in multiple dists; take the first one that has INSTALLER file available... - for dist_name in dist_names or []: - try: - dist = importlib_metadata.distribution(dist_name) - installer_text = dist.read_text('INSTALLER') - if installer_text is not None: - return installer_text.strip() - except importlib_metadata.PackageNotFoundError: - # This might happen with eggs if the egg directory name does not match the dist name declared in the - # metadata. - pass - - return None - - -def collect_all( - package_name: str, - include_py_files: bool = True, - filter_submodules: Callable = lambda name: True, - exclude_datas: list | None = None, - include_datas: list | None = None, - on_error: str = "warn once", -): - """ - Collect everything for a given package name. - - Arguments: - package_name: - An ``import``-able package name. - include_py_files: - Forwarded to :func:`collect_data_files`. - filter_submodules: - Forwarded to :func:`collect_submodules`. - exclude_datas: - Forwarded to :func:`collect_data_files`. - include_datas: - Forwarded to :func:`collect_data_files`. - on_error: - Forwarded onto :func:`collect_submodules`. - - Returns: - tuple: A ``(datas, binaries, hiddenimports)`` triplet containing: - - - All data files, raw Python files (if **include_py_files**), and distribution metadata directories (if - applicable). - - All dynamic libraries as returned by :func:`collect_dynamic_libs`. - - All submodules of **package_name**. - - Typical use:: - - datas, binaries, hiddenimports = collect_all('my_package_name') - """ - datas = collect_data_files(package_name, include_py_files, excludes=exclude_datas, includes=include_datas) - binaries = collect_dynamic_libs(package_name) - hiddenimports = collect_submodules(package_name, on_error=on_error, filter=filter_submodules) - - # `copy_metadata` requires a dist name instead of importable/package name. - # A namespace package might belong to multiple distributions, so process all of them. - pkg_to_dist = importlib_metadata.packages_distributions() - dist_names = set(pkg_to_dist.get(package_name, [])) - for dist_name in dist_names: - # Copy metadata - try: - datas += copy_metadata(dist_name) - except Exception: - pass - - return datas, binaries, hiddenimports - - -def collect_entry_point(name: str): - """ - Collect modules and metadata for all exporters of a given entry point. - - Args: - name: - The name of the entry point. Check the documentation for the library that uses the entry point to find - its name. - Returns: - A ``(datas, hiddenimports)`` pair that should be assigned to the ``datas`` and ``hiddenimports``, respectively. - - For libraries, such as ``pytest`` or ``keyring``, that rely on plugins to extend their behaviour. - - Examples: - Pytest uses an entry point called ``'pytest11'`` for its extensions. - To collect all those extensions use:: - - datas, hiddenimports = collect_entry_point("pytest11") - - These values may be used in a hook or added to the ``datas`` and ``hiddenimports`` arguments in the ``.spec`` - file. See :ref:`using spec files`. - - .. versionadded:: 4.3 - """ - datas = [] - imports = [] - for entry_point in importlib_metadata.entry_points(group=name): - datas += copy_metadata(entry_point.dist.name) - imports.append(entry_point.module) - return datas, imports - - -def get_hook_config(hook_api: PostGraphAPI, module_name: str, key: str): - """ - Get user settings for hooks. - - Args: - module_name: - The module/package for which the key setting belong to. - key: - A key for the config. - Returns: - The value for the config. ``None`` if not set. - - The ``get_hook_config`` function will lookup settings in the ``Analysis.hooksconfig`` dict. - - The hook settings can be added to ``.spec`` file in the form of:: - - a = Analysis(["my-app.py"], - ... - hooksconfig = { - "gi": { - "icons": ["Adwaita"], - "themes": ["Adwaita"], - "languages": ["en_GB", "zh_CN"], - }, - }, - ... - ) - """ - config = hook_api.analysis.hooksconfig - value = None - if module_name in config and key in config[module_name]: - value = config[module_name][key] - return value - - -def include_or_exclude_file( - filename: str, - include_list: list | None = None, - exclude_list: list | None = None, -): - """ - Generic inclusion/exclusion decision function based on filename and list of include and exclude patterns. - - Args: - filename: - Filename considered for inclusion. - include_list: - List of inclusion file patterns. - exclude_list: - List of exclusion file patterns. - - Returns: - A boolean indicating whether the file should be included or not. - - If ``include_list`` is provided, True is returned only if the filename matches one of include patterns (and does not - match any patterns in ``exclude_list``, if provided). If ``include_list`` is not provided, True is returned if - filename does not match any patterns in ``exclude list``, if provided. If neither list is provided, True is - returned for any filename. - """ - if include_list is not None: - for pattern in include_list: - if fnmatch.fnmatch(filename, pattern): - break - else: - return False # Not explicitly included; exclude - - if exclude_list is not None: - for pattern in exclude_list: - if fnmatch.fnmatch(filename, pattern): - return False # Explicitly excluded - - return True - - -def collect_delvewheel_libs_directory(package_name, libdir_name=None, datas=None, binaries=None): - """ - Collect data files and binaries from the .libs directory of a delvewheel-enabled python wheel. Such wheels ship - their shared libraries in a .libs directory that is located next to the package directory, and therefore falls - outside the purview of the collect_dynamic_libs() utility function. - - Args: - package_name: - Name of the package (e.g., scipy). - libdir_name: - Optional name of the .libs directory (e.g., scipy.libs). If not provided, ".libs" is added to - ``package_name``. - datas: - Optional list of datas to which collected data file entries are added. The combined result is retuned - as part of the output tuple. - binaries: - Optional list of binaries to which collected binaries entries are added. The combined result is retuned - as part of the output tuple. - - Returns: - tuple: A ``(datas, binaries)`` pair that should be assigned to the ``datas`` and ``binaries``, respectively. - - Examples: - Collect the ``scipy.libs`` delvewheel directory belonging to the Windows ``scipy`` wheel:: - - datas, binaries = collect_delvewheel_libs_directory("scipy") - - When the collected entries should be added to existing ``datas`` and ``binaries`` listst, the following form - can be used to avoid using intermediate temporary variables and merging those into existing lists:: - - datas, binaries = collect_delvewheel_libs_directory("scipy", datas=datas, binaries=binaries) - - .. versionadded:: 5.6 - """ - - datas = datas or [] - binaries = binaries or [] - - if libdir_name is None: - libdir_name = package_name + '.libs' - - # delvewheel is applicable only to Windows wheels - if not compat.is_win: - return datas, binaries - - # Get package's parent path - pkg_base, pkg_dir = get_package_paths(package_name) - pkg_base = Path(pkg_base) - libs_dir = pkg_base / libdir_name - - if not libs_dir.is_dir(): - return datas, binaries - - # Collect all dynamic libs - collect them as binaries in order to facilitate proper binary dependency analysis - # (for example, to ensure that system-installed VC runtime DLLs are collected, if needed). - # As of PyInstaller 5.4, this should be safe (should not result in duplication), because binary dependency - # analysis attempts to preserve the DLL directory structure. - binaries += [(str(dll_file), str(dll_file.parent.relative_to(pkg_base))) for dll_file in libs_dir.glob('*.dll')] - - # Collect the .load-order file; strictly speaking, this should be necessary only under python < 3.8, but let us - # collect it for completeness sake. Differently named variants have been observed: `.load_order`, `.load-order`, - # and `.load-order-Name`. - datas += [(str(load_order_file), str(load_order_file.parent.relative_to(pkg_base))) - for load_order_file in libs_dir.glob('.load[-_]order*')] - - return datas, binaries - - -if compat.is_pure_conda: - from PyInstaller.utils.hooks import conda as conda_support # noqa: F401 -elif compat.is_conda: - from PyInstaller.utils.hooks.conda import CONDA_META_DIR as _tmp - logger.warning( - "Assuming this is not an Anaconda environment or an additional venv/pipenv/... environment manager is being " - "used on top, because the conda-meta folder %s does not exist.", _tmp - ) - del _tmp diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 969a6f6..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/__pycache__/conda.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/__pycache__/conda.cpython-312.pyc deleted file mode 100644 index af808ba..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/__pycache__/conda.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/__pycache__/django.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/__pycache__/django.cpython-312.pyc deleted file mode 100644 index b99ddd9..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/__pycache__/django.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/__pycache__/gi.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/__pycache__/gi.cpython-312.pyc deleted file mode 100644 index a819734..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/__pycache__/gi.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/__pycache__/setuptools.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/__pycache__/setuptools.cpython-312.pyc deleted file mode 100644 index ca38372..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/__pycache__/setuptools.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/__pycache__/tcl_tk.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/__pycache__/tcl_tk.cpython-312.pyc deleted file mode 100644 index f811851..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/__pycache__/tcl_tk.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/conda.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/conda.py deleted file mode 100755 index a237102..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/conda.py +++ /dev/null @@ -1,401 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# language=rst -""" -Additional helper methods for working specifically with Anaconda distributions are found at -:mod:`PyInstaller.utils.hooks.conda_support` -which is designed to mimic (albeit loosely) the `importlib.metadata`_ package. These functions find and parse the -distribution metadata from json files located in the ``conda-meta`` directory. - -.. versionadded:: 4.2.0 - -This module is available only if run inside a Conda environment. Usage of this module should therefore be wrapped in -a conditional clause:: - - from PyInstaller.compat import is_pure_conda - - if is_pure_conda: - from PyInstaller.utils.hooks import conda_support - - # Code goes here. e.g. - binaries = conda_support.collect_dynamic_libs("numpy") - ... - -Packages are all referenced by the *distribution name* you use to install it, rather than the *package name* you import -it with. I.e., use ``distribution("pillow")`` instead of ``distribution("PIL")`` or use ``package_distribution("PIL")``. -""" -from __future__ import annotations - -import fnmatch -import json -import pathlib -import sys -from typing import Iterable, List -from importlib.metadata import PackagePath as _PackagePath - -from PyInstaller import compat -from PyInstaller.log import logger - -# Conda virtual environments each get their own copy of `conda-meta` so the use of `sys.prefix` instead of -# `sys.base_prefix`, `sys.real_prefix` or anything from our `compat` module is intentional. -CONDA_ROOT = pathlib.Path(sys.prefix) -CONDA_META_DIR = CONDA_ROOT / "conda-meta" - -# Find all paths in `sys.path` that are inside Conda root. -PYTHONPATH_PREFIXES = [] -for _path in sys.path: - _path = pathlib.Path(_path) - try: - PYTHONPATH_PREFIXES.append(_path.relative_to(sys.prefix)) - except ValueError: - pass - -PYTHONPATH_PREFIXES.sort(key=lambda p: len(p.parts), reverse=True) - - -class Distribution: - """ - A bucket class representation of a Conda distribution. - - This bucket exports the following attributes: - - :ivar name: The distribution's name. - :ivar version: Its version. - :ivar files: All filenames as :meth:`PackagePath`\\ s included with this distribution. - :ivar dependencies: Names of other distributions that this distribution depends on (with version constraints - removed). - :ivar packages: Names of importable packages included in this distribution. - - This class is not intended to be constructed directly by users. Rather use :meth:`distribution` or - :meth:`package_distribution` to provide one for you. - """ - def __init__(self, json_path: str): - try: - self._json_path = pathlib.Path(json_path) - assert self._json_path.exists() - except (TypeError, AssertionError): - raise TypeError( - "Distribution requires a path to a conda-meta json. Perhaps you want " - "`distribution({})` instead?".format(repr(json_path)) - ) - - # Everything we need (including this distribution's name) is kept in the metadata json. - self.raw: dict = json.loads(self._json_path.read_text()) - - # Unpack the more useful contents of the json. - self.name: str = self.raw["name"] - self.version: str = self.raw["version"] - self.files = [PackagePath(i) for i in self.raw["files"]] - self.dependencies = self._init_dependencies() - self.packages = self._init_package_names() - - def __repr__(self): - return "{}(name=\"{}\", packages={})".format(type(self).__name__, self.name, self.packages) - - def _init_dependencies(self): - """ - Read dependencies from ``self.raw["depends"]``. - - :return: Dependent distribution names. - :rtype: list - - The names in ``self.raw["depends"]`` come with extra version constraint information which must be stripped. - """ - dependencies = [] - # For each dependency: - for dependency in self.raw.get("depends", []): - # ``dependency`` is a string of the form: "[name] [version constraints]" - name, *version_constraints = dependency.split(maxsplit=1) - dependencies.append(name) - return dependencies - - def _init_package_names(self): - """ - Search ``self.files`` for package names shipped by this distribution. - - :return: Package names. - :rtype: list - - These are names you would ``import`` rather than names you would install. - """ - packages = [] - for file in self.files: - package = _get_package_name(file) - if package is not None: - packages.append(package) - return packages - - @classmethod - def from_name(cls, name: str): - """ - Get distribution information for a given distribution **name** (i.e., something you would ``conda install``). - - :rtype: :class:`Distribution` - """ - if name in distributions: - return distributions[name] - raise ModuleNotFoundError( - "Distribution {} is either not installed or was not installed using Conda.".format(name) - ) - - @classmethod - def from_package_name(cls, name: str): - """ - Get distribution information for a **package** (i.e., something you would import). - - :rtype: :class:`Distribution` - - For example, the package ``pkg_resources`` belongs to the distribution ``setuptools``, which contains three - packages. - - >>> package_distribution("pkg_resources") - Distribution(name="setuptools", - packages=['easy_install', 'pkg_resources', 'setuptools']) - """ - if name in distributions_by_package: - return distributions_by_package[name] - raise ModuleNotFoundError("Package {} is either not installed or was not installed using Conda.".format(name)) - - -distribution = Distribution.from_name -package_distribution = Distribution.from_package_name - - -class PackagePath(_PackagePath): - """ - A filename relative to Conda's root (``sys.prefix``). - - This class inherits from :class:`pathlib.PurePosixPath` even on non-Posix OSs. To convert to a :class:`pathlib.Path` - pointing to the real file, use the :meth:`locate` method. - """ - def locate(self): - """ - Return a path-like object for this path pointing to the file's true location. - """ - return pathlib.Path(sys.prefix) / self - - -def walk_dependency_tree(initial: str, excludes: Iterable[str] | None = None): - """ - Collect a :class:`Distribution` and all direct and indirect dependencies of that distribution. - - Arguments: - initial: - Distribution name to collect from. - excludes: - Distributions to exclude. - Returns: - A ``{name: distribution}`` mapping where ``distribution`` is the output of - :func:`conda_support.distribution(name) `. - """ - if excludes is not None: - excludes = set(excludes) - - # Rather than use true recursion, mimic it with a to-do queue. - from collections import deque - done = {} - names_to_do = deque([initial]) - - while names_to_do: - # Grab a distribution name from the to-do list. - name = names_to_do.pop() - try: - # Collect and save it's metadata. - done[name] = distribution = Distribution.from_name(name) - logger.debug("Collected Conda distribution '%s', a dependency of '%s'.", name, initial) - except ModuleNotFoundError: - logger.warning( - "Conda distribution '%s', dependency of '%s', was not found. " - "If you installed this distribution with pip then you may ignore this warning.", name, initial - ) - continue - # For each dependency: - for _name in distribution.dependencies: - if _name in done: - # Skip anything already done. - continue - if _name == name: - # Avoid infinite recursion if a distribution depends on itself. This will probably never happen but I - # certainly would not chance it. - continue - if excludes is not None and _name in excludes: - # Do not recurse to excluded dependencies. - continue - names_to_do.append(_name) - return done - - -def _iter_distributions(name, dependencies, excludes): - if dependencies: - return walk_dependency_tree(name, excludes).values() - else: - return [Distribution.from_name(name)] - - -def requires(name: str, strip_versions: bool = False) -> List[str]: - """ - List requirements of a distribution. - - Arguments: - name: - The name of the distribution. - strip_versions: - List only their names, not their version constraints. - Returns: - A list of distribution names. - """ - if strip_versions: - return distribution(name).dependencies - return distribution(name).raw["depends"] - - -def files(name: str, dependencies: bool = False, excludes: list | None = None) -> List[PackagePath]: - """ - List all files belonging to a distribution. - - Arguments: - name: - The name of the distribution. - dependencies: - Recursively collect files of dependencies too. - excludes: - Distributions to ignore if **dependencies** is true. - Returns: - All filenames belonging to the given distribution. - - With ``dependencies=False``, this is just a shortcut for:: - - conda_support.distribution(name).files - """ - return [file for dist in _iter_distributions(name, dependencies, excludes) for file in dist.files] - - -if compat.is_win: - lib_dir = pathlib.PurePath("Library", "bin") -else: - lib_dir = pathlib.PurePath("lib") - - -def collect_dynamic_libs(name: str, dest: str = ".", dependencies: bool = True, excludes: Iterable[str] | None = None): - """ - Collect DLLs for distribution **name**. - - Arguments: - name: - The distribution's project-name. - dest: - Target destination, defaults to ``'.'``. - dependencies: - Recursively collect libs for dependent distributions (recommended). - excludes: - Dependent distributions to skip, defaults to ``None``. - Returns: - List of DLLs in PyInstaller's ``(source, dest)`` format. - - This collects libraries only from Conda's shared ``lib`` (Unix) or ``Library/bin`` (Windows) folders. To collect - from inside a distribution's installation use the regular :func:`PyInstaller.utils.hooks.collect_dynamic_libs`. - """ - DLL_SUFFIXES = ("*.dll", "*.dylib", "*.so", "*.so.*") - _files = [] - for file in files(name, dependencies, excludes): - # A file is classified as a dynamic library if: - # 1) it lives inside the dedicated ``lib_dir`` DLL folder. - # - # NOTE: `file` is an instance of `PackagePath`, which inherits from `pathlib.PurePosixPath` even on Windows. - # Therefore, it does not properly handle cases when metadata paths contain Windows-style separator, which does - # seem to be used on some Windows installations (see #9113). Therefore, cast `file` to `pathlib.PurePath` - # before comparing its parent to `lib_dir` (which should also be a `pathlib.PurePath`). - if pathlib.PurePath(file).parent != lib_dir: - continue - # 2) it is a file (and not a directory or a symbolic link pointing to a directory) - resolved_file = file.locate() - if not resolved_file.is_file(): - continue - # 3) has a correct suffix - if not any([resolved_file.match(suffix) for suffix in DLL_SUFFIXES]): - continue - - _files.append((str(resolved_file), dest)) - return _files - - -# --- Map packages to distributions and vice-versa --- - - -def _get_package_name(file: PackagePath): - """ - Determine the package name of a Python file in :data:`sys.path`. - - Arguments: - file: - A Python filename relative to Conda root (sys.prefix). - Returns: - Package name or None. - - This function only considers single file packages e.g. ``foo.py`` or top level ``foo/__init__.py``\\ s. - Anything else is ignored (returning ``None``). - """ - file = pathlib.Path(file) - # TODO: Handle PEP 420 namespace packages (which are missing `__init__` module). No such Conda PEP 420 namespace - # packages are known. - - # Get top-level folders by finding parents of `__init__.xyz`s - if file.stem == "__init__" and file.suffix in compat.ALL_SUFFIXES: - file = file.parent - elif file.suffix not in compat.ALL_SUFFIXES: - # Keep single-file packages but skip DLLs, data and junk files. - return - - # Check if this file/folder's parent is in ``sys.path`` i.e. it's directly importable. This intentionally excludes - # submodules which would cause confusion because ``sys.prefix`` is in ``sys.path``, meaning that every file in an - # Conda installation is a submodule. - for prefix in PYTHONPATH_PREFIXES: - if len(file.parts) != len(prefix.parts) + 1: - # This check is redundant but speeds it up quite a bit. - continue - # There are no wildcards involved here. The use of ``fnmatch`` is simply to handle the `if case-insensitive - # file system: use case-insensitive string matching.` - if fnmatch.fnmatch(str(file.parent), str(prefix)): - return file.stem - - -# All the information we want is organised the wrong way. - -# We want to look up distribution based on package names, but we can only search for packages using distribution names. -# And we would like to search for a distribution's json file, but, due to the noisy filenames of the jsons, we can only -# find a json's distribution rather than a distribution's json. - -# So we have to read everything, then regroup distributions in the ways we want them grouped. This will likely be a -# spectacular bottleneck on full-blown Conda (non miniconda) with 250+ packages by default at several GiBs. I suppose we -# could cache this on a per-json basis if it gets too much. - - -def _init_distributions(): - distributions = {} - for path in CONDA_META_DIR.glob("*.json"): - dist = Distribution(path) - distributions[dist.name] = dist - return distributions - - -distributions = _init_distributions() - - -def _init_packages(): - distributions_by_package = {} - for distribution in distributions.values(): - for package in distribution.packages: - distributions_by_package[package] = distribution - return distributions_by_package - - -distributions_by_package = _init_packages() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/django.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/django.py deleted file mode 100755 index 5b8bdae..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/django.py +++ /dev/null @@ -1,152 +0,0 @@ -# ---------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -# ---------------------------------------------------------------------------- -import os - -from PyInstaller import isolated - - -@isolated.decorate -def django_dottedstring_imports(django_root_dir): - """ - An isolated helper that returns list of all Django dependencies, parsed from the `mysite.settings` module. - - NOTE: With newer version of Django this is most likely the part of PyInstaller that will be broken. - - Tested with Django 2.2 - """ - - import sys - import os - - import PyInstaller.utils.misc - from PyInstaller.utils import hooks as hookutils - - # Extra search paths to add to sys.path: - # - parent directory of the django_root_dir - # - django_root_dir itself; often, Django users do not specify absolute imports in the settings module. - search_paths = [ - PyInstaller.utils.misc.get_path_to_toplevel_modules(django_root_dir), - django_root_dir, - ] - sys.path += search_paths - - # Set the path to project's settings module - default_settings_module = os.path.basename(django_root_dir) + '.settings' - settings_module = os.environ.get('DJANGO_SETTINGS_MODULE', default_settings_module) - os.environ['DJANGO_SETTINGS_MODULE'] = settings_module - - # Calling django.setup() avoids the exception AppRegistryNotReady() and also reads the user settings - # from DJANGO_SETTINGS_MODULE. - # https://stackoverflow.com/questions/24793351/django-appregistrynotready - import django # noqa: E402 - - django.setup() - - # This allows to access all django settings even from the settings.py module. - from django.conf import settings # noqa: E402 - - hiddenimports = list(settings.INSTALLED_APPS) - - # Do not fail script when settings does not have such attributes. - if hasattr(settings, 'TEMPLATE_CONTEXT_PROCESSORS'): - hiddenimports += list(settings.TEMPLATE_CONTEXT_PROCESSORS) - - if hasattr(settings, 'TEMPLATE_LOADERS'): - hiddenimports += list(settings.TEMPLATE_LOADERS) - - hiddenimports += [settings.ROOT_URLCONF] - - def _remove_class(class_name): - return '.'.join(class_name.split('.')[0:-1]) - - #-- Changes in Django 1.7. - - # Remove class names and keep just modules. - if hasattr(settings, 'AUTHENTICATION_BACKENDS'): - for cl in settings.AUTHENTICATION_BACKENDS: - cl = _remove_class(cl) - hiddenimports.append(cl) - # Deprecated since 4.2, may be None until it is removed - cl = getattr(settings, 'DEFAULT_FILE_STORAGE', None) - if cl: - hiddenimports.append(_remove_class(cl)) - if hasattr(settings, 'FILE_UPLOAD_HANDLERS'): - for cl in settings.FILE_UPLOAD_HANDLERS: - cl = _remove_class(cl) - hiddenimports.append(cl) - if hasattr(settings, 'MIDDLEWARE_CLASSES'): - for cl in settings.MIDDLEWARE_CLASSES: - cl = _remove_class(cl) - hiddenimports.append(cl) - # Templates is a dict: - if hasattr(settings, 'TEMPLATES'): - for templ in settings.TEMPLATES: - backend = _remove_class(templ['BACKEND']) - hiddenimports.append(backend) - # Include context_processors. - if hasattr(templ, 'OPTIONS'): - if hasattr(templ['OPTIONS'], 'context_processors'): - # Context processors are functions - strip last word. - mods = templ['OPTIONS']['context_processors'] - mods = [_remove_class(x) for x in mods] - hiddenimports += mods - # Include database backends - it is a dict. - for v in settings.DATABASES.values(): - hiddenimports.append(v['ENGINE']) - - # Add templatetags and context processors for each installed app. - for app in settings.INSTALLED_APPS: - app_templatetag_module = app + '.templatetags' - app_ctx_proc_module = app + '.context_processors' - hiddenimports.append(app_templatetag_module) - hiddenimports += hookutils.collect_submodules(app_templatetag_module) - hiddenimports.append(app_ctx_proc_module) - - # Deduplicate imports. - hiddenimports = list(set(hiddenimports)) - - # Return the hidden imports - return hiddenimports - - -def django_find_root_dir(): - """ - Return path to directory (top-level Python package) that contains main django files. Return None if no directory - was detected. - - Main Django project directory contain files like '__init__.py', 'settings.py' and 'url.py'. - - In Django 1.4+ the script 'manage.py' is not in the directory with 'settings.py' but usually one level up. We - need to detect this special case too. - """ - # 'PyInstaller.config' cannot be imported as other top-level modules. - from PyInstaller.config import CONF - - # Get the directory with manage.py. Manage.py is supplied to PyInstaller as the first main executable script. - manage_py = CONF['main_script'] - manage_dir = os.path.dirname(os.path.abspath(manage_py)) - - # Get the Django root directory. The directory that contains settings.py and url.py. It could be the directory - # containing manage.py or any of its subdirectories. - settings_dir = None - files = set(os.listdir(manage_dir)) - if ('settings.py' in files or 'settings' in files) and 'urls.py' in files: - settings_dir = manage_dir - else: - for f in files: - if os.path.isdir(os.path.join(manage_dir, f)): - subfiles = os.listdir(os.path.join(manage_dir, f)) - # Subdirectory contains critical files. - if ('settings.py' in subfiles or 'settings' in subfiles) and 'urls.py' in subfiles: - settings_dir = os.path.join(manage_dir, f) - break # Find the first directory. - - return settings_dir diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/gi.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/gi.py deleted file mode 100755 index 9ae06ce..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/gi.py +++ /dev/null @@ -1,457 +0,0 @@ -# ---------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -# ---------------------------------------------------------------------------- -import os -import pathlib -import shutil -import subprocess -import hashlib -import re - -from PyInstaller.depend.utils import _resolveCtypesImports -from PyInstaller.utils.hooks import collect_submodules, collect_system_data_files, get_hook_config -from PyInstaller import isolated -from PyInstaller import log as logging -from PyInstaller import compat -from PyInstaller.depend.bindepend import findSystemLibrary - -logger = logging.getLogger(__name__) - - -class GiModuleInfo: - def __init__(self, module, version, hook_api=None): - self.name = module - self.version = version - self.available = False - self.sharedlibs = [] - self.typelib = None - self.dependencies = [] - - # If hook API is available, use it to override the version from hookconfig. - if hook_api is not None: - module_versions = get_hook_config(hook_api, 'gi', 'module-versions') - if module_versions: - self.version = module_versions.get(module, version) - - logger.debug("Gathering GI module info for %s %s", module, self.version) - - @isolated.decorate - def _get_module_info(module, version): - import gi - - # Ideally, we would use gi.Repository, which provides common abstraction for some of the functions we use in - # this codepath (e.g., `require`, `get_typelib_path`, `get_immediate_dependencies`). However, it lacks the - # `get_shared_library` function, which is why we are using "full" bindings via `gi.repository.GIRepository`. - # - # PyGObject 3.52.0 switched from girepository-1.0 to girepository-2.0, which means that GIRepository version - # has changed from 2.0 to 3.0 and some of the API has changed. - try: - gi.require_version("GIRepository", "3.0") - new_api = True - except ValueError: - gi.require_version("GIRepository", "2.0") - new_api = False - - from gi.repository import GIRepository - - # The old API had `get_default` method to obtain global singleton object; it was removed in the new API, - # which requires creation of separate GIRepository instances. - if new_api: - repo = GIRepository.Repository() - try: - repo.require(module, version, GIRepository.RepositoryLoadFlags.LAZY) - except ValueError: - return None # Module not available - - # The new API returns the list of shared libraries. - sharedlibs = repo.get_shared_libraries(module) - else: - repo = GIRepository.Repository.get_default() - try: - repo.require(module, version, GIRepository.RepositoryLoadFlags.IREPOSITORY_LOAD_FLAG_LAZY) - except ValueError: - return None # Module not available - - # Shared library/libraries - # Comma-separated list of paths to shared libraries, or None if none are associated. Convert to list. - sharedlibs = repo.get_shared_library(module) - sharedlibs = [lib.strip() for lib in sharedlibs.split(",")] if sharedlibs else [] - - # Path to .typelib file - typelib = repo.get_typelib_path(module) - - # Dependencies - # GIRepository.Repository.get_immediate_dependencies is available from gobject-introspection v1.44 on - if hasattr(repo, 'get_immediate_dependencies'): - dependencies = repo.get_immediate_dependencies(module) - else: - dependencies = repo.get_dependencies(module) - - return { - 'sharedlibs': sharedlibs, - 'typelib': typelib, - 'dependencies': dependencies, - } - - # Try to query information; if this fails, mark module as unavailable. - try: - info = _get_module_info(module, self.version) - if info is None: - logger.debug("GI module info %s %s not found.", module, self.version) - else: - logger.debug("GI module info %s %s found.", module, self.version) - self.sharedlibs = info['sharedlibs'] - self.typelib = info['typelib'] - self.dependencies = info['dependencies'] - self.available = True - except Exception as e: - logger.warning("Failed to query GI module %s %s: %s", module, self.version, e) - - def get_libdir(self): - """ - Return the path to shared library used by the module. If no libraries are associated with the typelib, None is - returned. If multiple library names are associated with the typelib, the path to the first resolved shared - library is returned. Raises exception if module is unavailable or none of the shared libraries could be - resolved. - """ - # Module unavailable - if not self.available: - raise ValueError(f"Module {self.name} {self.version} is unavailable!") - # Module has no associated shared libraries - if not self.sharedlibs: - return None - for lib in self.sharedlibs: - path = findSystemLibrary(lib) - if path: - return os.path.normpath(os.path.dirname(path)) - raise ValueError(f"Could not resolve any shared library of {self.name} {self.version}: {self.sharedlibs}!") - - def collect_typelib_data(self): - """ - Return a tuple of (binaries, datas, hiddenimports) to be used by PyGObject related hooks. - """ - datas = [] - binaries = [] - hiddenimports = [] - - logger.debug("Collecting module data for %s %s", self.name, self.version) - - # Module unavailable - if not self.available: - raise ValueError(f"Module {self.name} {self.version} is unavailable!") - - # Find shared libraries - resolved_libs = _resolveCtypesImports(self.sharedlibs) - for resolved_lib in resolved_libs: - logger.debug("Collecting shared library %s at %s", resolved_lib[0], resolved_lib[1]) - binaries.append((resolved_lib[1], ".")) - - # Find and collect .typelib file. Run it through the `gir_library_path_fix` to fix the library path, if - # necessary. - typelib_entry = gir_library_path_fix(self.typelib) - if typelib_entry: - logger.debug('Collecting gir typelib at %s', typelib_entry[0]) - datas.append(typelib_entry) - - # Overrides for the module - hiddenimports += collect_submodules('gi.overrides', lambda name: name.endswith('.' + self.name)) - - # Module dependencies - for dep in self.dependencies: - dep_module, _ = dep.rsplit('-', 1) - hiddenimports += [f'gi.repository.{dep_module}'] - - return binaries, datas, hiddenimports - - -# The old function, provided for backwards compatibility in 3rd party hooks. -def get_gi_libdir(module, version): - module_info = GiModuleInfo(module, version) - return module_info.get_libdir() - - -# The old function, provided for backwards compatibility in 3rd party hooks. -def get_gi_typelibs(module, version): - """ - Return a tuple of (binaries, datas, hiddenimports) to be used by PyGObject related hooks. Searches for and adds - dependencies recursively. - - :param module: GI module name, as passed to 'gi.require_version()' - :param version: GI module version, as passed to 'gi.require_version()' - """ - module_info = GiModuleInfo(module, version) - return module_info.collect_typelib_data() - - -def gir_library_path_fix(path): - import subprocess - - # 'PyInstaller.config' cannot be imported as other top-level modules. - from PyInstaller.config import CONF - - path = os.path.abspath(path) - - # On macOS we need to recompile the GIR files to reference the loader path, - # but this is not necessary on other platforms. - if compat.is_darwin: - - # If using a virtualenv, the base prefix and the path of the typelib - # have really nothing to do with each other, so try to detect that. - common_path = os.path.commonprefix([compat.base_prefix, path]) - if common_path == '/': - logger.debug("virtualenv detected? fixing the gir path...") - common_path = os.path.abspath(os.path.join(path, '..', '..', '..')) - - gir_path = os.path.join(common_path, 'share', 'gir-1.0') - - typelib_name = os.path.basename(path) - gir_name = os.path.splitext(typelib_name)[0] + '.gir' - - gir_file = os.path.join(gir_path, gir_name) - - if not os.path.exists(gir_path): - logger.error( - "Unable to find gir directory: %s.\nTry installing your platform's gobject-introspection package.", - gir_path - ) - return None - if not os.path.exists(gir_file): - logger.error( - "Unable to find gir file: %s.\nTry installing your platform's gobject-introspection package.", gir_file - ) - return None - - with open(gir_file, 'r', encoding='utf-8') as f: - lines = f.readlines() - # GIR files are `XML encoded `_, - # which means they are by definition encoded using UTF-8. - with open(os.path.join(CONF['workpath'], gir_name), 'w', encoding='utf-8') as f: - for line in lines: - if 'shared-library' in line: - split = re.split('(=)', line) - files = re.split('(["|,])', split[2]) - for count, item in enumerate(files): - if 'lib' in item: - files[count] = '@loader_path/' + os.path.basename(item) - line = ''.join(split[0:2]) + ''.join(files) - f.write(line) - - # g-ir-compiler expects a file so we cannot just pipe the fixed file to it. - command = subprocess.Popen(( - 'g-ir-compiler', os.path.join(CONF['workpath'], gir_name), - '-o', os.path.join(CONF['workpath'], typelib_name) - )) # yapf: disable - command.wait() - - return os.path.join(CONF['workpath'], typelib_name), 'gi_typelibs' - else: - return path, 'gi_typelibs' - - -@isolated.decorate -def get_glib_system_data_dirs(): - import gi - gi.require_version('GLib', '2.0') - from gi.repository import GLib - return GLib.get_system_data_dirs() - - -def get_glib_sysconf_dirs(): - """ - Try to return the sysconf directories (e.g., /etc). - """ - if compat.is_win: - # On Windows, if you look at gtkwin32.c, sysconfdir is actually relative to the location of the GTK DLL. Since - # that is what we are actually interested in (not the user path), we have to do that the hard way... - return [os.path.join(get_gi_libdir('GLib', '2.0'), 'etc')] - - @isolated.call - def data_dirs(): - import gi - gi.require_version('GLib', '2.0') - from gi.repository import GLib - return GLib.get_system_config_dirs() - - return data_dirs - - -def collect_glib_share_files(*path): - """ - Path is relative to the system data directory (e.g., /usr/share). - """ - glib_data_dirs = get_glib_system_data_dirs() - if glib_data_dirs is None: - return [] - - destdir = os.path.join('share', *path) - - # TODO: will this return too much? - collected = [] - for data_dir in glib_data_dirs: - p = os.path.join(data_dir, *path) - collected += collect_system_data_files(p, destdir=destdir, include_py_files=False) - - return collected - - -def collect_glib_etc_files(*path): - """ - Path is relative to the system config directory (e.g., /etc). - """ - glib_config_dirs = get_glib_sysconf_dirs() - if glib_config_dirs is None: - return [] - - destdir = os.path.join('etc', *path) - - # TODO: will this return too much? - collected = [] - for config_dir in glib_config_dirs: - p = os.path.join(config_dir, *path) - collected += collect_system_data_files(p, destdir=destdir, include_py_files=False) - - return collected - - -_glib_translations = None - - -def collect_glib_translations(prog, lang_list=None): - """ - Return a list of translations in the system locale directory whose names equal prog.mo. - """ - global _glib_translations - if _glib_translations is None: - if lang_list is not None: - trans = [] - for lang in lang_list: - trans += collect_glib_share_files(os.path.join("locale", lang)) - _glib_translations = trans - else: - _glib_translations = collect_glib_share_files('locale') - - names = [os.sep + prog + '.mo', os.sep + prog + '.po'] - namelen = len(names[0]) - - return [(src, dst) for src, dst in _glib_translations if src[-namelen:] in names] - - -# Not a hook utility function per-se (used by main Analysis class), but kept here to have all GLib/GObject functions -# in one place... -def compile_glib_schema_files(datas_toc, workdir, collect_source_files=False): - """ - Compile collected GLib schema files. Extracts the list of GLib schema files from the given input datas TOC, copies - them to temporary working directory, and compiles them. The resulting `gschemas.compiled` file is added to the - output TOC, replacing any existing entry with that name. If `collect_source_files` flag is set, the source XML - schema files are also (re)added to the output TOC; by default, they are not. This function is no-op (returns the - original TOC) if no GLib schemas are found in TOC or if `glib-compile-schemas` executable is not found in `PATH`. - """ - SCHEMA_DEST_DIR = pathlib.PurePath("share/glib-2.0/schemas") - workdir = pathlib.Path(workdir) - - schema_files = [] - output_toc = [] - for toc_entry in datas_toc: - dest_name, src_name, typecode = toc_entry - dest_name = pathlib.PurePath(dest_name) - src_name = pathlib.PurePath(src_name) - - # Pass-through for non-schema files, identified based on the destination directory. - if dest_name.parent != SCHEMA_DEST_DIR: - output_toc.append(toc_entry) - continue - - # It seems schemas directory contains different files with different suffices: - # - .gschema.xml - # - .schema.override - # - .enums.xml - # To avoid omitting anything, simply collect everything into temporary directory. - # Exemptions are gschema.dtd (which should be unnecessary) and gschemas.compiled (which we will generate - # ourselves in this function). - if src_name.name in {"gschema.dtd", "gschemas.compiled"}: - continue - - schema_files.append(src_name) - - # If there are no schema files available, simply return the input datas TOC. - if not schema_files: - return datas_toc - - # Ensure that `glib-compile-schemas` executable is in PATH, just in case... - schema_compiler_exe = shutil.which('glib-compile-schemas') - if not schema_compiler_exe: - logger.warning("GLib schema compiler (glib-compile-schemas) not found! Skipping GLib schema recompilation...") - return datas_toc - - # If `gschemas.compiled` file already exists in the temporary working directory, record its modification time and - # hash. This will allow us to restore the modification time on the newly-compiled copy, if the latter turns out - # to be identical to the existing old one. Just in case, if the file becomes subject to timestamp-based caching - # mechanism. - compiled_file = workdir / "gschemas.compiled" - old_compiled_file_hash = None - old_compiled_file_stat = None - - if compiled_file.is_file(): - # Record creation/modification time - old_compiled_file_stat = compiled_file.stat() - # Compute SHA1 hash; since compiled schema files are relatively small, do it in single step. - old_compiled_file_hash = hashlib.sha1(compiled_file.read_bytes()).digest() - - # Ensure that temporary working directory exists, and is empty. - if workdir.exists(): - shutil.rmtree(workdir) - workdir.mkdir(exist_ok=True) - - # Copy schema (source) files to temporary working directory - for schema_file in schema_files: - shutil.copy(schema_file, workdir) - - # Compile. The glib-compile-schema might produce warnings on its own (e.g., schemas using deprecated paths, or - # overrides for non-existent keys). Since these are non-actionable, capture and display them only as a DEBUG - # message, or as a WARNING one if the command fails. - logger.info("Compiling collected GLib schema files in %r...", str(workdir)) - try: - cmd_args = [schema_compiler_exe, str(workdir), '--targetdir', str(workdir)] - p = subprocess.run( - cmd_args, - stdin=subprocess.DEVNULL, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - check=True, - errors='ignore', - encoding='utf-8', - ) - logger.debug("Output from glib-compile-schemas:\n%s", p.stdout) - except subprocess.CalledProcessError as e: - # The called glib-compile-schema returned error. Display stdout/stderr, and return original datas TOC to - # minimize damage. - logger.warning("Failed to recompile GLib schemas! Returning collected files as-is!", exc_info=True) - logger.warning("Output from glib-compile-schemas:\n%s", e.stdout) - return datas_toc - except Exception: - # Compilation failed for whatever reason. Return original datas TOC to minimize damage. - logger.warning("Failed to recompile GLib schemas! Returning collected files as-is!", exc_info=True) - return datas_toc - - # Compute the checksum of the new compiled file, and if it matches the old checksum, restore the modification time. - if old_compiled_file_hash is not None: - new_compiled_file_hash = hashlib.sha1(compiled_file.read_bytes()).digest() - if new_compiled_file_hash == old_compiled_file_hash: - os.utime(compiled_file, ns=(old_compiled_file_stat.st_atime_ns, old_compiled_file_stat.st_mtime_ns)) - - # Add the resulting gschemas.compiled file to the output TOC - output_toc.append((str(SCHEMA_DEST_DIR / compiled_file.name), str(compiled_file), "DATA")) - - # Include source schema files in the output TOC (optional) - if collect_source_files: - for schema_file in schema_files: - output_toc.append((str(SCHEMA_DEST_DIR / schema_file.name), str(schema_file), "DATA")) - - return output_toc diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/qt/__init__.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/qt/__init__.py deleted file mode 100755 index fbefbe3..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/qt/__init__.py +++ /dev/null @@ -1,1427 +0,0 @@ -# ---------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -import glob -import os -import pathlib -import re - -from PyInstaller import compat -from PyInstaller import isolated -from PyInstaller import log as logging -from PyInstaller.depend import bindepend -from PyInstaller.utils import hooks, misc -from PyInstaller.utils.hooks.qt import _modules_info - -logger = logging.getLogger(__name__) - -# Qt deployment approach -# ---------------------- -# This is the core of PyInstaller's approach to Qt deployment. It is based on: -# -# - Discovering the location of Qt libraries by introspection, using QtLibraryInfo_. This provides compatibility with -# many variants of Qt5/6 (conda, self-compiled, provided by a Linux distro, etc.) and many versions of Qt5/6, all of -# which vary in the location of Qt files. -# -# - Placing all frozen PyQt5/6 or PySide2/6 Qt files in a standard subdirectory layout, which matches the layout of the -# corresponding wheel on PyPI. This is necessary to support Qt installs which are not in a subdirectory of the PyQt5/6 -# or PySide2/6 wrappers. See ``hooks/rthooks/pyi_rth_qt5.py`` for the use of environment variables to establish this -# layout. -# -# - Emitting warnings on missing QML and translation files which some installations do not have. -# -# - Determining additional files needed for deployment based on the information in the centralized Qt module information -# list in the ``_modules_info`` module. This includes plugins and translation files associated with each Qt python -# extension module, as well as additional python Qt extension modules. -# -# - Collecting additional files that are specific to each module and are handled separately, for example: -# -# - For dynamic OpenGL applications, the ``libEGL.dll``, ``libGLESv2.dll``, ``d3dcompiler_XX.dll`` (the XX is a -# version number), and ``opengl32sw.dll`` libraries need to be collected on Windows. This is handled by the -# "base" bindings hook, for example ``hook-PyQt5.py``. -# -# - If Qt was configured to use ICU, the ``icudtXX.dll``, ``icuinXX.dll``, and ``icuucXX.dll`` libraries need to -# be collected on Windows. This is handled by the "base" bindings hook, for example ``hook-PyQt5.py``. -# -# - Per the `Deploying QML Applications `_ page, QML-based -# applications need the ``qml/`` directory available. This is handled by ``QtQuick`` hook, for example -# ``hook-PyQt5.QtQuick.py``. -# -# - For ``QtWebEngine``-based applications, we follow the `deployWebEngineCore -# `_ -# function copies the following files from ``resources/``, and also copies the web engine process executable. -# - ``icudtl.dat`` -# - ``qtwebengine_devtools_resources.pak`` -# - ``qtwebengine_resources.pak`` -# - ``qtwebengine_resources_100p.pak`` -# - ``qtwebengine_resources_200p.pak`` -# -# This is handled by the ``QtWebEngineCore`` hook, for example ``hook-PyQt5.QtWebEngineCore.py``. -# -# For details and references, see the `original write-up -# `_ -# and the documentation in the ``_modules_info`` module. - - -# QtModuleInfo -# ------------ -# This class contains information about python module (extension), its corresponding Qt module (shared library), and -# associated plugins and translations. It is used within QtLibraryInfo_ to establish name-based mappings for file -# collection. -class QtModuleInfo: - def __init__(self, module, shared_lib=None, translations=None, plugins=None): - # Python module (extension) name without package namespace. For example, `QtCore`. - # Can be None if python bindings do not bind the module, but we still need to establish relationship between - # the Qt module (shared library) and its plugins and translations. - self.module = module - # Associated Qt module (shared library), if any. Used during recursive dependency analysis, where a python - # module (extension) is analyzed for linked Qt modules (shared libraries), and then their corresponding - # python modules (extensions) are added to hidden imports. For example, the Qt module name is `Qt5Core` or - # `Qt6Core`, depending on the Qt version. Can be None for python modules that are not tied to a particular - # Qt shared library (for example, the corresponding Qt module is headers-only) and hence they cannot be - # inferred from recursive link-time dependency analysis. - self.shared_lib = shared_lib - # List of base names of translation files (if any) associated with the Qt module. Multiple base names may be - # associated with a single module. - # For example, `['qt', 'qtbase']` for `QtCore` or `['qtmultimedia']` for `QtMultimedia`. - self.translations = translations or [] - # List of plugins associated with the Qt module. - self.plugins = plugins or [] - - def __repr__(self): - return f"(module={self.module!r}, shared_lib={self.shared_lib!r}, " \ - f"translations={self.translations!r}, plugins={self.plugins!r}" - - -# QtLibraryInfo -# -------------- -# This class uses introspection to determine the location of Qt files. This is essential to deal with the many variants -# of the PyQt5/6 and PySide2/6 package, each of which places files in a different location. Therefore, this class -# provides all location-related members of `QLibraryInfo `_. -class QtLibraryInfo: - def __init__(self, namespace): - if namespace not in ['PyQt5', 'PyQt6', 'PySide2', 'PySide6']: - raise Exception('Invalid namespace: {0}'.format(namespace)) - self.namespace = namespace - # Distinction between PyQt5/6 and PySide2/6 - self.is_pyqt = namespace in {'PyQt5', 'PyQt6'} - # Distinction between Qt5 and Qt6 - self.qt_major = 6 if namespace in {'PyQt6', 'PySide6'} else 5 - # Determine relative path where Qt libraries and data need to be collected in the frozen application. This - # varies between PyQt5/PyQt6/PySide2/PySide6, their versions, and platforms. NOTE: it is tempting to consider - # deriving this path as simply the value of QLibraryInfo.PrefixPath, taken relative to the package's root - # directory. However, we also need to support non-wheel deployments (e.g., with Qt installed in custom path on - # Windows, or with Qt and PyQt5 installed on linux using native package manager), and in those, the Qt - # PrefixPath does not reflect the required relative target path for the frozen application. - if namespace == 'PyQt5': - if self._use_new_layout("PyQt5", "5.15.4", False): - self.qt_rel_dir = os.path.join('PyQt5', 'Qt5') - else: - self.qt_rel_dir = os.path.join('PyQt5', 'Qt') - elif namespace == 'PyQt6': - if self._use_new_layout("PyQt6", "6.0.3", True): - self.qt_rel_dir = os.path.join('PyQt6', 'Qt6') - else: - self.qt_rel_dir = os.path.join('PyQt6', 'Qt') - elif namespace == 'PySide2': - # PySide2 uses PySide2/Qt on linux and macOS, and PySide2 on Windows - if compat.is_win: - self.qt_rel_dir = 'PySide2' - else: - self.qt_rel_dir = os.path.join('PySide2', 'Qt') - else: - # PySide6 follows the same logic as PySide2 - if compat.is_win: - self.qt_rel_dir = 'PySide6' - else: - self.qt_rel_dir = os.path.join('PySide6', 'Qt') - - # Process module information list to construct python-module-name -> info and shared-lib-name -> info mappings. - self._load_module_info() - - def __repr__(self): - return f"QtLibraryInfo({self.namespace})" - - # Delay initialization of the Qt library information until the corresponding attributes are first requested. - def __getattr__(self, name): - if 'version' in self.__dict__: - # Initialization was already done, but requested attribute is not available. - raise AttributeError(name) - - # Load Qt library info... - self._load_qt_info() - # ... and return the requested attribute - return getattr(self, name) - - # Check whether we must use the new layout (e.g. PyQt5/Qt5, PyQt6/Qt6) instead of the old layout (PyQt5/Qt, - # PyQt6/Qt). - @staticmethod - def _use_new_layout(package_basename: str, version: str, fallback_value: bool) -> bool: - # The PyQt wheels come in both non-commercial and commercial variants. So we need to check if a particular - # variant is installed before testing its version. - if hooks.check_requirement(package_basename): - return hooks.check_requirement(f"{package_basename} >= {version}") - if hooks.check_requirement(f"{package_basename}_commercial"): - return hooks.check_requirement(f"{package_basename}_commercial >= {version}") - return fallback_value - - # Load Qt information (called on first access to related fields) - def _load_qt_info(self): - """ - Load and process Qt library information. Called on the first access to the related attributes of the class - (e.g., `version` or `location`). - """ - - # Ensure self.version exists, even if PyQt{5,6}/PySide{2,6} cannot be imported. Hooks and util functions use - # `if .version` to check whether package was imported and other attributes are expected to be available. - # This also serves as a marker that initialization was already done. - self.version = None - - # Get library path information from Qt. See QLibraryInfo_. - @isolated.decorate - def _read_qt_library_info(package): - import os - import sys - import importlib - - # Import the Qt-based package - # equivalent to: from package.QtCore import QLibraryInfo, QCoreApplication - try: - QtCore = importlib.import_module('.QtCore', package) - except ModuleNotFoundError: - return None # Signal that package is unavailable - QLibraryInfo = QtCore.QLibraryInfo - QCoreApplication = QtCore.QCoreApplication - - # QLibraryInfo is not always valid until a QCoreApplication is instantiated. - app = QCoreApplication(sys.argv) # noqa: F841 - - # Qt6 deprecated QLibraryInfo.location() in favor of QLibraryInfo.path(), and - # QLibraryInfo.LibraryLocation enum was replaced by QLibraryInfo.LibraryPath. - if hasattr(QLibraryInfo, 'path'): - # Qt6; enumerate path enum values directly from the QLibraryInfo.LibraryPath enum. - path_names = [x for x in dir(QLibraryInfo.LibraryPath) if x.endswith('Path')] - location = {x: QLibraryInfo.path(getattr(QLibraryInfo.LibraryPath, x)) for x in path_names} - else: - # Qt5; in recent versions, location enum values can be enumeratd from QLibraryInfo.LibraryLocation. - # However, in older versions of Qt5 and its python bindings, that is unavailable. Hence the - # enumeration of "*Path"-named members of QLibraryInfo. - path_names = [x for x in dir(QLibraryInfo) if x.endswith('Path')] - location = {x: QLibraryInfo.location(getattr(QLibraryInfo, x)) for x in path_names} - - # Determine the python-based package location, by looking where the QtCore module is located. - package_location = os.path.dirname(QtCore.__file__) - - # Determine Qt version. Works for Qt 5.8 and later, where QLibraryInfo.version() was introduced. - try: - version = QLibraryInfo.version().segments() - except AttributeError: - version = [] - - return { - 'is_debug_build': QLibraryInfo.isDebugBuild(), - 'version': version, - 'location': location, - 'package_location': package_location, - } - - try: - qt_info = _read_qt_library_info(self.namespace) - except Exception as e: - logger.warning("%s: failed to obtain Qt library info: %s", self, e) - return - - # If package could not be imported, `_read_qt_library_info` returns None. In such cases, emit a debug message - # instead of a warning, because this initialization might be triggered by a helper function that is trying to - # determine availability of bindings by inspecting the `version` attribute of `QtLibraryInfo` for all bindings. - if qt_info is None: - logger.debug("%s: failed to obtain Qt library info: %s.QtCore could not be imported.", self, self.namespace) - return - - for k, v in qt_info.items(): - setattr(self, k, v) - - # Turn package_location into pathlib.Path(), and fully resolve it. - self.package_location = pathlib.Path(self.package_location).resolve() - - # Determine if the Qt is bundled with python package itself; this usually means we are dealing with with PyPI - # wheels. - resolved_qt_prefix_path = pathlib.Path(self.location['PrefixPath']).resolve() - self.qt_inside_package = ( - self.package_location == resolved_qt_prefix_path or # PySide2 and PySide6 Windows PyPI wheels - self.package_location in resolved_qt_prefix_path.parents - ) - - # Determine directory that contains Qt shared libraries. On non-Windows, this is typically location given by - # `LibrariesPath`. On Windows, it is usually `BinariesPath`, except for PySide PyPI wheels, where DLLs are - # placed in top-level `PrefixPath`. - if compat.is_win: - if self.qt_inside_package and not self.is_pyqt: - # Windows PyPI wheel - qt_lib_dir = self.location['PrefixPath'] - else: - qt_lib_dir = self.location['BinariesPath'] - else: - qt_lib_dir = self.location['LibrariesPath'] - self.qt_lib_dir = pathlib.Path(qt_lib_dir).resolve() - - # Module information list loading/processing - def _load_module_info(self): - """ - Process the Qt modules info definition list and construct two dictionaries: - - dictionary that maps Qt python module names to Qt module info entries - - dictionary that maps shared library names to Qt module info entries - """ - - self.python_modules = dict() - self.shared_libraries = dict() - - for entry in _modules_info.QT_MODULES_INFO: - # If entry specifies applicable bindings, check them - if entry.bindings: - applicable_bindings = _modules_info.process_namespace_strings(entry.bindings) - if self.namespace not in applicable_bindings: - continue - - # Create a QtModuleInfo entry - info_entry = QtModuleInfo( - module=entry.module, - shared_lib=f"Qt{self.qt_major}{entry.shared_lib}" if entry.shared_lib else None, - translations=entry.translations, - plugins=entry.plugins - ) - - # If we have python module (extension) name, create python-module-name -> info mapping. - if info_entry.module is not None: - self.python_modules[info_entry.module] = info_entry - - # If we have Qt module (shared library) name, create shared-lib-name -> info mapping. - if info_entry.shared_lib is not None: - self.shared_libraries[info_entry.shared_lib.lower()] = info_entry - - def _normalize_shared_library_name(self, filename): - """ - Normalize a shared library name into common form that we can use for look-ups and comparisons. - Primarily intended for Qt shared library names. - """ - - # Take base name, remove suffix, and lower case it. - lib_name = os.path.splitext(os.path.basename(filename))[0].lower() - # Linux libraries sometimes have a dotted version number -- ``libfoo.so.3``. It is now ''libfoo.so``, - # but the ``.so`` must also be removed. - if compat.is_linux and os.path.splitext(lib_name)[1] == '.so': - lib_name = os.path.splitext(lib_name)[0] - # Remove the "lib" prefix (Linux, macOS). - if lib_name.startswith('lib'): - lib_name = lib_name[3:] - # macOS: handle different naming schemes. PyPI wheels ship framework-enabled Qt builds, where shared - # libraries are part of .framework bundles (e.g., ``PyQt5/Qt5/lib/QtCore.framework/Versions/5/QtCore``). - # In Anaconda (Py)Qt installations, the shared libraries are installed in environment's library directory, - # and contain versioned extensions, e.g., ``libQt5Core.5.dylib``. - if compat.is_darwin: - if lib_name.startswith('qt') and not lib_name.startswith('qt' + str(self.qt_major)): - # Qt library from a framework bundle (e.g., ``QtCore``); change prefix from ``qt`` to ``qt5`` or - # ``qt6`` to match names in Windows/Linux. - lib_name = 'qt' + str(self.qt_major) + lib_name[2:] - if lib_name.endswith('.' + str(self.qt_major)): - # Qt library from Anaconda, which originally had versioned extension, e.g., ``libfoo.5.dynlib``. - # The above processing turned it into ``foo.5``, so we need to remove the last two characters. - lib_name = lib_name[:-2] - - # Handle cases with QT_LIBINFIX set to '_conda', i.e. conda-forge builds. - if lib_name.endswith('_conda'): - lib_name = lib_name[:-6] - - return lib_name - - # Collection - def collect_module(self, module_name): - """ - Collect all dependencies (hiddenimports, binaries, datas) for the given Qt python module. - - This function performs recursive analysis of extension module's link-time dependencies, and uses dictionaries - built by `_load_module_info` to discover associated plugin types, translation file base names, and hidden - imports that need to be collected. - """ - - # Accumulate all dependencies in a set to avoid duplicates. - hiddenimports = set() - translation_base_names = set() - plugin_types = set() - - # Exit if the requested library cannot be imported. - # NOTE: self..version can be empty list on older Qt5 versions (#5381). - if self.version is None: - return [], [], [] - - logger.debug('%s: processing module %s...', self, module_name) - - # Look up the associated Qt module information by python module name. - # This allows us to collect associated module data directly, even if there is no associated shared library - # (e.g., header-only Qt module, or statically-built one). - short_module_name = module_name.split('.', 1)[-1] # PySide2.QtModule -> QtModule - if short_module_name in self.python_modules: - qt_module_info = self.python_modules[short_module_name] - - # NOTE: no need to add a hiddenimport here, because this is the module under consideration. - - # Add plugins - plugin_types.update(qt_module_info.plugins) - - # Add translation base name(s) - translation_base_names.update(qt_module_info.translations) - - # Find the actual module extension file. - module_file = hooks.get_module_file_attribute(module_name) - - # Additional search path for shared library resolution. This is mostly required for library resolution on - # Windows (Linux and macOS binaries use run paths to find Qt libs). - qtlib_search_paths = [ - # For PyQt5 and PyQt6 wheels, shared libraries should be in BinariesPath, while for PySide2 and PySide6, - # they should be in PrefixPath. - self.location['BinariesPath' if self.is_pyqt else 'PrefixPath'], - ] - - # Walk through all the link-time dependencies of a dynamically-linked library (``.so``/``.dll``/``.dylib``). - imported_libraries = bindepend.get_imports(module_file, qtlib_search_paths) - while imported_libraries: - imported_lib_name, imported_lib_path = imported_libraries.pop() # (name, fullpath) tuple - - # Skip unresolved libraries - if imported_lib_path is None: - logger.debug("%s: ignoring unresolved library import %r", self, imported_lib_name) - continue - - # Normalize the shared library name - lib_name = self._normalize_shared_library_name(imported_lib_path) - logger.debug( - '%s: imported library %r, full path %r -> parsed name %r.', self, imported_lib_name, imported_lib_path, - lib_name - ) - - # PySide2 and PySide6 on linux seem to link all extension modules against libQt5Core, libQt5Network, and - # libQt5Qml (or their libQt6* equivalents). While the first two are reasonable, the libQt5Qml dependency - # pulls in whole QtQml module, along with its data and plugins, which in turn pull in several other Qt - # libraries, greatly inflating the bundle size (see #6447). - # - # Similarly, some extension modules (QtWebChannel, QtWebEngine*) seem to be also linked against libQt5Qml, - # even when the module can be used without having the whole QtQml module collected. - # - # Therefore, we explicitly prevent inclusion of QtQml based on the dynamic library dependency, except for - # QtQml* and QtQuick* modules, whose use directly implies the use of QtQml. - if lib_name in ("qt5qml", "qt6qml"): - if not short_module_name.startswith(('QtQml', 'QtQuick')): - logger.debug('%s: ignoring imported library %r.', self, lib_name) - continue - - # Use the parsed library name to look up associated Qt module information. - if lib_name in self.shared_libraries: - logger.debug('%s: collecting Qt module associated with %r.', self, lib_name) - - # Look up associated module info - qt_module_info = self.shared_libraries[lib_name] - - # If there is a python extension module associated with Qt module, add it to hiddenimports. Since this - # means that we (most likely) have a hook available for that module, we can avoid analyzing the shared - # library itself (i.e., stop the recursive analysis), because this will be done by the corresponding - # hook. - if qt_module_info.module: - if qt_module_info.module == short_module_name: - # The one exception is if we are analyzing shared library associated with the input module; in - # that case, avoid adding a hidden import and analyze the library's link-time dependencies. We - # do not need to worry about plugins and translations for this particular module, because those - # have been handled at the beginning of this function. - imported_libraries.update(bindepend.get_imports(imported_lib_path, qtlib_search_paths)) - else: - hiddenimports.add(self.namespace + "." + qt_module_info.module) - continue - - # Add plugins - plugin_types.update(qt_module_info.plugins) - - # Add translation base name(s) - translation_base_names.update(qt_module_info.translations) - - # Analyze the linked shared libraries for its dependencies (recursive analysis). - imported_libraries.update(bindepend.get_imports(imported_lib_path, qtlib_search_paths)) - - # Collect plugin files. - binaries = [] - for plugin_type in plugin_types: - binaries += self.collect_plugins(plugin_type) - - # Collect translation files. - datas = [] - translation_src = self.location['TranslationsPath'] - translation_dst = os.path.join(self.qt_rel_dir, 'translations') - - for translation_base_name in translation_base_names: - # Not all PyQt5 installations include translations. See - # https://github.com/pyinstaller/pyinstaller/pull/3229#issuecomment-359479893 - # and - # https://github.com/pyinstaller/pyinstaller/issues/2857#issuecomment-368744341. - translation_pattern = os.path.join(translation_src, translation_base_name + '_*.qm') - translation_files = glob.glob(translation_pattern) - if translation_files: - datas += [(translation_file, translation_dst) for translation_file in translation_files] - else: - logger.warning( - '%s: could not find translations with base name %r! These translations will not be collected.', - self, translation_base_name - ) - - # Convert hiddenimports to a list. - hiddenimports = list(hiddenimports) - - logger.debug( - '%s: dependencies for %s:\n' - ' hiddenimports = %r\n' - ' binaries = %r\n' - ' datas = %r', self, module_name, hiddenimports, binaries, datas - ) - - return hiddenimports, binaries, datas - - @staticmethod - def _filter_release_plugins(plugin_files): - """ - Filter the provided list of Qt plugin files and remove the debug variants, under the assumption that both the - release version of a plugin (qtplugin.dll) and its debug variant (qtplugind.dll) appear in the list. - """ - # All basenames for lookup - plugin_basenames = {os.path.normcase(os.path.basename(f)) for f in plugin_files} - # Process all given filenames - release_plugin_files = [] - for plugin_filename in plugin_files: - plugin_basename = os.path.normcase(os.path.basename(plugin_filename)) - if plugin_basename.endswith('d.dll'): - # If we can find a variant without trailing 'd' in the plugin list, then the DLL we are dealing with is - # a debug variant and needs to be excluded. - release_name = os.path.splitext(plugin_basename)[0][:-1] + '.dll' - if release_name in plugin_basenames: - continue - release_plugin_files.append(plugin_filename) - return release_plugin_files - - def collect_plugins(self, plugin_type): - """ - Collect all plugins of the specified type from the Qt plugin directory. - - Returns list of (src, dst) tuples. - """ - # Ensure plugin directory exists - plugin_src_dir = self.location['PluginsPath'] - if not os.path.isdir(plugin_src_dir): - raise Exception(f"Qt plugin directory '{plugin_src_dir}' does not exist!") - - # Collect all shared lib files in plugin type (sub)directory - plugin_files = misc.dlls_in_dir(os.path.join(plugin_src_dir, plugin_type)) - - # Windows: - # - # dlls_in_dir() grabs all files ending with ``*.dll``, ``*.so`` and ``*.dylib`` in a certain directory. On - # Windows this would grab debug copies of Qt plugins, which then causes PyInstaller to add a dependency on the - # Debug CRT *in addition* to the release CRT. - if compat.is_win: - plugin_files = self._filter_release_plugins(plugin_files) - - logger.debug("%s: found plugin files for plugin type %r: %r", self, plugin_type, plugin_files) - - plugin_dst_dir = os.path.join(self.qt_rel_dir, 'plugins', plugin_type) - - # Exclude plugins with invalid Qt dependencies. - binaries = [] - for plugin_file in plugin_files: - valid, reason = self._validate_plugin_dependencies(plugin_file) - if valid: - binaries.append((plugin_file, plugin_dst_dir)) - else: - logger.debug("%s: excluding plugin %r (%r)! Reason: %s", self, plugin_file, plugin_type, reason) - return binaries - - def _validate_plugin_dependencies(self, plugin_file): - """ - Validate Qt dependencies of the given Qt plugin file. For the plugin to pass validation, all its Qt dependencies - must be available (resolvable), and must be resolvable from the default Qt shared library directory (to avoid - pulling in libraries from unrelated Qt installations that happen to be in search path). - """ - - imported_libraries = bindepend.get_imports(plugin_file, search_paths=[self.qt_lib_dir]) - for imported_lib_name, imported_lib_path in imported_libraries: - # Parse/normalize the (unresolved) library name, to determine if dependency is a Qt shared library. If not, - # skip the validation. - lib_name = self._normalize_shared_library_name(imported_lib_name) - if not lib_name.startswith(f"qt{self.qt_major}"): - continue - - if imported_lib_path is None: - return False, f"Missing Qt dependency {imported_lib_name!r}." - - imported_lib_path = pathlib.Path(imported_lib_path).resolve() - if self.qt_lib_dir not in imported_lib_path.parents: - return ( - False, - f"Qt dependency {imported_lib_name!r} ({str(imported_lib_path)!r}) has been resolved outside of " - f"the Qt shared library directory ({str(self.qt_lib_dir)!r})." - ) - - return True, None - - def _collect_all_or_none(self, mandatory_dll_patterns, optional_dll_patterns=None): - """ - Try to find Qt DLLs from the specified mandatory pattern list. If all mandatory patterns resolve to DLLs, - collect them all, as well as any DLLs from the optional pattern list. If a mandatory pattern fails to resolve - to a DLL, return an empty list. - - This allows all-or-none collection of particular groups of Qt DLLs that may or may not be available. - """ - optional_dll_patterns = optional_dll_patterns or [] - - # Package parent path; used to preserve the directory structure when DLLs are collected from the python - # package (e.g., PyPI wheels). - package_parent_path = self.package_location.parent - - # On Windows, DLLs are typically placed in `location['BinariesPath']`, except for PySide PyPI wheels, where - # `location['PrefixPath']` is used. This difference is already handled by `qt_lib_dir`, which is also fully - # resolved. - dll_path = self.qt_lib_dir - - # Helper for processing single DLL pattern - def _process_dll_pattern(dll_pattern): - discovered_dlls = [] - - dll_files = dll_path.glob(dll_pattern) - for dll_file in dll_files: - if package_parent_path in dll_file.parents: - # The DLL is located within python package; preserve the layout - dst_dll_dir = dll_file.parent.relative_to(package_parent_path) - else: - # The DLL is not located within python package; collect into top-level directory - dst_dll_dir = '.' - discovered_dlls.append((str(dll_file), str(dst_dll_dir))) - - return discovered_dlls - - # Process mandatory patterns - collected_dlls = [] - for pattern in mandatory_dll_patterns: - discovered_dlls = _process_dll_pattern(pattern) - if not discovered_dlls: - return [] # Mandatory pattern resulted in no DLLs; abort - collected_dlls += discovered_dlls - - # Process optional patterns - for pattern in optional_dll_patterns: - collected_dlls += _process_dll_pattern(pattern) - - return collected_dlls - - # Collect required Qt binaries, but only if all binaries in a group exist. - def collect_extra_binaries(self): - """ - Collect extra binaries/DLLs required by Qt. These include ANGLE DLLs, OpenGL software renderer DLL, and ICU - DLLs. Applicable only on Windows (on other OSes, empty list is returned). - """ - - binaries = [] - - # Applicable only to Windows. - if not compat.is_win: - return [] - - # OpenGL: EGL/GLES via ANGLE, software OpenGL renderer. - binaries += self._collect_all_or_none(['libEGL.dll', 'libGLESv2.dll'], ['d3dcompiler_??.dll']) - binaries += self._collect_all_or_none(['opengl32sw.dll']) - - # Include ICU files, if they exist. - # See the "Deployment approach" section at the top of this file. - binaries += self._collect_all_or_none(['icudt??.dll', 'icuin??.dll', 'icuuc??.dll']) - - return binaries - - # Collect additional shared libraries required for SSL support in QtNetwork, if they are available. - # Primarily applicable to Windows (see issue #3520, #4048). - def collect_qtnetwork_files(self): - """ - Collect extra binaries/shared libraries required by the QtNetwork module, such as OpenSSL shared libraries. - """ - - # No-op if requested Qt-based package is not available. - if self.version is None: - return [] - - # Check if QtNetwork supports SSL and has OpenSSL backend available (Qt >= 6.1). - # Also query the run-time OpenSSL version, so we know what dynamic libraries we need to search for. - @isolated.decorate - def _check_if_openssl_enabled(package): - import sys - import importlib - - # Import the Qt-based package - # equivalent to: from package.QtCore import QCoreApplication - QtCore = importlib.import_module('.QtCore', package) - QCoreApplication = QtCore.QCoreApplication - QLibraryInfo = QtCore.QLibraryInfo - # equivalent to: from package.QtNetwork import QSslSocket - QtNetwork = importlib.import_module('.QtNetwork', package) - QSslSocket = QtNetwork.QSslSocket - - # Instantiate QCoreApplication to suppress warnings - app = QCoreApplication(sys.argv) # noqa: F841 - - if not QSslSocket.supportsSsl(): - return False, None - - # Query the run-time OpenSSL version - openssl_version = QSslSocket.sslLibraryVersionNumber() - - # For Qt >= 6.1, check if `openssl` TLS backend is available - try: - qt_version = QLibraryInfo.version().segments() - except AttributeError: - qt_version = [] # Qt <= 5.8 - - if qt_version < [6, 1]: - return True, openssl_version # TLS backends not implemented yet - - return ('openssl' in QSslSocket.availableBackends(), openssl_version) - - openssl_enabled, openssl_version = _check_if_openssl_enabled(self.namespace) - if not openssl_enabled or openssl_version == 0: - logger.debug("%s: QtNetwork: does not support SSL or does not use OpenSSL.", self) - return [] - - # The actual search is handled in OS-specific ways. - if compat.is_win: - return self._collect_qtnetwork_openssl_windows(openssl_version) - elif compat.is_darwin: - return self._collect_qtnetwork_openssl_macos(openssl_version) - elif compat.is_linux: - return self._collect_qtnetwork_openssl_linux(openssl_version) - else: - logger.warning("%s: QtNetwork: collection of OpenSSL not implemented for this platform!") - return [] - - def _collect_qtnetwork_openssl_windows(self, openssl_version): - """ - Windows-specific collection of OpenSSL DLLs required by QtNetwork module. - """ - - # Package parent path; used to preserve the directory structure when DLLs are collected from the python - # package (e.g., PyPI wheels). - package_parent_path = self.package_location.parent - - # The OpenSSL DLLs might be shipped with PyPI wheel (PyQt5), might be available in the environment (msys2, - # anaconda), or might be expected to be available in the environment (PySide2, PySide6, PyQt6 PyPI wheels). - # - # The OpenSSL DLL naming scheme depends on the version: - # - OpenSSL 1.0.x: libeay32.dll, ssleay32.dll - # - OpenSSL 1.1.x 32-bit: libssl-1_1.dll, libcrypto-1_1.dll - # - OpenSSL 1.1.x 64-bit: libssl-1_1-x64.dll, libcrypto-1_1-x64.dll - # - OpenSSL 3.0.x 32-bit: libssl-1.dll, libcrypto-3.dll - # - OpenSSL 3.0.x 64-bit: libssl-3-x64.dll, libcrypto-3-x64.dll - # - # The official Qt builds (which are used by PySide and PyQt PyPI wheels) seem to be build against: - # - OpenSSL 1.1.x starting with Qt5 5.14.2: - # https://www.qt.io/blog/2019/06/17/qt-5-12-4-released-support-openssl-1-1-1 - # - OpenSSL 3.x starting with Qt6 6.5.0: - # https://www.qt.io/blog/moving-to-openssl-3-in-binary-builds-starting-from-qt-6.5-beta-2 - # - # However, a package can build Qt against OpenSSL version of their own choice. For example, at the time of - # writing, both mingw-w64-x86_64-qt5-base 5.15.11+kde+r138-1 and mingw-w64-x86_64-qt6-base 6.6.0-2 packages - # depend on mingw-w64-x86_64-openssl 3.1.4-1 (so OpenSSL 3). - # - # Luckily, we can query the run-time version of OpenSSL by calling `QSslSocket.sslLibraryVersionNumber()`, - # and narrow down the search for specific version. - if openssl_version >= 0x10000000 and openssl_version < 0x10100000: - # OpenSSL 1.0.x - used by old Qt5 builds - dll_names = ( - 'libeay32.dll', - 'ssleay32.dll', - ) - logger.debug("%s: QtNetwork: looking for OpenSSL 1.0.x DLLs: %r", self, dll_names) - elif openssl_version >= 0x10100000 and openssl_version < 0x30000000: - # OpenSSL 1.1.x - dll_names = ( - 'libssl-1_1-x64.dll' if compat.is_64bits else 'libssl-1_1.dll', - 'libcrypto-1_1-x64.dll' if compat.is_64bits else 'libcrypto-1_1.dll', - ) - logger.debug("%s: QtNetwork: looking for OpenSSL 1.1.x DLLs: %r", self, dll_names) - elif openssl_version >= 0x30000000 and openssl_version < 0x40000000: - # OpenSSL 3.0.x - dll_names = ( - 'libssl-3-x64.dll' if compat.is_64bits else 'libssl-3.dll', - 'libcrypto-3-x64.dll' if compat.is_64bits else 'libcrypto-3.dll', - ) - logger.debug("%s: QtNetwork: looking for OpenSSL 3.0.x DLLs: %r", self, dll_names) - else: - dll_names = [] # Nothing to search for - logger.warning("%s: QtNetwork: unsupported OpenSSL version: %X", self, openssl_version) - - binaries = [] - found_in_package = False - for dll in dll_names: - # Attempt to resolve the DLL path - dll_file_path = bindepend.resolve_library_path(dll, search_paths=[self.qt_lib_dir]) - if dll_file_path is None: - continue - dll_file_path = pathlib.Path(dll_file_path).resolve() - if package_parent_path in dll_file_path.parents: - # The DLL is located within python package; preserve the layout - dst_dll_path = dll_file_path.parent.relative_to(package_parent_path) - found_in_package = True - else: - # The DLL is not located within python package; collect into top-level directory - dst_dll_path = '.' - binaries.append((str(dll_file_path), str(dst_dll_path))) - - # If we found at least one OpenSSL DLL in the bindings' python package directory, discard all external - # OpenSSL DLLs. - if found_in_package: - binaries = [(dll_src_path, dll_dest_path) for dll_src_path, dll_dest_path in binaries - if package_parent_path in pathlib.Path(dll_src_path).parents] - - return binaries - - def _collect_qtnetwork_openssl_macos(self, openssl_version): - """ - macOS-specific collection of OpenSSL dylibs required by QtNetwork module. - """ - - # The official Qt5 builds on macOS (shipped by PyPI wheels) appear to be built with Apple's SecureTransport API - # instead of OpenSSL; for example, `QSslSocket.sslLibraryVersionNumber` returns 0, while - # `sslLibraryVersionString()` returns "Secure Transport, macOS 12.6". So with PySide2 and PyQt5, we do not need - # to worry about collection of OpenSSL shared libraries. - # - # Support for OpenSSL was introduced in Qt 6.1 with `openssl` TLS backend; the official Qt6 builds prior to 6.5 - # seem to be built with OpenSSL 1.1.x, and later versions with 3.0.x. However, PySide6 and PyQt6 PyPI wheels do - # not ship OpenSSL dynamic libraries at all , so whether `openssl` TLS backend is used or not depends on the - # presence of externally provided OpenSSL dynamic libraries (for example, provided by Homebrew). It is worth - # noting that python.org python installers *do* provide OpenSSL shared libraries (1.1.x for python <= 3.10, - # 3.0.x for python >= 3.12, and both for python 3.11) for its `_ssl` extension - however, these are NOT visible - # to Qt and its QtNetwork module. - # - # When the frozen application is built and we collect python's `_ssl` extension, we also collect the OpenSSL - # shared libraries shipped by python. So at least in theory, those should be available to QtNetwork module as - # well (assuming they are of compatible version). However, this is not exactly the case - QtNetwork looks for - # the libraries in locations given by `DYLD_LIBRARY_PATH` environment variable and in .app/Contents/Frameworks - # (if the program is an .app bundle): - # - # https://github.com/qt/qtbase/blob/6.6.0/src/plugins/tls/openssl/qsslsocket_openssl_symbols.cpp#L590-L599 - # - # So it works out-of-the box for our .app bundles, because starting with PyInstaller 6.0, `sys._MEIPASS` is in - # .app/Contents/Frameworks. But it does not with POSIX builds, because bootloader does not modify the - # `DYLD_LIBRARY_PATH` environment variable to include `sys._MEIPASS` (since we usually do not need that; - # regular linked library resolution in our macOS builds is done via path rewriting and rpaths). So either we - # need a run-time hook to add `sys._MEIPASS` to `DYLD_LIBRARY_PATH`, or modify the bootloader to always do that. - # - # Collecting the OpenSSL library and making it discoverable by adding `sys._MEIPASS` to `DYLD_LIBRARY_PATH` - # should also prevent QtNetwork from "accidentally" pulling in Homebrew version at run-time (if Homebrew is - # installed on the target system and provides compatible OpenSSL version). - # - # Therefore, try to resolve OpenSSL library via the version indicated by `QSslSocket.sslLibraryVersionNumber`; - # however, we first explicitly search only {sys.base_prefix}/lib (which is where python.org builds put their - # dynamic libs), and only if that fails, perform regular dylib path resolution. This way we ensure that if the - # OpenSSL dylibs are provided by python itself, we always prefer those over the Homebrew version (since we are - # very likely going to collect them for python's `_ssl` extension anyway). - - # As per above text, we need to worry only about Qt6, and thus OpenSSL 1.1.x or 3.0.x - if openssl_version >= 0x10100000 and openssl_version < 0x30000000: - # OpenSSL 1.1.x - dylib_names = ( - 'libcrypto.1.1.dylib', - 'libssl.1.1.dylib', - ) - logger.debug("%s: QtNetwork: looking for OpenSSL 1.1.x dylibs: %r", self, dylib_names) - elif openssl_version >= 0x30000000 and openssl_version < 0x40000000: - # OpenSSL 3.0.x - dylib_names = ( - 'libcrypto.3.dylib', - 'libssl.3.dylib', - ) - logger.debug("%s: QtNetwork: looking for OpenSSL 3.0.x dylibs: %r", self, dylib_names) - else: - dylib_names = [] # Nothing to search for - logger.warning("%s: QtNetwork: unsupported OpenSSL version: %X", self, openssl_version) - - # Compared to Windows, we do not have to worry about dylib's path preservation, as these are never part of - # the package, and are therefore always collected to the top-level application directory. - binaries = [] - base_prefix_lib_dir = os.path.join(compat.base_prefix, 'lib') - for dylib in dylib_names: - # First, attempt to resolve using only {sys.base_prefix}/lib - `bindepend.resolve_library_path` uses - # standard dyld search semantics and uses the given search paths as fallback (and would therefore - # favor Homebrew-provided version of the library). - dylib_path = bindepend._resolve_library_path_in_search_paths(dylib, search_paths=[base_prefix_lib_dir]) - if dylib_path is None: - dylib_path = bindepend.resolve_library_path(dylib, search_paths=[base_prefix_lib_dir, self.qt_lib_dir]) - if dylib_path is None: - continue - binaries.append((str(dylib_path), '.')) - - return binaries - - def _collect_qtnetwork_openssl_linux(self, openssl_version): - """ - Linux-specific collection of OpenSSL dylibs required by QtNetwork module. - """ - - # Out of the supported OSes, Linux is by far the most straight-forward, because OpenSSL shared libraries are - # expected to be provided by the system. So we can just use standard library path resolution with library names - # inferred from the run-time OpenSSL version. At run-time, QtNetwork searches paths from `LD_LIBRARY_PATH`, and - # on Linux, our bootloader already adds `sys._MEIPASS` to that environment variable. - - if openssl_version >= 0x10000000 and openssl_version < 0x10100000: - # OpenSSL 1.0.x - used by old Qt5 builds - shlib_names = ( - 'libcrypto.so.10', - 'libssl.so.10', - ) - logger.debug("%s: QtNetwork: looking for OpenSSL 1.0.x shared libraries: %r", self, shlib_names) - elif openssl_version >= 0x10100000 and openssl_version < 0x30000000: - # OpenSSL 1.1.x - shlib_names = ( - 'libcrypto.so.1.1', - 'libssl.so.1.1', - ) - logger.debug("%s: QtNetwork: looking for OpenSSL 1.1.x shared libraries: %r", self, shlib_names) - elif openssl_version >= 0x30000000 and openssl_version < 0x40000000: - # OpenSSL 3.0.x - shlib_names = ( - 'libcrypto.so.3', - 'libssl.so.3', - ) - logger.debug("%s: QtNetwork: looking for OpenSSL 3.0.x shared libraries: %r", self, shlib_names) - else: - shlib_names = [] # Nothing to search for - logger.warning("%s: QtNetwork: unsupported OpenSSL version: %X", self, openssl_version) - - binaries = [] - for shlib in shlib_names: - shlib_path = bindepend.resolve_library_path(shlib) - if shlib_path is None: - continue - binaries.append((str(shlib_path), '.')) - - return binaries - - def collect_qtqml_files(self): - """ - Collect additional binaries and data for QtQml module. - """ - - # No-op if requested Qt-based package is not available. - if self.version is None: - return [], [] - - # Not all PyQt5/PySide2 installs have QML files. In this case, location['Qml2ImportsPath'] is empty. - # Furthermore, even if location path is provided, the directory itself may not exist. - # - # https://github.com/pyinstaller/pyinstaller/pull/3229#issuecomment-359735031 - # https://github.com/pyinstaller/pyinstaller/issues/3864 - # - # In Qt 6, Qml2ImportsPath was deprecated in favor of QmlImportsPath. The former is not available in PySide6 - # 6.4.0 anymore (but is in PyQt6 6.4.0). Use the new QmlImportsPath if available. - if 'QmlImportsPath' in self.location: - qml_src_dir = self.location['QmlImportsPath'] - else: - qml_src_dir = self.location['Qml2ImportsPath'] - if not qml_src_dir or not os.path.isdir(qml_src_dir): - logger.warning('%s: QML directory %r does not exist. QML files not packaged.', self, qml_src_dir) - return [], [] - - qml_src_path = pathlib.Path(qml_src_dir).resolve() - qml_dest_path = pathlib.PurePath(self.qt_rel_dir) / 'qml' - - binaries = [] - datas = [] - - # Helper that computes the destination directory for the given file or directory from a QML plugin directory. - def _compute_dest_dir(src_filename): - if src_filename.is_dir(): - rel_path = src_filename.relative_to(qml_src_path) - else: - rel_path = src_filename.relative_to(qml_src_path).parent - return qml_dest_path / rel_path - - # Discover all QML plugin sub-directories by searching for `qmldir` files. - qmldir_files = qml_src_path.rglob('**/qmldir') - for qmldir_file in sorted(qmldir_files): - plugin_dir = qmldir_file.parent - logger.debug("%s: processing QML plugin directory %s", self, plugin_dir) - - try: - # Obtain lists of source files (separated into binaries and data files). - plugin_binaries, plugin_datas = self._process_qml_plugin(qmldir_file) - # Convert into (src, dest) tuples. - binaries += [(str(src_file), str(_compute_dest_dir(src_file))) for src_file in plugin_binaries] - datas += [(str(src_file), str(_compute_dest_dir(src_file))) for src_file in plugin_datas] - except Exception: - logger.warning("%s: failed to process QML plugin directory %s", self, plugin_dir, exc_info=True) - - return binaries, datas - - # https://doc.qt.io/qt-6/qtqml-modules-qmldir.html#plugin-declaration - # [optional] plugin [ - _qml_plugin_def = re.compile(r"^(?:(?:optional)\s+)?(?:plugin)\s+(?P\w+)(?:\s+(?P\.+))?$") - - def _process_qml_plugin(self, qmldir_file): - """ - Processes the QML directory corresponding to the given `qmldir` file. - - Returns lists of binaries and data files, but only the source file names. It is up to caller to turn these into - lists of (src, dest) tuples. - """ - plugin_dir = qmldir_file.parent - - plugin_binaries = set() - - # Read the `qmldir` file to determine the names of plugin binaries, if any. - contents = qmldir_file.read_text(encoding="utf-8") - for line in contents.splitlines(): - m = self._qml_plugin_def.match(line) - if m is None: - continue - - plugin_name = m.group("name") - plugin_path = m.group("path") - - # We currently do not support custom plugin path - neither relative nor absolute (the latter will never - # be supported, because to make it relocatable, we would need to modify the `qmpldir file`). - if plugin_path is not None: - raise Exception(f"Non-empty plugin path ({plugin_path!r} is not supported yet!") - - # Turn the plugin base name into actual shared lib name. - if compat.is_linux: - plugin_file = plugin_dir / f"lib{plugin_name}.so" - elif compat.is_win: - plugin_file = plugin_dir / f"{plugin_name}.dll" - elif compat.is_darwin: - plugin_file = plugin_dir / f"lib{plugin_name}.dylib" - else: - continue # This implicitly disables subsequent validation on unhandled platforms. - - # Warn if plugin file does not exist - if not plugin_file.is_file(): - logger.warn("%s: QML plugin binary %r does not exist!", str(plugin_file)) - continue - - plugin_binaries.add(plugin_file) - - # Exclude plugins with invalid Qt dependencies. - invalid_binaries = False - for plugin_binary in plugin_binaries: - valid, reason = self._validate_plugin_dependencies(plugin_binary) - if not valid: - logger.debug("%s: excluding QML plugin binary %r! Reason: %s", self, str(plugin_binary), reason) - invalid_binaries = True - - # If there was an invalid binary, discard the plugin. - if invalid_binaries: - logger.debug("%s: excluding QML plugin directory %r due to invalid plugin binaries!", self, str(plugin_dir)) - return [], [] - - # Generate binaries list. - binaries = sorted(plugin_binaries) - - # Generate list of data files - all content of this directory, except for the plugin binaries. Sub-directories - # are included if they do not contain a `qmldir` file (we do not recurse into the directory, but instead pass - # only its name, leaving the recursion to PyInstaller's built-in expansion of paths returned by hooks). - datas = [] - for entry in plugin_dir.iterdir(): - if entry.is_file(): - if entry in plugin_binaries: - continue - else: - if (entry / "qmldir").is_file(): - continue - datas.append(entry) - - return binaries, datas - - def collect_qtwebengine_files(self): - """ - Collect QtWebEngine helper process executable, translations, and resources. - """ - - binaries = [] - datas = [] - - # Output directory (varies between PyQt and PySide and among OSes; the difference is abstracted by - # QtLibraryInfo.qt_rel_dir) - rel_data_path = self.qt_rel_dir - - is_macos_framework = False - if compat.is_darwin: - # Determine if we are dealing with a framework-based Qt build (e.g., PyPI wheels) or a dylib-based one - # (e.g., Anaconda). The former requires special handling, while the latter is handled in the same way as - # Windows and Linux builds. - is_macos_framework = os.path.exists( - os.path.join(self.location['LibrariesPath'], 'QtWebEngineCore.framework') - ) - - if is_macos_framework: - # macOS .framework bundle - src_framework_path = os.path.join(self.location['LibrariesPath'], 'QtWebEngineCore.framework') - - # If Qt libraries are bundled with the package, collect the .framework bundle into corresponding package's - # subdirectory, because binary dependency analysis will also try to preserve the directory structure. - # However, if we are collecting from system-wide Qt installation (e.g., Homebrew-installed Qt), the binary - # depndency analysis will attempt to re-create .framework bundle in top-level directory, so we need to - # collect the extra files there. - bundled_qt_libs = pathlib.Path(self.package_location) in pathlib.Path(src_framework_path).parents - if bundled_qt_libs: - dst_framework_path = os.path.join(rel_data_path, 'lib/QtWebEngineCore.framework') - else: - dst_framework_path = 'QtWebEngineCore.framework' # In top-level directory - - # Determine the version directory - for now, we assume we are dealing with single-version framework; - # i.e., the Versions directory contains only a single directory, and Current symlink to it. - versions = sorted([ - version for version in os.listdir(os.path.join(src_framework_path, 'Versions')) if version != 'Current' - ]) - if len(versions) == 0: - raise RuntimeError("Could not determine version of the QtWebEngineCore.framework!") - elif len(versions) > 1: - logger.warning( - "Found multiple versions in QtWebEngineCore.framework (%r) - using the last one!", versions - ) - version = versions[-1] - - # Collect the Helpers directory. In well-formed .framework bundles (such as the ones provided by Homebrew), - # the Helpers directory is located in the versioned directory, and symlinked to the top-level directory. - src_helpers_path = os.path.join(src_framework_path, 'Versions', version, 'Helpers') - dst_helpers_path = os.path.join(dst_framework_path, 'Versions', version, 'Helpers') - if not os.path.exists(src_helpers_path): - # Alas, the .framework bundles shipped with contemporary PyPI PyQt/PySide wheels are not well-formed - # (presumably because .whl cannot preserve symlinks?). The Helpers in the top-level directory is in fact - # the hard copy, and there is either no Helpers in versioned directory, or there is a duplicate. - # So fall back to collecting from the top-level, but collect into versioned directory in order to - # be compliant with codesign's expectations. - src_helpers_path = os.path.join(src_framework_path, 'Helpers') - - helper_datas = hooks.collect_system_data_files(src_helpers_path, dst_helpers_path) - - # Filter out the actual helper executable from datas, and add it to binaries instead. This ensures that it - # undergoes additional binary processing that rewrites the paths to linked libraries. - HELPER_EXE = 'QtWebEngineProcess.app/Contents/MacOS/QtWebEngineProcess' - for src_name, dest_name in helper_datas: - if src_name.endswith(HELPER_EXE): - binaries.append((src_name, dest_name)) - else: - datas.append((src_name, dest_name)) - - # Collect the Resources directory; same logic is used as with Helpers directory. - src_resources_path = os.path.join(src_framework_path, 'Versions', version, 'Resources') - dst_resources_path = os.path.join(dst_framework_path, 'Versions', version, 'Resources') - if not os.path.exists(src_resources_path): - src_resources_path = os.path.join(src_framework_path, 'Resources') - - datas += hooks.collect_system_data_files(src_resources_path, dst_resources_path) - - # NOTE: the QtWebEngineProcess helper is actually sought within the `QtWebEngineCore.framework/Helpers`, - # which ought to be a symlink to `QtWebEngineCore.framework/Versions/Current/Helpers`, where `Current` - # is also a symlink to the actual version directory, `A`. - # - # These symlinks are created automatically when the TOC list of collected resources is post-processed - # using `PyInstaller.utils.osx.collect_files_from_framework_bundles` helper, so we do not have to - # worry about them here... - else: - # Windows and linux (or Anaconda on macOS) - locales = 'qtwebengine_locales' - resources = 'resources' - - # Translations - datas.append(( - os.path.join(self.location['TranslationsPath'], locales), - os.path.join(rel_data_path, 'translations', locales), - )) - - # Resources; ``DataPath`` is the base directory for ``resources``, as per the - # `docs `_. - datas.append((os.path.join(self.location['DataPath'], resources), os.path.join(rel_data_path, resources)),) - - # Helper process executable (QtWebEngineProcess), located in ``LibraryExecutablesPath``. - # The target directory is determined as `LibraryExecutablesPath` relative to `PrefixPath`. On Windows, - # this should handle the differences between PySide2/PySide6 and PyQt5/PyQt6 PyPI wheel layout. - rel_helper_path = os.path.relpath(self.location['LibraryExecutablesPath'], self.location['PrefixPath']) - - # However, on Linux, we need to account for distribution-packaged Qt, where `LibraryExecutablesPath` might - # be nested deeper under `PrefixPath` than anticipated (w.r.t. PyPI wheel layout). For example, in Fedora, - # the helper is located under `/usr/lib64/qt5/libexec/QtWebEngineProcess`, with `PrefixPath` being `/usr` - # and `LibraryExecutablesPath` being `/usr/lib64/qt5/libexec/`, so the relative path ends up being - # `lib64/qt5/libexec` instead of just `libexec`. So on linux, we explicitly force the PyPI-compliant - # layout, by overriding relative helper path to just `libexec`. - if compat.is_linux and rel_helper_path != "libexec": - logger.info( - "%s: overriding relative destination path of QtWebEngineProcess helper from %r to %r!", self, - rel_helper_path, "libexec" - ) - rel_helper_path = "libexec" - - # Similarly, force the relative helper path for PySide2/PySide6 on Windows to `.`. This is already the case - # with PyPI PySide Windows wheels. But it is not the case with conda-installed PySide2, where the Qt's - # `PrefixPath` is for example `C:/Users//miniconda3/envs//Library`, while the corresponding - # `LibraryExecutablesPath` is `C:/Users//miniconda3/envs//Library/bin`. - if compat.is_win and not self.is_pyqt and rel_helper_path != ".": - logger.info( - "%s: overriding relative destination path of QtWebEngineProcess helper from %r to %r!", self, - rel_helper_path, "." - ) - rel_helper_path = "." - - dest = os.path.normpath(os.path.join(rel_data_path, rel_helper_path)) - binaries.append((os.path.join(self.location['LibraryExecutablesPath'], 'QtWebEngineProcess*'), dest)) - - # The helper QtWebEngineProcess executable should have an accompanying qt.conf file that helps it locate the - # Qt shared libraries. Try collecting it as well - qt_conf_file = os.path.join(self.location['LibraryExecutablesPath'], 'qt.conf') - if not os.path.isfile(qt_conf_file): - # The file seems to have been dropped from Qt 6.3 (and corresponding PySide6 and PyQt6) due to - # redundancy; however, we still need it in the frozen application - so generate our own. - from PyInstaller.config import CONF # workpath - # Relative path to root prefix of bundled Qt - this corresponds to the "inverse" of `rel_helper_path` - # variable that we computed earlier. - if rel_helper_path == '.': - rel_prefix = '.' - else: - # Replace each directory component in `rel_helper_path` with `..`. - rel_prefix = os.path.join(*['..' for _ in range(len(rel_helper_path.split(os.pathsep)))]) - # We expect the relative path to be either . or .. depending on PySide/PyQt layout; if that is not the - # case, warn about irregular path. - if rel_prefix not in ('.', '..'): - logger.warning( - "%s: unexpected relative Qt prefix path for QtWebEngineProcess qt.conf: %s", self, rel_prefix - ) - # The Qt docs on qt.conf (https://doc.qt.io/qt-5/qt-conf.html) recommend using forward slashes on - # Windows as well, due to backslash having to be escaped. This should not matter as we expect the - # relative path to be . or .., but you never know... - if os.sep == '\\': - rel_prefix = rel_prefix.replace(os.sep, '/') - # Create temporary file in workpath - qt_conf_file = os.path.join(CONF['workpath'], "qt.conf") - with open(qt_conf_file, 'w', encoding='utf-8') as fp: - print("[Paths]", file=fp) - print("Prefix = {}".format(rel_prefix), file=fp) - datas.append((qt_conf_file, dest)) - - # Add Linux-specific libraries. - if compat.is_linux: - # The automatic library detection fails for `NSS `_, - # which is used by QtWebEngine. In some distributions, the ``libnss`` supporting libraries are stored in a - # subdirectory ``nss``. Since ``libnss`` is not linked against them but loads them dynamically at run-time, - # we need to search for and add them. - # - # Specifically, the files we are looking for are - # - libfreebl3.so - # - libfreeblpriv3.so - # - libnssckbi.so - # - libnssdbm3.so - # - libsoftokn3.so - # and they might be in the same directory as ``libnss3.so`` (instead of ``nss`` subdirectory); this is - # the case even with contemporary Debian releases. See - # https://packages.debian.org/bullseye/amd64/libnss3/filelist - # vs. - # https://packages.debian.org/bookworm/amd64/libnss3/filelist - - # Analyze imports of ``QtWebEngineCore`` extension module, and look for ``libnss3.so`` to determine its - # parent directory. - libnss_dir = None - module_file = hooks.get_module_file_attribute(self.namespace + '.QtWebEngineCore') - for lib_name, lib_path in bindepend.get_imports(module_file): # (name, fullpath) tuples - if lib_path is None: - continue # Skip unresolved libraries - # Look for ``libnss3.so``. - if os.path.basename(lib_path).startswith('libnss3.so'): - libnss_dir = os.path.dirname(lib_path) - break - - # Search for NSS libraries - logger.debug("%s: QtWebEngineCore is linked against libnss3.so; collecting NSS libraries...", self) - if libnss_dir is not None: - # Libraries to search for - NSS_LIBS = [ - 'libfreebl3.so', - 'libfreeblpriv3.so', - 'libnssckbi.so', - 'libnssdbm3.so', - 'libsoftokn3.so', - ] - # Directories (relative to `libnss_dir`) to search in. Also serve as relative destination paths. - NSS_LIB_SUBDIRS = [ - 'nss', - '.', - ] - - for subdir in NSS_LIB_SUBDIRS: - for lib_name in NSS_LIBS: - lib_file = os.path.normpath(os.path.join(libnss_dir, subdir, lib_name)) - if os.path.isfile(lib_file): - logger.debug("%s: collecting NSS library: %r", self, lib_file) - binaries.append((lib_file, subdir)) - - return binaries, datas - - -# Provide single instances of this class to avoid each hook constructing its own. -pyqt5_library_info = QtLibraryInfo('PyQt5') -pyqt6_library_info = QtLibraryInfo('PyQt6') -pyside2_library_info = QtLibraryInfo('PySide2') -pyside6_library_info = QtLibraryInfo('PySide6') - - -def get_qt_library_info(namespace): - """ - Return QtLibraryInfo instance for the given namespace. - """ - if namespace == 'PyQt5': - return pyqt5_library_info - if namespace == 'PyQt6': - return pyqt6_library_info - elif namespace == 'PySide2': - return pyside2_library_info - elif namespace == 'PySide6': - return pyside6_library_info - - raise ValueError(f'Invalid namespace: {namespace}!') - - -# add_qt_dependencies -# -------------------- -# Generic implemnentation that finds the Qt 5/6 dependencies based on the hook name of a PyQt5/PyQt6/PySide2/PySide6 -# hook. Returns (hiddenimports, binaries, datas). Typical usage: -# ``hiddenimports, binaries, datas = add_qt5_dependencies(__file__)``. -def add_qt_dependencies(hook_file): - # Find the module underlying this Qt hook: change ``/path/to/hook-PyQt5.blah.py`` to ``PyQt5.blah``. - hook_name, hook_ext = os.path.splitext(os.path.basename(hook_file)) - assert hook_ext.startswith('.py') - assert hook_name.startswith('hook-') - module_name = hook_name[5:] - namespace = module_name.split('.')[0] - - # Retrieve Qt library info structure.... - qt_info = get_qt_library_info(namespace) - # ... and use it to collect module dependencies - return qt_info.collect_module(module_name) - - -# add_qt5_dependencies -# -------------------- -# Find the Qt5 dependencies based on the hook name of a PySide2/PyQt5 hook. Returns (hiddenimports, binaries, datas). -# Typical usage: ``hiddenimports, binaries, datas = add_qt5_dependencies(__file__)``. -add_qt5_dependencies = add_qt_dependencies # Use generic implementation - -# add_qt6_dependencies -# -------------------- -# Find the Qt6 dependencies based on the hook name of a PySide6/PyQt6 hook. Returns (hiddenimports, binaries, datas). -# Typical usage: ``hiddenimports, binaries, datas = add_qt6_dependencies(__file__)``. -add_qt6_dependencies = add_qt_dependencies # Use generic implementation - - -# A helper for ensuring that only one Qt bindings package is collected into frozen application. Intended to be called -# from hooks for top-level bindings packages. -def ensure_single_qt_bindings_package(qt_bindings): - # For the lack of better alternative, use CONF structure. Note that this enforces single bindings for the whole - # spec file instead of individual Analysis instances! - from PyInstaller.config import CONF - - seen_qt_bindings = CONF.get("_seen_qt_bindings") - if seen_qt_bindings is None: - CONF["_seen_qt_bindings"] = qt_bindings - elif qt_bindings != seen_qt_bindings: - # Raise SystemExit to abort build process - raise SystemExit( - "ERROR: Aborting build process due to attempt to collect multiple Qt bindings packages: attempting to run " - f"hook for {qt_bindings!r}, while hook for {seen_qt_bindings!r} has already been run! PyInstaller does not " - "support multiple Qt bindings packages in a frozen application - either ensure that the build environment " - "has only one Qt bindings package installed, or exclude the extraneous bindings packages via the module " - "exclusion mechanism (--exclude command-line option, or excludes list in the spec file)." - ) - - -# A helper for generating exclude rules for extraneous Qt bindings. Intended for use in hooks for packages that pull in -# multiple Qt bindings packages due to conditional imports (for example, `matplotlib.backends.qt_compat`, `qtpy`). -def exclude_extraneous_qt_bindings(hook_name, qt_bindings_order=None): - _QT_BINDINGS = ['PyQt5', 'PySide2', 'PyQt6', 'PySide6'] # Known bindings, and also their preferred order - _QT_API_ENV = 'QT_API' - - def _create_excludes(selected_bindings): - return [bindings for bindings in _QT_BINDINGS if bindings != selected_bindings] - - logger.debug("%s: selecting Qt bindings package...", hook_name) - - if not qt_bindings_order: - qt_bindings_order = _QT_BINDINGS # Use default preference order - - env_qt_bindings = os.environ.get(_QT_API_ENV) - if env_qt_bindings is not None: - # Case-normalize the value into capitalized name from _QT_BINDINGS for further processing. - normalized_name = {name.lower(): name for name in _QT_BINDINGS}.get(env_qt_bindings.lower()) - if normalized_name is None: - logger.warning( - "%s: ignoring unsupported Qt bindings name %r in %s environment variable (supported values: %r)!", - hook_name, env_qt_bindings, _QT_API_ENV, _QT_BINDINGS - ) - env_qt_bindings = normalized_name - - # First choice: see if a hook for top-level Qt bindings package has already been run; if it has, use that bindings - # package. Due to check in the `ensure_single_qt_bindings_package` that these hooks use, only one such hook could - # have been run. This should cover cases when the entry-point script explicitly imports one of Qt bindings before - # importing a package that supports multiple bindings. - from PyInstaller.config import CONF - seen_qt_bindings = CONF.get("_seen_qt_bindings") - if seen_qt_bindings is not None: - # If bindings are also specified via environment variable and they differ, display a warning. - if env_qt_bindings is not None and env_qt_bindings != seen_qt_bindings: - logger.warning( - "%s: ignoring %s environment variable (%r) because hook for %r has been run!", hook_name, _QT_API_ENV, - env_qt_bindings, seen_qt_bindings - ) - - logger.info( - "%s: selected %r as Qt bindings because hook for %r has been run before.", hook_name, seen_qt_bindings, - seen_qt_bindings - ) - return _create_excludes(seen_qt_bindings) - - # Second choice: honor the QT_API environment variable, if it specified a valid Qt bindings package. - if env_qt_bindings is not None: - logger.info( - "%s: selected %r as Qt bindings as specified by the %s environment variable.", hook_name, env_qt_bindings, - _QT_API_ENV - ) - return _create_excludes(env_qt_bindings) - - # Third choice: select first available bindings (sorted by the given preference order), and display a warning if - # multiple bindings are available. - available_qt_bindings = [] - for bindings_name in qt_bindings_order: - # Check if bindings are available - info = get_qt_library_info(bindings_name) - if info.version is None: - continue - available_qt_bindings.append(bindings_name) - - if not available_qt_bindings: - logger.warning("%s: no Qt bindings are available!", hook_name) - return [] # No need to generate any excludes... - - selected_qt_bindings = available_qt_bindings[0] - if len(available_qt_bindings) == 1: - logger.info("%s: selected %r as the only available Qt bindings.", hook_name, selected_qt_bindings) - else: - # Warn on multiple bindings, and tell user to use QT_API environment variable - logger.warning( - "%s: selected %r as Qt bindings, but multiple bindings are available: %r. Use the %s environment variable " - "to select different bindings and suppress this warning.", hook_name, selected_qt_bindings, - available_qt_bindings, _QT_API_ENV - ) - return _create_excludes(selected_qt_bindings) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/qt/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/qt/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 7f02536..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/qt/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/qt/__pycache__/_modules_info.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/qt/__pycache__/_modules_info.cpython-312.pyc deleted file mode 100644 index 96e58d0..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/qt/__pycache__/_modules_info.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/qt/_modules_info.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/qt/_modules_info.py deleted file mode 100755 index cd01bf9..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/qt/_modules_info.py +++ /dev/null @@ -1,450 +0,0 @@ -# ---------------------------------------------------------------------------- -# Copyright (c) 2022-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -# Qt modules information - the core of our Qt collection approach -# ---------------------------------------------------------------- -# -# The python bindings for Qt (``PySide2``, ``PyQt5``, ``PySide6``, ``PyQt6``) consist of several python binary extension -# modules that provide bindings for corresponding Qt modules. For example, the ``PySide2.QtNetwork`` python extension -# module provides bindings for the ``QtNetwork`` Qt module from the ``qt/qtbase`` Qt repository. -# -# A Qt module can be considered as consisting of: -# * a shared library (for example, on Linux, the shared library names for the ``QtNetwork`` Qt module in Qt5 and Qt6 -# are ``libQt5Network.so`` and ``libQt6Network.so``, respectively). -# * plugins: a certain type (or class) of plugins is usually associated with a single Qt module (for example, -# ``imageformats`` plugins are associated with the ``QtGui`` Qt module from the ``qt/qtbase`` Qt repository), but -# additional plugins of that type may come from other Qt repositories. For example, ``imageformats/qsvg`` plugin -# is provided by ``qtsvg/src/plugins/imageformats/svg`` from the ``qt/qtsvg`` repository, and ``imageformats/qpdf`` -# is provided by ``qtwebengine/src/pdf/plugins/imageformats/pdf`` from the ``qt/qtwebengine`` repository. -# * translation files: names of translation files consist of a base name, which typically corresponds to the Qt -# repository name, and language code. A single translation file usually covers all Qt modules contained within -# the same repository. For example, translation files with base name ``qtbase`` contain translations for ``QtCore``, -# ``QtGui``, ``QtWidgets``, ``QtNetwork``, and other Qt modules from the ``qt/qtbase`` Qt repository. -# -# The PyInstaller's built-in analysis of link-time dependencies ensures that when collecting a Qt python extension -# module, we automatically pick up the linked Qt shared libraries. However, collection of linked Qt shared libraries -# does not result in collection of plugins, nor translation files. In addition, the dependency of a Qt python extension -# module on other Qt python extension modules (i.e., at the bindings level) cannot be automatically determined due to -# PyInstaller's inability to scan imports in binary extensions. -# -# PyInstaller < 5.7 solved this problem using a dictionary that associated a Qt shared library name with python -# extension name, plugins, and translation files. For each hooked Qt python extension module, the hook calls a helper -# that analyzes the extension file for link-time dependencies, and matches those against the dictionary. Therefore, -# based on linked shared libraries, we could recursively infer the list of files to collect in addition to the shared -# libraries themselves: -# - plugins and translation files belonging to Qt modules whose shared libraries we collect -# - Qt python extension modules corresponding to the Qt modules that we collect -# -# The above approach ensures that even if analyzed python script contains only ``from PySide2 import QtWidgets``, -# we would also collect ``PySide2.QtGui`` and ``PySide2.QtCore``, as well as all corresponding Qt module files -# (the shared libraries, plugins, translation files). For this to work, a hook must be provided for the -# ``PySide2.QtWidgets`` that performs the recursive analysis of the extension module file; so to ensure that each -# Qt python extension module by itself ensures collection of all its dependencies, we need to hook all Qt python -# extension modules provided by specific python Qt bindings package. -# -# The above approach with single dictionary, however, has several limitations: -# - it cannot provide association for Qt python module that binds a Qt module without a shared library (i.e., a -# headers-only module, or a statically-built module). In such cases, potential plugins and translations should -# be associated directly with the Qt python extension file instead of the Qt module's (non-existent) shared library. -# - it cannot (directly) handle differences between Qt5 and Qt6; we had to build a second dictionary -# - it cannot handle differences between the bindings themselves; for example, PyQt5 binds some Qt modules that -# PySide2 does not bind. Or, the binding's Qt python extension module is named differently in PyQt and PySide -# bindings (or just differently in PyQt5, while PySide2, PySide6, and PyQt6 use the same name). -# -# In order address the above shortcomings, we now store all information a list of structures that contain information -# for a particular Qt python extension and/or Qt module (shared library): -# - python extension name (if applicable) -# - Qt module name base (if applicable) -# - plugins -# - translation files base name -# - applicable Qt version (if necessary) -# - applicable Qt bindings (if necessary) -# -# This list is used to dynamically construct two dictionaries (based on the bindings name and Qt version): -# - mapping python extension names to associated module information -# - mapping Qt shared library names to associated module information -# This allows us to associate plugins and translations with either Qt python extension or with the Qt module's shared -# library (or both), whichever is applicable. -# -# The `qt_dynamic_dependencies_dict`_ from the original approach was constructed using several information sources, as -# documented `here -# `_. -# -# In the current approach, the relations stored in the `QT_MODULES_INFO`_ list were determined directly, by inspecting -# the Qt source code. This requires some prior knowledge of how the Qt code is organized (repositories and individual Qt -# modules within them), as well as some searching based on guesswork. The procedure can be outlined as follows: -# * check out the `main Qt repository `_. This repository contains references to all other -# Qt repositories in the form of git submodules. -# * for Qt5: -# * check out the latest release tag, e.g., v5.15.2, then check out the submodules. -# * search the Qt modules' qmake .pro files; for example, ``qtbase/src/network/network.pro`` for QtNetwork module. -# The plugin types associated with the module are listed in the ``MODULE_PLUGIN_TYPES`` variable (in this case, -# ``bearer``). -# * all translations are gathered in ``qttranslations`` sub-module/repository, and their association with -# individual repositories can be seen in ``qttranslations/translations/translations.pro``. -# * for Qt6: -# * check out the latest release tag, e.g., v6.3.1, then check out the submodules. -# * search the Qt modules' CMake files; for example, ``qtbase/src/network/CMakeLists.txt`` for QtNetwork module. -# The plugin types associated with the module are listed under ``PLUGIN_TYPES`` argument of the -# ``qt_internal_add_module()`` function that defines the Qt module. -# -# The idea is to make a list of all extension modules found in a Qt bindings package, as well as all available plugin -# directories (which correspond to plugin types) and translation files. For each extension, identify the corresponding -# Qt module (shared library name) and its associated plugins and translation files. Once this is done, most of available -# plugins and translations in the python bindings package should have a corresponding python Qt extension module -# available; this gives us associations based on the python extension module names as well as based on the Qt shared -# library names. For any plugins and translation files remaining unassociated, identify the corresponding Qt module; -# this gives us associations based only on Qt shared library names. While this second group of associations are never -# processed directly (due to lack of corresponding python extension), they may end up being processed during the -# recursive dependency analysis, if the corresponding Qt shared library is linked against by some Qt python extension -# or another Qt shared library. - - -# This structure is used to define Qt module information, such as python module/extension name, Qt module (shared -# library) name, translation files' base names, plugins, as well as associated python bindings (which implicitly -# also encode major Qt version). -class _QtModuleDef: - def __init__(self, module, shared_lib=None, translations=None, plugins=None, bindings=None): - # Python module (extension) name without package namespace. For example, `QtCore`. - # Can be None if python bindings do not bind the module, but we still need to establish relationship between - # the Qt module (shared library) and its plugins and translations. - self.module = module - # Associated Qt module (shared library), if any. Used during recursive dependency analysis, where a python - # module (extension) is analyzed for linked Qt modules (shared libraries), and then their corresponding - # python modules (extensions) are added to hidden imports. For example, the Qt module name is `Qt5Core` or - # `Qt6Core`, depending on the Qt version. Can be None for python modules that are not tied to a particular - # Qt shared library (for example, the corresponding Qt module is headers-only) and hence they cannot be - # inferred from recursive link-time dependency analysis. - self.shared_lib = shared_lib - # List of base names of translation files (if any) associated with the Qt module. Multiple base names may be - # associated with a single module. - # For example, `['qt', 'qtbase']` for `QtCore` or `['qtmultimedia']` for `QtMultimedia`. - self.translations = translations or [] - # List of plugins associated with the Qt module. - self.plugins = plugins or [] - # List of bindings (PySide2, PyQt5, PySide6, PyQt6) that provide the python module. This allows association of - # plugins and translations with shared libraries even for bindings that do not provide python module binding - # for the Qt module. - self.bindings = set(bindings or []) - - -# All Qt-based bindings. -ALL_QT_BINDINGS = {"PySide2", "PyQt5", "PySide6", "PyQt6"} - -# Qt modules information - the core of our Qt collection approach. -# -# For every python module/extension (i.e., entry in the list below that has valid `module`), we need a corresponding -# hook, ensuring that the extension file is analyzed, so that we collect the associated plugins and translation -# files, as well as perform recursive analysis of link-time binary dependencies (so that plugins and translation files -# belonging to those dependencies are collected as well). -QT_MODULES_INFO = ( - # *** qt/qt3d *** - _QtModuleDef("Qt3DAnimation", shared_lib="3DAnimation"), - _QtModuleDef("Qt3DCore", shared_lib="3DCore"), - _QtModuleDef("Qt3DExtras", shared_lib="3DExtras"), - _QtModuleDef("Qt3DInput", shared_lib="3DInput", plugins=["3dinputdevices"]), - _QtModuleDef("Qt3DLogic", shared_lib="3DLogic"), - _QtModuleDef( - "Qt3DRender", shared_lib="3DRender", plugins=["geometryloaders", "renderplugins", "renderers", "sceneparsers"] - ), - - # *** qt/qtactiveqt *** - # The python module is called QAxContainer in PyQt bindings, but QtAxContainer in PySide. The associated Qt module - # is header-only, so there is no shared library. - _QtModuleDef("QAxContainer", bindings=["PyQt*"]), - _QtModuleDef("QtAxContainer", bindings=["PySide*"]), - - # *** qt/qtcharts *** - # The python module is called QtChart in PyQt5, and QtCharts in PySide2, PySide6, and PyQt6 (which corresponds to - # the associated Qt module name, QtCharts). - _QtModuleDef("QtChart", shared_lib="Charts", bindings=["PyQt5"]), - _QtModuleDef("QtCharts", shared_lib="Charts", bindings=["!PyQt5"]), - - # *** qt/qtbase *** - # QtConcurrent python module is available only in PySide bindings. - _QtModuleDef(None, shared_lib="Concurrent", bindings=["PyQt*"]), - _QtModuleDef("QtConcurrent", shared_lib="Concurrent", bindings=["PySide*"]), - _QtModuleDef("QtCore", shared_lib="Core", translations=["qt", "qtbase"]), - # QtDBus python module is available in all bindings but PySide2. - _QtModuleDef(None, shared_lib="DBus", bindings=["PySide2"]), - _QtModuleDef("QtDBus", shared_lib="DBus", bindings=["!PySide2"]), - # QtNetwork uses different plugins in Qt5 and Qt6. - _QtModuleDef("QtNetwork", shared_lib="Network", plugins=["bearer"], bindings=["PySide2", "PyQt5"]), - _QtModuleDef( - "QtNetwork", - shared_lib="Network", - plugins=["networkaccess", "networkinformation", "tls"], - bindings=["PySide6", "PyQt6"] - ), - _QtModuleDef( - "QtGui", - shared_lib="Gui", - plugins=[ - "accessiblebridge", - "egldeviceintegrations", - "generic", - "iconengines", - "imageformats", - "platforms", - "platforms/darwin", - "platforminputcontexts", - "platformthemes", - "xcbglintegrations", - # The ``wayland-*`` plugins are part of QtWaylandClient Qt module, whose shared library - # (e.g., libQt5WaylandClient.so) is linked by the wayland-related ``platforms`` plugins. Ideally, we would - # collect these plugins based on the QtWaylandClient shared library entry, but as our Qt hook utilities do - # not scan the plugins for dependencies, that would not work. So instead we list these plugins under QtGui - # to achieve pretty much the same end result. - "wayland-decoration-client", - "wayland-graphics-integration-client", - "wayland-shell-integration" - ] - ), - _QtModuleDef("QtOpenGL", shared_lib="OpenGL"), - # This python module is specific to PySide2 and has no associated Qt module. - _QtModuleDef("QtOpenGLFunctions", bindings=["PySide2"]), - # This Qt module was introduced with Qt6. - _QtModuleDef("QtOpenGLWidgets", shared_lib="OpenGLWidgets", bindings=["PySide6", "PyQt6"]), - _QtModuleDef("QtPrintSupport", shared_lib="PrintSupport", plugins=["printsupport"]), - _QtModuleDef("QtSql", shared_lib="Sql", plugins=["sqldrivers"]), - _QtModuleDef("QtTest", shared_lib="Test"), - _QtModuleDef("QtWidgets", shared_lib="Widgets", plugins=["styles"]), - _QtModuleDef("QtXml", shared_lib="Xml"), - - # *** qt/qtconnectivity *** - _QtModuleDef("QtBluetooth", shared_lib="QtBluetooth", translations=["qtconnectivity"]), - _QtModuleDef("QtNfc", shared_lib="Nfc", translations=["qtconnectivity"]), - - # *** qt/qtdatavis3d *** - _QtModuleDef("QtDataVisualization", shared_lib="DataVisualization"), - - # *** qt/qtdeclarative *** - _QtModuleDef("QtQml", shared_lib="Qml", translations=["qtdeclarative"], plugins=["qmltooling"]), - # Have the Qt5 variant collect translations for qtquickcontrols (qt/qtquickcontrols provides only QtQuick plugins). - _QtModuleDef( - "QtQuick", - shared_lib="Quick", - translations=["qtquickcontrols"], - plugins=["scenegraph"], - bindings=["PySide2", "PyQt5"] - ), - _QtModuleDef("QtQuick", shared_lib="Quick", plugins=["scenegraph"], bindings=["PySide6", "PyQt6"]), - # Qt6-only; in Qt5, this module is part of qt/qtquickcontrols2. Python module is available only in PySide6. - _QtModuleDef(None, shared_lib="QuickControls2", bindings=["PyQt6"]), - _QtModuleDef("QtQuickControls2", shared_lib="QuickControls2", bindings=["PySide6"]), - _QtModuleDef("QtQuickWidgets", shared_lib="QuickWidgets"), - - # *** qt/qtgamepad *** - # No python module; shared library -> plugins association entry. - _QtModuleDef(None, shared_lib="Gamepad", plugins=["gamepads"]), - - # *** qt/qtgraphs *** - # Qt6 >= 6.6.0; python module is available only in PySide6. - _QtModuleDef("QtGraphs", shared_lib="Graphs", bindings=["PySide6"]), - - # *** qt/qthttpserver *** - # Qt6 >= 6.4.0; python module is available only in PySide6. - _QtModuleDef("QtHttpServer", shared_lib="HttpServer", bindings=["PySide6"]), - - # *** qt/qtlocation *** - # QtLocation was reintroduced in Qt6 v6.5.0. - _QtModuleDef( - "QtLocation", - shared_lib="Location", - translations=["qtlocation"], - plugins=["geoservices"], - bindings=["PySide2", "PyQt5", "PySide6"] - ), - _QtModuleDef( - "QtPositioning", - shared_lib="Positioning", - translations=["qtlocation"], - plugins=["position"], - ), - - # *** qt/qtmacextras *** - # Qt5-only Qt module. - _QtModuleDef("QtMacExtras", shared_lib="MacExtras", bindings=["PySide2", "PyQt5"]), - - # *** qt/qtmultimedia *** - # QtMultimedia on Qt6 currently uses only a subset of plugin names from Qt5 counterpart. - _QtModuleDef( - "QtMultimedia", - shared_lib="Multimedia", - translations=["qtmultimedia"], - plugins=[ - "mediaservice", "audio", "video/bufferpool", "video/gstvideorenderer", "video/videonode", "playlistformats", - "resourcepolicy" - ], - bindings=["PySide2", "PyQt5"] - ), - _QtModuleDef( - "QtMultimedia", - shared_lib="Multimedia", - translations=["qtmultimedia"], - # `multimedia` plugins are available as of Qt6 >= 6.4.0; earlier versions had `video/gstvideorenderer` and - # `video/videonode` plugins. - plugins=["multimedia", "video/gstvideorenderer", "video/videonode"], - bindings=["PySide6", "PyQt6"] - ), - _QtModuleDef("QtMultimediaWidgets", shared_lib="MultimediaWidgets"), - # Qt6-only Qt module; python module is available in PySide6 >= 6.4.0 and PyQt6 >= 6.5.0 - _QtModuleDef("QtSpatialAudio", shared_lib="SpatialAudio", bindings=["PySide6", "PyQt6"]), - - # *** qt/qtnetworkauth *** - # QtNetworkAuth python module is available in all bindings but PySide2. - _QtModuleDef(None, shared_lib="NetworkAuth", bindings=["PySide2"]), - _QtModuleDef("QtNetworkAuth", shared_lib="NetworkAuth", bindings=["!PySide2"]), - - # *** qt/qtpurchasing *** - # Qt5-only Qt module, python module is available only in PyQt5. - _QtModuleDef("QtPurchasing", shared_lib="Purchasing", bindings=["PyQt5"]), - - # *** qt/qtquick1 *** - # This is an old, Qt 5.3-era module... - _QtModuleDef( - "QtDeclarative", - shared_lib="Declarative", - translations=["qtquick1"], - plugins=["qml1tooling"], - bindings=["PySide2", "PyQt5"] - ), - - # *** qt/qtquick3d *** - # QtQuick3D python module is available in all bindings but PySide2. - _QtModuleDef(None, shared_lib="Quick3D", bindings=["PySide2"]), - _QtModuleDef("QtQuick3D", shared_lib="Quick3D", bindings=["!PySide2"]), - # No python module; shared library -> plugins association entry. - _QtModuleDef(None, shared_lib="Quick3DAssetImport", plugins=["assetimporters"]), - - # *** qt/qtquickcontrols2 *** - # Qt5-only module; in Qt6, this module is part of qt/declarative. Python module is available only in PySide2. - _QtModuleDef(None, translations=["qtquickcontrols2"], shared_lib="QuickControls2", bindings=["PyQt5"]), - _QtModuleDef( - "QtQuickControls2", translations=["qtquickcontrols2"], shared_lib="QuickControls2", bindings=["PySide2"] - ), - - # *** qt/qtremoteobjects *** - _QtModuleDef("QtRemoteObjects", shared_lib="RemoteObjects"), - - # *** qt/qtscxml *** - # Python module is available only in PySide bindings. Plugins are available only in Qt6. - # PyQt wheels do not seem to ship the corresponding Qt modules (shared libs) at all. - _QtModuleDef("QtScxml", shared_lib="Scxml", bindings=["PySide2"]), - _QtModuleDef("QtScxml", shared_lib="Scxml", plugins=["scxmldatamodel"], bindings=["PySide6"]), - # Qt6-only Qt module, python module is available only in PySide6. - _QtModuleDef("QtStateMachine", shared_lib="StateMachine", bindings=["PySide6"]), - - # *** qt/qtsensors *** - _QtModuleDef("QtSensors", shared_lib="Sensors", plugins=["sensors", "sensorgestures"]), - - # *** qt/qtserialport *** - _QtModuleDef("QtSerialPort", shared_lib="SerialPort", translations=["qtserialport"]), - - # *** qt/qtscript *** - # Qt5-only Qt module, python module is available only in PySide2. PyQt5 wheels do not seem to ship the corresponding - # Qt modules (shared libs) at all. - _QtModuleDef("QtScript", shared_lib="Script", translations=["qtscript"], plugins=["script"], bindings=["PySide2"]), - _QtModuleDef("QtScriptTools", shared_lib="ScriptTools", bindings=["PySide2"]), - - # *** qt/qtserialbus *** - # No python module; shared library -> plugins association entry. - # PySide6 6.5.0 introduced python module. - _QtModuleDef(None, shared_lib="SerialBus", plugins=["canbus"], bindings=["!PySide6"]), - _QtModuleDef("QtSerialBus", shared_lib="SerialBus", plugins=["canbus"], bindings=["PySide6"]), - - # *** qt/qtsvg *** - _QtModuleDef("QtSvg", shared_lib="Svg"), - # Qt6-only Qt module. - _QtModuleDef("QtSvgWidgets", shared_lib="SvgWidgets", bindings=["PySide6", "PyQt6"]), - - # *** qt/qtspeech *** - _QtModuleDef("QtTextToSpeech", shared_lib="TextToSpeech", plugins=["texttospeech"]), - - # *** qt/qttools *** - # QtDesigner python module is available in all bindings but PySide2. - _QtModuleDef(None, shared_lib="Designer", plugins=["designer"], bindings=["PySide2"]), - _QtModuleDef( - "QtDesigner", shared_lib="Designer", translations=["designer"], plugins=["designer"], bindings=["!PySide2"] - ), - _QtModuleDef("QtHelp", shared_lib="Help", translations=["qt_help"]), - # Python module is available only in PySide bindings. - _QtModuleDef("QtUiTools", shared_lib="UiTools", bindings=["PySide*"]), - - # *** qt/qtvirtualkeyboard *** - # No python module; shared library -> plugins association entry. - _QtModuleDef(None, shared_lib="VirtualKeyboard", plugins=["virtualkeyboard"]), - - # *** qt/qtwebchannel *** - _QtModuleDef("QtWebChannel", shared_lib="WebChannel"), - - # *** qt/qtwebengine *** - # QtWebEngine is Qt5-only module (replaced by QtWebEngineQuick in Qt6). - _QtModuleDef("QtWebEngine", shared_lib="WebEngine", bindings=["PySide2", "PyQt5"]), - _QtModuleDef("QtWebEngineCore", shared_lib="WebEngineCore", translations=["qtwebengine"]), - # QtWebEngineQuick is Qt6-only module (replacement for QtWebEngine in Qt5). - _QtModuleDef("QtWebEngineQuick", shared_lib="WebEngineQuick", bindings=["PySide6", "PyQt6"]), - _QtModuleDef("QtWebEngineWidgets", shared_lib="WebEngineWidgets"), - # QtPdf and QtPdfWidgets have python module available in PySide6 and PyQt6 >= 6.4.0. - _QtModuleDef("QtPdf", shared_lib="Pdf", bindings=["PySide6", "PyQt6"]), - _QtModuleDef("QtPdfWidgets", shared_lib="PdfWidgets", bindings=["PySide6", "PyQt6"]), - - # *** qt/qtwebsockets *** - _QtModuleDef("QtWebSockets", shared_lib="WebSockets", translations=["qtwebsockets"]), - - # *** qt/qtwebview *** - # No python module; shared library -> plugins association entry. - _QtModuleDef(None, shared_lib="WebView", plugins=["webview"]), - - # *** qt/qtwinextras *** - # Qt5-only Qt module. - _QtModuleDef("QtWinExtras", shared_lib="WinExtras", bindings=["PySide2", "PyQt5"]), - - # *** qt/qtx11extras *** - # Qt5-only Qt module. - _QtModuleDef("QtX11Extras", shared_lib="X11Extras", bindings=["PySide2", "PyQt5"]), - - # *** qt/qtxmlpatterns *** - # Qt5-only Qt module. - _QtModuleDef( - "QtXmlPatterns", shared_lib="XmlPatterns", translations=["qtxmlpatterns"], bindings=["PySide2", "PyQt5"] - ), - - # *** qscintilla *** - # Python module is available only in PyQt bindings. No associated shared library. - _QtModuleDef("Qsci", translations=["qscintilla"], bindings=["PyQt*"]), -) - - -# Helpers for turning Qt namespace specifiers, such as "!PySide2" or "PyQt*", into set of applicable -# namespaces. -def process_namespace_strings(namespaces): - """"Process list of Qt namespace specifier strings into set of namespaces.""" - bindings = set() - for namespace in namespaces: - bindings |= _process_namespace_string(namespace) - return bindings - - -def _process_namespace_string(namespace): - """Expand a Qt namespace specifier string into set of namespaces.""" - if namespace.startswith("!"): - bindings = _process_namespace_string(namespace[1:]) - return ALL_QT_BINDINGS - bindings - else: - if namespace == "PySide*": - return {"PySide2", "PySide6"} - elif namespace == "PyQt*": - return {"PyQt5", "PyQt6"} - elif namespace in ALL_QT_BINDINGS: - return {namespace} - else: - raise ValueError(f"Invalid Qt namespace specifier: {namespace}!") diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/setuptools.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/setuptools.py deleted file mode 100755 index 47a649c..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/setuptools.py +++ /dev/null @@ -1,336 +0,0 @@ -# ---------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -from PyInstaller import log as logging -from PyInstaller import isolated - -logger = logging.getLogger(__name__) - - -# Import setuptools and analyze its properties in an isolated subprocess. This function is called by `SetuptoolsInfo` -# to initialize its properties. -@isolated.decorate -def _retrieve_setuptools_info(): - import importlib - - try: - setuptools = importlib.import_module("setuptools") # noqa: F841 - except ModuleNotFoundError: - return None - - # Delay these imports until after we have confirmed that setuptools is importable. - import pathlib - - import packaging.version - - from PyInstaller.compat import importlib_metadata - from PyInstaller.utils.hooks import ( - collect_data_files, - collect_submodules, - ) - - # Try to retrieve the version. At this point, failure is consider an error. - version_string = importlib_metadata.version("setuptools") - version = packaging.version.Version(version_string).release # Use the version tuple - - # setuptools >= 60.0 its vendored copy of distutils (mainly due to its removal from stdlib in python >= 3.12). - distutils_vendored = False - distutils_modules = [] - if version >= (60, 0): - distutils_vendored = True - distutils_modules += ["_distutils_hack"] - distutils_modules += collect_submodules( - "setuptools._distutils", - # setuptools 71.0.1 ~ 71.0.4 include `setuptools._distutils.tests`; avoid explicitly collecting it - # (t was not included in earlier setuptools releases). - filter=lambda name: name != 'setuptools._distutils.tests', - ) - - # Check if `setuptools._vendor` exists. Some linux distributions opt to de-vendor `setuptools` and remove the - # `setuptools._vendor` directory altogether. If this is the case, most of additional processing below should be - # skipped to avoid errors and warnings about non-existent `setuptools._vendor` module. - try: - setuptools_vendor = importlib.import_module("setuptools._vendor") - except ModuleNotFoundError: - setuptools_vendor = None - - # Check for exposed packages/modules that are vendored by setuptools. If stand-alone version is not provided in the - # environment, setuptools-vendored version is exposed (due to location of `setuptools._vendor` being appended to - # `sys.path`. Applicable to v71.0.0 and later. - vendored_status = dict() - vendored_namespace_package_paths = dict() - if version >= (71, 0) and setuptools_vendor is not None: - VENDORED_TOP_LEVEL_NAMESPACE_CANDIDATES = ( - "backports", # "regular" package, but has namespace semantics due to `pkgutil.extend_path()` - "jaraco", # PEP-420 namespace package - ) - - VENDORED_CANDIDATES = ( - "autocommand", - "backports.tarfile", - "importlib_metadata", - "importlib_resources", - "inflect", - "jaraco.context", - "jaraco.functools", - "jaraco.text", - "more_itertools", - "ordered_set", - "packaging", - "platformdirs", - "tomli", - "typeguard", - "typing_extensions", - "wheel", - "zipp", - ) - - # Resolve path(s) of `setuptools_vendor` package. - setuptools_vendor_paths = [pathlib.Path(path).resolve() for path in setuptools_vendor.__path__] - - # Process each candidate: top-level namespace packages - for candidate_name in VENDORED_TOP_LEVEL_NAMESPACE_CANDIDATES: - try: - candidate = importlib.import_module(candidate_name) - except ImportError: - continue - - # Retrieve the __path__ attribute and store it, so we can re-use it in hooks without having to re-import - # `setuptools` and the candidate package... - candidate_path_attr = getattr(candidate, '__path__', []) - if candidate_path_attr: - candidate_paths = [pathlib.Path(path).resolve() for path in candidate_path_attr] - is_vendored = [ - any([ - setuptools_vendor_path in candidate_path.parents or candidate_path == setuptools_vendor_path - for setuptools_vendor_path in setuptools_vendor_paths - ]) for candidate_path in candidate_paths - ] - # For namespace packages, distinguish between "fully" vendored and "partially" vendored state; i.e., - # whether the part of namespace package in the vendored directory is the only part or not. - if all(is_vendored): - vendored_status[candidate_name] = 'fully' - elif any(is_vendored): - vendored_status[candidate_name] = 'partially' - else: - vendored_status[candidate_name] = False - - # Store paths - vendored_namespace_package_paths[candidate_name] = [str(path) for path in candidate_path_attr] - - # Process each candidate: modules and packages - for candidate_name in VENDORED_CANDIDATES: - try: - candidate = importlib.import_module(candidate_name) - except ImportError: - continue - - # Check the __file__ attribute (modules and regular packages). Will not work with namespace packages, but - # at the moment, there are none (vendored top-level namespace packages have already been handled). - candidate_file_attr = getattr(candidate, '__file__', None) - if candidate_file_attr is not None: - candidate_path = pathlib.Path(candidate_file_attr).parent.resolve() - is_vendored = any([ - setuptools_vendor_path in candidate_path.parents or candidate_path == setuptools_vendor_path - for setuptools_vendor_path in setuptools_vendor_paths - ]) - vendored_status[candidate_name] = is_vendored # True/False - - # Collect submodules from `setuptools._vendor`, regardless of whether the vendored package is exposed or - # not (because setuptools might need/use it either way). - vendored_modules = [] - if setuptools_vendor is not None: - EXCLUDED_VENDORED_MODULES = ( - # Prevent recursing into setuptools._vendor.pyparsing.diagram, which typically fails to be imported due - # to missing dependencies (railroad, pyparsing (?), jinja2) and generates a warning... As the module is - # usually unimportable, it is likely not to be used by setuptools. NOTE: pyparsing was removed from - # vendored packages in setuptools v67.0.0; keep this exclude around for earlier versions. - 'setuptools._vendor.pyparsing.diagram', - # Setuptools >= 71 started shipping vendored dependencies that include tests; avoid collecting those via - # hidden imports. (Note that this also prevents creation of aliases for these module, but that should - # not be an issue, as they should not be referenced from anywhere). - 'setuptools._vendor.importlib_resources.tests', - # These appear to be utility scripts bundled with the jaraco.text package - exclude them. - 'setuptools._vendor.jaraco.text.show-newlines', - 'setuptools._vendor.jaraco.text.strip-prefix', - 'setuptools._vendor.jaraco.text.to-dvorak', - 'setuptools._vendor.jaraco.text.to-qwerty', - ) - vendored_modules += collect_submodules( - 'setuptools._vendor', - filter=lambda name: name not in EXCLUDED_VENDORED_MODULES, - ) - - # `collect_submodules` (and its underlying `pkgutil.iter_modules` do not discover namespace sub-packages, in - # this case `setuptools._vendor.jaraco`. So force a manual scan of modules/packages inside it. - vendored_modules += collect_submodules( - 'setuptools._vendor.jaraco', - filter=lambda name: name not in EXCLUDED_VENDORED_MODULES, - ) - - # *** Data files for vendored packages *** - vendored_data = [] - - if version >= (71, 0) and setuptools_vendor is not None: - # Since the vendored dependencies from `setuptools/_vendor` are now visible to the outside world, make - # sure we collect their metadata. (We cannot use copy_metadata here, because we need to collect data - # files to their original locations). - vendored_data += collect_data_files('setuptools._vendor', includes=['**/*.dist-info']) - # Similarly, ensure that `Lorem ipsum.txt` from vendored jaraco.text is collected - vendored_data += collect_data_files('setuptools._vendor.jaraco.text', includes=['**/Lorem ipsum.txt']) - - # Return dictionary with collected information - return { - "available": True, - "version": version, - "distutils_vendored": distutils_vendored, - "distutils_modules": distutils_modules, - "vendored_status": vendored_status, - "vendored_modules": vendored_modules, - "vendored_data": vendored_data, - "vendored_namespace_package_paths": vendored_namespace_package_paths, - } - - -class SetuptoolsInfo: - def __init__(self): - pass - - def __repr__(self): - return "SetuptoolsInfo" - - # Delay initialization of setuptools information until until the corresponding attributes are first requested. - def __getattr__(self, name): - if 'available' in self.__dict__: - # Initialization was already done, but requested attribute is not available. - raise AttributeError(name) - - # Load setuptools info... - self._load_setuptools_info() - # ... and return the requested attribute - return getattr(self, name) - - def _load_setuptools_info(self): - logger.info("%s: initializing cached setuptools info...", self) - - # Initialize variables so that they might be accessed even if setuptools is unavailable or if initialization - # fails for some reason. - self.available = False - self.version = None - self.distutils_vendored = False - self.distutils_modules = [] - self.vendored_status = dict() - self.vendored_modules = [] - self.vendored_data = [] - self.vendored_namespace_package_paths = dict() - - try: - setuptools_info = _retrieve_setuptools_info() - except Exception as e: - logger.warning("%s: failed to obtain setuptools info: %s", self, e) - return - - # If package could not be imported, `_retrieve_setuptools_info` returns None. In such cases, emit a debug - # message instead of a warning, because this initialization might be triggered by a helper function that is - # trying to determine availability of `setuptools` by inspecting the `available` attribute. - if setuptools_info is None: - logger.debug("%s: failed to obtain setuptools info: setuptools could not be imported.", self) - return - - # Copy properties - for key, value in setuptools_info.items(): - setattr(self, key, value) - - def is_vendored(self, module_name): - return self.vendored_status.get(module_name, False) - - @staticmethod - def _create_vendored_aliases(vendored_name, module_name, modules_list): - # Create aliases for all submodules - prefix_len = len(vendored_name) # Length of target-name prefix to remove - return ((module_name + vendored_module[prefix_len:], vendored_module) for vendored_module in modules_list - if vendored_module.startswith(vendored_name)) - - def get_vendored_aliases(self, module_name): - vendored_name = f"setuptools._vendor.{module_name}" - return self._create_vendored_aliases(vendored_name, module_name, self.vendored_modules) - - def get_distutils_aliases(self): - vendored_name = "setuptools._distutils" - return self._create_vendored_aliases(vendored_name, "distutils", self.distutils_modules) - - -setuptools_info = SetuptoolsInfo() - - -def pre_safe_import_module_for_top_level_namespace_packages(api): - """ - A common implementation of pre_safe_import_module hook function for handling vendored top-level namespace packages - (i.e., `backports` and `jaraco`). - - This function can be either called from the `pre_safe_import_module` function in a pre-safe-import-module hook, or - just imported into the hook and aliased to `pre_safe_import_module`. - """ - module_name = api.module_name - - # Check if the package/module is a vendored copy. This also returns False is setuptools is unavailable, because - # vendored module status dictionary will be empty. - vendored = setuptools_info.is_vendored(module_name) - if not vendored: - return - - if vendored == 'fully': - # For a fully-vendored copy, force creation of aliases; on one hand, this aims to ensure that submodules are - # resolvable, but on the other, it also prevents creation of unvendored top-level package, which should not - # exit in this case. - vendored_name = f"setuptools._vendor.{module_name}" - logger.info( - "Setuptools: %r appears to be a full setuptools-vendored copy - creating alias to %r!", module_name, - vendored_name - ) - # Create aliases for all (sub)modules - for aliased_name, real_vendored_name in setuptools_info.get_vendored_aliases(module_name): - api.add_alias_module(real_vendored_name, aliased_name) - elif vendored == 'partially': - # For a partially-vendored copy, adjust the submodule search paths, so that submodules from all locations are - # discoverable (especially from the setuptools vendor directory, which might not be in the search path yet). - search_paths = setuptools_info.vendored_namespace_package_paths.get(module_name, []) - logger.info( - "Setuptools: %r appears to be a partial setuptools-vendored copy - extending search paths to %r!", - module_name, search_paths - ) - for path in search_paths: - api.append_package_path(path) - else: - logger.warning("Setuptools: %r has unhandled vendored status: %r", module_name, vendored) - - -def pre_safe_import_module(api): - """ - A common implementation of pre_safe_import_module hook function. - - This function can be either called from the `pre_safe_import_module` function in a pre-safe-import-module hook, or - just imported into the hook. - """ - module_name = api.module_name - - # Check if the package/module is a vendored copy. This also returns False is setuptools is unavailable, because - # vendored module status dictionary will be empty. - if not setuptools_info.is_vendored(module_name): - return - - vendored_name = f"setuptools._vendor.{module_name}" - logger.info( - "Setuptools: %r appears to be a setuptools-vendored copy - creating alias to %r!", module_name, vendored_name - ) - - # Create aliases for all (sub)modules - for aliased_name, real_vendored_name in setuptools_info.get_vendored_aliases(module_name): - api.add_alias_module(real_vendored_name, aliased_name) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/tcl_tk.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/tcl_tk.py deleted file mode 100755 index e975c5f..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/hooks/tcl_tk.py +++ /dev/null @@ -1,356 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -import os -import fnmatch - -from PyInstaller import compat -from PyInstaller import isolated -from PyInstaller import log as logging -from PyInstaller.depend import bindepend - -if compat.is_darwin: - from PyInstaller.utils import osx as osxutils - -logger = logging.getLogger(__name__) - - -@isolated.decorate -def _get_tcl_tk_info(): - """ - Isolated-subprocess helper to retrieve the basic Tcl/Tk information: - - tkinter_extension_file = the value of __file__ attribute of the _tkinter binary extension (path to file). - - tcl_data_dir = path to the Tcl library/data directory. - - tcl_version = Tcl version - - tk_version = Tk version - - tcl_theaded = boolean indicating whether Tcl/Tk is built with multi-threading support. - """ - try: - import tkinter - import _tkinter - except ImportError: - # tkinter unavailable - return None - try: - tcl = tkinter.Tcl() - except tkinter.TclError: # e.g. "Can't find a usable init.tcl in the following directories: ..." - return None - - # Query the location of Tcl library/data directory. - tcl_data_dir = tcl.eval("info library") - - # Check if Tcl/Tk is built with multi-threaded support (built with --enable-threads), as indicated by the presence - # of optional `threaded` member in `tcl_platform` array. Tcl 9.0 removed the --enable-threads flag, and is always - # built with multi-threaded support (and thus the `threaded` array member has been removed). - TCL_MAJOR = int(_tkinter.TCL_VERSION.split(".")[0]) - if TCL_MAJOR >= 9: - tcl_threaded = True - else: - try: - tcl.getvar("tcl_platform(threaded)") # Ignore the actual value. - tcl_threaded = True - except tkinter.TclError: - tcl_threaded = False - - return { - "available": True, - # If `_tkinter` is a built-in (as opposed to an extension), it does not have a `__file__` attribute. - "tkinter_extension_file": getattr(_tkinter, '__file__', None), - "tcl_version": _tkinter.TCL_VERSION, - "tk_version": _tkinter.TK_VERSION, - "tcl_threaded": tcl_threaded, - "tcl_data_dir": tcl_data_dir, - } - - -class TclTkInfo: - # Root directory names of Tcl and Tk library/data directories in the frozen application. These directories are - # originally fully versioned (e.g., tcl8.6 and tk8.6); we want to remap them to unversioned variants, so that our - # run-time hook (pyi_rthook__tkinter.py) does not have to determine version numbers when setting `TCL_LIBRARY` - # and `TK_LIBRARY` environment variables. - # - # We also cannot use plain "tk" and "tcl", because on macOS, the Tcl and Tk shared libraries might come from - # framework bundles, and would therefore end up being collected as "Tcl" and "Tk" in the top-level application - # directory, causing clash due to filesystem being case-insensitive by default. - TCL_ROOTNAME = '_tcl_data' - TK_ROOTNAME = '_tk_data' - - def __init__(self): - pass - - def __repr__(self): - return "TclTkInfo" - - # Delay initialization of Tcl/Tk information until until the corresponding attributes are first requested. - def __getattr__(self, name): - if 'available' in self.__dict__: - # Initialization was already done, but requested attribute is not available. - raise AttributeError(name) - - # Load Qt library info... - self._load_tcl_tk_info() - # ... and return the requested attribute - return getattr(self, name) - - def _load_tcl_tk_info(self): - logger.info("%s: initializing cached Tcl/Tk info...", self) - - # Initialize variables so that they might be accessed even if tkinter/Tcl/Tk is unavailable or if initialization - # fails for some reason. - self.available = False - self.tkinter_extension_file = None - self.tcl_version = None - self.tk_version = None - self.tcl_threaded = False - self.tcl_data_dir = None - - self.tk_data_dir = None - self.tcl_module_dir = None - - self.is_macos_system_framework = False - self.tcl_shared_library = None - self.tk_shared_library = None - - self.data_files = [] - - try: - tcl_tk_info = _get_tcl_tk_info() - except Exception as e: - logger.warning("%s: failed to obtain Tcl/Tk info: %s", self, e) - return - - # If tkinter could not be imported, `_get_tcl_tk_info` returns None. In such cases, emit a debug message instead - # of a warning, because this initialization might be triggered by a helper function that is trying to determine - # availability of `tkinter` by inspecting the `available` attribute. - if tcl_tk_info is None: - logger.debug("%s: failed to obtain Tcl/Tk info: tkinter/_tkinter could not be imported.", self) - return - - # Copy properties - for key, value in tcl_tk_info.items(): - setattr(self, key, value) - - # Parse Tcl/Tk version into (major, minor) tuple. - self.tcl_version = tuple((int(x) for x in self.tcl_version.split(".")[:2])) - self.tk_version = tuple((int(x) for x in self.tk_version.split(".")[:2])) - - # Determine full path to Tcl and Tk shared libraries against which the `_tkinter` extension module is linked. - # This can only be done when `_tkinter` is in fact an extension, and not a built-in. In the latter case, the - # Tcl/Tk libraries are statically linked into python shared library, so there are no shared libraries for us - # to discover. - if self.tkinter_extension_file: - try: - ( - self.tcl_shared_library, - self.tk_shared_library, - ) = self._find_tcl_tk_shared_libraries(self.tkinter_extension_file) - except Exception: - logger.warning("%s: failed to determine Tcl and Tk shared library location!", self, exc_info=True) - - # macOS: check if _tkinter is linked against system-provided Tcl.framework and Tk.framework. This is the - # case with python3 from XCode tools (and was the case with very old homebrew python builds). In such cases, - # we should not be collecting Tcl/Tk files. - if compat.is_darwin: - self.is_macos_system_framework = self._check_macos_system_framework(self.tcl_shared_library) - - # Emit a warning in the unlikely event that we are dealing with Teapot-distributed version of ActiveTcl. - if not self.is_macos_system_framework: - self._warn_if_using_activetcl_or_teapot(self.tcl_data_dir) - - # Infer location of Tk library/data directory. Ideally, we could infer this by running - # - # import tkinter - # root = tkinter.Tk() - # tk_data_dir = root.tk.exprstring('$tk_library') - # - # in the isolated subprocess as part of `_get_tcl_tk_info`. However, that is impractical, as it shows the empty - # window, and on some platforms (e.g., linux) requires display server. Therefore, try to guess the location, - # based on the following heuristic: - # - if TK_LIBRARY is defined use it. - # - if Tk is built as macOS framework bundle, look for Scripts sub-directory in Resources directory next to - # the shared library. - # - otherwise, look for: $tcl_root/../tkX.Y, where X and Y are Tk major and minor version. - if "TK_LIBRARY" in os.environ: - self.tk_data_dir = os.environ["TK_LIBRARY"] - elif compat.is_darwin and self.tk_shared_library and ( - # is_framework_bundle_lib handles only fully-versioned framework library paths... - (osxutils.is_framework_bundle_lib(self.tk_shared_library)) or - # ... so manually handle top-level-symlinked variant for now. - (self.tk_shared_library).endswith("Tk.framework/Tk") - ): - # Fully resolve the library path, in case it is a top-level symlink; for example, resolve - # /Library/Frameworks/Python.framework/Versions/3.13/Frameworks/Tk.framework/Tk - # into - # /Library/Frameworks/Python.framework/Versions/3.13/Frameworks/Tk.framework/Versions/8.6/Tk - tk_lib_realpath = os.path.realpath(self.tk_shared_library) - # Resources/Scripts directory next to the shared library - self.tk_data_dir = os.path.join(os.path.dirname(tk_lib_realpath), "Resources", "Scripts") - else: - self.tk_data_dir = os.path.join( - os.path.dirname(self.tcl_data_dir), - f"tk{self.tk_version[0]}.{self.tk_version[1]}", - ) - - # Infer location of Tcl module directory. The modules directory is separate from the library/data one, and - # is located at $tcl_root/../tclX, where X is the major Tcl version. - self.tcl_module_dir = os.path.join( - os.path.dirname(self.tcl_data_dir), - f"tcl{self.tcl_version[0]}", - ) - - # Find all data files - if self.is_macos_system_framework: - logger.info("%s: using macOS system Tcl/Tk framework - not collecting data files.", self) - else: - # Collect Tcl and Tk scripts from their corresponding library/data directories. See comment at the - # definition of TK_ROOTNAME and TK_ROOTNAME variables. - if os.path.isdir(self.tcl_data_dir): - self.data_files += self._collect_files_from_directory( - self.tcl_data_dir, - prefix=self.TCL_ROOTNAME, - excludes=['demos', '*.lib', 'tclConfig.sh'], - ) - else: - logger.warning("%s: Tcl library/data directory %r does not exist!", self, self.tcl_data_dir) - - if os.path.isdir(self.tk_data_dir): - self.data_files += self._collect_files_from_directory( - self.tk_data_dir, - prefix=self.TK_ROOTNAME, - excludes=['demos', '*.lib', 'tkConfig.sh'], - ) - else: - logger.warning("%s: Tk library/data directory %r does not exist!", self, self.tk_data_dir) - - # Collect Tcl modules from modules directory - if os.path.isdir(self.tcl_module_dir): - self.data_files += self._collect_files_from_directory( - self.tcl_module_dir, - prefix=os.path.basename(self.tcl_module_dir), - ) - else: - logger.warning("%s: Tcl module directory %r does not exist!", self, self.tcl_module_dir) - - @staticmethod - def _collect_files_from_directory(root, prefix=None, excludes=None): - """ - A minimal port of PyInstaller.building.datastruct.Tree() functionality, which allows us to avoid using Tree - here. This way, the TclTkInfo data structure can be used without having PyInstaller's config context set up. - """ - excludes = excludes or [] - - todo = [(root, prefix)] - output = [] - while todo: - target_dir, prefix = todo.pop() - - for entry in os.listdir(target_dir): - # Basic name-based exclusion - if any((fnmatch.fnmatch(entry, exclude) for exclude in excludes)): - continue - - src_path = os.path.join(target_dir, entry) - dest_path = os.path.join(prefix, entry) if prefix else entry - - if os.path.isdir(src_path): - todo.append((src_path, dest_path)) - else: - # Return 3-element tuples with fully-resolved dest path, since other parts of code depend on that. - output.append((dest_path, src_path, 'DATA')) - - return output - - @staticmethod - def _find_tcl_tk_shared_libraries(tkinter_ext_file): - """ - Find Tcl and Tk shared libraries against which the _tkinter extension module is linked. - """ - tcl_lib = None - tk_lib = None - - for _, lib_path in bindepend.get_imports(tkinter_ext_file): # (name, fullpath) tuple - if lib_path is None: - continue # Skip unresolved entries - - # For comparison, take basename of lib_path. On macOS, lib_name returned by get_imports is in fact - # referenced name, which is not necessarily just a basename. - lib_name = os.path.basename(lib_path) - lib_name_lower = lib_name.lower() # lower-case for comparisons - - # First check for Tk library, because it is unlikely that 'tk' will appear in the name of the Tcl shared - # library, while 'tcl' could appear in the name of the Tk shared library. For example, Fedora 43 ships - # both Tcl/Tk 8.6 and 9.0, and in the latter, the libraries are named `libtcl9.0.so` and `libtcl9tk9.0.so`. - if 'tk' in lib_name_lower: - tk_lib = lib_path - elif 'tcl' in lib_name_lower: - tcl_lib = lib_path - - return tcl_lib, tk_lib - - @staticmethod - def _check_macos_system_framework(tcl_shared_lib): - # Starting with macOS 11, system libraries are hidden (unless both Python and PyInstaller's bootloader are built - # against macOS 11.x SDK). Therefore, Tcl shared library might end up unresolved (None); but that implicitly - # indicates that the system framework is used. - if tcl_shared_lib is None: - return True - - # Check if the path corresponds to the system framework, i.e., [/System]/Library/Frameworks/Tcl.framework/Tcl - return 'Library/Frameworks/Tcl.framework' in tcl_shared_lib - - @staticmethod - def _warn_if_using_activetcl_or_teapot(tcl_root): - """ - Check if Tcl installation is a Teapot-distributed version of ActiveTcl, and log a non-fatal warning that the - resulting frozen application will (likely) fail to run on other systems. - - PyInstaller does *not* freeze all ActiveTcl dependencies -- including Teapot, which is typically ignorable. - Since Teapot is *not* ignorable in this case, this function warns of impending failure. - - See Also - ------- - https://github.com/pyinstaller/pyinstaller/issues/621 - """ - if tcl_root is None: - return - - # Read the "init.tcl" script and look for mentions of "activetcl" and "teapot" - init_tcl = os.path.join(tcl_root, 'init.tcl') - if not os.path.isfile(init_tcl): - return - - mentions_activetcl = False - mentions_teapot = False - - # Tcl/Tk reads files using the system encoding (https://www.tcl.tk/doc/howto/i18n.html#system_encoding); - # on macOS, this is UTF-8. - with open(init_tcl, 'r', encoding='utf8') as fp: - for line in fp.readlines(): - line = line.strip().lower() - if line.startswith('#'): - continue - if 'activetcl' in line: - mentions_activetcl = True - if 'teapot' in line: - mentions_teapot = True - if mentions_activetcl and mentions_teapot: - break - - if mentions_activetcl and mentions_teapot: - logger.warning( - "You appear to be using an ActiveTcl build of Tcl/Tk, which PyInstaller has\n" - "difficulty freezing. To fix this, comment out all references to 'teapot' in\n" - f"{init_tcl!r}\n" - "See https://github.com/pyinstaller/pyinstaller/issues/621 for more information." - ) - - -tcltk_info = TclTkInfo() diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/misc.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/misc.py deleted file mode 100755 index 77a3e8e..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/misc.py +++ /dev/null @@ -1,229 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -This module contains miscellaneous functions that do not fit anywhere else. -""" - -import glob -import os -import pprint -import codecs -import re -import tokenize -import io -import pathlib - -from PyInstaller import log as logging -from PyInstaller.compat import is_win - -logger = logging.getLogger(__name__) - - -def dlls_in_subdirs(directory): - """ - Returns a list *.dll, *.so, *.dylib in the given directory and its subdirectories. - """ - filelist = [] - for root, dirs, files in os.walk(directory): - filelist.extend(dlls_in_dir(root)) - return filelist - - -def dlls_in_dir(directory): - """ - Returns a list of *.dll, *.so, *.dylib in the given directory. - """ - return files_in_dir(directory, ["*.so", "*.dll", "*.dylib"]) - - -def files_in_dir(directory, file_patterns=None): - """ - Returns a list of files in the given directory that match the given pattern. - """ - - file_patterns = file_patterns or [] - - files = [] - for file_pattern in file_patterns: - files.extend(glob.glob(os.path.join(directory, file_pattern))) - return files - - -def get_path_to_toplevel_modules(filename): - """ - Return the path to top-level directory that contains Python modules. - - It will look in parent directories for __init__.py files. The first parent directory without __init__.py is the - top-level directory. - - Returned directory might be used to extend the PYTHONPATH. - """ - curr_dir = os.path.dirname(os.path.abspath(filename)) - pattern = '__init__.py' - - # Try max. 10 levels up. - try: - for i in range(10): - files = set(os.listdir(curr_dir)) - # 'curr_dir' is still not top-level; go to parent dir. - if pattern in files: - curr_dir = os.path.dirname(curr_dir) - # Top-level dir found; return it. - else: - return curr_dir - except IOError: - pass - # No top-level directory found, or error was encountered. - return None - - -def mtime(fnm): - try: - # TODO: explain why this does not use os.path.getmtime() ? - # - It is probably not used because it returns float and not int. - return os.stat(fnm)[8] - except Exception: - return 0 - - -def save_py_data_struct(filename, data): - """ - Save data into text file as Python data structure. - :param filename: - :param data: - :return: - """ - dirname = os.path.dirname(filename) - if not os.path.exists(dirname): - os.makedirs(dirname) - with open(filename, 'w', encoding='utf-8') as f: - pprint.pprint(data, f) - - -def load_py_data_struct(filename): - """ - Load data saved as python code and interpret that code. - :param filename: - :return: - """ - with open(filename, 'r', encoding='utf-8') as f: - if is_win: - # import versioninfo so that VSVersionInfo can parse correctly. - from PyInstaller.utils.win32 import versioninfo # noqa: F401 - - return eval(f.read()) - - -def absnormpath(apath): - return os.path.abspath(os.path.normpath(apath)) - - -def module_parent_packages(full_modname): - """ - Return list of parent package names. - 'aaa.bb.c.dddd' -> ['aaa', 'aaa.bb', 'aaa.bb.c'] - :param full_modname: Full name of a module. - :return: List of parent module names. - """ - prefix = '' - parents = [] - # Ignore the last component in module name and get really just parent, grandparent, great grandparent, etc. - for pkg in full_modname.split('.')[0:-1]: - # Ensure that first item does not start with dot '.' - prefix += '.' + pkg if prefix else pkg - parents.append(prefix) - return parents - - -def is_file_qt_plugin(filename): - """ - Check if the given file is a Qt plugin file. - :param filename: Full path to file to check. - :return: True if given file is a Qt plugin file, False if not. - """ - - # Check the file contents; scan for QTMETADATA string. The scan is based on the brute-force Windows codepath of - # findPatternUnloaded() from qtbase/src/corelib/plugin/qlibrary.cpp in Qt5. - with open(filename, 'rb') as fp: - fp.seek(0, os.SEEK_END) - end_pos = fp.tell() - - SEARCH_CHUNK_SIZE = 8192 - QTMETADATA_MAGIC = b'QTMETADATA ' - - magic_offset = -1 - while end_pos >= len(QTMETADATA_MAGIC): - start_pos = max(end_pos - SEARCH_CHUNK_SIZE, 0) - chunk_size = end_pos - start_pos - # Is the remaining chunk large enough to hold the pattern? - if chunk_size < len(QTMETADATA_MAGIC): - break - # Read and scan the chunk - fp.seek(start_pos, os.SEEK_SET) - buf = fp.read(chunk_size) - pos = buf.rfind(QTMETADATA_MAGIC) - if pos != -1: - magic_offset = start_pos + pos - break - # Adjust search location for next chunk; ensure proper overlap. - end_pos = start_pos + len(QTMETADATA_MAGIC) - 1 - if magic_offset == -1: - return False - - return True - - -BOM_MARKERS_TO_DECODERS = { - codecs.BOM_UTF32_LE: codecs.utf_32_le_decode, - codecs.BOM_UTF32_BE: codecs.utf_32_be_decode, - codecs.BOM_UTF32: codecs.utf_32_decode, - codecs.BOM_UTF16_LE: codecs.utf_16_le_decode, - codecs.BOM_UTF16_BE: codecs.utf_16_be_decode, - codecs.BOM_UTF16: codecs.utf_16_decode, - codecs.BOM_UTF8: codecs.utf_8_decode, -} -BOM_RE = re.compile(rb"\A(%s)?(.*)" % b"|".join(map(re.escape, BOM_MARKERS_TO_DECODERS)), re.DOTALL) - - -def decode(raw: bytes): - """ - Decode bytes to string, respecting and removing any byte-order marks if present, or respecting but not removing any - PEP263 encoding comments (# encoding: cp1252). - """ - bom, raw = BOM_RE.match(raw).groups() - if bom: - return BOM_MARKERS_TO_DECODERS[bom](raw)[0] - - encoding, _ = tokenize.detect_encoding(io.BytesIO(raw).readline) - return raw.decode(encoding) - - -def is_iterable(arg): - """ - Check if the passed argument is an iterable." - """ - try: - iter(arg) - except TypeError: - return False - return True - - -def path_to_parent_archive(filename): - """ - Check if the given file path points to a file inside an existing archive file. Returns first path from the set of - parent paths that points to an existing file, or `None` if no such path exists (i.e., file is an actual stand-alone - file). - """ - for parent in pathlib.Path(filename).parents: - if parent.is_file(): - return parent - return None diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/osx.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/osx.py deleted file mode 100755 index 68726ba..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/osx.py +++ /dev/null @@ -1,757 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2014-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Utils for macOS platform. -""" - -import math -import os -import pathlib -import subprocess -import shutil -import tempfile - -from macholib.mach_o import ( - LC_BUILD_VERSION, - LC_CODE_SIGNATURE, - LC_ID_DYLIB, - LC_LOAD_DYLIB, - LC_LOAD_UPWARD_DYLIB, - LC_LOAD_WEAK_DYLIB, - LC_PREBOUND_DYLIB, - LC_REEXPORT_DYLIB, - LC_RPATH, - LC_SEGMENT_64, - LC_SYMTAB, - LC_UUID, - LC_VERSION_MIN_MACOSX, -) -from macholib.MachO import MachO -import macholib.util - -import PyInstaller.log as logging -from PyInstaller import compat - -logger = logging.getLogger(__name__) - - -def is_homebrew_env(): - """ - Check if Python interpreter was installed via Homebrew command 'brew'. - - :return: True if Homebrew else otherwise. - """ - # Python path prefix should start with Homebrew prefix. - env_prefix = get_homebrew_prefix() - if env_prefix and compat.base_prefix.startswith(env_prefix): - return True - return False - - -def is_macports_env(): - """ - Check if Python interpreter was installed via Macports command 'port'. - - :return: True if Macports else otherwise. - """ - # Python path prefix should start with Macports prefix. - env_prefix = get_macports_prefix() - if env_prefix and compat.base_prefix.startswith(env_prefix): - return True - return False - - -def get_homebrew_prefix(): - """ - :return: Root path of the Homebrew environment. - """ - prefix = shutil.which('brew') - # Conversion: /usr/local/bin/brew -> /usr/local - prefix = os.path.dirname(os.path.dirname(prefix)) - return prefix - - -def get_macports_prefix(): - """ - :return: Root path of the Macports environment. - """ - prefix = shutil.which('port') - # Conversion: /usr/local/bin/port -> /usr/local - prefix = os.path.dirname(os.path.dirname(prefix)) - return prefix - - -def _find_version_cmd(header): - """ - Helper that finds the version command in the given MachO header. - """ - # The SDK version is stored in LC_BUILD_VERSION command (used when targeting the latest versions of macOS) or in - # older LC_VERSION_MIN_MACOSX command. Check for presence of either. - version_cmd = [cmd for cmd in header.commands if cmd[0].cmd in {LC_BUILD_VERSION, LC_VERSION_MIN_MACOSX}] - assert len(version_cmd) == 1, \ - f"Expected exactly one LC_BUILD_VERSION or LC_VERSION_MIN_MACOSX command, found {len(version_cmd)}!" - return version_cmd[0] - - -def get_macos_sdk_version(filename): - """ - Obtain the version of macOS SDK against which the given binary was built. - - NOTE: currently, version is retrieved only from the first arch slice in the binary. - - :return: (major, minor, revision) tuple - """ - binary = MachO(filename) - header = binary.headers[0] - # Find version command using helper - version_cmd = _find_version_cmd(header) - return _hex_triplet(version_cmd[1].sdk) - - -def _hex_triplet(version): - # Parse SDK version number - major = (version & 0xFF0000) >> 16 - minor = (version & 0xFF00) >> 8 - revision = (version & 0xFF) - return major, minor, revision - - -def macosx_version_min(filename: str) -> tuple: - """ - Get the -macosx-version-min used to compile a macOS binary. - - For fat binaries, the minimum version is selected. - """ - versions = [] - for header in MachO(filename).headers: - cmd = _find_version_cmd(header) - if cmd[0].cmd == LC_VERSION_MIN_MACOSX: - versions.append(cmd[1].version) - else: - # macOS >= 10.14 uses LC_BUILD_VERSION instead. - versions.append(cmd[1].minos) - - return min(map(_hex_triplet, versions)) - - -def set_macos_sdk_version(filename, major, minor, revision): - """ - Overwrite the macOS SDK version declared in the given binary with the specified version. - - NOTE: currently, only version in the first arch slice is modified. - """ - # Validate values - assert 0 <= major <= 255, "Invalid major version value!" - assert 0 <= minor <= 255, "Invalid minor version value!" - assert 0 <= revision <= 255, "Invalid revision value!" - # Open binary - binary = MachO(filename) - header = binary.headers[0] - # Find version command using helper - version_cmd = _find_version_cmd(header) - # Write new SDK version number - version_cmd[1].sdk = major << 16 | minor << 8 | revision - # Write changes back. - with open(binary.filename, 'rb+') as fp: - binary.write(fp) - - -def fix_exe_for_code_signing(filename): - """ - Fixes the Mach-O headers to make code signing possible. - - Code signing on macOS does not work out of the box with embedding .pkg archive into the executable. - - The fix is done this way: - - Make the embedded .pkg archive part of the Mach-O 'String Table'. 'String Table' is at end of the macOS exe file, - so just change the size of the table to cover the end of the file. - - Fix the size of the __LINKEDIT segment. - - Note: the above fix works only if the single-arch thin executable or the last arch slice in a multi-arch fat - executable is not signed, because LC_CODE_SIGNATURE comes after LC_SYMTAB, and because modification of headers - invalidates the code signature. On modern arm64 macOS, code signature is mandatory, and therefore compilers - create a dummy signature when executable is built. In such cases, that signature needs to be removed before this - function is called. - - Mach-O format specification: http://developer.apple.com/documentation/Darwin/Reference/ManPages/man5/Mach-O.5.html - """ - # Estimate the file size after data was appended - file_size = os.path.getsize(filename) - - # Take the last available header. A single-arch thin binary contains a single slice, while a multi-arch fat binary - # contains multiple, and we need to modify the last one, which is adjacent to the appended data. - executable = MachO(filename) - header = executable.headers[-1] - - # Sanity check: ensure the executable slice is not signed (otherwise signature's section comes last in the - # __LINKEDIT segment). - sign_sec = [cmd for cmd in header.commands if cmd[0].cmd == LC_CODE_SIGNATURE] - assert len(sign_sec) == 0, "Executable contains code signature!" - - # Find __LINKEDIT segment by name (16-byte zero padded string) - __LINKEDIT_NAME = b'__LINKEDIT\x00\x00\x00\x00\x00\x00' - linkedit_seg = [cmd for cmd in header.commands if cmd[0].cmd == LC_SEGMENT_64 and cmd[1].segname == __LINKEDIT_NAME] - assert len(linkedit_seg) == 1, "Expected exactly one __LINKEDIT segment!" - linkedit_seg = linkedit_seg[0][1] # Take the segment command entry - # Find SYMTAB section - symtab_sec = [cmd for cmd in header.commands if cmd[0].cmd == LC_SYMTAB] - assert len(symtab_sec) == 1, "Expected exactly one SYMTAB section!" - symtab_sec = symtab_sec[0][1] # Take the symtab command entry - - # The string table is located at the end of the SYMTAB section, which in turn is the last section in the __LINKEDIT - # segment. Therefore, the end of SYMTAB section should be aligned with the end of __LINKEDIT segment, and in turn - # both should be aligned with the end of the file (as we are in the last or the only arch slice). - # - # However, when removing the signature from the executable using codesign under macOS 10.13, the codesign utility - # may produce an invalid file, with the declared length of the __LINKEDIT segment (linkedit_seg.filesize) pointing - # beyond the end of file, as reported in issue #6167. - # - # We can compensate for that by not using the declared sizes anywhere, and simply recompute them. In the final - # binary, the __LINKEDIT segment and the SYMTAB section MUST end at the end of the file (otherwise, we have bigger - # issues...). So simply recompute the declared sizes as difference between the final file length and the - # corresponding start offset (NOTE: the offset is relative to start of the slice, which is stored in header.offset. - # In thin binaries, header.offset is zero and start offset is relative to the start of file, but with fat binaries, - # header.offset is non-zero) - symtab_sec.strsize = file_size - (header.offset + symtab_sec.stroff) - linkedit_seg.filesize = file_size - (header.offset + linkedit_seg.fileoff) - - # Compute new vmsize by rounding filesize up to full page size. - page_size = (0x4000 if _get_arch_string(header.header).startswith('arm64') else 0x1000) - linkedit_seg.vmsize = math.ceil(linkedit_seg.filesize / page_size) * page_size - - # NOTE: according to spec, segments need to be aligned to page boundaries: 0x4000 (16 kB) for arm64, 0x1000 (4 kB) - # for other arches. But it seems we can get away without rounding and padding the segment file size - perhaps - # because it is the last one? - - # Write changes - with open(filename, 'rb+') as fp: - executable.write(fp) - - # In fat binaries, we also need to adjust the fat header. macholib as of version 1.14 does not support this, so we - # need to do it ourselves... - if executable.fat: - from macholib.mach_o import (FAT_MAGIC, FAT_MAGIC_64, fat_arch, fat_arch64, fat_header) - with open(filename, 'rb+') as fp: - # Taken from MachO.load_fat() implementation. The fat header's signature has already been validated when we - # loaded the file for the first time. - fat = fat_header.from_fileobj(fp) - if fat.magic == FAT_MAGIC: - archs = [fat_arch.from_fileobj(fp) for i in range(fat.nfat_arch)] - elif fat.magic == FAT_MAGIC_64: - archs = [fat_arch64.from_fileobj(fp) for i in range(fat.nfat_arch)] - # Adjust the size in the fat header for the last slice. - arch = archs[-1] - arch.size = file_size - arch.offset - # Now write the fat headers back to the file. - fp.seek(0) - fat.to_fileobj(fp) - for arch in archs: - arch.to_fileobj(fp) - - -def _get_arch_string(header): - """ - Converts cputype and cpusubtype from mach_o.mach_header_64 into arch string comparible with lipo/codesign. - The list of supported architectures can be found in man(1) arch. - """ - # NOTE: the constants below are taken from macholib.mach_o - cputype = header.cputype - cpusubtype = header.cpusubtype & 0x0FFFFFFF - if cputype == 0x01000000 | 7: - if cpusubtype == 8: - return 'x86_64h' # 64-bit intel (haswell) - else: - return 'x86_64' # 64-bit intel - elif cputype == 0x01000000 | 12: - if cpusubtype == 2: - return 'arm64e' - else: - return 'arm64' - elif cputype == 7: - return 'i386' # 32-bit intel - assert False, 'Unhandled architecture!' - - -def update_exe_identifier(filename, pkg_filename): - """ - Modifies the Mach-O image UUID stored in the LC_UUID command (if present) in order to ensure that different - frozen applications have different identifiers. See TN3178 for details on why this is required: - https://developer.apple.com/documentation/technotes/tn3178-checking-for-and-resolving-build-uuid-problems - """ - - # Compute hash of the PKG - import hashlib - pkg_hash = hashlib.sha1() - with open(pkg_filename, 'rb') as fp: - for chunk in iter(lambda: fp.read(8192), b""): - pkg_hash.update(chunk) - - # Modify UUID in all arch slices of the executable. - executable = MachO(filename) - for header in executable.headers: - # Find LC_UUID command - uuid_cmd = [cmd for cmd in header.commands if cmd[0].cmd == LC_UUID] - if not uuid_cmd: - continue - uuid_cmd = uuid_cmd[0] - - # Read the existing UUID (which is based on bootloader executable itself). - original_uuid = uuid_cmd[1].uuid - - # Add original UUID to the hash; this is similar to what UUID v3/v5 do with namespace + name, except - # that in our case, the prefix UUID (namespace) is added at the end, so that PKG hash needs to be - # (pre)computed only once. - combined_hash = pkg_hash.copy() - combined_hash.update(original_uuid) - - new_uuid = combined_hash.digest()[:16] # Same as uuid.uuid3() / uuid.uuid5(). - assert len(new_uuid) == 16 - - uuid_cmd[1].uuid = new_uuid - - # Write changes - with open(filename, 'rb+') as fp: - executable.write(fp) - - -class InvalidBinaryError(Exception): - """ - Exception raised by `get_binary_architectures` when it is passed an invalid binary. - """ - pass - - -class IncompatibleBinaryArchError(Exception): - """ - Exception raised by `binary_to_target_arch` when the passed binary fails the strict architecture check. - """ - def __init__(self, message): - url = "https://pyinstaller.org/en/stable/feature-notes.html#macos-multi-arch-support" - super().__init__(f"{message} For details about this error message, see: {url}") - - -def get_binary_architectures(filename): - """ - Inspects the given binary and returns tuple (is_fat, archs), where is_fat is boolean indicating fat/thin binary, - and arch is list of architectures with lipo/codesign compatible names. - """ - try: - executable = MachO(filename) - except ValueError as e: - raise InvalidBinaryError("Invalid Mach-O binary!") from e - return bool(executable.fat), [_get_arch_string(hdr.header) for hdr in executable.headers] - - -def convert_binary_to_thin_arch(filename, thin_arch, output_filename=None): - """ - Convert the given fat binary into thin one with the specified target architecture. - """ - output_filename = output_filename or filename - cmd_args = ['lipo', '-thin', thin_arch, filename, '-output', output_filename] - p = subprocess.run(cmd_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding='utf-8') - if p.returncode: - raise SystemError(f"lipo command ({cmd_args}) failed with error code {p.returncode}!\noutput: {p.stdout}") - - -def merge_into_fat_binary(output_filename, *slice_filenames): - """ - Merge the given single-arch thin binary files into a fat binary. - """ - cmd_args = ['lipo', '-create', '-output', output_filename, *slice_filenames] - p = subprocess.run(cmd_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding='utf-8') - if p.returncode: - raise SystemError(f"lipo command ({cmd_args}) failed with error code {p.returncode}!\noutput: {p.stdout}") - - -def binary_to_target_arch(filename, target_arch, display_name=None): - """ - Check that the given binary contains required architecture slice(s) and convert the fat binary into thin one, - if necessary. - """ - if not display_name: - display_name = filename # Same as input file - # Check the binary - is_fat, archs = get_binary_architectures(filename) - if target_arch == 'universal2': - if not is_fat: - raise IncompatibleBinaryArchError(f"{display_name} is not a fat binary!") - # Assume fat binary is universal2; nothing to do - else: - if is_fat: - if target_arch not in archs: - raise IncompatibleBinaryArchError(f"{display_name} does not contain slice for {target_arch}!") - # Convert to thin arch - logger.debug("Converting fat binary %s (%s) to thin binary (%s)", filename, display_name, target_arch) - convert_binary_to_thin_arch(filename, target_arch) - else: - if target_arch not in archs: - raise IncompatibleBinaryArchError( - f"{display_name} is incompatible with target arch {target_arch} (has arch: {archs[0]})!" - ) - # Binary has correct arch; nothing to do - - -def remove_signature_from_binary(filename): - """ - Remove the signature from all architecture slices of the given binary file using the codesign utility. - """ - logger.debug("Removing signature from file %r", filename) - cmd_args = ['/usr/bin/codesign', '--remove', '--all-architectures', filename] - p = subprocess.run(cmd_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding='utf-8') - if p.returncode: - raise SystemError(f"codesign command ({cmd_args}) failed with error code {p.returncode}!\noutput: {p.stdout}") - - -def sign_binary(filename, identity=None, entitlements_file=None, deep=False): - """ - Sign the binary using codesign utility. If no identity is provided, ad-hoc signing is performed. - """ - extra_args = [] - if not identity: - identity = '-' # ad-hoc signing - else: - extra_args.append('--options=runtime') # hardened runtime - if entitlements_file: - extra_args.append('--entitlements') - extra_args.append(entitlements_file) - if deep: - extra_args.append('--deep') - - logger.debug("Signing file %r", filename) - cmd_args = [ - '/usr/bin/codesign', '-s', identity, '--force', '--all-architectures', '--timestamp', *extra_args, filename - ] - p = subprocess.run(cmd_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding='utf-8') - if p.returncode: - raise SystemError(f"codesign command ({cmd_args}) failed with error code {p.returncode}!\noutput: {p.stdout}") - - -def set_dylib_dependency_paths(filename, target_rpath): - """ - Modify the given dylib's identity (in LC_ID_DYLIB command) and the paths to dependent dylibs (in LC_LOAD_DYLIB) - commands into `@rpath/` format, remove any existing rpaths (LC_RPATH commands), and add a new rpath - (LC_RPATH command) with the specified path. - - Uses `install-tool-name` utility to make the changes. - - The system libraries (e.g., the ones found in /usr/lib) are exempted from path rewrite. - - For multi-arch fat binaries, this function extracts each slice into temporary file, processes it separately, - and then merges all processed slices back into fat binary. This is necessary because `install-tool-name` cannot - modify rpaths in cases when an existing rpath is present only in one slice. - """ - - # Check if we are dealing with a fat binary; the `install-name-tool` seems to be unable to remove an rpath that is - # present only in one slice, so we need to extract each slice, process it separately, and then stich processed - # slices back into a fat binary. - is_fat, archs = get_binary_architectures(filename) - - if is_fat: - with tempfile.TemporaryDirectory() as tmpdir: - slice_filenames = [] - for arch in archs: - slice_filename = os.path.join(tmpdir, arch) - convert_binary_to_thin_arch(filename, arch, output_filename=slice_filename) - _set_dylib_dependency_paths(slice_filename, target_rpath) - slice_filenames.append(slice_filename) - merge_into_fat_binary(filename, *slice_filenames) - else: - # Thin binary - we can process it directly - _set_dylib_dependency_paths(filename, target_rpath) - - -def _set_dylib_dependency_paths(filename, target_rpath): - """ - The actual implementation of set_dylib_dependency_paths functionality. - - Implicitly assumes that a single-arch thin binary is given. - """ - - # Relocatable commands that we should overwrite - same list as used by `macholib`. - _RELOCATABLE = { - LC_LOAD_DYLIB, - LC_LOAD_UPWARD_DYLIB, - LC_LOAD_WEAK_DYLIB, - LC_PREBOUND_DYLIB, - LC_REEXPORT_DYLIB, - } - - # Parse dylib's header to extract the following commands: - # - LC_LOAD_DYLIB (or any member of _RELOCATABLE list): dylib load commands (dependent libraries) - # - LC_RPATH: rpath definitions - # - LC_ID_DYLIB: dylib's identity - binary = MachO(filename) - - dylib_id = None - rpaths = set() - linked_libs = set() - - for header in binary.headers: - for cmd in header.commands: - lc_type = cmd[0].cmd - if lc_type not in _RELOCATABLE and lc_type not in {LC_RPATH, LC_ID_DYLIB}: - continue - - # Decode path, strip trailing NULL characters - path = cmd[2].decode('utf-8').rstrip('\x00') - - if lc_type in _RELOCATABLE: - linked_libs.add(path) - elif lc_type == LC_RPATH: - rpaths.add(path) - elif lc_type == LC_ID_DYLIB: - dylib_id = path - - del binary - - # If dylib has identifier set, compute the normalized version, in form of `@rpath/basename`. - normalized_dylib_id = None - if dylib_id: - normalized_dylib_id = str(pathlib.PurePath('@rpath') / pathlib.PurePath(dylib_id).name) - - # Find dependent libraries that should have their prefix path changed to `@rpath`. If any dependent libraries - # end up using `@rpath` (originally or due to rewrite), set the `rpath_required` boolean to True, so we know - # that we need to add our rpath. - changed_lib_paths = [] - rpath_required = False - for linked_lib in linked_libs: - # Leave system dynamic libraries unchanged. - if macholib.util.in_system_path(linked_lib): - continue - - # The older python.org builds that use system Tcl/Tk framework have their _tkinter.cpython-*-darwin.so - # library linked against /Library/Frameworks/Tcl.framework/Versions/8.5/Tcl and - # /Library/Frameworks/Tk.framework/Versions/8.5/Tk, although the actual frameworks are located in - # /System/Library/Frameworks. Therefore, they slip through the above in_system_path() check, and we need to - # exempt them manually. - _exemptions = [ - '/Library/Frameworks/Tcl.framework/', - '/Library/Frameworks/Tk.framework/', - ] - if any([x in linked_lib for x in _exemptions]): - continue - - # This linked library will end up using `@rpath`, whether modified or not... - rpath_required = True - - new_path = str(pathlib.PurePath('@rpath') / pathlib.PurePath(linked_lib).name) - if linked_lib == new_path: - continue - - changed_lib_paths.append((linked_lib, new_path)) - - # Gather arguments for `install-name-tool` - install_name_tool_args = [] - - # Modify the dylib identifier if necessary - if normalized_dylib_id and normalized_dylib_id != dylib_id: - install_name_tool_args += ["-id", normalized_dylib_id] - - # Changed libs - for original_path, new_path in changed_lib_paths: - install_name_tool_args += ["-change", original_path, new_path] - - # Remove all existing rpaths except for the target rpath (if it already exists). `install_name_tool` disallows using - # `-delete_rpath` and `-add_rpath` with the same argument. - for rpath in rpaths: - if rpath == target_rpath: - continue - install_name_tool_args += [ - "-delete_rpath", - rpath, - ] - - # If any of linked libraries use @rpath now and our target rpath is not already added, add it. - # NOTE: @rpath in the dylib identifier does not actually require the rpath to be set on the binary... - if rpath_required and target_rpath not in rpaths: - install_name_tool_args += [ - "-add_rpath", - target_rpath, - ] - - # If we have no arguments, finish immediately. - if not install_name_tool_args: - return - - # Run `install_name_tool` - cmd_args = ["install_name_tool", *install_name_tool_args, filename] - p = subprocess.run(cmd_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding='utf-8') - if p.returncode: - raise SystemError( - f"install_name_tool command ({cmd_args}) failed with error code {p.returncode}!\noutput: {p.stdout}" - ) - - -def is_framework_bundle_lib(lib_path): - """ - Check if the given shared library is part of a .framework bundle. - """ - - lib_path = pathlib.PurePath(lib_path) - - # For now, focus only on versioned layout, such as `QtCore.framework/Versions/5/QtCore` - if lib_path.parent.parent.name != "Versions": - return False - if lib_path.parent.parent.parent.name != lib_path.name + ".framework": - return False - - return True - - -def collect_files_from_framework_bundles(collected_files): - """ - Scan the given TOC list of collected files for shared libraries that are collected from macOS .framework bundles, - and collect the bundles' Info.plist files. Additionally, create/restore the following symbolic links: - - `Versions/Current` pointing to the `Versions/` directory containing the binary - - `` in the top-level .framework directory, pointing to `Versions/Current/` - - `Resources` in the top-level .framework directory, pointing to `Versions/Current/Resources` - - additional directories in top-level .framework directory, pointing to their counterparts in `Versions/Current` - directory. - - Returns updated TOC list with added entries for the discovered Info.plist files and generated symbolic links. - """ - invalid_framework_found = False - - framework_entries = set() # Additional TOC entries for collected files. Use set for de-duplication. - framework_paths = set() # Registered framework paths for 2nd pass. - framework_symlinked_dirs = set() # Symlinked directories for filtering in 3rd pass. - - # 1st pass: discover binaries from .framework bundles, and for each such binary: - # - collect `Info.plist` - # - create `Current` -> `` symlink in `.framework/Versions` directory. - # - create `.framework/` -> `.framework/Versions/Current/` symlink. - # - create `.framework/Resources` -> `.framework/Versions/Current/Resources` symlink. - for dest_name, src_name, typecode in collected_files: - if typecode != 'BINARY': - continue - - src_path = pathlib.Path(src_name) # /src/path/to/.framework/Versions// - dest_path = pathlib.PurePath(dest_name) # /dest/path/to/.framework/Versions// - - # Check whether binary originates from a .framework bundle - if not is_framework_bundle_lib(src_path): - continue - - # Check whether binary is also collected into a .framework bundle (i.e., the original layout is preserved) - if not is_framework_bundle_lib(dest_path): - continue - - # Assuming versioned layout, Info.plist should exist in Resources directory located next to the binary. - info_plist_src = src_path.parent / "Resources" / "Info.plist" - if not info_plist_src.is_file(): - # Alas, the .framework bundles shipped with PySide/PyQt might have Info.plist available only in the - # top-level Resources directory. So accommodate this scenario as well, but collect the file into - # versioned directory to appease the code-signing gods... - info_plist_src_top = src_path.parent.parent.parent / "Resources" / "Info.plist" - if not info_plist_src_top.is_file(): - # Strictly speaking, a .framework bundle without Info.plist is invalid. However, that did not prevent - # PyQt from shipping such Qt .framework bundles up until v5.14.1. So by default, we just complain via - # a warning message; if such binaries work in unfrozen python, they should also work in frozen - # application. The codesign will refuse to sign the .app bundle (if we are generating one), but there - # is nothing we can do about that. - invalid_framework_found = True - framework_dir = src_path.parent.parent.parent - if compat.strict_collect_mode: - raise SystemError(f"Could not find Info.plist in {framework_dir}!") - else: - logger.warning("Could not find Info.plist in %s!", framework_dir) - continue - info_plist_src = info_plist_src_top - info_plist_dest = dest_path.parent / "Resources" / "Info.plist" - framework_entries.add((str(info_plist_dest), str(info_plist_src), "DATA")) - - # Reconstruct the symlink Versions/Current -> Versions/. - # This one seems to be necessary for code signing, but might be absent from .framework bundles shipped with - # python packages (i.e., PyPI wheels that do not support symlinks). So we always create it ourselves. - framework_entries.add((str(dest_path.parent.parent / "Current"), str(dest_path.parent.name), "SYMLINK")) - framework_symlinked_dirs.add(dest_path.parent.parent / "Current") # Cleanup in 3rd pass - - dest_framework_path = dest_path.parent.parent.parent # Top-level .framework directory path. - - # Symlink the binary in the `Current` directory to the top-level .framework directory. - # If TOC also contains an entry for a hard-copy entry in the top-level directory, it will be replaced by this - # symlink entry due to how our TOC normalization works. - framework_entries.add(( - str(dest_framework_path / dest_path.name), - str(pathlib.PurePath("Versions/Current") / dest_path.name), - "SYMLINK", - )) - - # Ditto for the `Resources` directory. - framework_entries.add(( - str(dest_framework_path / "Resources"), - "Versions/Current/Resources", - "SYMLINK", - )) - framework_symlinked_dirs.add(dest_framework_path / "Resources") # Cleanup in 3rd pass - - # Register the framework parent path to use in additional directories scan in subsequent pass. - framework_paths.add(dest_framework_path) - - # 2nd pass: scan for additional collected directories from .framework bundles, and create symlinks to the top-level - # application directory. Make the outer loop go over the registered framework paths, so it becomes no-op if no - # framework paths are registered. - VALID_SUBDIRS = {'Documentation', 'Frameworks', 'Headers', 'Helpers', 'Libraries', 'Resources'} - - for dest_framework_path in framework_paths: - for dest_name, src_name, typecode in collected_files: - dest_path = pathlib.PurePath(dest_name) - - # Try matching against framework path - try: - remaining_path = dest_path.relative_to(dest_framework_path) - except ValueError: # dest_path is not subpath of dest_framework_path - continue - - remaining_path_parts = remaining_path.parts - - # We are interested only in entries under Versions directory. - if remaining_path_parts[0] != 'Versions': - continue - - # If the entry name is among valid sub-directory names, create symlink. - dir_name = remaining_path_parts[2] - if dir_name not in VALID_SUBDIRS: - continue - - framework_entries.add(( - str(dest_framework_path / dir_name), - str(pathlib.PurePath("Versions/Current") / dir_name), - "SYMLINK", - )) - framework_symlinked_dirs.add(dest_framework_path / dir_name) # Cleanup in 3rd pass - - # 3rd pass: remove TOC entries under directories for which we are trying to restore symbolic links. These may be - # present when a python package (i.e., a PyPI wheel) ships a .framework bundle where symlinks were mangled into hard - # copies (due to lack of support for symlinks in wheels) AND these hard copies are collected through use of - # `collect_data` / `collect_binaries` / `collect_all` (either by user or by a hook). - if framework_symlinked_dirs: - filtered_toc = [] - - for dest_name, src_name, typecode in collected_files: - dest_path = pathlib.PurePath(dest_name) - - if any(dest_parent in framework_symlinked_dirs for dest_parent in dest_path.parents): - continue # Inside symlinked directory; remove - - filtered_toc.append((dest_name, src_name, typecode)) - else: - filtered_toc = collected_files - - # If we encountered an invalid .framework bundle without Info.plist, warn the user that code-signing will most - # likely fail. - if invalid_framework_found: - logger.warning( - "One or more collected .framework bundles have missing Info.plist file. If you are building an .app " - "bundle, you will most likely not be able to code-sign it." - ) - - return filtered_toc + sorted(framework_entries) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/run_tests.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/run_tests.py deleted file mode 100755 index c655c7a..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/run_tests.py +++ /dev/null @@ -1,70 +0,0 @@ -# ----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -# ----------------------------------------------------------------------------- - -import argparse -import sys - -import pytest - -from PyInstaller.compat import importlib_metadata - - -def paths_to_test(include_only=None): - """ - If ``include_only`` is falsey, this functions returns paths from all entry points. Otherwise, this parameter - must be a string or sequence of strings. In this case, this function will return *only* paths from entry points - whose ``module_name`` begins with the provided string(s). - """ - # Convert a string to a list. - if isinstance(include_only, str): - include_only = [include_only] - - # Walk through all entry points. - test_path_list = [] - for entry_point in importlib_metadata.entry_points(group="pyinstaller40", name="tests"): - # Implement ``include_only``. - if ( - not include_only # If falsey, include everything, - # Otherwise, include only the specified modules. - or any(entry_point.module.startswith(name) for name in include_only) - ): - test_path_list += list(entry_point.load()()) - return test_path_list - - -# Run pytest on all tests registered by the PyInstaller setuptools testing entry point. If provided, -# the ``include_only`` argument is passed to ``path_to_test``. -def run_pytest(*args, **kwargs): - paths = paths_to_test(include_only=kwargs.pop("include_only", None)) - # Return an error code if no tests were discovered. - if not paths: - print("Error: no tests discovered.", file=sys.stderr) - # This indicates no tests were discovered; see - # https://docs.pytest.org/en/latest/usage.html#possible-exit-codes. - return 5 - else: - # See https://docs.pytest.org/en/latest/usage.html#calling-pytest-from-python-code. - # Omit ``args[0]``, which is the name of this script. - print("pytest " + " ".join([*paths, *args[1:]])) - return pytest.main([*paths, *args[1:]], **kwargs) - - -if __name__ == "__main__": - # Look only for the ``--include_only`` argument. - parser = argparse.ArgumentParser(description='Run PyInstaller packaging tests.') - parser.add_argument( - "--include_only", - action="append", - help="Only run tests from the specified package.", - ) - args, unknown = parser.parse_known_args(sys.argv) - # Convert the parsed args into a dict using ``vars(args)``. - sys.exit(run_pytest(*unknown, **vars(args))) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/tests.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/tests.py deleted file mode 100755 index 4a0b9c7..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/tests.py +++ /dev/null @@ -1,112 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Decorators for skipping PyInstaller tests when specific requirements are not met. -""" - -import inspect -import sys -import textwrap - -import pytest - -from PyInstaller.utils.hooks import check_requirement - -# Wrap some pytest decorators to be consistent in tests. -parametrize = pytest.mark.parametrize -skipif = pytest.mark.skipif -xfail = pytest.mark.xfail -skip = pytest.mark.skip - -# Use these decorators to use the `pyi_builder` fixture only in onedir or only in onefile mode instead of both. -onedir_only = pytest.mark.parametrize('pyi_builder', ['onedir'], indirect=True) -onefile_only = pytest.mark.parametrize('pyi_builder', ['onefile'], indirect=True) - - -def importorskip(package: str): - """ - Skip a decorated test if **package** is not importable. - - Arguments: - package: - The name of the module. May be anything that is allowed after the ``import`` keyword. e.g. 'numpy' or - 'PIL.Image'. - Returns: - A pytest marker which either skips the test or does nothing. - - This function intentionally does not import the module. Doing so can lead to `sys.path` and `PATH` being - polluted, which then breaks later builds. - """ - if not importable(package): - return pytest.mark.skip(f"Can't import '{package}'.") - return pytest.mark.skipif(False, reason=f"Don't skip: '{package}' is importable.") - - -def importable(package: str): - from importlib.util import find_spec - - # The find_spec() function is used by the importlib machinery to locate a module to import. Using it finds the - # module but does not run it. Unfortunately, it does import parent modules to check submodules. - if "." in package: - # Using subprocesses is slow. If the top level module doesn't exist then we can skip it. - if not importable(package.split(".")[0]): - return False - # This is a submodule, import it in isolation. - from subprocess import DEVNULL, run - return run([sys.executable, "-c", "import " + package], stdout=DEVNULL, stderr=DEVNULL).returncode == 0 - - return find_spec(package) is not None - - -def requires(requirement: str): - """ - Mark a test to be skipped if **requirement** is not satisfied. - - Args: - requirement: - A distribution name and optional version specifier(s). See :func:`PyInstaller.utils.hooks.check_requirement` - which this argument is forwarded to. - Returns: - Either a skip marker or a dummy marker. - - This function operates on distribution metadata, and does not import any modules. - """ - if check_requirement(requirement): - return pytest.mark.skipif(False, reason=f"Don't skip: '{requirement}' is satisfied.") - else: - return pytest.mark.skip(f"Requires {requirement}.") - - -def gen_sourcefile(tmp_path, source, test_id=None): - """ - Generate a source file for testing. - - The source will be written into a file named like the test-function. This file will then be passed to - `test_script`. If you need other related file, e.g. as `.toc`-file for testing the content, put it at at the - normal place. Just mind to take the basnename from the test-function's name. - - :param script: Source code to create executable from. This will be saved into a temporary file which is then - passed on to `test_script`. - - :param test_id: Test-id for parametrized tests. If given, it will be appended to the script filename, - separated by two underscores. - """ - testname = inspect.stack()[1][3] - if test_id: - # For parametrized test append the test-id. - testname = testname + '__' + test_id - - # Periods are not allowed in Python module names. - testname = testname.replace('.', '_') - scriptfile = tmp_path / (testname + '.py') - source = textwrap.dedent(source) - scriptfile.write_text(source, encoding='utf-8') - return scriptfile diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/__init__.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/__init__.py deleted file mode 100755 index a7501ae..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__author__ = 'martin' diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index d3facc7..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/__pycache__/icon.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/__pycache__/icon.cpython-312.pyc deleted file mode 100644 index 8c11f42..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/__pycache__/icon.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/__pycache__/versioninfo.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/__pycache__/versioninfo.cpython-312.pyc deleted file mode 100644 index e2b9ef4..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/__pycache__/versioninfo.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/__pycache__/winmanifest.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/__pycache__/winmanifest.cpython-312.pyc deleted file mode 100644 index 0f21093..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/__pycache__/winmanifest.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/__pycache__/winresource.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/__pycache__/winresource.cpython-312.pyc deleted file mode 100644 index 236571f..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/__pycache__/winresource.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/__pycache__/winutils.cpython-312.pyc b/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/__pycache__/winutils.cpython-312.pyc deleted file mode 100644 index 8b042c4..0000000 Binary files a/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/__pycache__/winutils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/icon.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/icon.py deleted file mode 100755 index 7b703f8..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/icon.py +++ /dev/null @@ -1,251 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -The code in this module supports the --icon parameter on Windows. -(For --icon support under macOS, see building/osx.py.) - -The only entry point, called from api.py, is CopyIcons(), below. All the elaborate structure of classes that follows -is used to support the operation of CopyIcons_FromIco(). None of these classes and globals are referenced outside -this module. -""" - -import os -import os.path -import struct - -import PyInstaller.log as logging -from PyInstaller import config -from PyInstaller.compat import pywintypes, win32api -from PyInstaller.building.icon import normalize_icon_type - -logger = logging.getLogger(__name__) - -RT_ICON = 3 -RT_GROUP_ICON = 14 -LOAD_LIBRARY_AS_DATAFILE = 2 - - -class Structure: - def __init__(self): - size = self._sizeInBytes = struct.calcsize(self._format_) - self._fields_ = list(struct.unpack(self._format_, b'\000' * size)) - indexes = self._indexes_ = {} - for i, nm in enumerate(self._names_): - indexes[nm] = i - - def dump(self): - logger.info("DUMP of %s", self) - for name in self._names_: - if not name.startswith('_'): - logger.info("%20s = %s", name, getattr(self, name)) - logger.info("") - - def __getattr__(self, name): - if name in self._names_: - index = self._indexes_[name] - return self._fields_[index] - try: - return self.__dict__[name] - except KeyError as e: - raise AttributeError(name) from e - - def __setattr__(self, name, value): - if name in self._names_: - index = self._indexes_[name] - self._fields_[index] = value - else: - self.__dict__[name] = value - - def tostring(self): - return struct.pack(self._format_, *self._fields_) - - def fromfile(self, file): - data = file.read(self._sizeInBytes) - self._fields_ = list(struct.unpack(self._format_, data)) - - -class ICONDIRHEADER(Structure): - _names_ = "idReserved", "idType", "idCount" - _format_ = "hhh" - - -class ICONDIRENTRY(Structure): - _names_ = ("bWidth", "bHeight", "bColorCount", "bReserved", "wPlanes", "wBitCount", "dwBytesInRes", "dwImageOffset") - _format_ = "bbbbhhii" - - -class GRPICONDIR(Structure): - _names_ = "idReserved", "idType", "idCount" - _format_ = "hhh" - - -class GRPICONDIRENTRY(Structure): - _names_ = ("bWidth", "bHeight", "bColorCount", "bReserved", "wPlanes", "wBitCount", "dwBytesInRes", "nID") - _format_ = "bbbbhhih" - - -# An IconFile instance is created for each .ico file given. -class IconFile: - def __init__(self, path): - self.path = path - try: - # The path is from the user parameter, don't trust it. - file = open(self.path, "rb") - except OSError: - # The icon file can't be opened for some reason. Stop the - # program with an informative message. - raise SystemExit(f'ERROR: Unable to open icon file {self.path}!') - with file: - self.entries = [] - self.images = [] - header = self.header = ICONDIRHEADER() - header.fromfile(file) - for i in range(header.idCount): - entry = ICONDIRENTRY() - entry.fromfile(file) - self.entries.append(entry) - for e in self.entries: - file.seek(e.dwImageOffset, 0) - self.images.append(file.read(e.dwBytesInRes)) - - def grp_icon_dir(self): - return self.header.tostring() - - def grp_icondir_entries(self, id=1): - data = b'' - for entry in self.entries: - e = GRPICONDIRENTRY() - for n in e._names_[:-1]: - setattr(e, n, getattr(entry, n)) - e.nID = id - id = id + 1 - data = data + e.tostring() - return data - - -def CopyIcons_FromIco(dstpath, srcpath, id=1): - """ - Use the Win API UpdateResource facility to apply the icon resource(s) to the .exe file. - - :param str dstpath: absolute path of the .exe file being built. - :param str srcpath: list of 1 or more .ico file paths - """ - icons = map(IconFile, srcpath) - logger.debug("Copying icons from %s", srcpath) - - hdst = win32api.BeginUpdateResource(dstpath, 0) - - iconid = 1 - # Each step in the following enumerate() will instantiate an IconFile object, as a result of deferred execution - # of the map() above. - for i, f in enumerate(icons): - data = f.grp_icon_dir() - data = data + f.grp_icondir_entries(iconid) - win32api.UpdateResource(hdst, RT_GROUP_ICON, i + 1, data) - logger.debug("Writing RT_GROUP_ICON %d resource with %d bytes", i + 1, len(data)) - for data in f.images: - win32api.UpdateResource(hdst, RT_ICON, iconid, data) - logger.debug("Writing RT_ICON %d resource with %d bytes", iconid, len(data)) - iconid = iconid + 1 - - win32api.EndUpdateResource(hdst, 0) - - -def CopyIcons(dstpath, srcpath): - """ - Called from building/api.py to handle icons. If the input was by --icon on the command line, srcpath is a single - string. However, it is possible to modify the spec file adding icon=['foo.ico','bar.ico'] to the EXE() statement. - In that case, srcpath is a list of strings. - - The string format is either path-to-.ico or path-to-.exe,n for n an integer resource index in the .exe. In either - case, the path can be relative or absolute. - """ - - if isinstance(srcpath, (str, os.PathLike)): - # Just a single string, make it a one-element list. - srcpath = [srcpath] - # Convert possible PathLike elements to strings to allow the splitter function to work. - srcpath = [str(path) for path in srcpath] - - def splitter(s): - """ - Convert "pathname" to tuple ("pathname", None) - Convert "pathname,n" to tuple ("pathname", n) - """ - try: - srcpath, index = s.split(',') - return srcpath.strip(), int(index) - except ValueError: - return s, None - - # split all the items in the list into tuples as above. - srcpath = list(map(splitter, srcpath)) - - if len(srcpath) > 1: - # More than one icon source given. We currently handle multiple icons by calling CopyIcons_FromIco(), which only - # allows .ico, but will convert to that format if needed. - # - # Note that a ",index" on a .ico is just ignored in the single or multiple case. - srcs = [] - for s in srcpath: - srcs.append(normalize_icon_type(s[0], ("ico",), "ico", config.CONF["workpath"])) - return CopyIcons_FromIco(dstpath, srcs) - - # Just one source given. - srcpath, index = srcpath[0] - - # Makes sure the icon exists and attempts to convert to the proper format if applicable - srcpath = normalize_icon_type(srcpath, ("exe", "ico"), "ico", config.CONF["workpath"]) - - srcext = os.path.splitext(srcpath)[1] - - # Handle the simple case of foo.ico, ignoring any index. - if srcext.lower() == '.ico': - return CopyIcons_FromIco(dstpath, [srcpath]) - - # Single source is not .ico, presumably it is .exe (and if not, some error will occur). - if index is not None: - logger.debug("Copying icon from %s, %d", srcpath, index) - else: - logger.debug("Copying icons from %s", srcpath) - - try: - # Attempt to load the .ico or .exe containing the icon into memory using the same mechanism as if it were a DLL. - # If this fails for any reason (for example if the file does not exist or is not a .ico/.exe) then LoadLibraryEx - # returns a null handle and win32api raises a unique exception with a win error code and a string. - hsrc = win32api.LoadLibraryEx(srcpath, 0, LOAD_LIBRARY_AS_DATAFILE) - except pywintypes.error as W32E: - # We could continue with no icon (i.e., just return), but it seems best to terminate the build with a message. - raise SystemExit( - "ERROR: Unable to load icon file {}\n {} (Error code {})".format(srcpath, W32E.strerror, W32E.winerror) - ) - hdst = win32api.BeginUpdateResource(dstpath, 0) - if index is None: - grpname = win32api.EnumResourceNames(hsrc, RT_GROUP_ICON)[0] - elif index >= 0: - grpname = win32api.EnumResourceNames(hsrc, RT_GROUP_ICON)[index] - else: - grpname = -index - data = win32api.LoadResource(hsrc, RT_GROUP_ICON, grpname) - win32api.UpdateResource(hdst, RT_GROUP_ICON, grpname, data) - for iconname in win32api.EnumResourceNames(hsrc, RT_ICON): - data = win32api.LoadResource(hsrc, RT_ICON, iconname) - win32api.UpdateResource(hdst, RT_ICON, iconname, data) - win32api.FreeLibrary(hsrc) - win32api.EndUpdateResource(hdst, 0) - - -if __name__ == "__main__": - import sys - - dstpath = sys.argv[1] - srcpath = sys.argv[2:] - CopyIcons(dstpath, srcpath) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/versioninfo.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/versioninfo.py deleted file mode 100755 index b290644..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/versioninfo.py +++ /dev/null @@ -1,604 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -import struct - -import pefile - -from PyInstaller.compat import win32api - - -def pefile_check_control_flow_guard(filename): - """ - Checks if the specified PE file has CFG (Control Flow Guard) enabled. - - Parameters - ---------- - filename : str - Path to the PE file to inspect. - - Returns - ---------- - bool - True if file is a PE file with CFG enabled. False if CFG is not enabled or if file could not be processed using - the pefile library. - """ - try: - pe = pefile.PE(filename, fast_load=True) - # https://docs.microsoft.com/en-us/windows/win32/debug/pe-format - # IMAGE_DLLCHARACTERISTICS_GUARD_CF = 0x4000 - return bool(pe.OPTIONAL_HEADER.DllCharacteristics & 0x4000) - except Exception: - return False - - -# Ensures no code from the executable is executed. -LOAD_LIBRARY_AS_DATAFILE = 2 - - -def getRaw(text): - """ - Encodes text as UTF-16LE (Microsoft 'Unicode') for use in structs. - """ - return text.encode('UTF-16LE') - - -def read_version_info_from_executable(exe_filename): - """ - Read the version information structure from the given executable's resources, and return it as an instance of - `VSVersionInfo` structure. - """ - h = win32api.LoadLibraryEx(exe_filename, 0, LOAD_LIBRARY_AS_DATAFILE) - res = win32api.EnumResourceNames(h, pefile.RESOURCE_TYPE['RT_VERSION']) - if not len(res): - return None - data = win32api.LoadResource(h, pefile.RESOURCE_TYPE['RT_VERSION'], res[0]) - info = VSVersionInfo() - info.fromRaw(data) - win32api.FreeLibrary(h) - return info - - -def nextDWord(offset): - """ - Align `offset` to the next 4-byte boundary. - """ - return ((offset + 3) >> 2) << 2 - - -class VSVersionInfo: - """ - WORD wLength; // length of the VS_VERSION_INFO structure - WORD wValueLength; // length of the Value member - WORD wType; // 1 means text, 0 means binary - WCHAR szKey[]; // Contains the Unicode string "VS_VERSION_INFO". - WORD Padding1[]; - VS_FIXEDFILEINFO Value; - WORD Padding2[]; - WORD Children[]; // zero or more StringFileInfo or VarFileInfo - // structures (or both) that are children of the - // current version structure. - """ - def __init__(self, ffi=None, kids=None): - self.ffi = ffi - self.kids = kids or [] - - def fromRaw(self, data): - i, (sublen, vallen, wType, nm) = parseCommon(data) - #vallen is length of the ffi, typ is 0, nm is 'VS_VERSION_INFO'. - i = nextDWord(i) - # Now a VS_FIXEDFILEINFO - self.ffi = FixedFileInfo() - j = self.ffi.fromRaw(data, i) - i = j - while i < sublen: - j = i - i, (csublen, cvallen, ctyp, nm) = parseCommon(data, i) - if nm.strip() == 'StringFileInfo': - sfi = StringFileInfo() - k = sfi.fromRaw(csublen, cvallen, nm, data, i, j + csublen) - self.kids.append(sfi) - i = k - else: - vfi = VarFileInfo() - k = vfi.fromRaw(csublen, cvallen, nm, data, i, j + csublen) - self.kids.append(vfi) - i = k - i = j + csublen - i = nextDWord(i) - return i - - def toRaw(self): - raw_name = getRaw('VS_VERSION_INFO') - rawffi = self.ffi.toRaw() - vallen = len(rawffi) - typ = 0 - sublen = 6 + len(raw_name) + 2 - pad = b'' - if sublen % 4: - pad = b'\000\000' - sublen = sublen + len(pad) + vallen - pad2 = b'' - if sublen % 4: - pad2 = b'\000\000' - tmp = b''.join([kid.toRaw() for kid in self.kids]) - sublen = sublen + len(pad2) + len(tmp) - return struct.pack('HHH', sublen, vallen, typ) + raw_name + b'\000\000' + pad + rawffi + pad2 + tmp - - def __eq__(self, other): - return self.toRaw() == other - - def __str__(self, indent=''): - indent = indent + ' ' - tmp = [kid.__str__(indent + ' ') for kid in self.kids] - tmp = ', \n'.join(tmp) - return '\n'.join([ - "# UTF-8", - "#", - "# For more details about fixed file info 'ffi' see:", - "# http://msdn.microsoft.com/en-us/library/ms646997.aspx", - "VSVersionInfo(", - indent + f"ffi={self.ffi.__str__(indent)},", - indent + "kids=[", - tmp, - indent + "]", - ")", - ]) - - def __repr__(self): - return "versioninfo.VSVersionInfo(ffi=%r, kids=%r)" % (self.ffi, self.kids) - - -def parseCommon(data, start=0): - i = start + 6 - (wLength, wValueLength, wType) = struct.unpack('3H', data[start:i]) - i, text = parseUString(data, i, i + wLength) - return i, (wLength, wValueLength, wType, text) - - -def parseUString(data, start, limit): - i = start - while i < limit: - if data[i:i + 2] == b'\000\000': - break - i += 2 - text = data[start:i].decode('UTF-16LE') - i += 2 - return i, text - - -class FixedFileInfo: - """ - DWORD dwSignature; //Contains the value 0xFEEFO4BD - DWORD dwStrucVersion; // binary version number of this structure. - // The high-order word of this member contains - // the major version number, and the low-order - // word contains the minor version number. - DWORD dwFileVersionMS; // most significant 32 bits of the file's binary - // version number - DWORD dwFileVersionLS; // - DWORD dwProductVersionMS; // most significant 32 bits of the binary version - // number of the product with which this file was - // distributed - DWORD dwProductVersionLS; // - DWORD dwFileFlagsMask; // bitmask that specifies the valid bits in - // dwFileFlags. A bit is valid only if it was - // defined when the file was created. - DWORD dwFileFlags; // VS_FF_DEBUG, VS_FF_PATCHED etc. - DWORD dwFileOS; // VOS_NT, VOS_WINDOWS32 etc. - DWORD dwFileType; // VFT_APP etc. - DWORD dwFileSubtype; // 0 unless VFT_DRV or VFT_FONT or VFT_VXD - DWORD dwFileDateMS; - DWORD dwFileDateLS; - """ - def __init__( - self, - filevers=(0, 0, 0, 0), - prodvers=(0, 0, 0, 0), - mask=0x3f, - flags=0x0, - OS=0x40004, - fileType=0x1, - subtype=0x0, - date=(0, 0) - ): - self.sig = 0xfeef04bd - self.strucVersion = 0x10000 - self.fileVersionMS = (filevers[0] << 16) | (filevers[1] & 0xffff) - self.fileVersionLS = (filevers[2] << 16) | (filevers[3] & 0xffff) - self.productVersionMS = (prodvers[0] << 16) | (prodvers[1] & 0xffff) - self.productVersionLS = (prodvers[2] << 16) | (prodvers[3] & 0xffff) - self.fileFlagsMask = mask - self.fileFlags = flags - self.fileOS = OS - self.fileType = fileType - self.fileSubtype = subtype - self.fileDateMS = date[0] - self.fileDateLS = date[1] - - def fromRaw(self, data, i): - ( - self.sig, - self.strucVersion, - self.fileVersionMS, - self.fileVersionLS, - self.productVersionMS, - self.productVersionLS, - self.fileFlagsMask, - self.fileFlags, - self.fileOS, - self.fileType, - self.fileSubtype, - self.fileDateMS, - self.fileDateLS, - ) = struct.unpack('13L', data[i:i + 52]) - return i + 52 - - def toRaw(self): - return struct.pack( - '13L', - self.sig, - self.strucVersion, - self.fileVersionMS, - self.fileVersionLS, - self.productVersionMS, - self.productVersionLS, - self.fileFlagsMask, - self.fileFlags, - self.fileOS, - self.fileType, - self.fileSubtype, - self.fileDateMS, - self.fileDateLS, - ) - - def __eq__(self, other): - return self.toRaw() == other - - def __str__(self, indent=''): - fv = ( - self.fileVersionMS >> 16, self.fileVersionMS & 0xffff, - self.fileVersionLS >> 16, self.fileVersionLS & 0xffff, - ) # yapf: disable - pv = ( - self.productVersionMS >> 16, self.productVersionMS & 0xffff, - self.productVersionLS >> 16, self.productVersionLS & 0xffff, - ) # yapf: disable - fd = (self.fileDateMS, self.fileDateLS) - tmp = [ - 'FixedFileInfo(', - '# filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)', - '# Set not needed items to zero 0.', - 'filevers=%s,' % (fv,), - 'prodvers=%s,' % (pv,), - "# Contains a bitmask that specifies the valid bits 'flags'r", - 'mask=%s,' % hex(self.fileFlagsMask), - '# Contains a bitmask that specifies the Boolean attributes of the file.', - 'flags=%s,' % hex(self.fileFlags), - '# The operating system for which this file was designed.', - '# 0x4 - NT and there is no need to change it.', - 'OS=%s,' % hex(self.fileOS), - '# The general type of file.', - '# 0x1 - the file is an application.', - 'fileType=%s,' % hex(self.fileType), - '# The function of the file.', - '# 0x0 - the function is not defined for this fileType', - 'subtype=%s,' % hex(self.fileSubtype), - '# Creation date and time stamp.', - 'date=%s' % (fd,), - ')', - ] - return f'\n{indent} '.join(tmp) - - def __repr__(self): - fv = ( - self.fileVersionMS >> 16, self.fileVersionMS & 0xffff, - self.fileVersionLS >> 16, self.fileVersionLS & 0xffff, - ) # yapf: disable - pv = ( - self.productVersionMS >> 16, self.productVersionMS & 0xffff, - self.productVersionLS >> 16, self.productVersionLS & 0xffff, - ) # yapf: disable - fd = (self.fileDateMS, self.fileDateLS) - return ( - 'versioninfo.FixedFileInfo(filevers=%r, prodvers=%r, ' - 'mask=0x%x, flags=0x%x, OS=0x%x, ' - 'fileType=%r, subtype=0x%x, date=%r)' % - (fv, pv, self.fileFlagsMask, self.fileFlags, self.fileOS, self.fileType, self.fileSubtype, fd) - ) - - -class StringFileInfo: - """ - WORD wLength; // length of the version resource - WORD wValueLength; // length of the Value member in the current - // VS_VERSION_INFO structure - WORD wType; // 1 means text, 0 means binary - WCHAR szKey[]; // Contains the Unicode string 'StringFileInfo'. - WORD Padding[]; - StringTable Children[]; // list of zero or more String structures - """ - def __init__(self, kids=None): - self.name = 'StringFileInfo' - self.kids = kids or [] - - def fromRaw(self, sublen, vallen, name, data, i, limit): - self.name = name - while i < limit: - st = StringTable() - j = st.fromRaw(data, i, limit) - self.kids.append(st) - i = j - return i - - def toRaw(self): - raw_name = getRaw(self.name) - vallen = 0 - typ = 1 - sublen = 6 + len(raw_name) + 2 - pad = b'' - if sublen % 4: - pad = b'\000\000' - tmp = b''.join([kid.toRaw() for kid in self.kids]) - sublen = sublen + len(pad) + len(tmp) - return struct.pack('HHH', sublen, vallen, typ) + raw_name + b'\000\000' + pad + tmp - - def __eq__(self, other): - return self.toRaw() == other - - def __str__(self, indent=''): - new_indent = indent + ' ' - tmp = ', \n'.join(kid.__str__(new_indent) for kid in self.kids) - return f'{indent}StringFileInfo(\n{new_indent}[\n{tmp}\n{new_indent}])' - - def __repr__(self): - return 'versioninfo.StringFileInfo(%r)' % self.kids - - -class StringTable: - """ - WORD wLength; - WORD wValueLength; - WORD wType; - WCHAR szKey[]; - String Children[]; // list of zero or more String structures. - """ - def __init__(self, name=None, kids=None): - self.name = name or '' - self.kids = kids or [] - - def fromRaw(self, data, i, limit): - i, (cpsublen, cpwValueLength, cpwType, self.name) = parseCodePage(data, i, limit) # should be code page junk - i = nextDWord(i) - while i < limit: - ss = StringStruct() - j = ss.fromRaw(data, i, limit) - i = j - self.kids.append(ss) - i = nextDWord(i) - return i - - def toRaw(self): - raw_name = getRaw(self.name) - vallen = 0 - typ = 1 - sublen = 6 + len(raw_name) + 2 - tmp = [] - for kid in self.kids: - raw = kid.toRaw() - if len(raw) % 4: - raw = raw + b'\000\000' - tmp.append(raw) - tmp = b''.join(tmp) - sublen += len(tmp) - return struct.pack('HHH', sublen, vallen, typ) + raw_name + b'\000\000' + tmp - - def __eq__(self, other): - return self.toRaw() == other - - def __str__(self, indent=''): - new_indent = indent + ' ' - tmp = (',\n' + new_indent).join(str(kid) for kid in self.kids) - return f"{indent}StringTable(\n{new_indent}'{self.name}',\n{new_indent}[{tmp}])" - - def __repr__(self): - return 'versioninfo.StringTable(%r, %r)' % (self.name, self.kids) - - -class StringStruct: - """ - WORD wLength; - WORD wValueLength; - WORD wType; - WCHAR szKey[]; - WORD Padding[]; - String Value[]; - """ - def __init__(self, name=None, val=None): - self.name = name or '' - self.val = val or '' - - def fromRaw(self, data, i, limit): - i, (sublen, vallen, typ, self.name) = parseCommon(data, i) - limit = i + sublen - i = nextDWord(i) - i, self.val = parseUString(data, i, limit) - return i - - def toRaw(self): - raw_name = getRaw(self.name) - raw_val = getRaw(self.val) - # TODO: document the size of vallen and sublen. - vallen = len(self.val) + 1 # Number of (wide-)characters, not bytes! - typ = 1 - sublen = 6 + len(raw_name) + 2 - pad = b'' - if sublen % 4: - pad = b'\000\000' - sublen = sublen + len(pad) + (vallen * 2) - return struct.pack('HHH', sublen, vallen, typ) + raw_name + b'\000\000' + pad + raw_val + b'\000\000' - - def __eq__(self, other): - return self.toRaw() == other - - def __str__(self, indent=''): - return "StringStruct(%r, %r)" % (self.name, self.val) - - def __repr__(self): - return 'versioninfo.StringStruct(%r, %r)' % (self.name, self.val) - - -def parseCodePage(data, i, limit): - i, (sublen, wValueLength, wType, nm) = parseCommon(data, i) - return i, (sublen, wValueLength, wType, nm) - - -class VarFileInfo: - """ - WORD wLength; // length of the version resource - WORD wValueLength; // length of the Value member in the current - // VS_VERSION_INFO structure - WORD wType; // 1 means text, 0 means binary - WCHAR szKey[]; // Contains the Unicode string 'VarFileInfo'. - WORD Padding[]; - Var Children[]; // list of zero or more Var structures - """ - def __init__(self, kids=None): - self.kids = kids or [] - - def fromRaw(self, sublen, vallen, name, data, i, limit): - self.sublen = sublen - self.vallen = vallen - self.name = name - i = nextDWord(i) - while i < limit: - vs = VarStruct() - j = vs.fromRaw(data, i, limit) - self.kids.append(vs) - i = j - return i - - def toRaw(self): - self.vallen = 0 - self.wType = 1 - self.name = 'VarFileInfo' - raw_name = getRaw(self.name) - sublen = 6 + len(raw_name) + 2 - pad = b'' - if sublen % 4: - pad = b'\000\000' - tmp = b''.join([kid.toRaw() for kid in self.kids]) - self.sublen = sublen + len(pad) + len(tmp) - return struct.pack('HHH', self.sublen, self.vallen, self.wType) + raw_name + b'\000\000' + pad + tmp - - def __eq__(self, other): - return self.toRaw() == other - - def __str__(self, indent=''): - return indent + "VarFileInfo([%s])" % ', '.join(str(kid) for kid in self.kids) - - def __repr__(self): - return 'versioninfo.VarFileInfo(%r)' % self.kids - - -class VarStruct: - """ - WORD wLength; // length of the version resource - WORD wValueLength; // length of the Value member in the current - // VS_VERSION_INFO structure - WORD wType; // 1 means text, 0 means binary - WCHAR szKey[]; // Contains the Unicode string 'Translation' - // or a user-defined key string value - WORD Padding[]; // - WORD Value[]; // list of one or more values that are language - // and code-page identifiers - """ - def __init__(self, name=None, kids=None): - self.name = name or '' - self.kids = kids or [] - - def fromRaw(self, data, i, limit): - i, (self.sublen, self.wValueLength, self.wType, self.name) = parseCommon(data, i) - i = nextDWord(i) - for j in range(0, self.wValueLength, 2): - kid = struct.unpack('H', data[i:i + 2])[0] - self.kids.append(kid) - i += 2 - return i - - def toRaw(self): - self.wValueLength = len(self.kids) * 2 - self.wType = 0 - raw_name = getRaw(self.name) - sublen = 6 + len(raw_name) + 2 - pad = b'' - if sublen % 4: - pad = b'\000\000' - self.sublen = sublen + len(pad) + self.wValueLength - tmp = b''.join([struct.pack('H', kid) for kid in self.kids]) - return struct.pack('HHH', self.sublen, self.wValueLength, self.wType) + raw_name + b'\000\000' + pad + tmp - - def __eq__(self, other): - return self.toRaw() == other - - def __str__(self, indent=''): - return "VarStruct('%s', %r)" % (self.name, self.kids) - - def __repr__(self): - return 'versioninfo.VarStruct(%r, %r)' % (self.name, self.kids) - - -def load_version_info_from_text_file(filename): - """ - Load the `VSVersionInfo` structure from its string-based (`VSVersionInfo.__str__`) serialization by reading the - text from the file and running it through `eval()`. - """ - - # Read and parse the version file. It may have a byte order marker or encoding cookie - respect it if it does. - import PyInstaller.utils.misc as miscutils - with open(filename, 'rb') as fp: - text = miscutils.decode(fp.read()) - - # Deserialize via eval() - try: - info = eval(text) - except Exception as e: - raise ValueError("Failed to deserialize VSVersionInfo from text-based representation!") from e - - # Sanity check - assert isinstance(info, VSVersionInfo), \ - f"Loaded incompatible structure type! Expected VSVersionInfo, got: {type(info)!r}" - - return info - - -def write_version_info_to_executable(exe_filename, info): - assert isinstance(info, VSVersionInfo) - - # Remember overlay - pe = pefile.PE(exe_filename, fast_load=True) - overlay_before = pe.get_overlay() - pe.close() - - hdst = win32api.BeginUpdateResource(exe_filename, 0) - win32api.UpdateResource(hdst, pefile.RESOURCE_TYPE['RT_VERSION'], 1, info.toRaw()) - win32api.EndUpdateResource(hdst, 0) - - if overlay_before: - # Check if the overlay is still present - pe = pefile.PE(exe_filename, fast_load=True) - overlay_after = pe.get_overlay() - pe.close() - - # If the update removed the overlay data, re-append it - if not overlay_after: - with open(exe_filename, 'ab') as exef: - exef.write(overlay_before) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/winmanifest.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/winmanifest.py deleted file mode 100755 index 1d338df..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/winmanifest.py +++ /dev/null @@ -1,244 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -import xml.dom -import xml.dom.minidom - -#- Relevant constants from Windows headers -# Manifest resource code -RT_MANIFEST = 24 - -# Resource IDs (names) for manifest. -# See: https://www.gamedev.net/blogs/entry/2154553-manifest-embedding-and-activation -CREATEPROCESS_MANIFEST_RESOURCE_ID = 1 -ISOLATIONAWARE_MANIFEST_RESOURCE_ID = 2 - -LANG_NEUTRAL = 0 - -#- Default application manifest template, based on the one found in python executable. - -_DEFAULT_MANIFEST_XML = \ -b""" - - - - - - - - - - - - - - - - - - - - true - - - - - - - - -""" # noqa: E122,E501 - -#- DOM navigation helpers - - -def _find_elements_by_tag(root, tag): - """ - Find all elements with given tag under the given root element. - """ - return [node for node in root.childNodes if node.nodeType == xml.dom.Node.ELEMENT_NODE and node.tagName == tag] - - -def _find_element_by_tag(root, tag): - """ - Attempt to find a single element with given tag under the given root element, and return None if no such element - is found. Raises an error if multiple elements are found. - """ - elements = _find_elements_by_tag(root, tag) - if len(elements) > 1: - raise ValueError(f"Expected a single {tag!r} element, found {len(elements)} element(s)!") - if not elements: - return None - return elements[0] - - -#- Application manifest modification helpers - - -def _set_execution_level(manifest_dom, root_element, uac_admin=False, uac_uiaccess=False): - """ - Find -> -> element, and set its `level` and `uiAccess` - attributes based on supplied arguments. Create the XML elements if necessary, as they are optional. - """ - - # - trust_info_element = _find_element_by_tag(root_element, "trustInfo") - if not trust_info_element: - trust_info_element = manifest_dom.createElement("trustInfo") - trust_info_element.setAttribute("xmlns", "urn:schemas-microsoft-com:asm.v3") - root_element.appendChild(trust_info_element) - - # - security_element = _find_element_by_tag(trust_info_element, "security") - if not security_element: - security_element = manifest_dom.createElement("security") - trust_info_element.appendChild(security_element) - - # - requested_privileges_element = _find_element_by_tag(security_element, "requestedPrivileges") - if not requested_privileges_element: - requested_privileges_element = manifest_dom.createElement("requestedPrivileges") - security_element.appendChild(requested_privileges_element) - - # - requested_execution_level_element = _find_element_by_tag(requested_privileges_element, "requestedExecutionLevel") - if not requested_execution_level_element: - requested_execution_level_element = manifest_dom.createElement("requestedExecutionLevel") - requested_privileges_element.appendChild(requested_execution_level_element) - - requested_execution_level_element.setAttribute("level", "requireAdministrator" if uac_admin else "asInvoker") - requested_execution_level_element.setAttribute("uiAccess", "true" if uac_uiaccess else "false") - - -def _ensure_common_controls_dependency(manifest_dom, root_element): - """ - Scan elements for the one whose < -> corresponds to the - `Microsoft.Windows.Common-Controls`. If found, overwrite its properties. If not, create new - element with corresponding sub-elements and attributes. - """ - - # - dependency_elements = _find_elements_by_tag(root_element, "dependency") - for dependency_element in dependency_elements: - # - dependent_assembly_element = _find_element_by_tag(dependency_element, "dependentAssembly") - # - assembly_identity_element = _find_element_by_tag(dependent_assembly_element, "assemblyIdentity") - # Check the name attribute - if assembly_identity_element.attributes["name"].value == "Microsoft.Windows.Common-Controls": - common_controls_element = assembly_identity_element - break - else: - # Create - dependency_element = manifest_dom.createElement("dependency") - root_element.appendChild(dependency_element) - # Create - dependent_assembly_element = manifest_dom.createElement("dependentAssembly") - dependency_element.appendChild(dependent_assembly_element) - # Create - common_controls_element = manifest_dom.createElement("assemblyIdentity") - dependent_assembly_element.appendChild(common_controls_element) - - common_controls_element.setAttribute("type", "win32") - common_controls_element.setAttribute("name", "Microsoft.Windows.Common-Controls") - common_controls_element.setAttribute("version", "6.0.0.0") - common_controls_element.setAttribute("processorArchitecture", "*") - common_controls_element.setAttribute("publicKeyToken", "6595b64144ccf1df") - common_controls_element.setAttribute("language", "*") - - -def create_application_manifest(manifest_xml=None, uac_admin=False, uac_uiaccess=False): - """ - Create application manifest, from built-in or custom manifest XML template. If provided, `manifest_xml` must be - a string or byte string containing XML source. The returned manifest is a byte string, encoded in UTF-8. - - This function sets the attributes of `requestedExecutionLevel` based on provided `uac_admin` and `auc_uiacces` - arguments (creating the parent elements in the XML, if necessary). It also scans `dependency` elements for the - entry corresponding to `Microsoft.Windows.Common-Controls` and creates or modifies it as necessary. - """ - - if manifest_xml is None: - manifest_xml = _DEFAULT_MANIFEST_XML - - with xml.dom.minidom.parseString(manifest_xml) as manifest_dom: - root_element = manifest_dom.documentElement - - # Validate root element - must be - assert root_element.tagName == "assembly" - assert root_element.namespaceURI == "urn:schemas-microsoft-com:asm.v1" - assert root_element.attributes["manifestVersion"].value == "1.0" - - # Modify the manifest - _set_execution_level(manifest_dom, root_element, uac_admin, uac_uiaccess) - _ensure_common_controls_dependency(manifest_dom, root_element) - - # Create output XML - output = manifest_dom.toprettyxml(indent=" ", encoding="UTF-8") - - # Strip extra newlines - output = [line for line in output.splitlines() if line.strip()] - - # Replace: `` with ``. - # Support for `standalone` was added to `toprettyxml` in python 3.9, so do a manual work around. - output[0] = b"""""" - - output = b"\n".join(output) - - return output - - -def write_manifest_to_executable(filename, manifest_xml): - """ - Write the given manifest XML to the given executable's RT_MANIFEST resource. - """ - from PyInstaller.utils.win32 import winresource - - # CREATEPROCESS_MANIFEST_RESOURCE_ID is used for manifest resource in executables. - # ISOLATIONAWARE_MANIFEST_RESOURCE_ID is used for manifest resources in DLLs. - names = [CREATEPROCESS_MANIFEST_RESOURCE_ID] - - # Ensure LANG_NEUTRAL is updated, and also update any other present languages. - languages = [LANG_NEUTRAL, "*"] - - winresource.add_or_update_resource(filename, manifest_xml, RT_MANIFEST, names, languages) - - -def read_manifest_from_executable(filename): - """ - Read manifest from the given executable." - """ - from PyInstaller.utils.win32 import winresource - - resources = winresource.get_resources(filename, [RT_MANIFEST]) - - # `resources` is a three-level dictionary: - # - level 1: resource type (RT_MANIFEST) - # - level 2: resource name (CREATEPROCESS_MANIFEST_RESOURCE_ID) - # - level 3: resource language (LANG_NEUTRAL) - - # Level 1 - if RT_MANIFEST not in resources: - raise ValueError(f"No RT_MANIFEST resources found in {filename!r}.") - resources = resources[RT_MANIFEST] - - # Level 2 - if CREATEPROCESS_MANIFEST_RESOURCE_ID not in resources: - raise ValueError(f"No RT_MANIFEST resource named CREATEPROCESS_MANIFEST_RESOURCE_ID found in {filename!r}.") - resources = resources[CREATEPROCESS_MANIFEST_RESOURCE_ID] - - # Level 3 - # We prefer LANG_NEUTRAL, but allow fall back to the first available entry. - if LANG_NEUTRAL in resources: - resources = resources[LANG_NEUTRAL] - else: - resources = next(iter(resources.items())) - - manifest_xml = resources - return manifest_xml diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/winresource.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/winresource.py deleted file mode 100755 index f21d66c..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/winresource.py +++ /dev/null @@ -1,189 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Read and write resources from/to Win32 PE files. -""" - -import PyInstaller.log as logging -from PyInstaller.compat import pywintypes, win32api - -logger = logging.getLogger(__name__) - -LOAD_LIBRARY_AS_DATAFILE = 2 -ERROR_BAD_EXE_FORMAT = 193 -ERROR_RESOURCE_DATA_NOT_FOUND = 1812 -ERROR_RESOURCE_TYPE_NOT_FOUND = 1813 -ERROR_RESOURCE_NAME_NOT_FOUND = 1814 -ERROR_RESOURCE_LANG_NOT_FOUND = 1815 - - -def get_resources(filename, types=None, names=None, languages=None): - """ - Retrieve resources from the given PE file. - - filename: path to the PE file. - types: a list of resource types (integers or strings) to search for (None = all). - names: a list of resource names (integers or strings) to search for (None = all). - languages: a list of resource languages (integers) to search for (None = all). - - Returns a dictionary of the form {type: {name: {language: data}}}, which might also be empty if no matching - resources were found. - """ - types = set(types) if types is not None else {"*"} - names = set(names) if names is not None else {"*"} - languages = set(languages) if languages is not None else {"*"} - - output = {} - - # Errors codes for which we swallow exceptions - _IGNORE_EXCEPTIONS = { - ERROR_RESOURCE_DATA_NOT_FOUND, - ERROR_RESOURCE_TYPE_NOT_FOUND, - ERROR_RESOURCE_NAME_NOT_FOUND, - ERROR_RESOURCE_LANG_NOT_FOUND, - } - - # Open file - module_handle = win32api.LoadLibraryEx(filename, 0, LOAD_LIBRARY_AS_DATAFILE) - - # Enumerate available resource types - try: - available_types = win32api.EnumResourceTypes(module_handle) - except pywintypes.error as e: - if e.args[0] not in _IGNORE_EXCEPTIONS: - raise - available_types = [] - - if "*" not in types: - available_types = [res_type for res_type in available_types if res_type in types] - - for res_type in available_types: - # Enumerate available names for the resource type. - try: - available_names = win32api.EnumResourceNames(module_handle, res_type) - except pywintypes.error as e: - if e.args[0] not in _IGNORE_EXCEPTIONS: - raise - continue - - if "*" not in names: - available_names = [res_name for res_name in available_names if res_name in names] - - for res_name in available_names: - # Enumerate available languages for the resource type and name combination. - try: - available_languages = win32api.EnumResourceLanguages(module_handle, res_type, res_name) - except pywintypes.error as e: - if e.args[0] not in _IGNORE_EXCEPTIONS: - raise - continue - - if "*" not in languages: - available_languages = [res_lang for res_lang in available_languages if res_lang in languages] - - for res_lang in available_languages: - # Read data - try: - data = win32api.LoadResource(module_handle, res_type, res_name, res_lang) - except pywintypes.error as e: - if e.args[0] not in _IGNORE_EXCEPTIONS: - raise - continue - - if res_type not in output: - output[res_type] = {} - if res_name not in output[res_type]: - output[res_type][res_name] = {} - output[res_type][res_name][res_lang] = data - - # Close file - win32api.FreeLibrary(module_handle) - - return output - - -def add_or_update_resource(filename, data, res_type, names=None, languages=None): - """ - Update or add a single resource in the PE file with the given binary data. - - filename: path to the PE file. - data: binary data to write to the resource. - res_type: resource type to add/update (integer or string). - names: a list of resource names (integers or strings) to update (None = all). - languages: a list of resource languages (integers) to update (None = all). - """ - if res_type == "*": - raise ValueError("res_type cannot be a wildcard (*)!") - - names = set(names) if names is not None else {"*"} - languages = set(languages) if languages is not None else {"*"} - - # Retrieve existing resources, filtered by the given resource type and given resource names and languages. - resources = get_resources(filename, [res_type], names, languages) - - # Add res_type, name, language combinations that are not already present - resources = resources.get(res_type, {}) # This is now a {name: {language: data}} dictionary - - for res_name in names: - if res_name == "*": - continue - if res_name not in resources: - resources[res_name] = {} - - for res_lang in languages: - if res_lang == "*": - continue - if res_lang not in resources[res_name]: - resources[res_name][res_lang] = None # Just an indicator - - # Add resource to the target file, overwriting the existing resources with same type, name, language combinations. - module_handle = win32api.BeginUpdateResource(filename, 0) - for res_name in resources.keys(): - for res_lang in resources[res_name].keys(): - win32api.UpdateResource(module_handle, res_type, res_name, data, res_lang) - win32api.EndUpdateResource(module_handle, 0) - - -def copy_resources_from_pe_file(filename, src_filename, types=None, names=None, languages=None): - """ - Update or add resources in the given PE file by copying them over from the specified source PE file. - - filename: path to the PE file. - src_filename: path to the source PE file. - types: a list of resource types (integers or strings) to add/update via copy for (None = all). - names: a list of resource names (integers or strings) to add/update via copy (None = all). - languages: a list of resource languages (integers) to add/update via copy (None = all). - """ - types = set(types) if types is not None else {"*"} - names = set(names) if names is not None else {"*"} - languages = set(languages) if languages is not None else {"*"} - - # Retrieve existing resources, filtered by the given resource type and given resource names and languages. - resources = get_resources(src_filename, types, names, languages) - - for res_type, resources_for_type in resources.items(): - if "*" not in types and res_type not in types: - continue - for res_name, resources_for_type_name in resources_for_type.items(): - if "*" not in names and res_name not in names: - continue - for res_lang, data in resources_for_type_name.items(): - if "*" not in languages and res_lang not in languages: - continue - add_or_update_resource(filename, data, res_type, [res_name], [res_lang]) - - -def remove_all_resources(filename): - """ - Remove all resources from the given PE file: - """ - module_handle = win32api.BeginUpdateResource(filename, True) # bDeleteExistingResources=True - win32api.EndUpdateResource(module_handle, False) diff --git a/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/winutils.py b/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/winutils.py deleted file mode 100755 index 92cba77..0000000 --- a/venv/lib/python3.12/site-packages/PyInstaller/utils/win32/winutils.py +++ /dev/null @@ -1,257 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2023, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- -""" -Utilities for Windows platform. -""" - -from PyInstaller import compat - - -def get_windows_dir(): - """ - Return the Windows directory, e.g., C:\\Windows. - """ - windir = compat.win32api.GetWindowsDirectory() - if not windir: - raise SystemExit("ERROR: Cannot determine Windows directory!") - return windir - - -def get_system_path(): - """ - Return the required Windows system paths. - """ - sys_dir = compat.win32api.GetSystemDirectory() - # Ensure C:\Windows\system32 and C:\Windows directories are always present in PATH variable. - # C:\Windows\system32 is valid even for 64-bit Windows. Access do DLLs are transparently redirected to - # C:\Windows\syswow64 for 64bit applactions. - # See http://msdn.microsoft.com/en-us/library/aa384187(v=vs.85).aspx - return [sys_dir, get_windows_dir()] - - -def get_pe_file_machine_type(filename): - """ - Return the machine type code from the header of the given PE file. - """ - import pefile - - with pefile.PE(filename, fast_load=True) as pe: - return pe.FILE_HEADER.Machine - - -def set_exe_build_timestamp(exe_path, timestamp): - """ - Modifies the executable's build timestamp by updating values in the corresponding PE headers. - """ - import pefile - - with pefile.PE(exe_path, fast_load=True) as pe: - # Manually perform a full load. We need it to load all headers, but specifying it in the constructor triggers - # byte statistics gathering that takes forever with large files. So we try to go around that... - pe.full_load() - - # Set build timestamp. - # See: https://0xc0decafe.com/malware-analyst-guide-to-pe-timestamps - timestamp = int(timestamp) - # Set timestamp field in FILE_HEADER - pe.FILE_HEADER.TimeDateStamp = timestamp - # MSVC-compiled executables contain (at least?) one DIRECTORY_ENTRY_DEBUG entry that also contains timestamp - # with same value as set in FILE_HEADER. So modify that as well, as long as it is set. - debug_entries = getattr(pe, 'DIRECTORY_ENTRY_DEBUG', []) - for debug_entry in debug_entries: - if debug_entry.struct.TimeDateStamp: - debug_entry.struct.TimeDateStamp = timestamp - - # Generate updated EXE data - data = pe.write() - - # Rewrite the exe - with open(exe_path, 'wb') as fp: - fp.write(data) - - -def update_exe_pe_checksum(exe_path): - """ - Compute the executable's PE checksum, and write it to PE headers. - - This optional checksum is supposed to protect the executable against corruption but some anti-viral software have - taken to flagging anything without it set correctly as malware. See issue #5579. - """ - import pefile - - # Compute checksum using our equivalent of the MapFileAndCheckSumW - for large files, it is significantly faster - # than pure-pyton pefile.PE.generate_checksum(). However, it requires the file to be on disk (i.e., cannot operate - # on a memory buffer). - try: - checksum = compute_exe_pe_checksum(exe_path) - except Exception as e: - raise RuntimeError("Failed to compute PE checksum!") from e - - # Update the checksum - with pefile.PE(exe_path, fast_load=True) as pe: - pe.OPTIONAL_HEADER.CheckSum = checksum - - # Generate updated EXE data - data = pe.write() - - # Rewrite the exe - with open(exe_path, 'wb') as fp: - fp.write(data) - - -def compute_exe_pe_checksum(exe_path): - """ - This is a replacement for the MapFileAndCheckSumW function. As noted in MSDN documentation, the Microsoft's - implementation of MapFileAndCheckSumW internally calls its ASCII variant (MapFileAndCheckSumA), and therefore - cannot handle paths that contain characters that are not representable in the current code page. - See: https://docs.microsoft.com/en-us/windows/win32/api/imagehlp/nf-imagehlp-mapfileandchecksumw - - This function is based on Wine's implementation of MapFileAndCheckSumW, and due to being based entirely on - the pure widechar-API functions, it is not limited by the current code page. - """ - # ctypes bindings for relevant win32 API functions - import ctypes - from ctypes import windll, wintypes - - INVALID_HANDLE = wintypes.HANDLE(-1).value - - GetLastError = ctypes.windll.kernel32.GetLastError - GetLastError.argtypes = () - GetLastError.restype = wintypes.DWORD - - CloseHandle = windll.kernel32.CloseHandle - CloseHandle.argtypes = ( - wintypes.HANDLE, # hObject - ) - CloseHandle.restype = wintypes.BOOL - - CreateFileW = windll.kernel32.CreateFileW - CreateFileW.argtypes = ( - wintypes.LPCWSTR, # lpFileName - wintypes.DWORD, # dwDesiredAccess - wintypes.DWORD, # dwShareMode - wintypes.LPVOID, # lpSecurityAttributes - wintypes.DWORD, # dwCreationDisposition - wintypes.DWORD, # dwFlagsAndAttributes - wintypes.HANDLE, # hTemplateFile - ) - CreateFileW.restype = wintypes.HANDLE - - CreateFileMappingW = windll.kernel32.CreateFileMappingW - CreateFileMappingW.argtypes = ( - wintypes.HANDLE, # hFile - wintypes.LPVOID, # lpSecurityAttributes - wintypes.DWORD, # flProtect - wintypes.DWORD, # dwMaximumSizeHigh - wintypes.DWORD, # dwMaximumSizeLow - wintypes.LPCWSTR, # lpName - ) - CreateFileMappingW.restype = wintypes.HANDLE - - MapViewOfFile = windll.kernel32.MapViewOfFile - MapViewOfFile.argtypes = ( - wintypes.HANDLE, # hFileMappingObject - wintypes.DWORD, # dwDesiredAccess - wintypes.DWORD, # dwFileOffsetHigh - wintypes.DWORD, # dwFileOffsetLow - wintypes.DWORD, # dwNumberOfBytesToMap - ) - MapViewOfFile.restype = wintypes.LPVOID - - UnmapViewOfFile = windll.kernel32.UnmapViewOfFile - UnmapViewOfFile.argtypes = ( - wintypes.LPCVOID, # lpBaseAddress - ) - UnmapViewOfFile.restype = wintypes.BOOL - - GetFileSizeEx = windll.kernel32.GetFileSizeEx - GetFileSizeEx.argtypes = ( - wintypes.HANDLE, # hFile - wintypes.PLARGE_INTEGER, # lpFileSize - ) - - CheckSumMappedFile = windll.imagehlp.CheckSumMappedFile - CheckSumMappedFile.argtypes = ( - wintypes.LPVOID, # BaseAddress - wintypes.DWORD, # FileLength - wintypes.PDWORD, # HeaderSum - wintypes.PDWORD, # CheckSum - ) - CheckSumMappedFile.restype = wintypes.LPVOID - - # Open file - hFile = CreateFileW( - ctypes.c_wchar_p(exe_path), - 0x80000000, # dwDesiredAccess = GENERIC_READ - 0x00000001 | 0x00000002, # dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE, - None, # lpSecurityAttributes = NULL - 3, # dwCreationDisposition = OPEN_EXISTING - 0x80, # dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL - None # hTemplateFile = NULL - ) - if hFile == INVALID_HANDLE: - err = GetLastError() - raise RuntimeError(f"Failed to open file {exe_path}! Error code: {err}") - - # Query file size - fileLength = wintypes.LARGE_INTEGER(0) - if GetFileSizeEx(hFile, fileLength) == 0: - err = GetLastError() - CloseHandle(hFile) - raise RuntimeError(f"Failed to query file size file! Error code: {err}") - fileLength = fileLength.value - if fileLength > (2**32 - 1): - raise RuntimeError("Executable size exceeds maximum allowed executable size on Windows (4 GiB)!") - - # Map the file - hMapping = CreateFileMappingW( - hFile, - None, # lpFileMappingAttributes = NULL - 0x02, # flProtect = PAGE_READONLY - 0, # dwMaximumSizeHigh = 0 - 0, # dwMaximumSizeLow = 0 - None # lpName = NULL - ) - if not hMapping: - err = GetLastError() - CloseHandle(hFile) - raise RuntimeError(f"Failed to map file! Error code: {err}") - - # Create map view - baseAddress = MapViewOfFile( - hMapping, - 4, # dwDesiredAccess = FILE_MAP_READ - 0, # dwFileOffsetHigh = 0 - 0, # dwFileOffsetLow = 0 - 0 # dwNumberOfBytesToMap = 0 - ) - if baseAddress == 0: - err = GetLastError() - CloseHandle(hMapping) - CloseHandle(hFile) - raise RuntimeError(f"Failed to create map view! Error code: {err}") - - # Finally, compute the checksum - headerSum = wintypes.DWORD(0) - checkSum = wintypes.DWORD(0) - ret = CheckSumMappedFile(baseAddress, fileLength, ctypes.byref(headerSum), ctypes.byref(checkSum)) - if ret is None: - err = GetLastError() - - # Cleanup - UnmapViewOfFile(baseAddress) - CloseHandle(hMapping) - CloseHandle(hFile) - - if ret is None: - raise RuntimeError(f"CheckSumMappedFile failed! Error code: {err}") - - return checkSum.value diff --git a/venv/lib/python3.12/site-packages/__pycache__/_black_version.cpython-312.pyc b/venv/lib/python3.12/site-packages/__pycache__/_black_version.cpython-312.pyc deleted file mode 100644 index 609350f..0000000 Binary files a/venv/lib/python3.12/site-packages/__pycache__/_black_version.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/__pycache__/autopep8.cpython-312.pyc b/venv/lib/python3.12/site-packages/__pycache__/autopep8.cpython-312.pyc deleted file mode 100644 index c6ab400..0000000 Binary files a/venv/lib/python3.12/site-packages/__pycache__/autopep8.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/__pycache__/mccabe.cpython-312.pyc b/venv/lib/python3.12/site-packages/__pycache__/mccabe.cpython-312.pyc deleted file mode 100644 index 7a52148..0000000 Binary files a/venv/lib/python3.12/site-packages/__pycache__/mccabe.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/__pycache__/mypy_extensions.cpython-312.pyc b/venv/lib/python3.12/site-packages/__pycache__/mypy_extensions.cpython-312.pyc deleted file mode 100644 index f0b3f57..0000000 Binary files a/venv/lib/python3.12/site-packages/__pycache__/mypy_extensions.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/__pycache__/pycodestyle.cpython-312.pyc b/venv/lib/python3.12/site-packages/__pycache__/pycodestyle.cpython-312.pyc deleted file mode 100644 index f020714..0000000 Binary files a/venv/lib/python3.12/site-packages/__pycache__/pycodestyle.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc b/venv/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc deleted file mode 100644 index 045b030..0000000 Binary files a/venv/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_black_version.py b/venv/lib/python3.12/site-packages/_black_version.py deleted file mode 100644 index b20f386..0000000 --- a/venv/lib/python3.12/site-packages/_black_version.py +++ /dev/null @@ -1 +0,0 @@ -version = "26.3.1" diff --git a/venv/lib/python3.12/site-packages/_black_version.pyi b/venv/lib/python3.12/site-packages/_black_version.pyi deleted file mode 100644 index c2ee2ca..0000000 --- a/venv/lib/python3.12/site-packages/_black_version.pyi +++ /dev/null @@ -1 +0,0 @@ -version: str diff --git a/venv/lib/python3.12/site-packages/_distutils_hack/__init__.py b/venv/lib/python3.12/site-packages/_distutils_hack/__init__.py deleted file mode 100644 index 94f71b9..0000000 --- a/venv/lib/python3.12/site-packages/_distutils_hack/__init__.py +++ /dev/null @@ -1,239 +0,0 @@ -# don't import any costly modules -import os -import sys - -report_url = ( - "https://github.com/pypa/setuptools/issues/new?template=distutils-deprecation.yml" -) - - -def warn_distutils_present(): - if 'distutils' not in sys.modules: - return - import warnings - - warnings.warn( - "Distutils was imported before Setuptools, but importing Setuptools " - "also replaces the `distutils` module in `sys.modules`. This may lead " - "to undesirable behaviors or errors. To avoid these issues, avoid " - "using distutils directly, ensure that setuptools is installed in the " - "traditional way (e.g. not an editable install), and/or make sure " - "that setuptools is always imported before distutils." - ) - - -def clear_distutils(): - if 'distutils' not in sys.modules: - return - import warnings - - warnings.warn( - "Setuptools is replacing distutils. Support for replacing " - "an already imported distutils is deprecated. In the future, " - "this condition will fail. " - f"Register concerns at {report_url}" - ) - mods = [ - name - for name in sys.modules - if name == "distutils" or name.startswith("distutils.") - ] - for name in mods: - del sys.modules[name] - - -def enabled(): - """ - Allow selection of distutils by environment variable. - """ - which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'local') - if which == 'stdlib': - import warnings - - warnings.warn( - "Reliance on distutils from stdlib is deprecated. Users " - "must rely on setuptools to provide the distutils module. " - "Avoid importing distutils or import setuptools first, " - "and avoid setting SETUPTOOLS_USE_DISTUTILS=stdlib. " - f"Register concerns at {report_url}" - ) - return which == 'local' - - -def ensure_local_distutils(): - import importlib - - clear_distutils() - - # With the DistutilsMetaFinder in place, - # perform an import to cause distutils to be - # loaded from setuptools._distutils. Ref #2906. - with shim(): - importlib.import_module('distutils') - - # check that submodules load as expected - core = importlib.import_module('distutils.core') - assert '_distutils' in core.__file__, core.__file__ - assert 'setuptools._distutils.log' not in sys.modules - - -def do_override(): - """ - Ensure that the local copy of distutils is preferred over stdlib. - - See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401 - for more motivation. - """ - if enabled(): - warn_distutils_present() - ensure_local_distutils() - - -class _TrivialRe: - def __init__(self, *patterns) -> None: - self._patterns = patterns - - def match(self, string): - return all(pat in string for pat in self._patterns) - - -class DistutilsMetaFinder: - def find_spec(self, fullname, path, target=None): - # optimization: only consider top level modules and those - # found in the CPython test suite. - if path is not None and not fullname.startswith('test.'): - return None - - method_name = 'spec_for_{fullname}'.format(**locals()) - method = getattr(self, method_name, lambda: None) - return method() - - def spec_for_distutils(self): - if self.is_cpython(): - return None - - import importlib - import importlib.abc - import importlib.util - - try: - mod = importlib.import_module('setuptools._distutils') - except Exception: - # There are a couple of cases where setuptools._distutils - # may not be present: - # - An older Setuptools without a local distutils is - # taking precedence. Ref #2957. - # - Path manipulation during sitecustomize removes - # setuptools from the path but only after the hook - # has been loaded. Ref #2980. - # In either case, fall back to stdlib behavior. - return None - - class DistutilsLoader(importlib.abc.Loader): - def create_module(self, spec): - mod.__name__ = 'distutils' - return mod - - def exec_module(self, module): - pass - - return importlib.util.spec_from_loader( - 'distutils', DistutilsLoader(), origin=mod.__file__ - ) - - @staticmethod - def is_cpython(): - """ - Suppress supplying distutils for CPython (build and tests). - Ref #2965 and #3007. - """ - return os.path.isfile('pybuilddir.txt') - - def spec_for_pip(self): - """ - Ensure stdlib distutils when running under pip. - See pypa/pip#8761 for rationale. - """ - if sys.version_info >= (3, 12) or self.pip_imported_during_build(): - return - clear_distutils() - self.spec_for_distutils = lambda: None - - @classmethod - def pip_imported_during_build(cls): - """ - Detect if pip is being imported in a build script. Ref #2355. - """ - import traceback - - return any( - cls.frame_file_is_setup(frame) for frame, line in traceback.walk_stack(None) - ) - - @staticmethod - def frame_file_is_setup(frame): - """ - Return True if the indicated frame suggests a setup.py file. - """ - # some frames may not have __file__ (#2940) - return frame.f_globals.get('__file__', '').endswith('setup.py') - - def spec_for_sensitive_tests(self): - """ - Ensure stdlib distutils when running select tests under CPython. - - python/cpython#91169 - """ - clear_distutils() - self.spec_for_distutils = lambda: None - - sensitive_tests = ( - [ - 'test.test_distutils', - 'test.test_peg_generator', - 'test.test_importlib', - ] - if sys.version_info < (3, 10) - else [ - 'test.test_distutils', - ] - ) - - -for name in DistutilsMetaFinder.sensitive_tests: - setattr( - DistutilsMetaFinder, - f'spec_for_{name}', - DistutilsMetaFinder.spec_for_sensitive_tests, - ) - - -DISTUTILS_FINDER = DistutilsMetaFinder() - - -def add_shim(): - DISTUTILS_FINDER in sys.meta_path or insert_shim() - - -class shim: - def __enter__(self) -> None: - insert_shim() - - def __exit__(self, exc: object, value: object, tb: object) -> None: - _remove_shim() - - -def insert_shim(): - sys.meta_path.insert(0, DISTUTILS_FINDER) - - -def _remove_shim(): - try: - sys.meta_path.remove(DISTUTILS_FINDER) - except ValueError: - pass - - -if sys.version_info < (3, 12): - # DistutilsMetaFinder can only be disabled in Python < 3.12 (PEP 632) - remove_shim = _remove_shim diff --git a/venv/lib/python3.12/site-packages/_distutils_hack/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/_distutils_hack/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 2f8b82b..0000000 Binary files a/venv/lib/python3.12/site-packages/_distutils_hack/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_distutils_hack/__pycache__/override.cpython-312.pyc b/venv/lib/python3.12/site-packages/_distutils_hack/__pycache__/override.cpython-312.pyc deleted file mode 100644 index 61509cf..0000000 Binary files a/venv/lib/python3.12/site-packages/_distutils_hack/__pycache__/override.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_distutils_hack/override.py b/venv/lib/python3.12/site-packages/_distutils_hack/override.py deleted file mode 100644 index 2cc433a..0000000 --- a/venv/lib/python3.12/site-packages/_distutils_hack/override.py +++ /dev/null @@ -1 +0,0 @@ -__import__('_distutils_hack').do_override() diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/__init__.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/__init__.py deleted file mode 100644 index 91e9306..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/__init__.py +++ /dev/null @@ -1,47 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -import sys - -__version__ = '2026.4' -__maintainer__ = 'Legorooj, bwoodsend' -__uri__ = 'https://github.com/pyinstaller/pyinstaller-hooks-contrib' - - -def get_hook_dirs(): - import os - hooks_dir = os.path.dirname(__file__) - return [ - # Required because standard hooks are in sub-directory instead of the top-level hooks directory. - os.path.join(hooks_dir, 'stdhooks'), - # pre_* and run-time hooks - hooks_dir, - ] - - -# Several packages for which provide hooks are involved in deep dependency chains when various optional dependencies are -# installed in the environment, and their analysis typically requires recursion limit that exceeds the default 1000. -# Therefore, automatically raise the recursion limit to at least 5000. This alleviates the need to do so on per-hook -# basis. -if (sys.platform.startswith('win') or sys.platform == 'cygwin') and sys.version_info < (3, 11): - # The recursion limit test in PyInstaller main repository seems to push the recursion level to the limit; and if the - # limit is set to 5000, this crashes python 3.8 - 3.10 on Windows and 3.9 that is (at the time of writing) available - # under Cygwin. Further investigation revealed that Windows builds of python 3.8 and 3.10 handle recursion up to - # level ~2075, while the practical limit for 3.9 is between 1950 and 1975. Therefore, for affected combinations of - # platforms and python versions, use a conservative limit of 1900 - if only to avoid issues with the recursion limit - # test in the main PyInstaller repository... - new_recursion_limit = 1900 -else: - new_recursion_limit = 5000 - -if sys.getrecursionlimit() < new_recursion_limit: - sys.setrecursionlimit(new_recursion_limit) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index cb7c4f1..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/__pycache__/__init__.cpython-314.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/__pycache__/__init__.cpython-314.pyc deleted file mode 100644 index 2898871..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/__pycache__/__init__.cpython-314.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/__pycache__/compat.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/__pycache__/compat.cpython-312.pyc deleted file mode 100644 index 25d15ce..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/__pycache__/compat.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/compat.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/compat.py deleted file mode 100644 index 4acba2f..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/compat.py +++ /dev/null @@ -1,42 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -import sys - -from PyInstaller.utils.hooks import is_module_satisfies - - -if is_module_satisfies("PyInstaller >= 6.0"): - # PyInstaller >= 6.0 imports importlib_metadata in its compat module - from PyInstaller.compat import importlib_metadata -else: - # Older PyInstaller version - duplicate logic from PyInstaller 6.0 - class ImportlibMetadataError(SystemExit): - def __init__(self): - super().__init__( - "pyinstaller-hooks-contrib requires importlib.metadata from python >= 3.10 stdlib or " - "importlib_metadata from importlib-metadata >= 4.6" - ) - - if sys.version_info >= (3, 10): - import importlib.metadata as importlib_metadata - else: - try: - import importlib_metadata - except ImportError as e: - raise ImportlibMetadataError() from e - - import packaging.version # For importlib_metadata version check - - # Validate the version - if packaging.version.parse(importlib_metadata.version("importlib-metadata")) < packaging.version.parse("4.6"): - raise ImportlibMetadataError() diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/pre_find_module_path/__init__.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/pre_find_module_path/__init__.py deleted file mode 100644 index 89c0c0f..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/pre_find_module_path/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/pre_find_module_path/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/pre_find_module_path/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 5614688..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/pre_find_module_path/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/__init__.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/__init__.py deleted file mode 100644 index 89c0c0f..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 0c5fe1e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/__pycache__/hook-tensorflow.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/__pycache__/hook-tensorflow.cpython-312.pyc deleted file mode 100644 index d4a1f7f..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/__pycache__/hook-tensorflow.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/__pycache__/hook-win32com.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/__pycache__/hook-win32com.cpython-312.pyc deleted file mode 100644 index 658c7c8..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/__pycache__/hook-win32com.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/hook-tensorflow.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/hook-tensorflow.py deleted file mode 100644 index 0d135b6..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/hook-tensorflow.py +++ /dev/null @@ -1,28 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2022, PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import is_module_satisfies - - -def pre_safe_import_module(api): - # As of tensorflow 2.8.0, the `tensorflow.keras` is entirely gone, replaced by a lazy-loaded alias for - # `keras.api._v2.keras`. Without us registering the alias here, a program that imports only from - # `tensorflow.keras` fails to collect `tensorflow`. - # See: https://github.com/pyinstaller/pyinstaller/discussions/6890 - # The alias was already present in earlier releases, but it does not seem to be causing problems there, - # so keep this specific to tensorflow >= 2.8.0 to avoid accidentally breaking something else. - # - # Starting with tensorflow 2.16.0, the alias points to `keras._tf_keras.keras`. - if is_module_satisfies("tensorflow >= 2.16.0"): - api.add_alias_module('keras._tf_keras.keras', 'tensorflow.keras') - elif is_module_satisfies("tensorflow >= 2.8.0"): - api.add_alias_module('keras.api._v2.keras', 'tensorflow.keras') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/hook-win32com.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/hook-win32com.py deleted file mode 100644 index c28e1d2..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/hook-win32com.py +++ /dev/null @@ -1,50 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2020, PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -#----------------------------------------------------------------------------- -""" -PyWin32 package 'win32com' extends its __path__ attribute with win32comext -directory and thus PyInstaller is not able to find modules in it. For example -module 'win32com.shell' is in reality 'win32comext.shell'. - ->>> win32com.__path__ -['win32com', 'C:\\Python27\\Lib\\site-packages\\win32comext'] - -""" - -import os - -from PyInstaller import compat -from PyInstaller import isolated -from PyInstaller.utils.hooks import logger - - -@isolated.decorate -def _get_win32com_file(): - try: - import win32com - return win32com.__file__ - except Exception: - return None - - -def pre_safe_import_module(api): - if not compat.is_win or compat.is_cygwin: - return - - win32com_file = _get_win32com_file() - if not win32com_file: - logger.debug('win32com: module not available') - return # win32com unavailable - win32com_dir = os.path.dirname(win32com_file) - comext_dir = os.path.join(os.path.dirname(win32com_dir), 'win32comext') - logger.debug('win32com: extending __path__ with dir %r' % comext_dir) - # Append the __path__ where PyInstaller will look for 'win32com' modules.' - api.append_package_path(comext_dir) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks.dat b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks.dat deleted file mode 100644 index f868f56..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks.dat +++ /dev/null @@ -1,16 +0,0 @@ -{ - 'cryptography': ['pyi_rth_cryptography_openssl.py'], - 'enchant': ['pyi_rth_enchant.py'], - 'findlibs': ['pyi_rth_findlibs.py'], - 'ffpyplayer': ['pyi_rth_ffpyplayer.py'], - 'osgeo': ['pyi_rth_osgeo.py'], - 'traitlets': ['pyi_rth_traitlets.py'], - 'usb': ['pyi_rth_usb.py'], - 'nltk': ['pyi_rth_nltk.py'], - 'pyproj': ['pyi_rth_pyproj.py'], - 'pygraphviz': ['pyi_rth_pygraphviz.py'], - 'pythoncom': ['pyi_rth_pythoncom.py'], - 'pyqtgraph': ['pyi_rth_pyqtgraph_multiprocess.py'], - 'pywintypes': ['pyi_rth_pywintypes.py'], - 'tensorflow': ['pyi_rth_tensorflow.py'], -} diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__init__.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__init__.py deleted file mode 100644 index 30d22ed..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the Apache License 2.0 -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: Apache-2.0 -# ------------------------------------------------------------------ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index def200e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_cryptography_openssl.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_cryptography_openssl.cpython-312.pyc deleted file mode 100644 index eb0dc3b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_cryptography_openssl.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_enchant.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_enchant.cpython-312.pyc deleted file mode 100644 index 77d93bf..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_enchant.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_ffpyplayer.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_ffpyplayer.cpython-312.pyc deleted file mode 100644 index c93d256..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_ffpyplayer.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_findlibs.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_findlibs.cpython-312.pyc deleted file mode 100644 index e75ab80..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_findlibs.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_nltk.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_nltk.cpython-312.pyc deleted file mode 100644 index 3b220d9..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_nltk.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_osgeo.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_osgeo.cpython-312.pyc deleted file mode 100644 index 54b8113..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_osgeo.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pygraphviz.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pygraphviz.cpython-312.pyc deleted file mode 100644 index 7fd1fcc..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pygraphviz.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pyproj.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pyproj.cpython-312.pyc deleted file mode 100644 index c6dfada..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pyproj.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pyqtgraph_multiprocess.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pyqtgraph_multiprocess.cpython-312.pyc deleted file mode 100644 index a4e2a7a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pyqtgraph_multiprocess.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pythoncom.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pythoncom.cpython-312.pyc deleted file mode 100644 index 5143d16..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pythoncom.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pywintypes.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pywintypes.cpython-312.pyc deleted file mode 100644 index 99570b6..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pywintypes.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_tensorflow.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_tensorflow.cpython-312.pyc deleted file mode 100644 index 8beb94b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_tensorflow.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_traitlets.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_traitlets.cpython-312.pyc deleted file mode 100644 index fe7766f..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_traitlets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_usb.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_usb.cpython-312.pyc deleted file mode 100644 index a74a7e0..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_usb.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_cryptography_openssl.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_cryptography_openssl.py deleted file mode 100644 index dbabe69..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_cryptography_openssl.py +++ /dev/null @@ -1,20 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# This file is distributed under the terms of the Apache License 2.0 -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - -import os -import sys - -# If we collected OpenSSL modules into `ossl-modules` directory, override the OpenSSL search path by setting the -# `OPENSSL_MODULES` environment variable. -_ossl_modules_dir = os.path.join(sys._MEIPASS, 'ossl-modules') -if os.path.isdir(_ossl_modules_dir): - os.environ['OPENSSL_MODULES'] = _ossl_modules_dir -del _ossl_modules_dir diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_enchant.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_enchant.py deleted file mode 100644 index 36c185d..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_enchant.py +++ /dev/null @@ -1,22 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2020, PyInstaller Development Team. -# -# This file is distributed under the terms of the Apache License 2.0 -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - -import os -import sys - -# On Mac OS X tell enchant library where to look for enchant backends (aspell, myspell, ...). -# Enchant is looking for backends in directory 'PREFIX/lib/enchant' -# Note: env. var. ENCHANT_PREFIX_DIR is implemented only in the development version: -# https://github.com/AbiWord/enchant -# https://github.com/AbiWord/enchant/pull/2 -# TODO Test this rthook. -if sys.platform.startswith('darwin'): - os.environ['ENCHANT_PREFIX_DIR'] = os.path.join(sys._MEIPASS, 'enchant') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_ffpyplayer.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_ffpyplayer.py deleted file mode 100644 index 6a024de..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_ffpyplayer.py +++ /dev/null @@ -1,19 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2023, PyInstaller Development Team. -# -# This file is distributed under the terms of the Apache License 2.0 -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - -# Starting with v4.3.5, the `ffpyplayer` package attempts to use `site.USER_BASE` in path manipulation functions. -# As frozen application runs with disabled `site`, the value of this variable is `None`, and causes path manipulation -# functions to raise an error. As a work-around, we set `site.USER_BASE` to an empty string, which is also what the -# fake `site` module available in PyInstaller prior to v5.5 did. -import site - -if site.USER_BASE is None: - site.USER_BASE = '' diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_findlibs.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_findlibs.py deleted file mode 100644 index 48e4ddd..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_findlibs.py +++ /dev/null @@ -1,58 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2024, PyInstaller Development Team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - -# Override the findlibs.find() function to give precedence to sys._MEIPASS, followed by `ctypes.util.find_library`, -# and only then the hard-coded paths from the original implementation. The main aim here is to avoid loading libraries -# from Homebrew environment on macOS when it happens to be present at run-time and we have a bundled copy collected from -# the build system. This happens because we (try not to) modify `DYLD_LIBRARY_PATH`, and the original `findlibs.find()` -# implementation gives precedence to environment variables and several fixed/hard-coded locations, and uses -# `ctypes.util.find_library` as the final fallback... -def _pyi_rthook(): - import sys - import os - import ctypes.util - - # findlibs v0.1.0 broke compatibility with python < 3.10; due to incompatible typing annotation, attempting to - # import the package raises `TypeError: unsupported operand type(s) for |: 'type' and 'NoneType'`. Gracefully - # handle this situation by making this run-time hook no-op, in order to avoid crashing the frozen program even - # if it would never end up importing/using `findlibs`. - try: - import findlibs - except TypeError: - return - - _orig_find = getattr(findlibs, 'find', None) - - def _pyi_find(lib_name, *args, **kwargs): - extension = findlibs.EXTENSIONS.get(sys.platform, ".so") - - # First check sys._MEIPASS - fullname = os.path.join(sys._MEIPASS, "lib{}{}".format(lib_name, extension)) - if os.path.isfile(fullname): - return fullname - - # Fall back to `ctypes.util.find_library` (to give it precedence over hard-coded paths from original - # implementation). - lib = ctypes.util.find_library(lib_name) - if lib is not None: - return lib - - # Finally, fall back to original implementation - if _orig_find is not None: - return _orig_find(lib_name, *args, **kwargs) - - return None - - findlibs.find = _pyi_find - - -_pyi_rthook() -del _pyi_rthook diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_nltk.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_nltk.py deleted file mode 100644 index feb9eb7..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_nltk.py +++ /dev/null @@ -1,17 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2020, PyInstaller Development Team. -# -# This file is distributed under the terms of the Apache License 2.0 -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - -import sys -import os -import nltk - -#add the path to nltk_data -nltk.data.path.insert(0, os.path.join(sys._MEIPASS, "nltk_data")) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_osgeo.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_osgeo.py deleted file mode 100644 index 7b31027..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_osgeo.py +++ /dev/null @@ -1,32 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2015-2020, PyInstaller Development Team. -# -# This file is distributed under the terms of the Apache License 2.0 -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - -import os -import sys - -# Installing `osgeo` Conda packages requires to set `GDAL_DATA` - -is_win = sys.platform.startswith('win') -if is_win: - - gdal_data = os.path.join(sys._MEIPASS, 'data', 'gdal') - if not os.path.exists(gdal_data): - - gdal_data = os.path.join(sys._MEIPASS, 'Library', 'share', 'gdal') - # last attempt, check if one of the required file is in the generic folder Library/data - if not os.path.exists(os.path.join(gdal_data, 'gcs.csv')): - gdal_data = os.path.join(sys._MEIPASS, 'Library', 'data') - -else: - gdal_data = os.path.join(sys._MEIPASS, 'share', 'gdal') - -if os.path.exists(gdal_data): - os.environ['GDAL_DATA'] = gdal_data diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pygraphviz.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pygraphviz.py deleted file mode 100644 index cfae2b3..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pygraphviz.py +++ /dev/null @@ -1,32 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2021, PyInstaller Development Team. -# -# This file is distributed under the terms of the Apache License 2.0 -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - -import pygraphviz - -# Override pygraphviz.AGraph._which method to search for graphviz executables inside sys._MEIPASS -if hasattr(pygraphviz.AGraph, '_which'): - - def _pygraphviz_override_which(self, name): - import os - import sys - import platform - - program_name = name - if platform.system() == "Windows": - program_name += ".exe" - - program_path = os.path.join(sys._MEIPASS, program_name) - if not os.path.isfile(program_path): - raise ValueError(f"Prog {name} not found in the PyInstaller-frozen application bundle!") - - return program_path - - pygraphviz.AGraph._which = _pygraphviz_override_which diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pyproj.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pyproj.py deleted file mode 100644 index b78b70b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pyproj.py +++ /dev/null @@ -1,26 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2015-2020, PyInstaller Development Team. -# -# This file is distributed under the terms of the Apache License 2.0 -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - -import os -import sys - -# Installing `pyproj` Conda packages requires to set `PROJ_LIB` - -is_win = sys.platform.startswith('win') -if is_win: - - proj_data = os.path.join(sys._MEIPASS, 'Library', 'share', 'proj') - -else: - proj_data = os.path.join(sys._MEIPASS, 'share', 'proj') - -if os.path.exists(proj_data): - os.environ['PROJ_LIB'] = proj_data diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pyqtgraph_multiprocess.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pyqtgraph_multiprocess.py deleted file mode 100644 index 06a012b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pyqtgraph_multiprocess.py +++ /dev/null @@ -1,52 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2022, PyInstaller Development Team. -# -# This file is distributed under the terms of the Apache License 2.0 -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - -import sys -import os - - -def _setup_pyqtgraph_multiprocess_hook(): - # NOTE: pyqtgraph.multiprocess spawns the sub-process using subprocess.Popen (or equivalent). This means that in - # onefile builds, the executable in subprocess will unpack itself again, into different sys._MEIPASS, because - # the _MEIPASS2 environment variable is not set (bootloader / bootstrap script cleans it up). This will make the - # argv[1] check below fail, due to different sys._MEIPASS value in the subprocess. - # - # To work around this, at the time of writing (PyInstaller 5.5), the user needs to set _MEIPASS2 environment - # variable to sys._MEIPASS before using `pyqtgraph.multiprocess` in onefile builds. And stlib's - # `multiprocessing.freeze_support` needs to be called in the entry-point program, due to `pyqtgraph.multiprocess` - # internally using stdlib's `multiprocessing` primitives. - if len(sys.argv) == 2 and sys.argv[1] == os.path.join(sys._MEIPASS, 'pyqtgraph', 'multiprocess', 'bootstrap.py'): - # Load as module; this requires --hiddenimport pyqtgraph.multiprocess.bootstrap - try: - import importlib.util - spec = importlib.util.find_spec("pyqtgraph.multiprocess.bootstrap") - bootstrap_co = spec.loader.get_code("pyqtgraph.multiprocess.bootstrap") - except Exception: - bootstrap_co = None - - if bootstrap_co: - exec(bootstrap_co) - sys.exit(0) - - # Load from file; requires pyqtgraph/multiprocess/bootstrap.py collected as data file - # This is obsolete for PyInstaller >= v6.10.0 - bootstrap_file = os.path.join(sys._MEIPASS, 'pyqtgraph', 'multiprocess', 'bootstrap.py') - if os.path.isfile(bootstrap_file): - with open(bootstrap_file, 'r') as fp: - bootstrap_code = fp.read() - exec(bootstrap_code) - sys.exit(0) - - raise RuntimeError("Could not find pyqtgraph.multiprocess bootstrap code or script!") - - -_setup_pyqtgraph_multiprocess_hook() -del _setup_pyqtgraph_multiprocess_hook diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pythoncom.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pythoncom.py deleted file mode 100644 index 4f11fb8..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pythoncom.py +++ /dev/null @@ -1,24 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2022, PyInstaller Development Team. -# -# This file is distributed under the terms of the Apache License 2.0 -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - -# Unfortunately, __import_pywin32_system_module__ from pywintypes module assumes that in a frozen application, the -# pythoncom3X.dll and pywintypes3X.dll that are normally found in site-packages/pywin32_system32, are located -# directly in the sys.path, without bothering to check first if they are actually available in the standard location. -# This obviously runs afoul of our attempts at preserving the directory layout and placing them in the pywin32_system32 -# sub-directory instead of the top-level application directory. So as a work-around, add the sub-directory to sys.path -# to keep pywintypes happy... -import sys -import os - -pywin32_system32_path = os.path.join(sys._MEIPASS, 'pywin32_system32') -if os.path.isdir(pywin32_system32_path) and pywin32_system32_path not in sys.path: - sys.path.append(pywin32_system32_path) -del pywin32_system32_path diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pywintypes.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pywintypes.py deleted file mode 100644 index 4f11fb8..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pywintypes.py +++ /dev/null @@ -1,24 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2022, PyInstaller Development Team. -# -# This file is distributed under the terms of the Apache License 2.0 -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - -# Unfortunately, __import_pywin32_system_module__ from pywintypes module assumes that in a frozen application, the -# pythoncom3X.dll and pywintypes3X.dll that are normally found in site-packages/pywin32_system32, are located -# directly in the sys.path, without bothering to check first if they are actually available in the standard location. -# This obviously runs afoul of our attempts at preserving the directory layout and placing them in the pywin32_system32 -# sub-directory instead of the top-level application directory. So as a work-around, add the sub-directory to sys.path -# to keep pywintypes happy... -import sys -import os - -pywin32_system32_path = os.path.join(sys._MEIPASS, 'pywin32_system32') -if os.path.isdir(pywin32_system32_path) and pywin32_system32_path not in sys.path: - sys.path.append(pywin32_system32_path) -del pywin32_system32_path diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_tensorflow.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_tensorflow.py deleted file mode 100644 index 747ea45..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_tensorflow.py +++ /dev/null @@ -1,53 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2023, PyInstaller Development Team. -# -# This file is distributed under the terms of the Apache License 2.0 -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - -def _pyi_rthook(): - import sys - - # `tensorflow` versions prior to 2.3.0 attempt to use `site.USER_SITE` in path/string manipulation functions. - # As frozen application runs with disabled `site`, the value of this variable is `None`, and causes path/string - # manipulation functions to raise an error. As a work-around, we set `site.USER_SITE` to an empty string, which is - # also what the fake `site` module available in PyInstaller prior to v5.5 did. - import site - - if site.USER_SITE is None: - site.USER_SITE = '' - - # The issue described about with site.USER_SITE being None has largely been resolved in contemporary `tensorflow` - # versions, which now check that `site.ENABLE_USER_SITE` is set and that `site.USER_SITE` is not None before - # trying to use it. - # - # However, `tensorflow` will attempt to search and load its plugins only if it believes that it is running from - # "a pip-based installation" - if the package's location is rooted in one of the "site-packages" directories. See - # https://github.com/tensorflow/tensorflow/blob/6887368d6d46223f460358323c4b76d61d1558a8/tensorflow/api_template.__init__.py#L110C76-L156 - # Unfortunately, they "cleverly" infer the module's location via `inspect.getfile(inspect.currentframe())`, which - # in the frozen application returns anonymized relative source file name (`tensorflow/__init__.py`) - so we need one - # of the "site directories" to be just "tensorflow" (to fool the `_running_from_pip_package()` check), and we also - # need `sys._MEIPASS` to be among them (to load the plugins from the actual `sys._MEIPASS/tensorflow-plugins`). - # Therefore, we monkey-patch `site.getsitepackages` to add those two entries to the list of "site directories". - - _orig_getsitepackages = getattr(site, 'getsitepackages', None) - - def _pyi_getsitepackages(): - return [ - sys._MEIPASS, - "tensorflow", - *(_orig_getsitepackages() if _orig_getsitepackages is not None else []), - ] - - site.getsitepackages = _pyi_getsitepackages - - # NOTE: instead of the above override, we could also set TF_PLUGGABLE_DEVICE_LIBRARY_PATH, but that works only - # for tensorflow >= 2.12. - - -_pyi_rthook() -del _pyi_rthook diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_traitlets.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_traitlets.py deleted file mode 100644 index 5ec3a9f..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_traitlets.py +++ /dev/null @@ -1,25 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2020, PyInstaller Development Team. -# -# This file is distributed under the terms of the Apache License 2.0 -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - -# 'traitlets' uses module 'inspect' from default Python library to inspect -# source code of modules. However, frozen app does not contain source code -# of Python modules. -# -# hook-IPython depends on module 'traitlets'. - -import traitlets.traitlets - - -def _disabled_deprecation_warnings(method, cls, method_name, msg): - pass - - -traitlets.traitlets._deprecated_method = _disabled_deprecation_warnings diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_usb.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_usb.py deleted file mode 100644 index b64624d..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_usb.py +++ /dev/null @@ -1,85 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2013-2020, PyInstaller Development Team. -# -# This file is distributed under the terms of the Apache License 2.0 -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: Apache-2.0 -#----------------------------------------------------------------------------- - - -import ctypes -import glob -import os -import sys -# Pyusb changed these libusb module names in commit 2082e7. -try: - import usb.backend.libusb10 as libusb10 -except ImportError: - import usb.backend.libusb1 as libusb10 -try: - import usb.backend.libusb01 as libusb01 -except ImportError: - import usb.backend.libusb0 as libusb01 -import usb.backend.openusb as openusb - - -def get_load_func(type, candidates): - - def _load_library(find_library=None): - exec_path = sys._MEIPASS - - library = None - for candidate in candidates: - - # Find a list of library files that match 'candidate'. - if find_library: - # Caller provides a function that lookup lib path by candidate name. - lib_path = find_library(candidate) - libs = [lib_path] if lib_path else [] - else: - # No find_library callback function, we look at the default location. - if os.name == 'posix' and sys.platform == 'darwin': - libs = glob.glob("%s/%s*.dylib*" % (exec_path, candidate)) - elif sys.platform == 'win32' or sys.platform == 'cygwin': - libs = glob.glob("%s\\%s*.dll" % (exec_path, candidate)) - else: - libs = glob.glob("%s/%s*.so*" % (exec_path, candidate)) - - # Do linker's path lookup work to force load bundled copy. - for libname in libs: - try: - # NOTE: libusb01 is using CDLL under win32. - # (see usb.backends.libusb01) - if sys.platform == 'win32' and type != 'libusb01': - library = ctypes.WinDLL(libname) - else: - library = ctypes.CDLL(libname) - if library is not None: - break - except OSError: - library = None - if library is not None: - break - else: - raise OSError('USB library could not be found') - - if type == 'libusb10': - if not hasattr(library, 'libusb_init'): - raise OSError('USB library could not be found') - return library - - return _load_library - - -# NOTE: Need to keep in sync with future PyUSB updates. -if sys.platform == 'cygwin': - libusb10._load_library = get_load_func('libusb10', ('cygusb-1.0', )) - libusb01._load_library = get_load_func('libusb01', ('cygusb0', )) - openusb._load_library = get_load_func('openusb', ('openusb', )) -else: - libusb10._load_library = get_load_func('libusb10', ('usb-1.0', 'libusb-1.0', 'usb')) - libusb01._load_library = get_load_func('libusb01', ('usb-0.1', 'usb', 'libusb0', 'libusb')) - openusb._load_library = get_load_func('openusb', ('openusb', )) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__init__.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__init__.py deleted file mode 100644 index 89c0c0f..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 605bb3d..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-BTrees.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-BTrees.cpython-312.pyc deleted file mode 100644 index 0be14f2..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-BTrees.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-CTkMessagebox.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-CTkMessagebox.cpython-312.pyc deleted file mode 100644 index ce10797..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-CTkMessagebox.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-Crypto.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-Crypto.cpython-312.pyc deleted file mode 100644 index 17f67c9..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-Crypto.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-Cryptodome.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-Cryptodome.cpython-312.pyc deleted file mode 100644 index 0730131..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-Cryptodome.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-HtmlTestRunner.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-HtmlTestRunner.cpython-312.pyc deleted file mode 100644 index 93b1979..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-HtmlTestRunner.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-IPython.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-IPython.cpython-312.pyc deleted file mode 100644 index 948353a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-IPython.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-OpenGL.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-OpenGL.cpython-312.pyc deleted file mode 100644 index 92b2c04..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-OpenGL.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-OpenGL_accelerate.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-OpenGL_accelerate.cpython-312.pyc deleted file mode 100644 index 8ee627d..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-OpenGL_accelerate.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-PyTaskbar.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-PyTaskbar.cpython-312.pyc deleted file mode 100644 index c86eee4..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-PyTaskbar.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-Xlib.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-Xlib.cpython-312.pyc deleted file mode 100644 index 3edb20a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-Xlib.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-_mssql.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-_mssql.cpython-312.pyc deleted file mode 100644 index 9cd71ad..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-_mssql.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-_mysql.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-_mysql.cpython-312.pyc deleted file mode 100644 index 51cc27a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-_mysql.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-accessible_output2.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-accessible_output2.cpython-312.pyc deleted file mode 100644 index ac07cab..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-accessible_output2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-adbc_driver_manager.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-adbc_driver_manager.cpython-312.pyc deleted file mode 100644 index 431ceb9..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-adbc_driver_manager.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-adbutils.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-adbutils.cpython-312.pyc deleted file mode 100644 index 351f62a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-adbutils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-adios.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-adios.cpython-312.pyc deleted file mode 100644 index 3b0c19e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-adios.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-afmformats.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-afmformats.cpython-312.pyc deleted file mode 100644 index e4329e0..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-afmformats.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-aliyunsdkcore.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-aliyunsdkcore.cpython-312.pyc deleted file mode 100644 index 02e81dd..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-aliyunsdkcore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-altair.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-altair.cpython-312.pyc deleted file mode 100644 index 4b3b456..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-altair.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-amazonproduct.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-amazonproduct.cpython-312.pyc deleted file mode 100644 index e3cf963..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-amazonproduct.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-anyio.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-anyio.cpython-312.pyc deleted file mode 100644 index 9925897..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-anyio.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-apkutils.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-apkutils.cpython-312.pyc deleted file mode 100644 index f595730..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-apkutils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-appdirs.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-appdirs.cpython-312.pyc deleted file mode 100644 index cbc9997..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-appdirs.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-appy.pod.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-appy.pod.cpython-312.pyc deleted file mode 100644 index 442dbed..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-appy.pod.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-apscheduler.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-apscheduler.cpython-312.pyc deleted file mode 100644 index 7f0f90d..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-apscheduler.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-argon2.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-argon2.cpython-312.pyc deleted file mode 100644 index 811c833..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-argon2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-astor.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-astor.cpython-312.pyc deleted file mode 100644 index 1b2965b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-astor.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-astroid.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-astroid.cpython-312.pyc deleted file mode 100644 index b433fc2..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-astroid.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-astropy.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-astropy.cpython-312.pyc deleted file mode 100644 index 685f2dc..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-astropy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-astropy_iers_data.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-astropy_iers_data.cpython-312.pyc deleted file mode 100644 index 0dfad28..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-astropy_iers_data.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-av.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-av.cpython-312.pyc deleted file mode 100644 index e2d3c9c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-av.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-avro.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-avro.cpython-312.pyc deleted file mode 100644 index 08dbfc1..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-avro.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-azurerm.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-azurerm.cpython-312.pyc deleted file mode 100644 index 31a19bb..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-azurerm.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-backports.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-backports.cpython-312.pyc deleted file mode 100644 index ba636b9..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-backports.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-backports.zoneinfo.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-backports.zoneinfo.cpython-312.pyc deleted file mode 100644 index e67f0f0..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-backports.zoneinfo.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bacon.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bacon.cpython-312.pyc deleted file mode 100644 index acf99e2..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bacon.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bcrypt.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bcrypt.cpython-312.pyc deleted file mode 100644 index d10c5b2..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bcrypt.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bitsandbytes.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bitsandbytes.cpython-312.pyc deleted file mode 100644 index 4966ba7..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bitsandbytes.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-black.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-black.cpython-312.pyc deleted file mode 100644 index ed4198b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-black.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bleak.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bleak.cpython-312.pyc deleted file mode 100644 index 9732370..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bleak.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-blib2to3.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-blib2to3.cpython-312.pyc deleted file mode 100644 index 11e0b74..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-blib2to3.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-blspy.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-blspy.cpython-312.pyc deleted file mode 100644 index 094cbc8..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-blspy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bokeh.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bokeh.cpython-312.pyc deleted file mode 100644 index 705bf8c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bokeh.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-boto.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-boto.cpython-312.pyc deleted file mode 100644 index 5d6e724..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-boto.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-boto3.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-boto3.cpython-312.pyc deleted file mode 100644 index 07852e2..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-boto3.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-botocore.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-botocore.cpython-312.pyc deleted file mode 100644 index a8fa043..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-botocore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-branca.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-branca.cpython-312.pyc deleted file mode 100644 index 5528917..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-branca.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cairocffi.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cairocffi.cpython-312.pyc deleted file mode 100644 index d8e3a43..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cairocffi.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cairosvg.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cairosvg.cpython-312.pyc deleted file mode 100644 index 1b3be9f..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cairosvg.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-capstone.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-capstone.cpython-312.pyc deleted file mode 100644 index 71fa261..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-capstone.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cassandra.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cassandra.cpython-312.pyc deleted file mode 100644 index c595c2d..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cassandra.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-celpy.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-celpy.cpython-312.pyc deleted file mode 100644 index 1e22967..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-celpy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-certifi.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-certifi.cpython-312.pyc deleted file mode 100644 index 334ce3d..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-certifi.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cf_units.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cf_units.cpython-312.pyc deleted file mode 100644 index 2567a83..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cf_units.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cftime.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cftime.cpython-312.pyc deleted file mode 100644 index 4213c3e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cftime.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-chardet.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-chardet.cpython-312.pyc deleted file mode 100644 index 028c030..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-chardet.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-charset_normalizer.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-charset_normalizer.cpython-312.pyc deleted file mode 100644 index e88f73c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-charset_normalizer.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cloudpickle.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cloudpickle.cpython-312.pyc deleted file mode 100644 index 1315476..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cloudpickle.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cloudscraper.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cloudscraper.cpython-312.pyc deleted file mode 100644 index e82f4e5..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cloudscraper.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-clr.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-clr.cpython-312.pyc deleted file mode 100644 index db7347c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-clr.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-clr_loader.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-clr_loader.cpython-312.pyc deleted file mode 100644 index a0b9e7f..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-clr_loader.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cmocean.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cmocean.cpython-312.pyc deleted file mode 100644 index 89eed95..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cmocean.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-compliance_checker.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-compliance_checker.cpython-312.pyc deleted file mode 100644 index 7056572..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-compliance_checker.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-comtypes.client.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-comtypes.client.cpython-312.pyc deleted file mode 100644 index 3bef570..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-comtypes.client.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-countrycode.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-countrycode.cpython-312.pyc deleted file mode 100644 index eef49b3..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-countrycode.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-countryinfo.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-countryinfo.cpython-312.pyc deleted file mode 100644 index b59177c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-countryinfo.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cryptography.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cryptography.cpython-312.pyc deleted file mode 100644 index 604dc65..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cryptography.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cumm.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cumm.cpython-312.pyc deleted file mode 100644 index da23c04..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cumm.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-customtkinter.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-customtkinter.cpython-312.pyc deleted file mode 100644 index 605c861..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-customtkinter.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cv2.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cv2.cpython-312.pyc deleted file mode 100644 index 4fc5c0c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cv2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cx_Oracle.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cx_Oracle.cpython-312.pyc deleted file mode 100644 index 4c095ed..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cx_Oracle.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cytoolz.itertoolz.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cytoolz.itertoolz.cpython-312.pyc deleted file mode 100644 index 228786f..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cytoolz.itertoolz.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash.cpython-312.pyc deleted file mode 100644 index 29774d6..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_bootstrap_components.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_bootstrap_components.cpython-312.pyc deleted file mode 100644 index d940120..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_bootstrap_components.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_core_components.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_core_components.cpython-312.pyc deleted file mode 100644 index 159eaee..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_core_components.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_html_components.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_html_components.cpython-312.pyc deleted file mode 100644 index 8c7f6b8..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_html_components.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_renderer.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_renderer.cpython-312.pyc deleted file mode 100644 index 429e2be..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_renderer.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_table.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_table.cpython-312.pyc deleted file mode 100644 index d843418..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_table.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_uploader.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_uploader.cpython-312.pyc deleted file mode 100644 index 50e641b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_uploader.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dask.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dask.cpython-312.pyc deleted file mode 100644 index ded9f2a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dask.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-datasets.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-datasets.cpython-312.pyc deleted file mode 100644 index 2f6ff7e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-datasets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dateparser.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dateparser.cpython-312.pyc deleted file mode 100644 index 2533d27..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dateparser.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dateparser.utils.strptime.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dateparser.utils.strptime.cpython-312.pyc deleted file mode 100644 index 3ccdbd0..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dateparser.utils.strptime.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dateutil.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dateutil.cpython-312.pyc deleted file mode 100644 index 1016184..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dateutil.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dbus_fast.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dbus_fast.cpython-312.pyc deleted file mode 100644 index 1cd9017..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dbus_fast.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dclab.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dclab.cpython-312.pyc deleted file mode 100644 index fc0ea95..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dclab.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ddgs.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ddgs.cpython-312.pyc deleted file mode 100644 index af6f841..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ddgs.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-detectron2.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-detectron2.cpython-312.pyc deleted file mode 100644 index e3fb755..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-detectron2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-discid.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-discid.cpython-312.pyc deleted file mode 100644 index c551e8c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-discid.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-distorm3.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-distorm3.cpython-312.pyc deleted file mode 100644 index 82763ac..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-distorm3.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-distributed.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-distributed.cpython-312.pyc deleted file mode 100644 index 261aaf7..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-distributed.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dns.rdata.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dns.rdata.cpython-312.pyc deleted file mode 100644 index f03b427..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dns.rdata.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-docutils.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-docutils.cpython-312.pyc deleted file mode 100644 index 8389a3e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-docutils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-docx.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-docx.cpython-312.pyc deleted file mode 100644 index 281ea65..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-docx.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-docx2pdf.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-docx2pdf.cpython-312.pyc deleted file mode 100644 index 7f0f247..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-docx2pdf.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-duckdb.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-duckdb.cpython-312.pyc deleted file mode 100644 index 4c967e0..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-duckdb.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dynaconf.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dynaconf.cpython-312.pyc deleted file mode 100644 index 6636ba5..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dynaconf.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-easyocr.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-easyocr.cpython-312.pyc deleted file mode 100644 index e9744b6..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-easyocr.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eccodeslib.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eccodeslib.cpython-312.pyc deleted file mode 100644 index ee88d9c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eccodeslib.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eckitlib.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eckitlib.cpython-312.pyc deleted file mode 100644 index 94216bc..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eckitlib.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eel.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eel.cpython-312.pyc deleted file mode 100644 index f9c2a4a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eel.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-emoji.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-emoji.cpython-312.pyc deleted file mode 100644 index 85ce580..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-emoji.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-enchant.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-enchant.cpython-312.pyc deleted file mode 100644 index 0453072..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-enchant.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eng_to_ipa.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eng_to_ipa.cpython-312.pyc deleted file mode 100644 index c0002f4..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eng_to_ipa.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ens.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ens.cpython-312.pyc deleted file mode 100644 index 33f88e9..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ens.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-enzyme.parsers.ebml.core.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-enzyme.parsers.ebml.core.cpython-312.pyc deleted file mode 100644 index f22d6a8..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-enzyme.parsers.ebml.core.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_abi.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_abi.cpython-312.pyc deleted file mode 100644 index 0c16bda..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_abi.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_account.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_account.cpython-312.pyc deleted file mode 100644 index 30a5be1..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_account.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_hash.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_hash.cpython-312.pyc deleted file mode 100644 index 3c51cc8..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_hash.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_keyfile.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_keyfile.cpython-312.pyc deleted file mode 100644 index 4061f1c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_keyfile.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_keys.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_keys.cpython-312.pyc deleted file mode 100644 index efae614..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_keys.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_rlp.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_rlp.cpython-312.pyc deleted file mode 100644 index 71fe125..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_rlp.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_typing.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_typing.cpython-312.pyc deleted file mode 100644 index 2d41418..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_typing.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_utils.cpython-312.pyc deleted file mode 100644 index 08bb3d6..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_utils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_utils.network.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_utils.network.cpython-312.pyc deleted file mode 100644 index b69fa8e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_utils.network.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-exchangelib.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-exchangelib.cpython-312.pyc deleted file mode 100644 index cf53a0b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-exchangelib.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fabric.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fabric.cpython-312.pyc deleted file mode 100644 index ec261bb..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fabric.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fairscale.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fairscale.cpython-312.pyc deleted file mode 100644 index 4393618..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fairscale.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fake_useragent.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fake_useragent.cpython-312.pyc deleted file mode 100644 index 42f0c4c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fake_useragent.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-faker.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-faker.cpython-312.pyc deleted file mode 100644 index 1dc606c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-faker.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-falcon.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-falcon.cpython-312.pyc deleted file mode 100644 index 7fbdd69..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-falcon.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fastai.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fastai.cpython-312.pyc deleted file mode 100644 index 67b014b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fastai.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fastparquet.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fastparquet.cpython-312.pyc deleted file mode 100644 index bf9c9e5..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fastparquet.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fckitlib.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fckitlib.cpython-312.pyc deleted file mode 100644 index 9a76375..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fckitlib.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ffpyplayer.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ffpyplayer.cpython-312.pyc deleted file mode 100644 index 2e77446..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ffpyplayer.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fiona.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fiona.cpython-312.pyc deleted file mode 100644 index 4e2106f..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fiona.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flask_compress.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flask_compress.cpython-312.pyc deleted file mode 100644 index 6ccb42f..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flask_compress.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flask_restx.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flask_restx.cpython-312.pyc deleted file mode 100644 index 9b5a27a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flask_restx.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flex.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flex.cpython-312.pyc deleted file mode 100644 index 66518ec..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flex.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flirpy.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flirpy.cpython-312.pyc deleted file mode 100644 index cef95e3..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flirpy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fmpy.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fmpy.cpython-312.pyc deleted file mode 100644 index 6d05e30..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fmpy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-folium.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-folium.cpython-312.pyc deleted file mode 100644 index d09acdd..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-folium.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-freetype.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-freetype.cpython-312.pyc deleted file mode 100644 index fa5e116..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-freetype.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-frictionless.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-frictionless.cpython-312.pyc deleted file mode 100644 index c4708cc..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-frictionless.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fsspec.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fsspec.cpython-312.pyc deleted file mode 100644 index 7563e0f..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fsspec.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fvcore.nn.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fvcore.nn.cpython-312.pyc deleted file mode 100644 index fd8e201..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fvcore.nn.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gadfly.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gadfly.cpython-312.pyc deleted file mode 100644 index 2604dd2..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gadfly.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gbulb.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gbulb.cpython-312.pyc deleted file mode 100644 index 1660c41..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gbulb.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gcloud.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gcloud.cpython-312.pyc deleted file mode 100644 index 5445fcc..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gcloud.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-geopandas.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-geopandas.cpython-312.pyc deleted file mode 100644 index 3a86216..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-geopandas.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gitlab.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gitlab.cpython-312.pyc deleted file mode 100644 index a77e7de..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gitlab.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-globus_sdk.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-globus_sdk.cpython-312.pyc deleted file mode 100644 index 74c1b3d..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-globus_sdk.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gmplot.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gmplot.cpython-312.pyc deleted file mode 100644 index 6cd15e0..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gmplot.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gmsh.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gmsh.cpython-312.pyc deleted file mode 100644 index 5614c72..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gmsh.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gooey.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gooey.cpython-312.pyc deleted file mode 100644 index 5950d29..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gooey.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.api_core.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.api_core.cpython-312.pyc deleted file mode 100644 index 7daafc5..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.api_core.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.bigquery.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.bigquery.cpython-312.pyc deleted file mode 100644 index fe3c58b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.bigquery.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.core.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.core.cpython-312.pyc deleted file mode 100644 index 0dc7dea..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.core.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.kms_v1.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.kms_v1.cpython-312.pyc deleted file mode 100644 index 7ad7b39..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.kms_v1.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.pubsub_v1.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.pubsub_v1.cpython-312.pyc deleted file mode 100644 index d2aa1db..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.pubsub_v1.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.speech.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.speech.cpython-312.pyc deleted file mode 100644 index 6be5d0c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.speech.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.storage.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.storage.cpython-312.pyc deleted file mode 100644 index aed1013..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.storage.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.translate.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.translate.cpython-312.pyc deleted file mode 100644 index 8b6bc11..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.translate.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-googleapiclient.model.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-googleapiclient.model.cpython-312.pyc deleted file mode 100644 index 2177c73..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-googleapiclient.model.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-grapheme.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-grapheme.cpython-312.pyc deleted file mode 100644 index 2eac354..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-grapheme.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-graphql_query.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-graphql_query.cpython-312.pyc deleted file mode 100644 index 307860e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-graphql_query.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-great_expectations.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-great_expectations.cpython-312.pyc deleted file mode 100644 index 84b5d26..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-great_expectations.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gribapi.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gribapi.cpython-312.pyc deleted file mode 100644 index b893d30..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gribapi.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-grpc.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-grpc.cpython-312.pyc deleted file mode 100644 index b664944..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-grpc.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gtk.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gtk.cpython-312.pyc deleted file mode 100644 index f55839f..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gtk.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-h3.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-h3.cpython-312.pyc deleted file mode 100644 index a908b14..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-h3.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-h5py.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-h5py.cpython-312.pyc deleted file mode 100644 index cc4b4d6..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-h5py.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-hdf5plugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-hdf5plugin.cpython-312.pyc deleted file mode 100644 index f37fd74..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-hdf5plugin.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-hexbytes.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-hexbytes.cpython-312.pyc deleted file mode 100644 index 0821f83..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-hexbytes.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-httplib2.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-httplib2.cpython-312.pyc deleted file mode 100644 index b650a56..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-httplib2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-humanize.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-humanize.cpython-312.pyc deleted file mode 100644 index 49878a9..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-humanize.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-hydra.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-hydra.cpython-312.pyc deleted file mode 100644 index 0999c72..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-hydra.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ijson.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ijson.cpython-312.pyc deleted file mode 100644 index 0fdc18d..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ijson.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-imageio.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-imageio.cpython-312.pyc deleted file mode 100644 index 011dba0..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-imageio.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-imageio_ffmpeg.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-imageio_ffmpeg.cpython-312.pyc deleted file mode 100644 index fb58f30..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-imageio_ffmpeg.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-imagingcontrol4.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-imagingcontrol4.cpython-312.pyc deleted file mode 100644 index c17a3d3..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-imagingcontrol4.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-iminuit.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-iminuit.cpython-312.pyc deleted file mode 100644 index 4de9689..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-iminuit.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-intake.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-intake.cpython-312.pyc deleted file mode 100644 index bd185a3..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-intake.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-iso639.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-iso639.cpython-312.pyc deleted file mode 100644 index 23c208d..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-iso639.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-itk.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-itk.cpython-312.pyc deleted file mode 100644 index c35ab12..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-itk.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jaraco.text.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jaraco.text.cpython-312.pyc deleted file mode 100644 index fccf425..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jaraco.text.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jedi.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jedi.cpython-312.pyc deleted file mode 100644 index d2d0f04..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jedi.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jieba.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jieba.cpython-312.pyc deleted file mode 100644 index 242b67b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jieba.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jinja2.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jinja2.cpython-312.pyc deleted file mode 100644 index b883d8a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jinja2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jinxed.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jinxed.cpython-312.pyc deleted file mode 100644 index 3cf5a44..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jinxed.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jira.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jira.cpython-312.pyc deleted file mode 100644 index 327e3e1..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jira.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonpath_rw_ext.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonpath_rw_ext.cpython-312.pyc deleted file mode 100644 index b7936c7..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonpath_rw_ext.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonrpcserver.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonrpcserver.cpython-312.pyc deleted file mode 100644 index a7cdecc..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonrpcserver.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonschema.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonschema.cpython-312.pyc deleted file mode 100644 index dd4c7be..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonschema.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonschema_specifications.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonschema_specifications.cpython-312.pyc deleted file mode 100644 index 3493e84..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonschema_specifications.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jupyterlab.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jupyterlab.cpython-312.pyc deleted file mode 100644 index 6b741eb..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jupyterlab.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-kaleido.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-kaleido.cpython-312.pyc deleted file mode 100644 index 9723e41..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-kaleido.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-khmernltk.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-khmernltk.cpython-312.pyc deleted file mode 100644 index f57e2f6..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-khmernltk.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-kinterbasdb.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-kinterbasdb.cpython-312.pyc deleted file mode 100644 index 639772d..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-kinterbasdb.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-langchain.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-langchain.cpython-312.pyc deleted file mode 100644 index f81e494..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-langchain.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-langchain_classic.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-langchain_classic.cpython-312.pyc deleted file mode 100644 index bbcff88..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-langchain_classic.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-langcodes.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-langcodes.cpython-312.pyc deleted file mode 100644 index 495bd50..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-langcodes.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-langdetect.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-langdetect.cpython-312.pyc deleted file mode 100644 index ae3474f..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-langdetect.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-laonlp.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-laonlp.cpython-312.pyc deleted file mode 100644 index 3a2b8e1..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-laonlp.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lark.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lark.cpython-312.pyc deleted file mode 100644 index 572eb04..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lark.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ldfparser.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ldfparser.cpython-312.pyc deleted file mode 100644 index daa3ac0..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ldfparser.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lensfunpy.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lensfunpy.cpython-312.pyc deleted file mode 100644 index 5949bac..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lensfunpy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-libaudioverse.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-libaudioverse.cpython-312.pyc deleted file mode 100644 index 0ddb203..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-libaudioverse.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-librosa.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-librosa.cpython-312.pyc deleted file mode 100644 index ede1a4d..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-librosa.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lightgbm.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lightgbm.cpython-312.pyc deleted file mode 100644 index ccd726d..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lightgbm.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lightning.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lightning.cpython-312.pyc deleted file mode 100644 index 4368f63..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lightning.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-limits.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-limits.cpython-312.pyc deleted file mode 100644 index 23bf881..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-limits.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-linear_operator.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-linear_operator.cpython-312.pyc deleted file mode 100644 index d54528d..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-linear_operator.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lingua.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lingua.cpython-312.pyc deleted file mode 100644 index ee9a031..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lingua.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-litestar.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-litestar.cpython-312.pyc deleted file mode 100644 index 2b8937d..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-litestar.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-llvmlite.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-llvmlite.cpython-312.pyc deleted file mode 100644 index ef3c136..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-llvmlite.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-logilab.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-logilab.cpython-312.pyc deleted file mode 100644 index b26f384..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-logilab.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.cpython-312.pyc deleted file mode 100644 index 9c49f61..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.etree.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.etree.cpython-312.pyc deleted file mode 100644 index cded39a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.etree.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.isoschematron.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.isoschematron.cpython-312.pyc deleted file mode 100644 index 01cd9d9..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.isoschematron.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.objectify.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.objectify.cpython-312.pyc deleted file mode 100644 index 25e7ae5..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.objectify.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lz4.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lz4.cpython-312.pyc deleted file mode 100644 index 58cb5c8..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lz4.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-magic.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-magic.cpython-312.pyc deleted file mode 100644 index 2960833..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-magic.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mako.codegen.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mako.codegen.cpython-312.pyc deleted file mode 100644 index 65fa7fa..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mako.codegen.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mariadb.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mariadb.cpython-312.pyc deleted file mode 100644 index 03a637a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mariadb.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-markdown.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-markdown.cpython-312.pyc deleted file mode 100644 index b1bbd5d..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-markdown.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mecab.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mecab.cpython-312.pyc deleted file mode 100644 index a79f1db..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mecab.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-metpy.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-metpy.cpython-312.pyc deleted file mode 100644 index c691a4b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-metpy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-migrate.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-migrate.cpython-312.pyc deleted file mode 100644 index 613832e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-migrate.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mimesis.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mimesis.cpython-312.pyc deleted file mode 100644 index 8fb56a4..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mimesis.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-minecraft_launcher_lib.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-minecraft_launcher_lib.cpython-312.pyc deleted file mode 100644 index 27a63ef..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-minecraft_launcher_lib.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mistune.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mistune.cpython-312.pyc deleted file mode 100644 index 843883b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mistune.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mnemonic.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mnemonic.cpython-312.pyc deleted file mode 100644 index 9815d14..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mnemonic.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-monai.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-monai.cpython-312.pyc deleted file mode 100644 index 730947b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-monai.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-moviepy.audio.fx.all.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-moviepy.audio.fx.all.cpython-312.pyc deleted file mode 100644 index 5acae4d..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-moviepy.audio.fx.all.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-moviepy.video.fx.all.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-moviepy.video.fx.all.cpython-312.pyc deleted file mode 100644 index aedca8b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-moviepy.video.fx.all.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mpl_toolkits.basemap.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mpl_toolkits.basemap.cpython-312.pyc deleted file mode 100644 index 001cddc..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mpl_toolkits.basemap.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-msoffcrypto.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-msoffcrypto.cpython-312.pyc deleted file mode 100644 index 5f7b37d..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-msoffcrypto.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nacl.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nacl.cpython-312.pyc deleted file mode 100644 index 51c67ee..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nacl.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-names.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-names.cpython-312.pyc deleted file mode 100644 index cae36cf..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-names.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nanite.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nanite.cpython-312.pyc deleted file mode 100644 index 018a223..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nanite.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-narwhals.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-narwhals.cpython-312.pyc deleted file mode 100644 index fe78582..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-narwhals.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nbconvert.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nbconvert.cpython-312.pyc deleted file mode 100644 index 5851a03..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nbconvert.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nbdime.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nbdime.cpython-312.pyc deleted file mode 100644 index 6139de2..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nbdime.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nbformat.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nbformat.cpython-312.pyc deleted file mode 100644 index 5d62001..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nbformat.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nbt.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nbt.cpython-312.pyc deleted file mode 100644 index 61a8310..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nbt.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ncclient.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ncclient.cpython-312.pyc deleted file mode 100644 index 0952230..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ncclient.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-netCDF4.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-netCDF4.cpython-312.pyc deleted file mode 100644 index 102e3bc..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-netCDF4.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nicegui.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nicegui.cpython-312.pyc deleted file mode 100644 index 7d9d101..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nicegui.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-niquests.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-niquests.cpython-312.pyc deleted file mode 100644 index bf600bf..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-niquests.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nltk.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nltk.cpython-312.pyc deleted file mode 100644 index 064f32b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nltk.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nnpy.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nnpy.cpython-312.pyc deleted file mode 100644 index 49adeb9..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nnpy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-notebook.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-notebook.cpython-312.pyc deleted file mode 100644 index 02f7598..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-notebook.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-numba.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-numba.cpython-312.pyc deleted file mode 100644 index 7c25f72..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-numba.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-numbers_parser.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-numbers_parser.cpython-312.pyc deleted file mode 100644 index 1b7de14..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-numbers_parser.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-numcodecs.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-numcodecs.cpython-312.pyc deleted file mode 100644 index a8b6343..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-numcodecs.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cublas.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cublas.cpython-312.pyc deleted file mode 100644 index e9a69a1..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cublas.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cuda_cupti.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cuda_cupti.cpython-312.pyc deleted file mode 100644 index 17a3f66..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cuda_cupti.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cuda_nvcc.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cuda_nvcc.cpython-312.pyc deleted file mode 100644 index 90fbf3c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cuda_nvcc.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cuda_nvrtc.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cuda_nvrtc.cpython-312.pyc deleted file mode 100644 index 9a7c79b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cuda_nvrtc.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cuda_runtime.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cuda_runtime.cpython-312.pyc deleted file mode 100644 index b7631f6..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cuda_runtime.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cudnn.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cudnn.cpython-312.pyc deleted file mode 100644 index 3c7a6dd..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cudnn.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cufft.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cufft.cpython-312.pyc deleted file mode 100644 index 9661060..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cufft.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.curand.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.curand.cpython-312.pyc deleted file mode 100644 index 1c55737..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.curand.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cusolver.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cusolver.cpython-312.pyc deleted file mode 100644 index 4a36d37..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cusolver.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cusparse.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cusparse.cpython-312.pyc deleted file mode 100644 index 8fc1092..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cusparse.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.nccl.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.nccl.cpython-312.pyc deleted file mode 100644 index 3eaabcc..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.nccl.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.nvjitlink.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.nvjitlink.cpython-312.pyc deleted file mode 100644 index d947028..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.nvjitlink.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.nvtx.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.nvtx.cpython-312.pyc deleted file mode 100644 index 966b9ec..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.nvtx.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-office365.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-office365.cpython-312.pyc deleted file mode 100644 index 4882740..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-office365.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-onnxruntime.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-onnxruntime.cpython-312.pyc deleted file mode 100644 index 367d43c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-onnxruntime.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-opencc.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-opencc.cpython-312.pyc deleted file mode 100644 index b9330c8..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-opencc.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-openpyxl.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-openpyxl.cpython-312.pyc deleted file mode 100644 index e32eb4e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-openpyxl.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-opentelemetry.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-opentelemetry.cpython-312.pyc deleted file mode 100644 index d13fd0b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-opentelemetry.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-orjson.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-orjson.cpython-312.pyc deleted file mode 100644 index 42cc086..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-orjson.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-osgeo.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-osgeo.cpython-312.pyc deleted file mode 100644 index 7c3e461..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-osgeo.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pandas_flavor.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pandas_flavor.cpython-312.pyc deleted file mode 100644 index cfab310..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pandas_flavor.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-panel.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-panel.cpython-312.pyc deleted file mode 100644 index d74d56b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-panel.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-parsedatetime.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-parsedatetime.cpython-312.pyc deleted file mode 100644 index 87da605..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-parsedatetime.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-parso.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-parso.cpython-312.pyc deleted file mode 100644 index 08e090e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-parso.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-passlib.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-passlib.cpython-312.pyc deleted file mode 100644 index 7dc604b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-passlib.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-paste.exceptions.reporter.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-paste.exceptions.reporter.cpython-312.pyc deleted file mode 100644 index 37c0086..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-paste.exceptions.reporter.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-patoolib.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-patoolib.cpython-312.pyc deleted file mode 100644 index f42c5eb..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-patoolib.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-patsy.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-patsy.cpython-312.pyc deleted file mode 100644 index e6e1c85..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-patsy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pdfminer.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pdfminer.cpython-312.pyc deleted file mode 100644 index a9a7f4b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pdfminer.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pendulum.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pendulum.cpython-312.pyc deleted file mode 100644 index 4ff1132..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pendulum.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-phonenumbers.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-phonenumbers.cpython-312.pyc deleted file mode 100644 index 1425208..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-phonenumbers.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pingouin.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pingouin.cpython-312.pyc deleted file mode 100644 index 81016b3..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pingouin.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pint.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pint.cpython-312.pyc deleted file mode 100644 index 55869d4..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pint.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pinyin.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pinyin.cpython-312.pyc deleted file mode 100644 index 79fa1f8..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pinyin.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-platformdirs.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-platformdirs.cpython-312.pyc deleted file mode 100644 index 320749a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-platformdirs.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-plotly.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-plotly.cpython-312.pyc deleted file mode 100644 index 1364d43..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-plotly.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pointcept.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pointcept.cpython-312.pyc deleted file mode 100644 index 2c60aff..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pointcept.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pptx.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pptx.cpython-312.pyc deleted file mode 100644 index dfdebad..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pptx.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-prettytable.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-prettytable.cpython-312.pyc deleted file mode 100644 index a67defc..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-prettytable.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-psutil.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-psutil.cpython-312.pyc deleted file mode 100644 index 360a8e0..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-psutil.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-psychopy.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-psychopy.cpython-312.pyc deleted file mode 100644 index dd9c6a1..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-psychopy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-psycopg2.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-psycopg2.cpython-312.pyc deleted file mode 100644 index 5269788..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-psycopg2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-psycopg_binary.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-psycopg_binary.cpython-312.pyc deleted file mode 100644 index 7505c72..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-psycopg_binary.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-publicsuffix2.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-publicsuffix2.cpython-312.pyc deleted file mode 100644 index f6a1549..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-publicsuffix2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pubsub.core.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pubsub.core.cpython-312.pyc deleted file mode 100644 index eb613af..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pubsub.core.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-puremagic.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-puremagic.cpython-312.pyc deleted file mode 100644 index ec44e87..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-puremagic.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-py.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-py.cpython-312.pyc deleted file mode 100644 index 03895db..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-py.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyarrow.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyarrow.cpython-312.pyc deleted file mode 100644 index bd870ed..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyarrow.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pycountry.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pycountry.cpython-312.pyc deleted file mode 100644 index 77fda6c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pycountry.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pycparser.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pycparser.cpython-312.pyc deleted file mode 100644 index bcb086c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pycparser.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pycrfsuite.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pycrfsuite.cpython-312.pyc deleted file mode 100644 index e5f5e7c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pycrfsuite.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pydantic.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pydantic.cpython-312.pyc deleted file mode 100644 index f1b9260..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pydantic.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pydicom.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pydicom.cpython-312.pyc deleted file mode 100644 index 9bd1e54..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pydicom.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pydivert.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pydivert.cpython-312.pyc deleted file mode 100644 index aa704bf..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pydivert.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyecharts.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyecharts.cpython-312.pyc deleted file mode 100644 index 361632e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyecharts.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-io.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-io.cpython-312.pyc deleted file mode 100644 index 68f96cd..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-io.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-ods.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-ods.cpython-312.pyc deleted file mode 100644 index 9c815e4..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-ods.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-ods3.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-ods3.cpython-312.pyc deleted file mode 100644 index 5026b76..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-ods3.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-odsr.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-odsr.cpython-312.pyc deleted file mode 100644 index 58b9bd9..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-odsr.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-xls.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-xls.cpython-312.pyc deleted file mode 100644 index 87979bf..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-xls.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-xlsx.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-xlsx.cpython-312.pyc deleted file mode 100644 index adc49bd..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-xlsx.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-xlsxw.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-xlsxw.cpython-312.pyc deleted file mode 100644 index 1d06452..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-xlsxw.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel.cpython-312.pyc deleted file mode 100644 index ecc1238..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_io.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_io.cpython-312.pyc deleted file mode 100644 index c5906d5..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_io.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_ods.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_ods.cpython-312.pyc deleted file mode 100644 index b4fd5c2..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_ods.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_ods3.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_ods3.cpython-312.pyc deleted file mode 100644 index ba0391e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_ods3.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_odsr.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_odsr.cpython-312.pyc deleted file mode 100644 index 9aab0c8..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_odsr.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_xls.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_xls.cpython-312.pyc deleted file mode 100644 index 634ad84..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_xls.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_xlsx.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_xlsx.cpython-312.pyc deleted file mode 100644 index 7e7fb6b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_xlsx.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_xlsxw.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_xlsxw.cpython-312.pyc deleted file mode 100644 index 5d0a781..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_xlsxw.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcelerate.Writer.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcelerate.Writer.cpython-312.pyc deleted file mode 100644 index 97f0aba..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcelerate.Writer.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pygraphviz.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pygraphviz.cpython-312.pyc deleted file mode 100644 index 556cfae..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pygraphviz.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pygwalker.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pygwalker.cpython-312.pyc deleted file mode 100644 index b0d3c03..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pygwalker.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pylibmagic.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pylibmagic.cpython-312.pyc deleted file mode 100644 index adf5e52..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pylibmagic.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pylint.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pylint.cpython-312.pyc deleted file mode 100644 index 558d561..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pylint.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pylsl.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pylsl.cpython-312.pyc deleted file mode 100644 index 7fd9704..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pylsl.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pymediainfo.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pymediainfo.cpython-312.pyc deleted file mode 100644 index 13757f5..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pymediainfo.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pymeshlab.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pymeshlab.cpython-312.pyc deleted file mode 100644 index f207d09..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pymeshlab.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pymorphy3.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pymorphy3.cpython-312.pyc deleted file mode 100644 index e66db70..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pymorphy3.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pymssql.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pymssql.cpython-312.pyc deleted file mode 100644 index 698727c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pymssql.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pynng.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pynng.cpython-312.pyc deleted file mode 100644 index c7ad7ad..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pynng.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pynput.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pynput.cpython-312.pyc deleted file mode 100644 index d261043..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pynput.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyodbc.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyodbc.cpython-312.pyc deleted file mode 100644 index 429051f..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyodbc.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyopencl.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyopencl.cpython-312.pyc deleted file mode 100644 index c74ffc4..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyopencl.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypdfium2.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypdfium2.cpython-312.pyc deleted file mode 100644 index 5fffb83..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypdfium2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypdfium2_raw.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypdfium2_raw.cpython-312.pyc deleted file mode 100644 index d845cc7..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypdfium2_raw.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypemicro.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypemicro.cpython-312.pyc deleted file mode 100644 index 8d2a81c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypemicro.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyphen.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyphen.cpython-312.pyc deleted file mode 100644 index c4dbbe9..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyphen.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyppeteer.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyppeteer.cpython-312.pyc deleted file mode 100644 index 775d163..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyppeteer.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyproj.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyproj.cpython-312.pyc deleted file mode 100644 index 64f0fc1..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyproj.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypsexec.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypsexec.cpython-312.pyc deleted file mode 100644 index 80e5458..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypsexec.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypylon.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypylon.cpython-312.pyc deleted file mode 100644 index d002c99..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypylon.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyqtgraph.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyqtgraph.cpython-312.pyc deleted file mode 100644 index 9b8e4ba..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyqtgraph.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyshark.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyshark.cpython-312.pyc deleted file mode 100644 index a154666..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyshark.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pysnmp.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pysnmp.cpython-312.pyc deleted file mode 100644 index e9816e4..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pysnmp.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pystray.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pystray.cpython-312.pyc deleted file mode 100644 index 34c3bf3..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pystray.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pytest.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pytest.cpython-312.pyc deleted file mode 100644 index 37215e5..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pytest.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pythainlp.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pythainlp.cpython-312.pyc deleted file mode 100644 index 31aa835..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pythainlp.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pythoncom.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pythoncom.cpython-312.pyc deleted file mode 100644 index f20a7a2..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pythoncom.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pytokens.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pytokens.cpython-312.pyc deleted file mode 100644 index 2c66f8e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pytokens.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyttsx.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyttsx.cpython-312.pyc deleted file mode 100644 index a5fb8d2..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyttsx.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyttsx3.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyttsx3.cpython-312.pyc deleted file mode 100644 index d832f79..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyttsx3.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyviz_comms.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyviz_comms.cpython-312.pyc deleted file mode 100644 index 51a3930..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyviz_comms.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyvjoy.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyvjoy.cpython-312.pyc deleted file mode 100644 index 5824a27..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyvjoy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pywintypes.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pywintypes.cpython-312.pyc deleted file mode 100644 index 619c8ad..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pywintypes.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pywt.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pywt.cpython-312.pyc deleted file mode 100644 index b037219..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pywt.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-qtmodern.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-qtmodern.cpython-312.pyc deleted file mode 100644 index 64b00ed..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-qtmodern.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-radicale.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-radicale.cpython-312.pyc deleted file mode 100644 index 637fbd0..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-radicale.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-raven.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-raven.cpython-312.pyc deleted file mode 100644 index e69fbaf..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-raven.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rawpy.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rawpy.cpython-312.pyc deleted file mode 100644 index f6d4ef9..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rawpy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rdflib.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rdflib.cpython-312.pyc deleted file mode 100644 index 4dfa36b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rdflib.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-redmine.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-redmine.cpython-312.pyc deleted file mode 100644 index 3b7d9a1..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-redmine.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-regex.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-regex.cpython-312.pyc deleted file mode 100644 index a571bbd..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-regex.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-reportlab.lib.utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-reportlab.lib.utils.cpython-312.pyc deleted file mode 100644 index 345b050..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-reportlab.lib.utils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-reportlab.pdfbase._fontdata.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-reportlab.pdfbase._fontdata.cpython-312.pyc deleted file mode 100644 index 17a6fca..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-reportlab.pdfbase._fontdata.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-resampy.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-resampy.cpython-312.pyc deleted file mode 100644 index 7072aa5..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-resampy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rich.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rich.cpython-312.pyc deleted file mode 100644 index 359a697..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rich.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rlp.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rlp.cpython-312.pyc deleted file mode 100644 index 363c9da..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rlp.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rpy2.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rpy2.cpython-312.pyc deleted file mode 100644 index 932459a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rpy2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rtree.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rtree.cpython-312.pyc deleted file mode 100644 index 869ea09..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rtree.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ruamel.yaml.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ruamel.yaml.cpython-312.pyc deleted file mode 100644 index e0fcb7f..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ruamel.yaml.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rubicon.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rubicon.cpython-312.pyc deleted file mode 100644 index 06362b4..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rubicon.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sacremoses.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sacremoses.cpython-312.pyc deleted file mode 100644 index 5047e1c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sacremoses.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sam2.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sam2.cpython-312.pyc deleted file mode 100644 index e4d851d..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sam2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-saml2.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-saml2.cpython-312.pyc deleted file mode 100644 index 86fa30e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-saml2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-schwifty.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-schwifty.cpython-312.pyc deleted file mode 100644 index 0da9748..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-schwifty.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-seedir.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-seedir.cpython-312.pyc deleted file mode 100644 index 9483ec0..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-seedir.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-selectolax.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-selectolax.cpython-312.pyc deleted file mode 100644 index 5a80776..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-selectolax.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-selenium.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-selenium.cpython-312.pyc deleted file mode 100644 index 30cacb8..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-selenium.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sentry_sdk.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sentry_sdk.cpython-312.pyc deleted file mode 100644 index ec2d7b6..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sentry_sdk.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-setuptools_scm.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-setuptools_scm.cpython-312.pyc deleted file mode 100644 index 446e867..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-setuptools_scm.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-shapely.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-shapely.cpython-312.pyc deleted file mode 100644 index 13f69db..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-shapely.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-shotgun_api3.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-shotgun_api3.cpython-312.pyc deleted file mode 100644 index 822e9f2..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-shotgun_api3.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-simplemma.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-simplemma.cpython-312.pyc deleted file mode 100644 index f54db91..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-simplemma.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.color.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.color.cpython-312.pyc deleted file mode 100644 index 3d19e9c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.color.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.cpython-312.pyc deleted file mode 100644 index 64a2c56..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.data.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.data.cpython-312.pyc deleted file mode 100644 index 84cd0cd..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.data.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.draw.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.draw.cpython-312.pyc deleted file mode 100644 index 11ed96f..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.draw.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.exposure.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.exposure.cpython-312.pyc deleted file mode 100644 index 6405531..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.exposure.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.feature.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.feature.cpython-312.pyc deleted file mode 100644 index 97631b8..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.feature.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.filters.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.filters.cpython-312.pyc deleted file mode 100644 index 78b2c8e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.filters.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.future.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.future.cpython-312.pyc deleted file mode 100644 index be3636f..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.future.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.graph.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.graph.cpython-312.pyc deleted file mode 100644 index 00d1fa8..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.graph.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.io.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.io.cpython-312.pyc deleted file mode 100644 index 2f54a5e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.io.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.measure.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.measure.cpython-312.pyc deleted file mode 100644 index fbda603..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.measure.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.metrics.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.metrics.cpython-312.pyc deleted file mode 100644 index b98e31d..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.metrics.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.morphology.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.morphology.cpython-312.pyc deleted file mode 100644 index cf15d40..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.morphology.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.registration.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.registration.cpython-312.pyc deleted file mode 100644 index 6899f83..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.registration.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.restoration.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.restoration.cpython-312.pyc deleted file mode 100644 index df235dd..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.restoration.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.segmentation.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.segmentation.cpython-312.pyc deleted file mode 100644 index 48e4a2b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.segmentation.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.transform.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.transform.cpython-312.pyc deleted file mode 100644 index d8af41d..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.transform.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.cluster.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.cluster.cpython-312.pyc deleted file mode 100644 index e44a331..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.cluster.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.cpython-312.pyc deleted file mode 100644 index b6d46d9..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.externals.array_api_compat.cupy.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.externals.array_api_compat.cupy.cpython-312.pyc deleted file mode 100644 index c83c162..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.externals.array_api_compat.cupy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.externals.array_api_compat.dask.array.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.externals.array_api_compat.dask.array.cpython-312.pyc deleted file mode 100644 index e5bdcda..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.externals.array_api_compat.dask.array.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.externals.array_api_compat.numpy.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.externals.array_api_compat.numpy.cpython-312.pyc deleted file mode 100644 index a5e96cd..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.externals.array_api_compat.numpy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.externals.array_api_compat.torch.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.externals.array_api_compat.torch.cpython-312.pyc deleted file mode 100644 index 70b6649..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.externals.array_api_compat.torch.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.linear_model.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.linear_model.cpython-312.pyc deleted file mode 100644 index a693fbd..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.linear_model.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.metrics.cluster.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.metrics.cluster.cpython-312.pyc deleted file mode 100644 index e622612..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.metrics.cluster.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.metrics.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.metrics.cpython-312.pyc deleted file mode 100644 index 72e58a4..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.metrics.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.metrics.pairwise.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.metrics.pairwise.cpython-312.pyc deleted file mode 100644 index 1f7513c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.metrics.pairwise.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.neighbors.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.neighbors.cpython-312.pyc deleted file mode 100644 index 01af51a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.neighbors.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.tree.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.tree.cpython-312.pyc deleted file mode 100644 index 13565db..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.tree.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.utils.cpython-312.pyc deleted file mode 100644 index f3160da..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.utils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skyfield.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skyfield.cpython-312.pyc deleted file mode 100644 index 66c60d6..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skyfield.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-slixmpp.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-slixmpp.cpython-312.pyc deleted file mode 100644 index 1064f57..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-slixmpp.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sound_lib.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sound_lib.cpython-312.pyc deleted file mode 100644 index 34d5946..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sound_lib.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sounddevice.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sounddevice.cpython-312.pyc deleted file mode 100644 index d0c00bc..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sounddevice.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-soundfile.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-soundfile.cpython-312.pyc deleted file mode 100644 index b5028ff..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-soundfile.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-spacy.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-spacy.cpython-312.pyc deleted file mode 100644 index 447f0b8..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-spacy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-speech_recognition.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-speech_recognition.cpython-312.pyc deleted file mode 100644 index 1dffcfd..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-speech_recognition.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-spiceypy.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-spiceypy.cpython-312.pyc deleted file mode 100644 index 48aea17..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-spiceypy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-spnego.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-spnego.cpython-312.pyc deleted file mode 100644 index 256cb15..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-spnego.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-srsly.msgpack._packer.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-srsly.msgpack._packer.cpython-312.pyc deleted file mode 100644 index c6c0bc1..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-srsly.msgpack._packer.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sspilib.raw.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sspilib.raw.cpython-312.pyc deleted file mode 100644 index a58bd74..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sspilib.raw.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-statsmodels.tsa.statespace.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-statsmodels.tsa.statespace.cpython-312.pyc deleted file mode 100644 index b4151d0..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-statsmodels.tsa.statespace.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-stdnum.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-stdnum.cpython-312.pyc deleted file mode 100644 index 106b960..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-stdnum.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-storm.database.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-storm.database.cpython-312.pyc deleted file mode 100644 index 9e30da1..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-storm.database.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sudachipy.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sudachipy.cpython-312.pyc deleted file mode 100644 index ded5911..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sudachipy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sunpy.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sunpy.cpython-312.pyc deleted file mode 100644 index be4941f..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sunpy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sv_ttk.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sv_ttk.cpython-312.pyc deleted file mode 100644 index a8c5e1e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sv_ttk.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-swagger_spec_validator.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-swagger_spec_validator.cpython-312.pyc deleted file mode 100644 index d42b8cb..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-swagger_spec_validator.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tableauhyperapi.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tableauhyperapi.cpython-312.pyc deleted file mode 100644 index d32c480..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tableauhyperapi.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tables.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tables.cpython-312.pyc deleted file mode 100644 index f2eabac..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tables.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tcod.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tcod.cpython-312.pyc deleted file mode 100644 index f995f6f..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tcod.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tensorflow.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tensorflow.cpython-312.pyc deleted file mode 100644 index 6fd16aa..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tensorflow.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-text_unidecode.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-text_unidecode.cpython-312.pyc deleted file mode 100644 index 79c37ff..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-text_unidecode.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-textdistance.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-textdistance.cpython-312.pyc deleted file mode 100644 index 47adfd6..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-textdistance.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-thinc.backends.numpy_ops.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-thinc.backends.numpy_ops.cpython-312.pyc deleted file mode 100644 index dac3ac6..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-thinc.backends.numpy_ops.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-thinc.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-thinc.cpython-312.pyc deleted file mode 100644 index 78da787..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-thinc.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-timezonefinder.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-timezonefinder.cpython-312.pyc deleted file mode 100644 index 3feb8d9..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-timezonefinder.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-timm.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-timm.cpython-312.pyc deleted file mode 100644 index 8555583..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-timm.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tinycss2.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tinycss2.cpython-312.pyc deleted file mode 100644 index e864e3d..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tinycss2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tkinterdnd2.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tkinterdnd2.cpython-312.pyc deleted file mode 100644 index 6c07f0b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tkinterdnd2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tkinterweb.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tkinterweb.cpython-312.pyc deleted file mode 100644 index b631b44..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tkinterweb.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tkinterweb_tkhtml.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tkinterweb_tkhtml.cpython-312.pyc deleted file mode 100644 index 8696eee..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tkinterweb_tkhtml.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tkinterweb_tkhtml_extras.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tkinterweb_tkhtml_extras.cpython-312.pyc deleted file mode 100644 index 3ff336e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tkinterweb_tkhtml_extras.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga.cpython-312.pyc deleted file mode 100644 index fcbb1fa..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga_cocoa.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga_cocoa.cpython-312.pyc deleted file mode 100644 index a371c86..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga_cocoa.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga_gtk.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga_gtk.cpython-312.pyc deleted file mode 100644 index 723c243..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga_gtk.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga_winforms.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga_winforms.cpython-312.pyc deleted file mode 100644 index 9013285..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga_winforms.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torch.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torch.cpython-312.pyc deleted file mode 100644 index ceb9aba..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torch.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchao.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchao.cpython-312.pyc deleted file mode 100644 index b98abfb..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchao.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchaudio.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchaudio.cpython-312.pyc deleted file mode 100644 index a30f81e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchaudio.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchtext.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchtext.cpython-312.pyc deleted file mode 100644 index b4507ff..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchtext.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchvision.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchvision.cpython-312.pyc deleted file mode 100644 index 637ff49..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchvision.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchvision.io.image.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchvision.io.image.cpython-312.pyc deleted file mode 100644 index 631f9a4..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchvision.io.image.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame.cpython-312.pyc deleted file mode 100644 index 753a4de..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_client.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_client.cpython-312.pyc deleted file mode 100644 index 10eb753..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_client.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_code.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_code.cpython-312.pyc deleted file mode 100644 index e696d8a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_code.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_components.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_components.cpython-312.pyc deleted file mode 100644 index 5fb6f29..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_components.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_datagrid.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_datagrid.cpython-312.pyc deleted file mode 100644 index ce2d091..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_datagrid.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_deckgl.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_deckgl.cpython-312.pyc deleted file mode 100644 index 14227a6..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_deckgl.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_formkit.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_formkit.cpython-312.pyc deleted file mode 100644 index baae4b2..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_formkit.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_grid.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_grid.cpython-312.pyc deleted file mode 100644 index 27e6c6a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_grid.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_iframe.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_iframe.cpython-312.pyc deleted file mode 100644 index 515fb4e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_iframe.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_keycloak.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_keycloak.cpython-312.pyc deleted file mode 100644 index 569b6b3..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_keycloak.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_leaflet.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_leaflet.cpython-312.pyc deleted file mode 100644 index 03166c8..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_leaflet.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_markdown.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_markdown.cpython-312.pyc deleted file mode 100644 index 72237a6..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_markdown.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_matplotlib.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_matplotlib.cpython-312.pyc deleted file mode 100644 index a3a0f04..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_matplotlib.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_mesh_streamer.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_mesh_streamer.cpython-312.pyc deleted file mode 100644 index d603d54..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_mesh_streamer.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_plotly.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_plotly.cpython-312.pyc deleted file mode 100644 index 737722b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_plotly.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_pvui.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_pvui.cpython-312.pyc deleted file mode 100644 index fa8976a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_pvui.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_quasar.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_quasar.cpython-312.pyc deleted file mode 100644 index cf187fb..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_quasar.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_rca.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_rca.cpython-312.pyc deleted file mode 100644 index e1271af..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_rca.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_router.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_router.cpython-312.pyc deleted file mode 100644 index 0fd66d3..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_router.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_simput.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_simput.cpython-312.pyc deleted file mode 100644 index 8a6d110..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_simput.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_tauri.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_tauri.cpython-312.pyc deleted file mode 100644 index a2e6201..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_tauri.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_tweakpane.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_tweakpane.cpython-312.pyc deleted file mode 100644 index c1a79b0..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_tweakpane.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vega.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vega.cpython-312.pyc deleted file mode 100644 index f0f0c43..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vega.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vtk.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vtk.cpython-312.pyc deleted file mode 100644 index c96fb2f..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vtk.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vtk3d.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vtk3d.cpython-312.pyc deleted file mode 100644 index b652297..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vtk3d.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vtklocal.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vtklocal.cpython-312.pyc deleted file mode 100644 index f672331..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vtklocal.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vuetify.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vuetify.cpython-312.pyc deleted file mode 100644 index 52482ad..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vuetify.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_xterm.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_xterm.cpython-312.pyc deleted file mode 100644 index 451bea2..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_xterm.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-transformers.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-transformers.cpython-312.pyc deleted file mode 100644 index 3234507..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-transformers.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-travertino.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-travertino.cpython-312.pyc deleted file mode 100644 index 03578ae..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-travertino.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trimesh.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trimesh.cpython-312.pyc deleted file mode 100644 index 23b2ec9..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trimesh.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-triton.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-triton.cpython-312.pyc deleted file mode 100644 index 59f07e9..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-triton.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ttkthemes.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ttkthemes.cpython-312.pyc deleted file mode 100644 index e090990..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ttkthemes.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ttkwidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ttkwidgets.cpython-312.pyc deleted file mode 100644 index 5487018..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ttkwidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tzdata.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tzdata.cpython-312.pyc deleted file mode 100644 index 93ce432..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tzdata.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tzwhere.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tzwhere.cpython-312.pyc deleted file mode 100644 index b967f26..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tzwhere.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-u1db.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-u1db.cpython-312.pyc deleted file mode 100644 index 78e24bb..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-u1db.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ultralytics.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ultralytics.cpython-312.pyc deleted file mode 100644 index 10d9140..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ultralytics.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-umap.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-umap.cpython-312.pyc deleted file mode 100644 index ba0cf31..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-umap.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-unidecode.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-unidecode.cpython-312.pyc deleted file mode 100644 index 802025a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-unidecode.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-uniseg.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-uniseg.cpython-312.pyc deleted file mode 100644 index fe58138..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-uniseg.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-urllib3.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-urllib3.cpython-312.pyc deleted file mode 100644 index 15adcb6..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-urllib3.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-urllib3_future.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-urllib3_future.cpython-312.pyc deleted file mode 100644 index 4718900..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-urllib3_future.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-usb.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-usb.cpython-312.pyc deleted file mode 100644 index b1a98c1..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-usb.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-uuid6.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-uuid6.cpython-312.pyc deleted file mode 100644 index b46f193..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-uuid6.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-uvicorn.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-uvicorn.cpython-312.pyc deleted file mode 100644 index 74cf840..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-uvicorn.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-uvloop.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-uvloop.cpython-312.pyc deleted file mode 100644 index 139b98a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-uvloop.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vaderSentiment.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vaderSentiment.cpython-312.pyc deleted file mode 100644 index c061885..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vaderSentiment.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkAcceleratorsVTKmCore.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkAcceleratorsVTKmCore.cpython-312.pyc deleted file mode 100644 index 757e8f8..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkAcceleratorsVTKmCore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkAcceleratorsVTKmDataModel.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkAcceleratorsVTKmDataModel.cpython-312.pyc deleted file mode 100644 index d12d816..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkAcceleratorsVTKmDataModel.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkAcceleratorsVTKmFilters.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkAcceleratorsVTKmFilters.cpython-312.pyc deleted file mode 100644 index a5384bb..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkAcceleratorsVTKmFilters.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkChartsCore.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkChartsCore.cpython-312.pyc deleted file mode 100644 index 4de67a1..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkChartsCore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonColor.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonColor.cpython-312.pyc deleted file mode 100644 index b8a5e02..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonColor.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonComputationalGeometry.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonComputationalGeometry.cpython-312.pyc deleted file mode 100644 index a2b4a53..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonComputationalGeometry.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonDataModel.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonDataModel.cpython-312.pyc deleted file mode 100644 index 123c10d..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonDataModel.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonExecutionModel.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonExecutionModel.cpython-312.pyc deleted file mode 100644 index 637bd61..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonExecutionModel.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonMath.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonMath.cpython-312.pyc deleted file mode 100644 index 20da1fb..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonMath.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonMisc.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonMisc.cpython-312.pyc deleted file mode 100644 index c5d47bb..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonMisc.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonPython.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonPython.cpython-312.pyc deleted file mode 100644 index 4fbfa6e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonPython.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonSystem.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonSystem.cpython-312.pyc deleted file mode 100644 index 28d5142..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonSystem.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonTransforms.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonTransforms.cpython-312.pyc deleted file mode 100644 index c601b93..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkCommonTransforms.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkDomainsChemistry.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkDomainsChemistry.cpython-312.pyc deleted file mode 100644 index 3d47f37..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkDomainsChemistry.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkDomainsChemistryOpenGL2.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkDomainsChemistryOpenGL2.cpython-312.pyc deleted file mode 100644 index 0f6d558..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkDomainsChemistryOpenGL2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersAMR.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersAMR.cpython-312.pyc deleted file mode 100644 index 8c8c11c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersAMR.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersCellGrid.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersCellGrid.cpython-312.pyc deleted file mode 100644 index 54287d5..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersCellGrid.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersCore.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersCore.cpython-312.pyc deleted file mode 100644 index e83979c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersCore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersExtraction.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersExtraction.cpython-312.pyc deleted file mode 100644 index d69ddba..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersExtraction.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersFlowPaths.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersFlowPaths.cpython-312.pyc deleted file mode 100644 index b9ad0ad..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersFlowPaths.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersGeneral.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersGeneral.cpython-312.pyc deleted file mode 100644 index bb9a8dc..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersGeneral.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersGeneric.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersGeneric.cpython-312.pyc deleted file mode 100644 index 5e6b4cb..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersGeneric.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersGeometry.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersGeometry.cpython-312.pyc deleted file mode 100644 index 71ce449..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersGeometry.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersGeometryPreview.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersGeometryPreview.cpython-312.pyc deleted file mode 100644 index e29b6bd..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersGeometryPreview.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersHybrid.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersHybrid.cpython-312.pyc deleted file mode 100644 index d300393..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersHybrid.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersHyperTree.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersHyperTree.cpython-312.pyc deleted file mode 100644 index 4b1d71e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersHyperTree.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersImaging.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersImaging.cpython-312.pyc deleted file mode 100644 index ae9a76c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersImaging.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersModeling.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersModeling.cpython-312.pyc deleted file mode 100644 index 5639053..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersModeling.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersParallel.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersParallel.cpython-312.pyc deleted file mode 100644 index c3842f2..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersParallel.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersParallelDIY2.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersParallelDIY2.cpython-312.pyc deleted file mode 100644 index bdec8ba..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersParallelDIY2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersParallelImaging.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersParallelImaging.cpython-312.pyc deleted file mode 100644 index 204c2b4..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersParallelImaging.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersParallelStatistics.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersParallelStatistics.cpython-312.pyc deleted file mode 100644 index e7b142a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersParallelStatistics.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersPoints.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersPoints.cpython-312.pyc deleted file mode 100644 index a80d2be..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersPoints.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersProgrammable.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersProgrammable.cpython-312.pyc deleted file mode 100644 index aa2c1a4..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersProgrammable.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersPython.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersPython.cpython-312.pyc deleted file mode 100644 index 3388686..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersPython.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersReduction.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersReduction.cpython-312.pyc deleted file mode 100644 index 177f764..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersReduction.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersSMP.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersSMP.cpython-312.pyc deleted file mode 100644 index 53778b4..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersSMP.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersSelection.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersSelection.cpython-312.pyc deleted file mode 100644 index 87edbf0..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersSelection.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersSources.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersSources.cpython-312.pyc deleted file mode 100644 index e115990..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersSources.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersStatistics.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersStatistics.cpython-312.pyc deleted file mode 100644 index 7c571e1..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersStatistics.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersTemporal.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersTemporal.cpython-312.pyc deleted file mode 100644 index 484c95b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersTemporal.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersTensor.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersTensor.cpython-312.pyc deleted file mode 100644 index 29a70eb..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersTensor.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersTexture.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersTexture.cpython-312.pyc deleted file mode 100644 index c63fc87..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersTexture.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersTopology.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersTopology.cpython-312.pyc deleted file mode 100644 index 788683e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersTopology.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersVerdict.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersVerdict.cpython-312.pyc deleted file mode 100644 index 57969d0..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkFiltersVerdict.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkGeovisCore.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkGeovisCore.cpython-312.pyc deleted file mode 100644 index ea950e8..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkGeovisCore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOAMR.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOAMR.cpython-312.pyc deleted file mode 100644 index 04c4e9a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOAMR.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOAsynchronous.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOAsynchronous.cpython-312.pyc deleted file mode 100644 index 92d19f8..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOAsynchronous.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOAvmesh.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOAvmesh.cpython-312.pyc deleted file mode 100644 index 1aec05e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOAvmesh.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOCGNSReader.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOCGNSReader.cpython-312.pyc deleted file mode 100644 index accd7d3..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOCGNSReader.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOCONVERGECFD.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOCONVERGECFD.cpython-312.pyc deleted file mode 100644 index e0b014c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOCONVERGECFD.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOCellGrid.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOCellGrid.cpython-312.pyc deleted file mode 100644 index a81e216..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOCellGrid.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOCesium3DTiles.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOCesium3DTiles.cpython-312.pyc deleted file mode 100644 index e12bc4d..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOCesium3DTiles.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOChemistry.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOChemistry.cpython-312.pyc deleted file mode 100644 index bc333ee..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOChemistry.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOCityGML.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOCityGML.cpython-312.pyc deleted file mode 100644 index d97b49b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOCityGML.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOCore.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOCore.cpython-312.pyc deleted file mode 100644 index 87127f3..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOCore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOERF.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOERF.cpython-312.pyc deleted file mode 100644 index 0ffdb52..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOERF.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOEnSight.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOEnSight.cpython-312.pyc deleted file mode 100644 index b101c99..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOEnSight.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOEngys.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOEngys.cpython-312.pyc deleted file mode 100644 index c1ec5d3..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOEngys.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOExodus.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOExodus.cpython-312.pyc deleted file mode 100644 index 189021a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOExodus.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOExport.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOExport.cpython-312.pyc deleted file mode 100644 index 63e2a86..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOExport.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOExportGL2PS.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOExportGL2PS.cpython-312.pyc deleted file mode 100644 index 2de97ad..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOExportGL2PS.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOExportPDF.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOExportPDF.cpython-312.pyc deleted file mode 100644 index a2ed3fe..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOExportPDF.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOFDS.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOFDS.cpython-312.pyc deleted file mode 100644 index f31a498..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOFDS.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOFLUENTCFF.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOFLUENTCFF.cpython-312.pyc deleted file mode 100644 index c01f880..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOFLUENTCFF.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOGeoJSON.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOGeoJSON.cpython-312.pyc deleted file mode 100644 index e9e501e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOGeoJSON.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOGeometry.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOGeometry.cpython-312.pyc deleted file mode 100644 index 97de056..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOGeometry.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOH5Rage.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOH5Rage.cpython-312.pyc deleted file mode 100644 index 6991f86..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOH5Rage.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOH5part.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOH5part.cpython-312.pyc deleted file mode 100644 index 7b35185..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOH5part.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOHDF.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOHDF.cpython-312.pyc deleted file mode 100644 index c7dd79d..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOHDF.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOIOSS.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOIOSS.cpython-312.pyc deleted file mode 100644 index 36202fe..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOIOSS.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOImage.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOImage.cpython-312.pyc deleted file mode 100644 index e56f833..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOImage.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOImport.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOImport.cpython-312.pyc deleted file mode 100644 index 4e784aa..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOImport.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOInfovis.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOInfovis.cpython-312.pyc deleted file mode 100644 index a0f676a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOInfovis.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOLANLX3D.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOLANLX3D.cpython-312.pyc deleted file mode 100644 index 95c2ead..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOLANLX3D.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOLSDyna.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOLSDyna.cpython-312.pyc deleted file mode 100644 index 1f424ac..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOLSDyna.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOLegacy.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOLegacy.cpython-312.pyc deleted file mode 100644 index 44e142b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOLegacy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOMINC.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOMINC.cpython-312.pyc deleted file mode 100644 index 9f1d80b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOMINC.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOMotionFX.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOMotionFX.cpython-312.pyc deleted file mode 100644 index 34bef7c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOMotionFX.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOMovie.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOMovie.cpython-312.pyc deleted file mode 100644 index baf295e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOMovie.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIONetCDF.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIONetCDF.cpython-312.pyc deleted file mode 100644 index 7028fbf..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIONetCDF.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOOMF.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOOMF.cpython-312.pyc deleted file mode 100644 index dc2b993..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOOMF.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOOggTheora.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOOggTheora.cpython-312.pyc deleted file mode 100644 index cef4d36..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOOggTheora.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOPIO.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOPIO.cpython-312.pyc deleted file mode 100644 index ceaa7dd..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOPIO.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOPLY.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOPLY.cpython-312.pyc deleted file mode 100644 index 9335e92..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOPLY.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOParallel.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOParallel.cpython-312.pyc deleted file mode 100644 index d023093..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOParallel.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOParallelExodus.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOParallelExodus.cpython-312.pyc deleted file mode 100644 index 8458738..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOParallelExodus.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOParallelLSDyna.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOParallelLSDyna.cpython-312.pyc deleted file mode 100644 index 4459a29..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOParallelLSDyna.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOParallelXML.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOParallelXML.cpython-312.pyc deleted file mode 100644 index 393f6c9..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOParallelXML.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOSQL.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOSQL.cpython-312.pyc deleted file mode 100644 index e40a625..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOSQL.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOSegY.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOSegY.cpython-312.pyc deleted file mode 100644 index 961131b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOSegY.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOTRUCHAS.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOTRUCHAS.cpython-312.pyc deleted file mode 100644 index c1b0977..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOTRUCHAS.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOTecplotTable.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOTecplotTable.cpython-312.pyc deleted file mode 100644 index 3c773f3..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOTecplotTable.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOVPIC.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOVPIC.cpython-312.pyc deleted file mode 100644 index 187bd78..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOVPIC.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOVeraOut.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOVeraOut.cpython-312.pyc deleted file mode 100644 index f8bb677..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOVeraOut.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOVideo.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOVideo.cpython-312.pyc deleted file mode 100644 index 52b2652..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOVideo.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOXML.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOXML.cpython-312.pyc deleted file mode 100644 index 7c62b46..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOXML.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOXMLParser.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOXMLParser.cpython-312.pyc deleted file mode 100644 index 8dc313c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOXMLParser.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOXdmf2.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOXdmf2.cpython-312.pyc deleted file mode 100644 index 97b5acb..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkIOXdmf2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingColor.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingColor.cpython-312.pyc deleted file mode 100644 index 57a8cf9..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingColor.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingCore.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingCore.cpython-312.pyc deleted file mode 100644 index 5b12af8..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingCore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingFourier.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingFourier.cpython-312.pyc deleted file mode 100644 index 91970ff..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingFourier.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingGeneral.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingGeneral.cpython-312.pyc deleted file mode 100644 index 782a028..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingGeneral.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingHybrid.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingHybrid.cpython-312.pyc deleted file mode 100644 index 925ceaf..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingHybrid.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingMath.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingMath.cpython-312.pyc deleted file mode 100644 index f2b0359..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingMath.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingMorphological.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingMorphological.cpython-312.pyc deleted file mode 100644 index 8036dd5..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingMorphological.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingOpenGL2.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingOpenGL2.cpython-312.pyc deleted file mode 100644 index 2014d78..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingOpenGL2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingSources.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingSources.cpython-312.pyc deleted file mode 100644 index 84fb16a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingSources.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingStatistics.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingStatistics.cpython-312.pyc deleted file mode 100644 index 748231b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingStatistics.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingStencil.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingStencil.cpython-312.pyc deleted file mode 100644 index a2124c7..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkImagingStencil.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkInfovisCore.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkInfovisCore.cpython-312.pyc deleted file mode 100644 index b83a020..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkInfovisCore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkInfovisLayout.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkInfovisLayout.cpython-312.pyc deleted file mode 100644 index 487a91c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkInfovisLayout.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkInteractionImage.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkInteractionImage.cpython-312.pyc deleted file mode 100644 index ad6be47..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkInteractionImage.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkInteractionStyle.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkInteractionStyle.cpython-312.pyc deleted file mode 100644 index b2ee0f7..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkInteractionStyle.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkInteractionWidgets.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkInteractionWidgets.cpython-312.pyc deleted file mode 100644 index a818977..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkInteractionWidgets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkParallelCore.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkParallelCore.cpython-312.pyc deleted file mode 100644 index 6e6af26..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkParallelCore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkPythonContext2D.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkPythonContext2D.cpython-312.pyc deleted file mode 100644 index 01d3c11..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkPythonContext2D.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingAnnotation.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingAnnotation.cpython-312.pyc deleted file mode 100644 index f9dd265..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingAnnotation.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingCellGrid.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingCellGrid.cpython-312.pyc deleted file mode 100644 index 56cb487..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingCellGrid.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingContext2D.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingContext2D.cpython-312.pyc deleted file mode 100644 index d09d004..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingContext2D.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingContextOpenGL2.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingContextOpenGL2.cpython-312.pyc deleted file mode 100644 index 9b46220..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingContextOpenGL2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingCore.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingCore.cpython-312.pyc deleted file mode 100644 index f68b75b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingCore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingExternal.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingExternal.cpython-312.pyc deleted file mode 100644 index 46e5845..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingExternal.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingFreeType.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingFreeType.cpython-312.pyc deleted file mode 100644 index 5091ec8..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingFreeType.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingGL2PSOpenGL2.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingGL2PSOpenGL2.cpython-312.pyc deleted file mode 100644 index dabb38b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingGL2PSOpenGL2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingGridAxes.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingGridAxes.cpython-312.pyc deleted file mode 100644 index fb3844d..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingGridAxes.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingHyperTreeGrid.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingHyperTreeGrid.cpython-312.pyc deleted file mode 100644 index a1a4fbc..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingHyperTreeGrid.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingImage.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingImage.cpython-312.pyc deleted file mode 100644 index 6fc73bd..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingImage.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingLICOpenGL2.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingLICOpenGL2.cpython-312.pyc deleted file mode 100644 index 4ab1da2..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingLICOpenGL2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingLOD.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingLOD.cpython-312.pyc deleted file mode 100644 index fb3d5d9..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingLOD.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingLabel.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingLabel.cpython-312.pyc deleted file mode 100644 index 976cd64..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingLabel.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingMatplotlib.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingMatplotlib.cpython-312.pyc deleted file mode 100644 index 7b0f0f2..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingMatplotlib.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingOpenGL2.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingOpenGL2.cpython-312.pyc deleted file mode 100644 index 6bbccae..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingOpenGL2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingParallel.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingParallel.cpython-312.pyc deleted file mode 100644 index a9345a9..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingParallel.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingSceneGraph.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingSceneGraph.cpython-312.pyc deleted file mode 100644 index 121e30b..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingSceneGraph.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingUI.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingUI.cpython-312.pyc deleted file mode 100644 index 119459f..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingUI.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingVR.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingVR.cpython-312.pyc deleted file mode 100644 index 0613099..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingVR.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingVRModels.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingVRModels.cpython-312.pyc deleted file mode 100644 index 7de3113..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingVRModels.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingVolume.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingVolume.cpython-312.pyc deleted file mode 100644 index 87482a9..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingVolume.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingVolumeAMR.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingVolumeAMR.cpython-312.pyc deleted file mode 100644 index a0676ca..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingVolumeAMR.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingVolumeOpenGL2.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingVolumeOpenGL2.cpython-312.pyc deleted file mode 100644 index fce2bbe..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingVolumeOpenGL2.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingVtkJS.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingVtkJS.cpython-312.pyc deleted file mode 100644 index 79db393..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkRenderingVtkJS.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkSerializationManager.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkSerializationManager.cpython-312.pyc deleted file mode 100644 index e90f42a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkSerializationManager.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkTestingRendering.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkTestingRendering.cpython-312.pyc deleted file mode 100644 index 52af4bb..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkTestingRendering.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkTestingSerialization.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkTestingSerialization.cpython-312.pyc deleted file mode 100644 index a12bc8f..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkTestingSerialization.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkViewsContext2D.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkViewsContext2D.cpython-312.pyc deleted file mode 100644 index 1eb3b8a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkViewsContext2D.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkViewsCore.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkViewsCore.cpython-312.pyc deleted file mode 100644 index 8fd0a13..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkViewsCore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkViewsInfovis.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkViewsInfovis.cpython-312.pyc deleted file mode 100644 index ae561b8..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkViewsInfovis.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkWebCore.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkWebCore.cpython-312.pyc deleted file mode 100644 index 1cd8a7e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkWebCore.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkWebGLExporter.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkWebGLExporter.cpython-312.pyc deleted file mode 100644 index 7a11eaa..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkmodules.vtkWebGLExporter.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkpython.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkpython.cpython-312.pyc deleted file mode 100644 index 1329791..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkpython.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wavefile.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wavefile.cpython-312.pyc deleted file mode 100644 index c672e82..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wavefile.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-weasyprint.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-weasyprint.cpython-312.pyc deleted file mode 100644 index 5842ffe..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-weasyprint.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-web3.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-web3.cpython-312.pyc deleted file mode 100644 index 93cac36..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-web3.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-webassets.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-webassets.cpython-312.pyc deleted file mode 100644 index 2a848ce..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-webassets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-webrtcvad.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-webrtcvad.cpython-312.pyc deleted file mode 100644 index 24a175a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-webrtcvad.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-websockets.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-websockets.cpython-312.pyc deleted file mode 100644 index e6f67a7..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-websockets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-webview.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-webview.cpython-312.pyc deleted file mode 100644 index 02b3c13..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-webview.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-win32com.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-win32com.cpython-312.pyc deleted file mode 100644 index 6533ddc..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-win32com.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wordcloud.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wordcloud.cpython-312.pyc deleted file mode 100644 index 45bf216..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wordcloud.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-workflow.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-workflow.cpython-312.pyc deleted file mode 100644 index e1c3f70..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-workflow.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wx.lib.activex.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wx.lib.activex.cpython-312.pyc deleted file mode 100644 index fb1826c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wx.lib.activex.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wx.lib.pubsub.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wx.lib.pubsub.cpython-312.pyc deleted file mode 100644 index da32764..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wx.lib.pubsub.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wx.xrc.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wx.xrc.cpython-312.pyc deleted file mode 100644 index 88f8761..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wx.xrc.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xarray.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xarray.cpython-312.pyc deleted file mode 100644 index f4450ef..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xarray.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xml.dom.html.HTMLDocument.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xml.dom.html.HTMLDocument.cpython-312.pyc deleted file mode 100644 index 0d5d63a..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xml.dom.html.HTMLDocument.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xml.sax.saxexts.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xml.sax.saxexts.cpython-312.pyc deleted file mode 100644 index 41d04b2..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xml.sax.saxexts.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xmldiff.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xmldiff.cpython-312.pyc deleted file mode 100644 index 145b5de..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xmldiff.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xmlschema.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xmlschema.cpython-312.pyc deleted file mode 100644 index b05ab15..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xmlschema.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xsge_gui.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xsge_gui.cpython-312.pyc deleted file mode 100644 index 0086c00..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xsge_gui.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xyzservices.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xyzservices.cpython-312.pyc deleted file mode 100644 index bcee473..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xyzservices.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-yapf_third_party.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-yapf_third_party.cpython-312.pyc deleted file mode 100644 index 3b7327e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-yapf_third_party.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-z3c.rml.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-z3c.rml.cpython-312.pyc deleted file mode 100644 index 69ff893..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-z3c.rml.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-zarr.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-zarr.cpython-312.pyc deleted file mode 100644 index c18506e..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-zarr.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-zeep.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-zeep.cpython-312.pyc deleted file mode 100644 index c5fc978..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-zeep.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-zmq.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-zmq.cpython-312.pyc deleted file mode 100644 index 7e6b19c..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-zmq.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-zoneinfo.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-zoneinfo.cpython-312.pyc deleted file mode 100644 index 1061482..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-zoneinfo.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-BTrees.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-BTrees.py deleted file mode 100644 index 1213dfd..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-BTrees.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for BTrees: https://pypi.org/project/BTrees/4.5.1/ - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules('BTrees') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-CTkMessagebox.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-CTkMessagebox.py deleted file mode 100644 index dd43aad..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-CTkMessagebox.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -# A fully customizable messagebox for customtkinter! -# (extension/add-on) -# ------------------------------------------------------------------ -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("CTkMessagebox") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-Crypto.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-Crypto.py deleted file mode 100644 index a52de53..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-Crypto.py +++ /dev/null @@ -1,62 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Hook for PyCryptodome library: https://pypi.python.org/pypi/pycryptodome - -PyCryptodome is an almost drop-in replacement for the now unmaintained -PyCrypto library. The two are mutually exclusive as they live under -the same package ("Crypto"). - -PyCryptodome distributes dynamic libraries and builds them as if they were -Python C extensions (even though they are not extensions - as they can't be -imported by Python). It might sound a bit weird, but this decision is rooted -in PyPy and its partial and slow support for C extensions. However, this also -invalidates several of the existing methods used by PyInstaller to decide the -right files to pull in. - -Even though this hook is meant to help with PyCryptodome only, it will be -triggered also when PyCrypto is installed, so it must be tested with both. - -Tested with PyCryptodome 3.5.1, PyCrypto 2.6.1, Python 2.7 & 3.6, Fedora & Windows -""" - -import os -import glob - -from PyInstaller.compat import EXTENSION_SUFFIXES -from PyInstaller.utils.hooks import get_module_file_attribute - -# Include the modules as binaries in a subfolder named like the package. -# Cryptodome's loader expects to find them inside the package directory for -# the main module. We cannot use hiddenimports because that would add the -# modules outside the package. - -binaries = [] -binary_module_names = [ - 'Crypto.Math', # First in the list - 'Crypto.Cipher', - 'Crypto.Util', - 'Crypto.Hash', - 'Crypto.Protocol', - 'Crypto.PublicKey', -] - -try: - for module_name in binary_module_names: - m_dir = os.path.dirname(get_module_file_attribute(module_name)) - for ext in EXTENSION_SUFFIXES: - module_bin = glob.glob(os.path.join(m_dir, '_*%s' % ext)) - for f in module_bin: - binaries.append((f, module_name.replace('.', os.sep))) -except ImportError: - # Do nothing for PyCrypto (Crypto.Math does not exist there) - pass diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-Cryptodome.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-Cryptodome.py deleted file mode 100644 index 3a88482..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-Cryptodome.py +++ /dev/null @@ -1,44 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Hook for Cryptodome module: https://pypi.python.org/pypi/pycryptodomex - -Tested with Cryptodomex 3.4.2, Python 2.7 & 3.5, Windows -""" - -import os -import glob - -from PyInstaller.compat import EXTENSION_SUFFIXES -from PyInstaller.utils.hooks import get_module_file_attribute - -# Include the modules as binaries in a subfolder named like the package. -# Cryptodome's loader expects to find them inside the package directory for -# the main module. We cannot use hiddenimports because that would add the -# modules outside the package. - -binaries = [] -binary_module_names = [ - 'Cryptodome.Cipher', - 'Cryptodome.Util', - 'Cryptodome.Hash', - 'Cryptodome.Protocol', - 'Cryptodome.Math', - 'Cryptodome.PublicKey', -] - -for module_name in binary_module_names: - m_dir = os.path.dirname(get_module_file_attribute(module_name)) - for ext in EXTENSION_SUFFIXES: - module_bin = glob.glob(os.path.join(m_dir, '_*%s' % ext)) - for f in module_bin: - binaries.append((f, module_name.replace('.', '/'))) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-HtmlTestRunner.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-HtmlTestRunner.py deleted file mode 100644 index 56abec9..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-HtmlTestRunner.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for HtmlTestRunner: https://pypi.org/project/html-testRunner//1.2.1 - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('HtmlTestRunner') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-IPython.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-IPython.py deleted file mode 100644 index 8fec50b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-IPython.py +++ /dev/null @@ -1,42 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Tested with IPython 4.0.0. - -from PyInstaller.compat import is_win, is_darwin -from PyInstaller.utils.hooks import collect_data_files - -# Ignore 'matplotlib'. IPython contains support for matplotlib. -# Ignore GUI libraries. IPython supports integration with GUI frameworks. -# Assume that it will be imported by any other module when the user really -# uses it. -excludedimports = [ - 'gtk', - 'matplotlib', - 'PySide', - 'PyQt4', - 'PySide2', - 'PyQt5', - 'PySide6', - 'PyQt6', -] - -# IPython uses 'tkinter' for clipboard access on Linux/Unix. Exclude it on Windows and OS X. -if is_win or is_darwin: - excludedimports.append('tkinter') - -datas = collect_data_files('IPython') - -# IPython imports extensions by changing to the extensions directory and using -# importlib.import_module, so we need to copy over the extensions as if they -# were data files. -datas += collect_data_files('IPython.extensions', include_py_files=True) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-OpenGL.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-OpenGL.py deleted file mode 100644 index ae7bd48..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-OpenGL.py +++ /dev/null @@ -1,42 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Hook for PyOpenGL 3.x versions from 3.0.0b6 up. Previous versions have a -plugin system based on pkg_resources which is problematic to handle correctly -under pyinstaller; 2.x versions used to run fine without hooks, so this one -shouldn't hurt. -""" - -from PyInstaller.compat import is_win, is_darwin -from PyInstaller.utils.hooks import collect_data_files, collect_submodules - - -# PlatformPlugin performs a conditional import based on os.name and -# sys.platform. PyInstaller misses this so let's add it ourselves... -if is_win: - hiddenimports = ['OpenGL.platform.win32'] -elif is_darwin: - hiddenimports = ['OpenGL.platform.darwin'] -# Use glx for other platforms (Linux, ...) -else: - hiddenimports = ['OpenGL.platform.glx'] - -# Arrays modules are needed too. -hiddenimports += collect_submodules('OpenGL.arrays') - -# PyOpenGL 3.x uses ctypes to load DLL libraries. PyOpenGL windows installer -# adds necessary dll files to -# DLL_DIRECTORY = os.path.join( os.path.dirname( OpenGL.__file__ ), 'DLLS') -# PyInstaller is not able to find these dlls. Just include them all as data -# files. -if is_win: - datas = collect_data_files('OpenGL') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-OpenGL_accelerate.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-OpenGL_accelerate.py deleted file mode 100644 index 5d6998b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-OpenGL_accelerate.py +++ /dev/null @@ -1,22 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -OpenGL_accelerate contais modules written in cython. This module -should speed up some functions from OpenGL module. The following -hiddenimports are not resolved by PyInstaller because OpenGL_accelerate -is compiled to native Python modules. -""" - -hiddenimports = [ - 'OpenGL_accelerate.wrapper', - 'OpenGL_accelerate.formathandler', -] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-PyTaskbar.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-PyTaskbar.py deleted file mode 100644 index 55a82a1..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-PyTaskbar.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("PyTaskbar") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-Xlib.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-Xlib.py deleted file mode 100644 index 8ce588e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-Xlib.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules('Xlib') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-_mssql.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-_mssql.py deleted file mode 100644 index 356a314..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-_mssql.py +++ /dev/null @@ -1,13 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -hiddenimports = ['uuid'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-_mysql.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-_mysql.py deleted file mode 100644 index 252fd2a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-_mysql.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Hook for _mysql, required if higher-level pure python module is not imported -""" - -hiddenimports = ['_mysql_exceptions'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-accessible_output2.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-accessible_output2.py deleted file mode 100644 index 8d69536..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-accessible_output2.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -accessible_output2: http://hg.q-continuum.net/accessible_output2 -""" - -from PyInstaller.utils.hooks import collect_dynamic_libs - -binaries = collect_dynamic_libs('accessible_output2') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-adbc_driver_manager.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-adbc_driver_manager.py deleted file mode 100644 index b08866d..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-adbc_driver_manager.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2026 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - - -hiddenimports = ['adbc_driver_manager._static_version'] -module_collection_mode = { - 'adbc_driver_manager._static_version': 'py', -} diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-adbutils.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-adbutils.py deleted file mode 100644 index 302439e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-adbutils.py +++ /dev/null @@ -1,23 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files, is_module_satisfies - -# adb.exe is not automatically collected by collect_dynamic_libs() -datas = collect_data_files("adbutils", subdir="binaries", includes=["adb*"]) - -# adbutils v2.2.2 replaced `pkg_resources` with `importlib.resources`, and now uses the following code to determine the -# path to the `adbutils.binaries` sub-package directory: -# https://github.com/openatx/adbutils/blob/2.2.2/adbutils/_utils.py#L78-L87 -# As `adbutils.binaries` is not directly imported anywhere, we need a hidden import. -if is_module_satisfies('adbutils >= 2.2.2'): - hiddenimports = ['adbutils.binaries'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-adios.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-adios.py deleted file mode 100644 index 761de00..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-adios.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Hook for http://pypi.python.org/pypi/adios/ -""" - -hiddenimports = ['adios._hl.selections'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-afmformats.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-afmformats.py deleted file mode 100644 index 79eafa6..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-afmformats.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for afmformats: https://pypi.python.org/pypi/afmformats - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('afmformats') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-aliyunsdkcore.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-aliyunsdkcore.py deleted file mode 100644 index 50b0d96..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-aliyunsdkcore.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("aliyunsdkcore") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-altair.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-altair.py deleted file mode 100644 index 126115b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-altair.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("altair") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-amazonproduct.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-amazonproduct.py deleted file mode 100644 index 46b8467..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-amazonproduct.py +++ /dev/null @@ -1,26 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Hook for Python bindings for Amazon's Product Advertising API. -https://bitbucket.org/basti/python-amazon-product-api -""" - -hiddenimports = ['amazonproduct.processors.__init__', - 'amazonproduct.processors._lxml', - 'amazonproduct.processors.objectify', - 'amazonproduct.processors.elementtree', - 'amazonproduct.processors.etree', - 'amazonproduct.processors.minidom', - 'amazonproduct.contrib.__init__', - 'amazonproduct.contrib.cart', - 'amazonproduct.contrib.caching', - 'amazonproduct.contrib.retry'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-anyio.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-anyio.py deleted file mode 100644 index c19fb44..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-anyio.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -AnyIO contains a number of back-ends as dynamically imported modules. -This hook was tested against AnyIO v1.4.0. -""" - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules('anyio._backends') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-apkutils.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-apkutils.py deleted file mode 100644 index a8804bc..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-apkutils.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("apkutils") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-appdirs.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-appdirs.py deleted file mode 100644 index d49d5ba..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-appdirs.py +++ /dev/null @@ -1,21 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Import hook for appdirs. - -On Windows, appdirs tries 2 different methods to get well-known directories -from the system: First with win32com, then with ctypes. Excluding win32com here -avoids including all the win32com related DLLs in programs that don't include -them otherwise. -""" - -excludedimports = ['win32com'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-appy.pod.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-appy.pod.py deleted file mode 100644 index 056aea2..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-appy.pod.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for appy.pod: https://pypi.python.org/pypi/appy/0.9.1 - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('appy.pod', True) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-apscheduler.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-apscheduler.py deleted file mode 100644 index 4ac1838..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-apscheduler.py +++ /dev/null @@ -1,27 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -APScheduler uses entry points to dynamically load executors, job -stores and triggers. -This hook was tested against APScheduler 3.6.3. -""" - -from PyInstaller.utils.hooks import (collect_submodules, copy_metadata, - is_module_satisfies) - -if is_module_satisfies("apscheduler < 4"): - if is_module_satisfies("pyinstaller >= 4.4"): - datas = copy_metadata('APScheduler', recursive=True) - else: - datas = copy_metadata('APScheduler') - - hiddenimports = collect_submodules('apscheduler') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-argon2.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-argon2.py deleted file mode 100644 index 505639a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-argon2.py +++ /dev/null @@ -1,13 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -hiddenimports = ["_cffi_backend"] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-astor.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-astor.py deleted file mode 100644 index 93452da..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-astor.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('astor') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-astroid.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-astroid.py deleted file mode 100644 index 22323cd..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-astroid.py +++ /dev/null @@ -1,48 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -# -# *************************************************** -# hook-astriod.py - PyInstaller hook file for astriod -# *************************************************** -# The astriod package, in __pkginfo__.py, is version 1.1.1. Looking at its -# source: -# -# From __init__.py, starting at line 111:: -# -# BRAIN_MODULES_DIR = join(dirname(__file__), 'brain') -# if BRAIN_MODULES_DIR not in sys.path: -# # add it to the end of the list so user path take precedence -# sys.path.append(BRAIN_MODULES_DIR) -# # load modules in this directory -# for module in listdir(BRAIN_MODULES_DIR): -# if module.endswith('.py'): -# __import__(module[:-3]) -# -# So, we need all the Python source in the ``brain/`` subdirectory, -# since this is run-time discovered and loaded. Therefore, these -# files are all data files. - -from PyInstaller.utils.hooks import collect_data_files, collect_submodules, \ - is_module_or_submodule - -# Note that brain/ isn't a module (it lacks an __init__.py, so it can't be -# referred to as astroid.brain; instead, locate it as package astriod, -# subdirectory brain/. -datas = collect_data_files('astroid', True, 'brain') - -# Update: in astroid v 1.4.1, the brain/ module import parts of astroid. Since -# everything in brain/ is dynamically imported, these are hidden imports. For -# simplicity, include everything in astroid. Exclude all the test/ subpackage -# contents and the test_util module. -hiddenimports = ['six'] + collect_submodules('astroid', - lambda name: (not is_module_or_submodule(name, 'astroid.tests')) and - (not name == 'test_util')) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-astropy.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-astropy.py deleted file mode 100644 index 925ca4d..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-astropy.py +++ /dev/null @@ -1,42 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files, collect_submodules, \ - copy_metadata, is_module_satisfies - -# Astropy includes a number of non-Python files that need to be present -# at runtime, so we include these explicitly here. -datas = collect_data_files('astropy') - -# In a number of places, astropy imports other sub-modules in a way that is not -# always auto-discovered by pyinstaller, so we always include all submodules. -hiddenimports = collect_submodules('astropy') - -# We now need to include the *_parsetab.py and *_lextab.py files for unit and -# coordinate parsing, since these are loaded as files rather than imported as -# sub-modules. We leverage collect_data_files to get all files in astropy then -# filter these. -ply_files = [] -for path, target in collect_data_files('astropy', include_py_files=True): - if path.endswith(('_parsetab.py', '_lextab.py')): - ply_files.append((path, target)) - -datas += ply_files - -# Astropy version >= 5.0 queries metadata to get version information. -if is_module_satisfies('astropy >= 5.0'): - datas += copy_metadata('astropy') - datas += copy_metadata('numpy') - -# In the Cython code, Astropy imports numpy.lib.recfunctions which isn't -# automatically discovered by pyinstaller, so we add this as a hidden import. -hiddenimports += ['numpy.lib.recfunctions'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-astropy_iers_data.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-astropy_iers_data.py deleted file mode 100644 index 828dd45..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-astropy_iers_data.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for https://github.com/astropy/astropy-iers-data - -from PyInstaller.utils.hooks import collect_data_files -datas = collect_data_files("astropy_iers_data") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-av.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-av.py deleted file mode 100644 index 8770d6d..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-av.py +++ /dev/null @@ -1,44 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -import os - -from PyInstaller.compat import is_win -from PyInstaller.utils.hooks import collect_submodules, is_module_satisfies, get_package_paths - -hiddenimports = ['fractions'] + collect_submodules("av") - -# Starting with av 9.1.1, the DLLs shipped with Windows PyPI wheels are stored -# in site-packages/av.libs instead of directly in the site-packages/av. -if is_module_satisfies("av >= 9.1.1") and is_win: - pkg_base, pkg_dir = get_package_paths("av") - lib_dir = os.path.join(pkg_base, "av.libs") - if os.path.isdir(lib_dir): - # We collect DLLs as data files instead of binaries to suppress binary - # analysis, which would result in duplicates (because it collects a copy - # into the top-level directory instead of preserving the original layout). - # In addition to DLls, this also collects .load-order* file (required on - # python < 3.8), and ensures that Shapely.libs directory exists (required - # on python >= 3.8 due to os.add_dll_directory call). - datas = [ - (os.path.join(lib_dir, lib_file), 'av.libs') - for lib_file in os.listdir(lib_dir) - ] - -# With av 13.0.0, one of the cythonized modules (`av.audio.layout`) started using `dataclasses`. Add it to hidden -# imports to ensure it is collected in cases when it is not referenced from anywhere else. -if is_module_satisfies("av >= 13.0.0"): - hiddenimports += ['dataclasses'] - -# av 13.1.0 added a cythonized `av.opaque` module that uses `uuid`; add it to hidden imports to ensure it is collected -# in cases when it is not referenced from anywhere else. -if is_module_satisfies("av >= 13.1.0"): - hiddenimports += ['uuid'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-avro.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-avro.py deleted file mode 100644 index 178fa29..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-avro.py +++ /dev/null @@ -1,27 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Avro is a serialization and RPC framework. -""" - -import os -from PyInstaller.utils.hooks import get_module_file_attribute - -res_loc = os.path.dirname(get_module_file_attribute("avro")) -# see https://github.com/apache/avro/blob/master/lang/py3/setup.py -datas = [ - # Include the version.txt file, used to set __version__ - (os.path.join(res_loc, "VERSION.txt"), "avro"), - # The handshake schema is needed for IPC communication - (os.path.join(res_loc, "HandshakeRequest.avsc"), "avro"), - (os.path.join(res_loc, "HandshakeResponse.avsc"), "avro"), -] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-azurerm.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-azurerm.py deleted file mode 100644 index 52e9c51..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-azurerm.py +++ /dev/null @@ -1,22 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -# Azurerm is a lite api to microsoft azure. -# Azurerm is using pkg_resources internally which is not supported by py-installer. -# This hook will collect the module metadata. -# Tested with Azurerm 0.10.0 - -from PyInstaller.utils.hooks import copy_metadata, is_module_satisfies - -if is_module_satisfies("pyinstaller >= 4.4"): - datas = copy_metadata("azurerm", recursive=True) -else: - datas = copy_metadata("azurerm") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-backports.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-backports.py deleted file mode 100644 index af9ead4..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-backports.py +++ /dev/null @@ -1,20 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Some of jaraco's backports packages (backports.functools-lru-cache, backports.tarfile) use pkgutil-style `backports` -# namespace package, with `__init__.py` file that contains: -# -# __path__ = __import__('pkgutil').extend_path(__path__, __name__) -# -# This import via `__import__` function slips past PyInstaller's modulegraph analysis; so add a hidden import, in case -# the user's program (and its dependencies) have no other direct imports of `pkgutil`. -hiddenimports = ['pkgutil'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-backports.zoneinfo.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-backports.zoneinfo.py deleted file mode 100644 index 03a5e41..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-backports.zoneinfo.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.compat import is_win - -# On Windows, timezone data is provided by the tzdata package that is -# not directly loaded. -if is_win: - hiddenimports = ['tzdata'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-bacon.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-bacon.py deleted file mode 100644 index febf11b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-bacon.py +++ /dev/null @@ -1,50 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for Bacon (https://github.com/aholkner/bacon) -# Bacon requires its native DLLs to be copied alongside frozen executable. - -import os -import ctypes - -from PyInstaller.compat import is_win, is_darwin -from PyInstaller.utils.hooks import get_package_paths - - -def collect_native_files(package, files): - pkg_base, pkg_dir = get_package_paths(package) - return [(os.path.join(pkg_dir, file), '.') for file in files] - - -if is_win: - files = ['Bacon.dll', - 'd3dcompiler_46.dll', - 'libEGL.dll', - 'libGLESv2.dll', - 'msvcp110.dll', - 'msvcr110.dll', - 'vccorllib110.dll'] - if ctypes.sizeof(ctypes.c_void_p) == 4: - hiddenimports = ["bacon.windows32"] - datas = collect_native_files('bacon.windows32', files) - else: - hiddenimports = ["bacon.windows64"] - datas = collect_native_files('bacon.windows64', files) -elif is_darwin: - if ctypes.sizeof(ctypes.c_void_p) == 4: - hiddenimports = ["bacon.darwin32"] - files = ['Bacon.dylib'] - datas = collect_native_files('bacon.darwin32', files) - else: - hiddenimports = ["bacon.darwin64"] - files = ['Bacon64.dylib'] - datas = collect_native_files('bacon.darwin64', files) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-bcrypt.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-bcrypt.py deleted file mode 100644 index adbb592..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-bcrypt.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Hook for https://pypi.org/project/bcrypt/ -""" - -hiddenimports = ['_cffi_backend'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-bitsandbytes.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-bitsandbytes.py deleted file mode 100644 index 7897cf3..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-bitsandbytes.py +++ /dev/null @@ -1,23 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# --------------------------------------------------- - -from PyInstaller.utils.hooks import collect_dynamic_libs - -# bitsandbytes contains several extensions for CPU and different CUDA versions: libbitsandbytes_cpu.so, -# libbitsandbytes_cuda110_nocublaslt.so, libbitsandbytes_cuda110.so, etc. At build-time, we could query the -# `bitsandbytes.cextension.setup` and its `binary_name` attribute for the extension that is in use. However, if the -# build system does not have CUDA available, this would automatically mean that we will not collect any of the CUDA -# libs. So for now, we collect them all. -binaries = collect_dynamic_libs("bitsandbytes") - -# bitsandbytes uses triton's JIT module, which requires access to source .py files. -module_collection_mode = 'pyz+py' diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-black.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-black.py deleted file mode 100644 index 25ba19c..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-black.py +++ /dev/null @@ -1,29 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -from PyInstaller.utils.hooks import collect_submodules, collect_data_files - -# These are all imported from cythonized extensions. -hiddenimports = [ - 'json', - 'platform', - 'click', - 'mypy_extensions', - 'pathspec', - '_black_version', - 'platformdirs', - *collect_submodules('black'), - # blib2to3.pytree, blib2to3.pygen, various submodules from blib2to3.pgen2; best to just collect all submodules. - *collect_submodules('blib2to3'), -] - -# Ensure that `black/resources/black.schema.json` is collected, in case someone tries to call `black.schema.get_schema`. -datas = collect_data_files('black') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-bleak.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-bleak.py deleted file mode 100644 index 9fa261e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-bleak.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -# hook for https://github.com/hbldh/bleak - -from PyInstaller.utils.hooks import collect_data_files, collect_dynamic_libs -from PyInstaller.compat import is_win - -if is_win: - datas = collect_data_files('bleak', subdir=r'backends\dotnet') - binaries = collect_dynamic_libs('bleak') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-blib2to3.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-blib2to3.py deleted file mode 100644 index cda9c1c..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-blib2to3.py +++ /dev/null @@ -1,26 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -from PyInstaller.utils.hooks import collect_submodules, collect_data_files -from _pyinstaller_hooks_contrib.utils.mypy import find_mypyc_module_for_dist - -hiddenimports = [ - # `black` (or rather, its `blib2to3` library) uses `mypy`, and includes a top-level module with - # dynamically-generated name prefix; for example, `30fcd23745efe32ce681__mypyc`. - *find_mypyc_module_for_dist('black'), - 'dataclasses', - 'pkgutil', - 'tempfile', - *collect_submodules('blib2to3') -] - -# Ensure that data files, such as `PatternGrammar.txt` and `Grammar.txt`, are collected. -datas = collect_data_files('blib2to3') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-blspy.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-blspy.py deleted file mode 100644 index 18cbca2..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-blspy.py +++ /dev/null @@ -1,35 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -import os -import glob - -from PyInstaller.utils.hooks import get_module_file_attribute -from PyInstaller.compat import is_win - -# blspy comes as a stand-alone extension module that's placed directly -# in site-packages. -# -# On macOS and Linux, it is linked against the GMP library, whose shared -# library is stored in blspy.libs and .dylibsblspy, respectively. As this -# is a linked dependency, it is collected properly by PyInstaller and -# no further work is needed. -# -# On Windows, however, the blspy extension is linked against MPIR library, -# whose DLLs are placed directly into site-packages. The mpir.dll is -# linked dependency and is picked up automatically, but it in turn -# dynamically loads CPU-specific backends that are named mpir_*.dll. -# We need to colllect these manually. -if is_win: - blspy_dir = os.path.dirname(get_module_file_attribute('blspy')) - mpir_dlls = glob.glob(os.path.join(blspy_dir, 'mpir_*.dll')) - binaries = [(mpir_dll, '.') for mpir_dll in mpir_dlls] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-bokeh.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-bokeh.py deleted file mode 100644 index 8c42be6..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-bokeh.py +++ /dev/null @@ -1,27 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files, copy_metadata, is_module_satisfies - -# core/_templates/* -# server/static/**/* -# subcommands/*.py -# bokeh/_sri.json - -datas = collect_data_files('bokeh.core') + \ - collect_data_files('bokeh.server') + \ - collect_data_files('bokeh.command.subcommands', include_py_files=True) + \ - collect_data_files('bokeh') - -# bokeh >= 3.0.0 sets its __version__ from metadata -if is_module_satisfies('bokeh >= 3.0.0'): - datas += copy_metadata('bokeh') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-boto.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-boto.py deleted file mode 100644 index 4ee2144..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-boto.py +++ /dev/null @@ -1,25 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -# -# Boto3, the next version of Boto, is now stable and recommended for general -# use. -# -# Boto is an integrated interface to current and future infrastructural -# services offered by Amazon Web Services. -# -# http://boto.readthedocs.org/en/latest/ -# -# Tested with boto 2.38.0 - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('boto') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-boto3.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-boto3.py deleted file mode 100644 index 579463c..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-boto3.py +++ /dev/null @@ -1,29 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -# -# Boto is the Amazon Web Services (AWS) SDK for Python, which allows Python -# developers to write software that makes use of Amazon services like S3 and -# EC2. Boto provides an easy to use, object-oriented API as well as low-level -# direct service access. -# -# http://boto3.readthedocs.org/en/latest/ -# -# Tested with boto3 1.2.1 - -from PyInstaller.utils.hooks import collect_data_files, collect_submodules - -hiddenimports = ( - collect_submodules('boto3.dynamodb') + - collect_submodules('boto3.ec2') + - collect_submodules('boto3.s3') -) -datas = collect_data_files('boto3') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-botocore.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-botocore.py deleted file mode 100644 index 47ab1a0..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-botocore.py +++ /dev/null @@ -1,30 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -# -# Botocore is a low-level interface to a growing number of Amazon Web Services. -# Botocore serves as the foundation for the AWS-CLI command line utilities. It -# will also play an important role in the boto3.x project. -# -# The botocore package is compatible with Python versions 2.6.5, Python 2.7.x, -# and Python 3.3.x and higher. -# -# https://botocore.readthedocs.org/en/latest/ -# -# Tested with botocore 1.4.36 - -from PyInstaller.utils.hooks import collect_data_files -from PyInstaller.utils.hooks import is_module_satisfies - -if is_module_satisfies('botocore >= 1.4.36'): - hiddenimports = ['html.parser'] - -datas = collect_data_files('botocore') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-branca.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-branca.py deleted file mode 100644 index 9cb01f9..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-branca.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("branca") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cairocffi.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cairocffi.py deleted file mode 100644 index c7db979..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cairocffi.py +++ /dev/null @@ -1,45 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -import ctypes.util -import os - -from PyInstaller.depend.utils import _resolveCtypesImports -from PyInstaller.utils.hooks import collect_data_files, is_module_satisfies, logger - -datas = collect_data_files("cairocffi") - -binaries = [] - -# NOTE: Update this if cairocffi requires more libraries -libs = ["cairo-2", "cairo", "libcairo-2"] - -try: - lib_basenames = [] - for lib in libs: - libname = ctypes.util.find_library(lib) - if libname is not None: - lib_basenames += [os.path.basename(libname)] - - if lib_basenames: - resolved_libs = _resolveCtypesImports(lib_basenames) - for resolved_lib in resolved_libs: - binaries.append((resolved_lib[1], '.')) -except Exception as e: - logger.warning("Error while trying to find system-installed Cairo library: %s", e) - -if not binaries: - logger.warning("Cairo library not found - cairocffi will likely fail to work!") - -# cairocffi 1.6.0 requires cairocffi/constants.py source file, so make sure it is collected. -# The module collection mode setting requires PyInstaller >= 5.3. -if is_module_satisfies('cairocffi >= 1.6.0'): - module_collection_mode = {'cairocffi.constants': 'pyz+py'} diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cairosvg.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cairosvg.py deleted file mode 100644 index 6098bf2..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cairosvg.py +++ /dev/null @@ -1,40 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -import ctypes.util -import os - -from PyInstaller.depend.utils import _resolveCtypesImports -from PyInstaller.utils.hooks import collect_data_files, logger - -datas = collect_data_files("cairosvg") - -binaries = [] - -# NOTE: Update this if cairosvg requires more libraries -libs = ["cairo-2", "cairo", "libcairo-2"] - -try: - lib_basenames = [] - for lib in libs: - libname = ctypes.util.find_library(lib) - if libname is not None: - lib_basenames += [os.path.basename(libname)] - - if lib_basenames: - resolved_libs = _resolveCtypesImports(lib_basenames) - for resolved_lib in resolved_libs: - binaries.append((resolved_lib[1], '.')) -except Exception as e: - logger.warning("Error while trying to find system-installed Cairo library: %s", e) - -if not binaries: - logger.warning("Cairo library not found - cairosvg will likely fail to work!") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-capstone.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-capstone.py deleted file mode 100644 index 3f18043..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-capstone.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -from PyInstaller.utils.hooks import collect_dynamic_libs - -# Collect needed libraries for capstone -binaries = collect_dynamic_libs('capstone') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cassandra.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cassandra.py deleted file mode 100644 index 1ebd1dd..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cassandra.py +++ /dev/null @@ -1,22 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -# -# A modern, feature-rich and highly-tunable Python client library for Apache Cassandra (2.1+) and -# DataStax Enterprise (4.7+) using exclusively Cassandra's binary protocol and Cassandra Query Language v3. -# -# http://datastax.github.io/python-driver/api/index.html -# -# Tested with cassandra-driver 3.25.0 - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules('cassandra') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-celpy.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-celpy.py deleted file mode 100644 index 6d66a0e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-celpy.py +++ /dev/null @@ -1,24 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -# -# cel-python is Pure Python implementation of Google Common Expression Language, -# https://opensource.google/projects/cel -# This implementation has minimal dependencies, runs quickly, and can be embedded into Python-based applications. -# Specifically, the intent is to be part of Cloud Custodian, C7N, as part of the security policy filter. -# https://github.com/cloud-custodian/cel-python -# -# Tested with cel-python 0.1.5 - -from PyInstaller.utils.hooks import collect_data_files - -# Collect *.lark file(s) from the package -datas = collect_data_files('celpy') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-certifi.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-certifi.py deleted file mode 100644 index 22c3d0b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-certifi.py +++ /dev/null @@ -1,21 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Certifi is a carefully curated collection of Root Certificates for -# validating the trustworthiness of SSL certificates while verifying -# the identity of TLS hosts. - -# It has been extracted from the Requests project. - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('certifi') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cf_units.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cf_units.py deleted file mode 100644 index e8c1f3f..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cf_units.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -# Include data files from cf_units/etc sub-directory. -datas = collect_data_files('cf_units', includes=['etc/**']) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cftime.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cftime.py deleted file mode 100644 index 20cfc82..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cftime.py +++ /dev/null @@ -1,21 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# The cftime._cftime is a cython exension with following hidden imports: -hiddenimports = [ - 're', - 'time', - 'datetime', - 'warnings', - 'numpy', - 'cftime._strptime', -] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-chardet.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-chardet.py deleted file mode 100644 index f7c9156..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-chardet.py +++ /dev/null @@ -1,31 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2026 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies - -hiddenimports = [] -datas = [] - -# Starting with v7.0.0, we need to collect mypy extension, and the data files from chardet/models -if is_module_satisfies("chardet >= 7.0.0"): - from PyInstaller.utils.hooks import collect_data_files - from _pyinstaller_hooks_contrib.utils.mypy import find_mypyc_module_for_dist - - hiddenimports += find_mypyc_module_for_dist('chardet') - datas += collect_data_files('chardet') - -# In the Windows PyPI wheel of chardet v7.4.0post2, the extensions in `chardet.pipeline` seem to come with individual -# `__mypyc` counterparts (for example the `chardet.pipeline.orchestrator` extension references a corresponding -# `chardet.pipeline.orchestrator__mypyc` extension). Ensure all these are collected by collecting submodules. -if is_module_satisfies("chardet >= 7.4.0"): - from PyInstaller.utils.hooks import collect_submodules - hiddenimports += collect_submodules('chardet.pipeline') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-charset_normalizer.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-charset_normalizer.py deleted file mode 100644 index d429b84..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-charset_normalizer.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies - -if is_module_satisfies("charset_normalizer >= 3.4.5"): - from _pyinstaller_hooks_contrib.utils.mypy import find_mypyc_module_for_dist - hiddenimports = find_mypyc_module_for_dist('charset_normalizer') -elif is_module_satisfies("charset_normalizer >= 3.0.1"): - hiddenimports = ["charset_normalizer.md__mypyc"] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cloudpickle.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cloudpickle.py deleted file mode 100644 index bfaff37..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cloudpickle.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies - -# cloudpickle to 3.0.0 keeps `cloudpickle_fast` module around for backward compatibility with existing pickled data, -# but does not import it directly anymore. Ensure it is collected nevertheless. -if is_module_satisfies("cloudpickle >= 3.0.0"): - hiddenimports = ["cloudpickle.cloudpickle_fast"] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cloudscraper.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cloudscraper.py deleted file mode 100644 index 3656f24..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cloudscraper.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('cloudscraper') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-clr.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-clr.py deleted file mode 100644 index e0afb86..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-clr.py +++ /dev/null @@ -1,55 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# There is a name clash between pythonnet's clr module/extension (which this hooks is for) and clr package that provides -# the terminal styling library (https://pypi.org/project/clr/). Therefore, we must first check if pythonnet is actually -# available... -from PyInstaller.utils.hooks import is_module_satisfies -from PyInstaller.compat import is_win - -if is_module_satisfies("pythonnet"): - # pythonnet requires both clr.pyd and Python.Runtime.dll, but the latter isn't found by PyInstaller. - import ctypes.util - from PyInstaller.log import logger - from _pyinstaller_hooks_contrib.compat import importlib_metadata - - collected_runtime_files = [] - - # Try finding Python.Runtime.dll via distribution's file list - dist_files = importlib_metadata.files('pythonnet') or [] - runtime_dll_files = [f for f in dist_files if f.match('Python.Runtime.dll')] - if len(runtime_dll_files) == 1: - runtime_dll_file = runtime_dll_files[0] - collected_runtime_files = [(runtime_dll_file.locate(), runtime_dll_file.parent.as_posix())] - logger.debug("hook-clr: Python.Runtime.dll discovered via metadata.") - elif len(runtime_dll_files) > 1: - logger.warning("hook-clr: multiple instances of Python.Runtime.dll listed in metadata - cannot resolve.") - - # Fall back to the legacy way - if not collected_runtime_files: - runtime_dll_file = ctypes.util.find_library('Python.Runtime') - if runtime_dll_file: - collected_runtime_files = [(runtime_dll_file, '.')] - logger.debug('hook-clr: Python.Runtime.dll discovered via legacy method.') - - if not collected_runtime_files: - raise Exception('Python.Runtime.dll not found') - - # On Windows, collect runtime DLL file(s) as binaries; on other OSes, collect them as data files, to prevent fatal - # errors in binary dependency analysis. - if is_win: - binaries = collected_runtime_files - else: - datas = collected_runtime_files - - # These modules are imported inside Python.Runtime.dll - hiddenimports = ["platform", "warnings"] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-clr_loader.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-clr_loader.py deleted file mode 100644 index e997c41..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-clr_loader.py +++ /dev/null @@ -1,22 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.compat import is_win, is_cygwin -from PyInstaller.utils.hooks import collect_dynamic_libs - -# The clr-loader is used by pythonnet 3.x to load CLR (.NET) runtime. -# On Windows, the default runtime is the .NET Framework, and its corresponding -# loader requires DLLs from clr_loader\ffi\dlls to be collected. This runtime -# is supported only on Windows, so we do not have to worry about it on other -# OSes (where Mono or .NET Core are supported). -if is_win or is_cygwin: - binaries = collect_dynamic_libs("clr_loader") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cmocean.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cmocean.py deleted file mode 100644 index d7201b5..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cmocean.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("cmocean", subdir="rgb") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-compliance_checker.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-compliance_checker.py deleted file mode 100644 index d8fb4be..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-compliance_checker.py +++ /dev/null @@ -1,22 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules, copy_metadata, collect_data_files - -# Collect submodules to ensure that checker plugins are collected. but avoid collecting tests sub-package. -hiddenimports = collect_submodules('compliance_checker', filter=lambda name: name != 'compliance_checker.tests') - -# Copy metadata, because checker plugins are discovered via entry-points -datas = copy_metadata('compliance_checker') - -# Include data files from compliance_checker/data sub-directory. -datas += collect_data_files('compliance_checker', includes=['data/**']) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-comtypes.client.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-comtypes.client.py deleted file mode 100644 index a96e16d..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-comtypes.client.py +++ /dev/null @@ -1,22 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# https://github.com/enthought/comtypes/blob/1.4.5/comtypes/client/_generate.py#L271-L280 -hiddenimports = [ - "comtypes.persist", - "comtypes.typeinfo", - "comtypes.automation", - "comtypes.stream", - "comtypes", - "ctypes.wintypes", - "ctypes", -] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-countrycode.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-countrycode.py deleted file mode 100644 index 535105d..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-countrycode.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('countrycode') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-countryinfo.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-countryinfo.py deleted file mode 100644 index aa05a06..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-countryinfo.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata, collect_data_files - -datas = copy_metadata("countryinfo") + collect_data_files("countryinfo") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cryptography.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cryptography.py deleted file mode 100644 index 4e55d49..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cryptography.py +++ /dev/null @@ -1,132 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Hook for cryptography module from the Python Cryptography Authority. -""" - -import os -import glob -import pathlib - -from PyInstaller import compat -from PyInstaller import isolated -from PyInstaller.utils.hooks import ( - collect_submodules, - copy_metadata, - get_module_file_attribute, - is_module_satisfies, - logger, -) - -# get the package data so we can load the backends -datas = copy_metadata('cryptography') - -# Add the backends as hidden imports -hiddenimports = collect_submodules('cryptography.hazmat.backends') - -# Add the OpenSSL FFI binding modules as hidden imports -hiddenimports += collect_submodules('cryptography.hazmat.bindings.openssl') + ['_cffi_backend'] - - -# Include the cffi extensions as binaries in a subfolder named like the package. -# The cffi verifier expects to find them inside the package directory for -# the main module. We cannot use hiddenimports because that would add the modules -# outside the package. -# NOTE: this is not true anymore with PyInstaller >= 6.0, but we keep it like this for compatibility with 5.x series. -binaries = [] -cryptography_dir = os.path.dirname(get_module_file_attribute('cryptography')) -for ext in compat.EXTENSION_SUFFIXES: - ffimods = glob.glob(os.path.join(cryptography_dir, '*_cffi_*%s*' % ext)) - for f in ffimods: - binaries.append((f, 'cryptography')) - - -# Check if `cryptography` is dynamically linked against OpenSSL >= 3.0.0. In that case, we might need to collect -# external OpenSSL modules, if OpenSSL was built with modules support. It seems the best indication of this is the -# presence of `ossl-modules` directory next to the OpenSSL shared library. -# -# NOTE: PyPI wheels ship with extensions statically linked against OpenSSL, so this is mostly catering alternative -# installation methods (Anaconda on all OSes, Homebrew on macOS, various linux distributions). -try: - @isolated.decorate - def _check_cryptography_openssl3(): - # Check if OpenSSL 3 is used. - from cryptography.hazmat.backends.openssl.backend import backend - openssl_version = backend.openssl_version_number() - if openssl_version < 0x30000000: - return False, None - - # Obtain path to the bindings module for binary dependency analysis. Under older versions of cryptography, - # this was a separate `_openssl` module; in contemporary versions, it is `_rust` module. - try: - import cryptography.hazmat.bindings._openssl as bindings_module - except ImportError: - import cryptography.hazmat.bindings._rust as bindings_module - - return True, str(bindings_module.__file__) - - uses_openssl3, bindings_module = _check_cryptography_openssl3() -except Exception: - logger.warning( - "hook-cryptography: failed to determine whether cryptography is using OpenSSL >= 3.0.0", exc_info=True - ) - uses_openssl3, bindings_module = False, None - -if uses_openssl3: - # Determine location of OpenSSL shared library, provided that extension module is dynamically linked against it. - # This requires the new PyInstaller.bindepend API from PyInstaller >= 6.0. - openssl_lib = None - if is_module_satisfies("PyInstaller >= 6.0"): - from PyInstaller.depend import bindepend - - if compat.is_win: - SSL_LIB_NAME = 'libssl-3-x64.dll' if compat.is_64bits else 'libssl-3.dll' - elif compat.is_darwin: - SSL_LIB_NAME = 'libssl.3.dylib' - else: - SSL_LIB_NAME = 'libssl.so.3' - - linked_libs = bindepend.get_imports(bindings_module) - openssl_lib = [ - # Compare the basename of lib_name, because lib_fullpath is None if we fail to resolve the library. - lib_fullpath for lib_name, lib_fullpath in linked_libs if os.path.basename(lib_name) == SSL_LIB_NAME - ] - openssl_lib = openssl_lib[0] if openssl_lib else None - else: - logger.warning( - "hook-cryptography: full support for cryptography + OpenSSL >= 3.0.0 requires PyInstaller >= 6.0" - ) - - # Check for presence of ossl-modules directory next to the OpenSSL shared library. - if openssl_lib: - logger.info("hook-cryptography: cryptography uses dynamically-linked OpenSSL: %r", openssl_lib) - - openssl_lib_dir = pathlib.Path(openssl_lib).parent - - # Collect whole ossl-modules directory, if it exists. - ossl_modules_dir = openssl_lib_dir / 'ossl-modules' - - # Msys2/MinGW installations on Windows put the shared library into `bin` directory, but the modules are - # located in `lib` directory. Account for that possibility. - if not ossl_modules_dir.is_dir() and openssl_lib_dir.name == 'bin': - ossl_modules_dir = openssl_lib_dir.parent / 'lib' / 'ossl-modules' - - # On Alpine linux, the true location of shared library is /lib directory, but the modules' directory is located - # in /usr/lib instead. Account for that possibility. - if not ossl_modules_dir.is_dir() and openssl_lib_dir == pathlib.Path('/lib'): - ossl_modules_dir = pathlib.Path('/usr/lib/ossl-modules') - - if ossl_modules_dir.is_dir(): - logger.debug("hook-cryptography: collecting OpenSSL modules directory: %r", str(ossl_modules_dir)) - binaries.append((str(ossl_modules_dir), 'ossl-modules')) - else: - logger.info("hook-cryptography: cryptography does not seem to be using dynamically linked OpenSSL.") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cumm.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cumm.py deleted file mode 100644 index 1193a7f..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cumm.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later - -from PyInstaller.utils.hooks import collect_data_files - -# Collect files from cumm/include directory - at import, the package asserts the existence of this directory. -datas = collect_data_files('cumm') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-customtkinter.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-customtkinter.py deleted file mode 100644 index 0247ad6..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-customtkinter.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("customtkinter") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cv2.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cv2.py deleted file mode 100644 index d6573c1..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cv2.py +++ /dev/null @@ -1,168 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -import sys -import os -import glob -import pathlib - -import PyInstaller.utils.hooks as hookutils -from PyInstaller import compat - -hiddenimports = ['numpy'] - -# On Windows, make sure that opencv_videoio_ffmpeg*.dll is bundled -binaries = [] -if compat.is_win: - # If conda is active, look for the DLL in its library path - if compat.is_conda: - libdir = os.path.join(compat.base_prefix, 'Library', 'bin') - pattern = os.path.join(libdir, 'opencv_videoio_ffmpeg*.dll') - for f in glob.glob(pattern): - - binaries.append((f, '.')) - - # Include any DLLs from site-packages/cv2 (opencv_videoio_ffmpeg*.dll - # can be found there in the PyPI version) - binaries += hookutils.collect_dynamic_libs('cv2') - -# Collect auxiliary sub-packages, such as `cv2.gapi`, `cv2.mat_wrapper`, `cv2.misc`, and `cv2.utils`. This also -# picks up submodules with valid module names, such as `cv2.config`, `cv2.load_config_py2`, and `cv2.load_config_py3`. -# Therefore, filter out `cv2.load_config_py2`. -hiddenimports += hookutils.collect_submodules('cv2', filter=lambda name: name != 'cv2.load_config_py2') - -# We also need to explicitly exclude `cv2.load_config_py2` due to it being imported in `cv2.__init__`. -excludedimports = ['cv2.load_config_py2'] - -# OpenCV loader from 4.5.4.60 requires extra config files and modules. -# We need to collect `config.py` and `load_config_py3`; to improve compatibility with PyInstaller < 5.2, where -# `module_collection_mode` (see below) is not implemented. -# We also need to collect `config-3.py` or `config-3.X.py`, whichever is available (the former is usually -# provided by PyPI wheels, while the latter seems to be used when user builds OpenCV from source). -datas = hookutils.collect_data_files( - 'cv2', - include_py_files=True, - includes=[ - 'config.py', - f'config-{sys.version_info[0]}.{sys.version_info[1]}.py', - 'config-3.py', - 'load_config_py3.py', - ], -) - - -# The OpenCV versions that attempt to perform module substitution via sys.path manipulation (== 4.5.4.58, >= 4.6.0.66) -# do not directly import the cv2.cv2 extension anymore, so in order to ensure it is collected, we would need to add it -# to hidden imports. However, when OpenCV is built by user from source, the extension is not located in the package's -# root directory, but in python-3.X sub-directory, which precludes referencing via module name due to sub-directory -# not being a valid subpackage name. Hence, emulate the OpenCV's loader and execute `config-3.py` or `config-3.X.py` -# to obtain the search path. -def find_cv2_extension(config_file): - # Prepare environment - PYTHON_EXTENSIONS_PATHS = [] - LOADER_DIR = os.path.dirname(os.path.abspath(os.path.realpath(config_file))) - - global_vars = globals().copy() - local_vars = locals().copy() - - # Exec the config file - with open(config_file) as fp: - code = compile(fp.read(), os.path.basename(config_file), 'exec') - exec(code, global_vars, local_vars) - - # Read the modified PYTHON_EXTENSIONS_PATHS - PYTHON_EXTENSIONS_PATHS = local_vars['PYTHON_EXTENSIONS_PATHS'] - if not PYTHON_EXTENSIONS_PATHS: - return None - - # Search for extension file - for extension_path in PYTHON_EXTENSIONS_PATHS: - extension_path = pathlib.Path(extension_path) - if compat.is_win: - extension_files = list(extension_path.glob('cv2*.pyd')) - else: - extension_files = list(extension_path.glob('cv2*.so')) - if extension_files: - if len(extension_files) > 1: - hookutils.logger.warning("Found multiple cv2 extension candidates: %s", extension_files) - extension_file = extension_files[0] # Take first (or hopefully the only one) - - hookutils.logger.debug("Found cv2 extension module: %s", extension_file) - - # Compute path relative to parent of config file (which should be the package's root) - dest_dir = pathlib.Path("cv2") / extension_file.parent.relative_to(LOADER_DIR) - return str(extension_file), str(dest_dir) - - hookutils.logger.warning( - "Could not find cv2 extension module! Config file: %s, search paths: %s", - config_file, PYTHON_EXTENSIONS_PATHS) - - return None - - -config_file = [ - src_path for src_path, _ in datas - if os.path.basename(src_path) in (f'config-{sys.version_info[0]}.{sys.version_info[1]}.py', 'config-3.py') -] - -if config_file: - try: - extension_info = find_cv2_extension(config_file[0]) - if extension_info: - ext_src, ext_dst = extension_info - # Due to bug in PyInstaller's TOC structure implementation (affecting PyInstaller up to latest version at - # the time of writing, 5.9), we fail to properly resolve `cv2.cv2` EXTENSION entry's destination name if - # we already have a BINARY entry with the same destination name. This results in verbatim `cv2.cv2` file - # created in application directory in addition to the proper copy in the `cv2` sub-directoy. - # Therefoe, if destination directory of the cv2 extension module is the top-level package directory, fall - # back to using hiddenimports instead. - if ext_dst == 'cv2': - # Extension found in top-level package directory; likely a PyPI wheel. - hiddenimports += ['cv2.cv2'] - else: - # Extension found in sub-directory; use BINARY entry - binaries += [extension_info] - except Exception: - hookutils.logger.warning("Failed to determine location of cv2 extension module!", exc_info=True) - - -# Mark the cv2 package to be collected in source form, bypassing PyInstaller's PYZ archive and FrozenImporter. This is -# necessary because recent versions of cv2 package attempt to perform module substritution via sys.path manipulation, -# which is incompatible with the way that FrozenImporter works. This requires pyinstaller/pyinstaller#6945, i.e., -# PyInstaller >= 5.3. On earlier versions, the following statement does nothing, and problematic cv2 versions -# (== 4.5.4.58, >= 4.6.0.66) will not work. -# -# Note that the collect_data_files() above is still necessary, because some of the cv2 loader's config scripts are not -# valid module names (e.g., config-3.py). So the two collection approaches are complementary, and any overlap in files -# (e.g., __init__.py) is handled gracefully due to PyInstaller's uniqueness constraints on collected files. -module_collection_mode = 'py' - -# In linux PyPI opencv-python wheels, the cv2 extension is linked against Qt, and the wheel bundles a basic subset of Qt -# shared libraries, plugins, and font files. This is not the case on other OSes (presumably native UI APIs are used by -# OpenCV HighGUI module), nor in the headless PyPI wheels (opencv-python-headless). -# The bundled Qt shared libraries should be picked up automatically due to binary dependency analysis, but we need to -# collect plugins and font files from the `qt` subdirectory. -if compat.is_linux: - pkg_path = pathlib.Path(hookutils.get_module_file_attribute('cv2')).parent - # Collect .ttf files fron fonts directory. - # NOTE: since we are using glob, we can skip checks for (sub)directories' existence. - qt_fonts_dir = pkg_path / 'qt' / 'fonts' - datas += [ - (str(font_file), str(font_file.parent.relative_to(pkg_path.parent))) - for font_file in qt_fonts_dir.rglob('*.ttf') - ] - # Collect .so files from plugins directory. - qt_plugins_dir = pkg_path / 'qt' / 'plugins' - binaries += [ - (str(plugin_file), str(plugin_file.parent.relative_to(pkg_path.parent))) - for plugin_file in qt_plugins_dir.rglob('*.so') - ] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cx_Oracle.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cx_Oracle.py deleted file mode 100644 index ae5daa8..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cx_Oracle.py +++ /dev/null @@ -1,13 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -hiddenimports = ['decimal'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cytoolz.itertoolz.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cytoolz.itertoolz.py deleted file mode 100644 index fcba975..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cytoolz.itertoolz.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for the cytoolz package: https://pypi.python.org/pypi/cytoolz -# Tested with cytoolz 0.9.0 and Python 3.5.2, on Ubuntu Linux x64 - -hiddenimports = ['cytoolz.utils', 'cytoolz._signatures'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash.py deleted file mode 100644 index 07a3fe8..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('dash') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash_bootstrap_components.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash_bootstrap_components.py deleted file mode 100644 index 8028d14..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash_bootstrap_components.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('dash_bootstrap_components') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash_core_components.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash_core_components.py deleted file mode 100644 index a41fe5a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash_core_components.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('dash_core_components') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash_html_components.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash_html_components.py deleted file mode 100644 index 077d8a5..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash_html_components.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('dash_html_components') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash_renderer.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash_renderer.py deleted file mode 100644 index 854f87e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash_renderer.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('dash_renderer') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash_table.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash_table.py deleted file mode 100644 index b7bb600..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash_table.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('dash_table') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash_uploader.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash_uploader.py deleted file mode 100644 index f9bf99b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash_uploader.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('dash_uploader') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dask.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dask.py deleted file mode 100644 index a11f7b7..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dask.py +++ /dev/null @@ -1,19 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2020, PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import collect_data_files - -# Collect data files: -# - dask.yaml -# - dask-schema.yaml -# - widgets/templates/*.html.j2 (but avoid collecting files from `widgets/tests/templates`!) -datas = collect_data_files('dask', includes=['*.yml', '*.yaml', 'widgets/templates/*.html.j2']) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-datasets.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-datasets.py deleted file mode 100644 index 1ff1a61..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-datasets.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Collect source .py files for JIT/torchscript. Requires PyInstaller >= 5.3, no-op in older versions. -module_collection_mode = 'pyz+py' diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dateparser.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dateparser.py deleted file mode 100644 index ed97292..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dateparser.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -# Ensure that `dateparser/data/dateparser_tz_cache.pkl` data file is collected. Applicable to dateparser >= v1.2.2; -# earlier releases have no data files, so this call returns empty list. -datas = collect_data_files('dateparser') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dateparser.utils.strptime.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dateparser.utils.strptime.py deleted file mode 100644 index 35e6c92..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dateparser.utils.strptime.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for dateparser: https://pypi.org/project/dateparser/ - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = ["_strptime"] + collect_submodules('dateparser.data') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dateutil.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dateutil.py deleted file mode 100644 index 54abddf..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dateutil.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("dateutil") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dbus_fast.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dbus_fast.py deleted file mode 100644 index 4e2eb72..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dbus_fast.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules - -# Collect all submodules to handle imports made from cythonized extensions. -hiddenimports = collect_submodules('dbus_fast') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dclab.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dclab.py deleted file mode 100644 index 3179a16..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dclab.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for dclab: https://pypi.python.org/pypi/dclab - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('dclab') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ddgs.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ddgs.py deleted file mode 100644 index 3d41d20..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ddgs.py +++ /dev/null @@ -1,20 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2026 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules - -# The .ddgs module is lazily loaded, and is discovered only because PyInstaller currently analyzes imports under -# `if TYPE_CHECKING`. See: https://github.com/deedy5/ddgs/blob/v9.10.0/ddgs/__init__.py#L14-L15 -hiddenimports = ['ddgs.ddgs'] - -# The engines/backends are discovered via `pkgutil.iter_modules()`, so we need to ensure they are collected. -hiddenimports += collect_submodules('ddgs.engines') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-detectron2.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-detectron2.py deleted file mode 100644 index 1ff1a61..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-detectron2.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Collect source .py files for JIT/torchscript. Requires PyInstaller >= 5.3, no-op in older versions. -module_collection_mode = 'pyz+py' diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-discid.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-discid.py deleted file mode 100644 index 37cba62..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-discid.py +++ /dev/null @@ -1,40 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -import os - -from PyInstaller.utils.hooks import get_module_attribute, logger -from PyInstaller.depend.utils import _resolveCtypesImports - -binaries = [] - -# Use the _LIB_NAME attribute of discid.libdiscid to resolve the shared library name. This saves us from having to -# duplicate the name guessing logic from discid.libdiscid. -# On error, PyInstaller >= 5.0 raises exception, earlier versions return an empty string. -try: - lib_name = get_module_attribute("discid.libdiscid", "_LIB_NAME") -except Exception: - lib_name = None - -if lib_name: - lib_name = os.path.basename(lib_name) - try: - resolved_binary = _resolveCtypesImports([lib_name]) - lib_file = resolved_binary[0][1] - except Exception as e: - lib_file = None - logger.warning("Error while trying to resolve %s: %s", lib_name, e) - - if lib_file: - binaries += [(lib_file, '.')] -else: - logger.warning("Failed to determine name of libdiscid shared library from _LIB_NAME attribute of discid.libdiscid!") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-distorm3.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-distorm3.py deleted file mode 100644 index b2fb731..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-distorm3.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for the diStorm3 module: https://pypi.python.org/pypi/distorm3 -# Tested with distorm3 3.3.0, Python 2.7, Windows - -from PyInstaller.utils.hooks import collect_dynamic_libs - -# distorm3 dynamic library should be in the path with other dynamic libraries. -binaries = collect_dynamic_libs('distorm3', destdir='.') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-distributed.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-distributed.py deleted file mode 100644 index d1072d9..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-distributed.py +++ /dev/null @@ -1,29 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2025, PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import collect_data_files, collect_submodules - -# Collect submodules of distributed.http, many of which are imported indirectly. -hiddenimports = collect_submodules("distributed.http") - -# Collect data files (distributed.yaml, distributed-schema.yaml, templates). -datas = collect_data_files("distributed") - -# `distributed.dashboard.components.scheduler` attempts to refer to data files relative to its parent directory, but -# with non-normalized '..' elements in the path (e.g., `_MEIPASS/distributed/dashboard/components/../theme.yaml`). On -# POSIX systems, such paths are treated as non-existent if a component does not exist, even if the file exists at the -# normalized location (i.e., if `_MEIPASS/distributed/dashboard/theme.yaml` file exists but -# `_MEIPASS/distributed/dashboard/components` directory does not). As a work around, collect source .py files from -# `distributed.dashboard.components` to ensure existence of the `components` directory. -module_collection_mode = { - 'distributed.dashboard.components': 'pyz+py', -} diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dns.rdata.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dns.rdata.py deleted file mode 100644 index a185ad9..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dns.rdata.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# This is hook for DNS python package dnspython. - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules('dns.rdtypes') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-docutils.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-docutils.py deleted file mode 100644 index 9d4ee79..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-docutils.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules, collect_data_files - -hiddenimports = (collect_submodules('docutils.languages') + - collect_submodules('docutils.writers') + - collect_submodules('docutils.parsers.rst.languages') + - collect_submodules('docutils.parsers.rst.directives')) -datas = collect_data_files('docutils') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-docx.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-docx.py deleted file mode 100644 index aefe64e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-docx.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("docx") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-docx2pdf.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-docx2pdf.py deleted file mode 100644 index c746417..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-docx2pdf.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later. -# ------------------------------------------------------------------ - -# Hook for docx2pdf: https://pypi.org/project/docx2pdf/ - -from PyInstaller.utils.hooks import copy_metadata, collect_data_files - -datas = copy_metadata('docx2pdf') -datas += collect_data_files('docx2pdf') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-duckdb.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-duckdb.py deleted file mode 100644 index 0d24af0..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-duckdb.py +++ /dev/null @@ -1,22 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata, is_module_satisfies - -# duckdb requires stdlib `inspect` module. On newer python versions (>= 3.10), it is collected as a dependency of other -# stdlib modules, while on older python versions this is not the case. Therefore, we add it to hidden imports regardless -# of python version. -hiddenimports = ['inspect'] - -# Starting with v1.4.0, `duckdb` uses `importlib.metadata.version()` to determine its version. -if is_module_satisfies("duckdb >= 1.4.0"): - datas = copy_metadata('duckdb') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dynaconf.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dynaconf.py deleted file mode 100644 index 08c809a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dynaconf.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -hiddenimports = ['dynaconf.loaders.env_loader', - 'dynaconf.loaders.redis_loader', - 'dynaconf.loaders.vault.loader'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-easyocr.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-easyocr.py deleted file mode 100644 index a868875..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-easyocr.py +++ /dev/null @@ -1,18 +0,0 @@ -from PyInstaller.utils.hooks import collect_data_files, get_hook_config - -# Recognition backends are imported with `importlib.import_module()`. -hiddenimports = ['easyocr.model.vgg_model', 'easyocr.model.model'] - - -def hook(hook_api): - lang_codes = get_hook_config(hook_api, 'easyocr', 'lang_codes') - if not lang_codes: - lang_codes = ['*'] - - extra_datas = list() - extra_datas += collect_data_files('easyocr', include_py_files=False, subdir='character', - includes=[f'{lang_code}_char.txt' for lang_code in lang_codes]) - extra_datas += collect_data_files('easyocr', include_py_files=False, subdir='dict', - includes=[f'{lang_code}.txt' for lang_code in lang_codes]) - - hook_api.add_datas(extra_datas) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eccodeslib.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eccodeslib.py deleted file mode 100644 index b04e500..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eccodeslib.py +++ /dev/null @@ -1,20 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_dynamic_libs - -# Collect bundled dynamic libraries. -binaries = collect_dynamic_libs('eccodeslib') - -# `eccodeslib` depends on `eckitlib` and `fckitlib`, and when libraries are being imported at run-time by -# `findlibs.find()` user warnings are emitted if these packages cannot be imported. -hiddenimports = ['eckitlib', 'fckitlib'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eckitlib.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eckitlib.py deleted file mode 100644 index 99a8786..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eckitlib.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_dynamic_libs - -# Collect bundled dynamic libraries. -binaries = collect_dynamic_libs('eckitlib') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eel.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eel.py deleted file mode 100644 index ceeb974..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eel.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('eel') -hiddenimports = ['bottle_websocket'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-emoji.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-emoji.py deleted file mode 100644 index ecdf1fd..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-emoji.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('emoji') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-enchant.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-enchant.py deleted file mode 100644 index 39fd990..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-enchant.py +++ /dev/null @@ -1,69 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Import hook for PyEnchant. - -Tested with PyEnchant 1.6.6. -""" - -import os - -from PyInstaller import isolated -from PyInstaller import compat -from PyInstaller.utils.hooks import collect_data_files, collect_dynamic_libs, get_installer - -# TODO Add Linux support -# Collect first all files that were installed directly into pyenchant -# package directory and this includes: -# - Windows: libenchat-1.dll, libenchat_ispell.dll, libenchant_myspell.dll, other -# dependent dlls and dictionaries for several languages (de, en, fr) -# - macOS: usually libenchant.dylib and several dictionaries when installed via pip. -binaries = collect_dynamic_libs('enchant') -datas = collect_data_files('enchant') -excludedimports = ['enchant.tests'] - -# On macOS try to find files in Homebrew or Macports environments. -if compat.is_darwin: - # Note: env. var. ENCHANT_PREFIX_DIR is implemented only in the development version: - # https://github.com/AbiWord/enchant - # https://github.com/AbiWord/enchant/pull/2 - # TODO Test this hook with development version of enchant. - @isolated.decorate - def _get_enchant_lib(): - from enchant._enchant import e # ctypes.CDLL - return e._name - - libenchant = _get_enchant_lib() - - installer = get_installer('enchant') - if installer != 'pip': - # Note: Name of detected enchant library is 'libenchant.dylib'. However, it - # is just symlink to 'libenchant.1.dylib'. - binaries.append((libenchant, '.')) - - # Collect enchant backends from Macports. Using same file structure as on Windows. - @isolated.decorate - def _get_enchant_backends(): - from enchant import Broker - return [str(provider.file) for provider in Broker().describe()] - - backends = _get_enchant_backends() - binaries.extend([(b, 'enchant/lib/enchant') for b in backends]) - - # Collect all available dictionaries from Macports. Using same file structure as on Windows. - # In Macports are available mostly hunspell (myspell) and aspell dictionaries. - libdir = os.path.dirname(libenchant) # e.g. /opt/local/lib - sharedir = os.path.join(os.path.dirname(libdir), 'share') # e.g. /opt/local/share - if os.path.exists(os.path.join(sharedir, 'enchant')): - datas.append((os.path.join(sharedir, 'enchant'), 'enchant/share/enchant')) - if os.path.exists(os.path.join(sharedir, 'enchant-2')): - datas.append((os.path.join(sharedir, 'enchant-2'), 'enchant/share/enchant-2')) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eng_to_ipa.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eng_to_ipa.py deleted file mode 100644 index 5a78114..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eng_to_ipa.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('eng_to_ipa') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ens.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ens.py deleted file mode 100644 index 89e496e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ens.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("ens") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-enzyme.parsers.ebml.core.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-enzyme.parsers.ebml.core.py deleted file mode 100644 index 047274c..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-enzyme.parsers.ebml.core.py +++ /dev/null @@ -1,25 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -enzyme: -https://github.com/Diaoul/enzyme -""" - -import os -from PyInstaller.utils.hooks import get_package_paths - -# get path of enzyme -ep = get_package_paths('enzyme') - -# add the data -data = os.path.join(ep[1], 'parsers', 'ebml', 'specs', 'matroska.xml') -datas = [(data, "enzyme/parsers/ebml/specs")] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_abi.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_abi.py deleted file mode 100644 index 75c26f0..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_abi.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata("eth_abi") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_account.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_account.py deleted file mode 100644 index 1a9c8f5..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_account.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata("eth_account") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_hash.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_hash.py deleted file mode 100644 index 0c9d50e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_hash.py +++ /dev/null @@ -1,20 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules, copy_metadata, is_module_satisfies - -# The ``eth_hash.utils.load_backend`` function does a dynamic import. -hiddenimports = collect_submodules('eth_hash.backends') - -# As of eth-hash 0.6.0, it uses importlib.metadata.version() set its __version__ attribute -if is_module_satisfies("eth-hash >= 0.6.0"): - datas = copy_metadata("eth-hash") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_keyfile.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_keyfile.py deleted file mode 100644 index 2d9453a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_keyfile.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata("eth_keyfile") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_keys.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_keys.py deleted file mode 100644 index d96535e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_keys.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata, is_module_satisfies - -# As of eth-keys 0.5.0, it uses importlib.metadata.version() set its __version__ attribute -if is_module_satisfies("eth-keys >= 0.5.0"): - datas = copy_metadata("eth-keys") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_rlp.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_rlp.py deleted file mode 100644 index 01943a6..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_rlp.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies, copy_metadata - -# Starting with v1.0.0, `eth_rlp` queries its version from metadata. -if is_module_satisfies("eth-rlp >= 1.0.0"): - datas = copy_metadata('eth-rlp') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_typing.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_typing.py deleted file mode 100644 index f31e4ca..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_typing.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata - -# eth-typing queries it's own version using importlib.metadata/pkg_resources. -datas = copy_metadata("eth-typing") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_utils.network.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_utils.network.py deleted file mode 100644 index 3bd88f9..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_utils.network.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("eth_utils") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_utils.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_utils.py deleted file mode 100644 index a87ec3c..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_utils.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata("eth_utils") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-exchangelib.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-exchangelib.py deleted file mode 100644 index 0c46bcc..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-exchangelib.py +++ /dev/null @@ -1,12 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -hiddenimports = ['tzdata'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fabric.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fabric.py deleted file mode 100644 index 3367c0c..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fabric.py +++ /dev/null @@ -1,22 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -# -# Fabric is a high level Python (2.7, 3.4+) library designed to execute shell commands remotely over SSH, -# yielding useful Python objects in return -# -# https://docs.fabfile.org/en/latest -# -# Tested with fabric 2.6.0 - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('fabric') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fairscale.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fairscale.py deleted file mode 100644 index 8b5d53d..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fairscale.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Collect source .py files for JIT/torchscript. Requires PyInstaller >= 5.3, no-op in older versions. -module_collection_mode = 'pyz+py' diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fake_useragent.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fake_useragent.py deleted file mode 100644 index feab067..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fake_useragent.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2026 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("fake_useragent") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-faker.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-faker.py deleted file mode 100644 index 1d5b039..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-faker.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules, collect_data_files - -hiddenimports = collect_submodules('faker.providers') -datas = ( - collect_data_files('text_unidecode') + # noqa: W504 - collect_data_files('faker.providers', include_py_files=True) -) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-falcon.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-falcon.py deleted file mode 100644 index 1c1d2b1..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-falcon.py +++ /dev/null @@ -1,41 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.compat import is_py311 -from PyInstaller.utils.hooks import is_module_satisfies - -hiddenimports = [ - 'cgi', - 'falcon.app_helpers', - 'falcon.forwarded', - 'falcon.media', - 'falcon.request_helpers', - 'falcon.responders', - 'falcon.response_helpers', - 'falcon.routing', - 'falcon.vendor.mimeparse', - 'falcon.vendor', - 'uuid', - 'xml.etree.ElementTree', - 'xml.etree' -] - -# falcon v4.0.0 added couple of more cythonized modules that depend on the following stdlib modules. -if is_module_satisfies('falcon >= 4.0.0'): - hiddenimports += [ - 'dataclasses', - 'json', - ] - - # `wsgiref.types` is available (and thus referenced) only under python >= 3.11. - if is_py311: - hiddenimports += ['wsgiref.types'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fastai.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fastai.py deleted file mode 100644 index 1ff1a61..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fastai.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Collect source .py files for JIT/torchscript. Requires PyInstaller >= 5.3, no-op in older versions. -module_collection_mode = 'pyz+py' diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fastparquet.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fastparquet.py deleted file mode 100644 index b43bbb4..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fastparquet.py +++ /dev/null @@ -1,32 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -import os - -from PyInstaller.compat import is_win -from PyInstaller.utils.hooks import get_package_paths - -# In all versions for which fastparquet provides Windows wheels (>= 0.7.0), delvewheel is used, -# so we need to collect the external site-packages/fastparquet.libs directory. -if is_win: - pkg_base, pkg_dir = get_package_paths("fastparquet") - lib_dir = os.path.join(pkg_base, "fastparquet.libs") - if os.path.isdir(lib_dir): - # We collect DLLs as data files instead of binaries to suppress binary - # analysis, which would result in duplicates (because it collects a copy - # into the top-level directory instead of preserving the original layout). - # In addition to DLls, this also collects .load-order* file (required on - # python < 3.8), and ensures that fastparquet.libs directory exists (required - # on python >= 3.8 due to os.add_dll_directory call). - datas = [ - (os.path.join(lib_dir, lib_file), 'fastparquet.libs') - for lib_file in os.listdir(lib_dir) - ] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fckitlib.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fckitlib.py deleted file mode 100644 index 22fe17f..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fckitlib.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_dynamic_libs - -# Collect bundled dynamic libraries. -binaries = collect_dynamic_libs('fckitlib') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ffpyplayer.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ffpyplayer.py deleted file mode 100644 index 1a96414..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ffpyplayer.py +++ /dev/null @@ -1,28 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller import isolated -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules("ffpyplayer") -binaries = [] - - -# ffpyplayer has an internal variable that list locations of libraries it is using. -@isolated.decorate -def _get_ffpyplayer_binary_dirs(): - import ffpyplayer - return ffpyplayer.dep_bins - - -for binary_dir in _get_ffpyplayer_binary_dirs(): - binaries += [(binary_dir, '.')] # Copy DLLs from these locations into top-level application directory. diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fiona.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fiona.py deleted file mode 100644 index 1e6d3fa..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fiona.py +++ /dev/null @@ -1,26 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files, is_module_satisfies - -hiddenimports = [ - "fiona._shim", - "fiona.schema", - "json", -] - -# As of fiona 1.9.0, `fiona.enums` is also a hidden import, made in cythonized `fiona.crs`. -if is_module_satisfies("fiona >= 1.9.0"): - hiddenimports.append("fiona.enums") - -# Collect data files that are part of the package (e.g., projections database) -datas = collect_data_files("fiona") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-flask_compress.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-flask_compress.py deleted file mode 100644 index 9e04195..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-flask_compress.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata('flask_compress') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-flask_restx.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-flask_restx.py deleted file mode 100644 index c83b5b3..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-flask_restx.py +++ /dev/null @@ -1,14 +0,0 @@ -# ----------------------------------------------------------------------------- -# Copyright (c) 2005-2020, PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ----------------------------------------------------------------------------- -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('flask_restx') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-flex.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-flex.py deleted file mode 100644 index 3faaa82..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-flex.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# hook for https://github.com/pipermerriam/flex - -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata('flex') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-flirpy.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-flirpy.py deleted file mode 100644 index 4c51397..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-flirpy.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Hook for flirpy, a library to interact with FLIR thermal imaging cameras and images. -https://github.com/LJMUAstroEcology/flirpy -""" - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('flirpy') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fmpy.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fmpy.py deleted file mode 100644 index daeb3c6..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fmpy.py +++ /dev/null @@ -1,25 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Hook for FMPy, a library to simulate Functional Mockup Units (FMUs) -https://github.com/CATIA-Systems/FMPy - -Adds the data files that are required at runtime: - -- XSD schema files -- dynamic libraries for the CVode solver -- source and header files for the compilation of c-code FMUs -""" - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('fmpy') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-folium.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-folium.py deleted file mode 100644 index a6af178..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-folium.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -# Collect data files (templates) -datas = collect_data_files("folium") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-freetype.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-freetype.py deleted file mode 100644 index 0ae5c04..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-freetype.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_dynamic_libs - -# Collect the bundled freetype shared library, if available. -binaries = collect_dynamic_libs('freetype') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-frictionless.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-frictionless.py deleted file mode 100644 index fc0ff20..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-frictionless.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files, collect_submodules - -# Collect data files in frictionless/assets -datas = collect_data_files('frictionless') - -# Collect modules from `frictionless.plugins` (programmatic imports). -hiddenimports = collect_submodules('frictionless.plugins') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fsspec.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fsspec.py deleted file mode 100644 index e57a32d..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fsspec.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules('fsspec') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fvcore.nn.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fvcore.nn.py deleted file mode 100644 index 1ff1a61..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fvcore.nn.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Collect source .py files for JIT/torchscript. Requires PyInstaller >= 5.3, no-op in older versions. -module_collection_mode = 'pyz+py' diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gadfly.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gadfly.py deleted file mode 100644 index 1bf2314..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gadfly.py +++ /dev/null @@ -1,13 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -hiddenimports = ["sql_mar"] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gbulb.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gbulb.py deleted file mode 100644 index 68116a1..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gbulb.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Prevent this package from pulling `setuptools_scm` into frozen application, as it makes no sense in that context. -excludedimports = ["setuptools_scm"] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gcloud.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gcloud.py deleted file mode 100644 index 051d61c..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gcloud.py +++ /dev/null @@ -1,21 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata - -# This hook was written for `gcloud` - https://pypi.org/project/gcloud -# Suppress package-not-found errors when the hook is triggered by `gcloud` namespace package from `gcloud-aio-*` and -# `gcloud-rest-*` dists (https://github.com/talkiq/gcloud-aio). -try: - datas = copy_metadata('gcloud') -except Exception: - pass diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-geopandas.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-geopandas.py deleted file mode 100644 index 44d9001..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-geopandas.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("geopandas", subdir="datasets") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gitlab.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gitlab.py deleted file mode 100644 index 8adf54b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gitlab.py +++ /dev/null @@ -1,22 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -# -# python-gitlab is a Python package providing access to the GitLab server API. -# It supports the v4 API of GitLab, and provides a CLI tool (gitlab). -# -# https://python-gitlab.readthedocs.io -# -# Tested with gitlab 3.2.0 - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('gitlab') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-globus_sdk.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-globus_sdk.py deleted file mode 100644 index 49fb06f..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-globus_sdk.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files, collect_submodules, copy_metadata - -datas = copy_metadata("globus_sdk") -datas += collect_data_files("globus_sdk") -hiddenimports = collect_submodules("globus_sdk") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gmplot.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gmplot.py deleted file mode 100644 index ce2d5ce..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gmplot.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2005-2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('gmplot') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gmsh.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gmsh.py deleted file mode 100644 index d9755d0..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gmsh.py +++ /dev/null @@ -1,28 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -import os - -from PyInstaller.utils.hooks import logger, get_module_attribute - -# Query the `libpath` attribute of the `gmsh` module to obtain the path to shared library. This way, we do not need to -# duplicate the discovery logic. -try: - lib_file = get_module_attribute('gmsh', 'libpath') -except Exception: - logger.warning("Failed to query gmsh.libpath!", exc_info=True) - lib_file = None - -if lib_file and os.path.isfile(lib_file): - binaries = [(lib_file, '.')] -else: - logger.warning("Could not find gmsh shared library - gmsh will likely fail to load at run-time!") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gooey.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gooey.py deleted file mode 100644 index 8861b47..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gooey.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Gooey GUI carries some language and images for it's UI to function. -""" - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('gooey') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.api_core.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.api_core.py deleted file mode 100644 index 641bdf0..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.api_core.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata('google-api-core') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.bigquery.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.bigquery.py deleted file mode 100644 index 1bbfa4a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.bigquery.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata -datas = (copy_metadata('google-cloud-bigquery') + - # the pakcage queries meta-data about ``request`` - copy_metadata('requests')) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.core.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.core.py deleted file mode 100644 index db7c20e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.core.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata('google-cloud-core') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.kms_v1.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.kms_v1.py deleted file mode 100644 index 116d7f4..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.kms_v1.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Client library URL: https://googleapis.dev/python/cloudkms/latest/ -# Import Example for client library: -# https://cloud.google.com/kms/docs/reference/libraries#client-libraries-install-python - -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata('google-cloud-kms') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.pubsub_v1.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.pubsub_v1.py deleted file mode 100644 index d022668..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.pubsub_v1.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata('google-cloud-pubsub') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.speech.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.speech.py deleted file mode 100644 index 7fed599..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.speech.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata('google-cloud-speech') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.storage.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.storage.py deleted file mode 100644 index 29866bc..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.storage.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata('google-cloud-storage') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.translate.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.translate.py deleted file mode 100644 index 465b8e9..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.translate.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata('google-cloud-translate') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-googleapiclient.model.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-googleapiclient.model.py deleted file mode 100644 index d1a2293..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-googleapiclient.model.py +++ /dev/null @@ -1,20 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata -from PyInstaller.utils.hooks import collect_data_files - -# googleapiclient.model queries the library version via -# pkg_resources.get_distribution("google-api-python-client").version, -# so we need to collect that package's metadata -datas = copy_metadata('google_api_python_client') -datas += collect_data_files('googleapiclient.discovery_cache', excludes=['*.txt', '**/__pycache__']) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-grapheme.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-grapheme.py deleted file mode 100644 index fbe2a4b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-grapheme.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('grapheme') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-graphql_query.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-graphql_query.py deleted file mode 100644 index f5a0f80..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-graphql_query.py +++ /dev/null @@ -1,18 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2023, PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -#----------------------------------------------------------------------------- -""" -PyInstaller hook file for graphql_query. Tested with version 1.0.3. -""" - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('graphql_query') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-great_expectations.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-great_expectations.py deleted file mode 100644 index a19b7c4..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-great_expectations.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('great_expectations') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gribapi.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gribapi.py deleted file mode 100644 index 984a989..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gribapi.py +++ /dev/null @@ -1,89 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -import os -import pathlib - -from PyInstaller import isolated -from PyInstaller.utils.hooks import collect_data_files, logger - -# Collect the headers (eccodes.h, gribapi.h) that are bundled with the package. -datas = collect_data_files('gribapi') - -# Collect the eccodes shared library. Starting with eccodes 2.37.0, binary wheels with bundled shared library are -# provided for linux and macOS, and since 2.39.0, also for Windows. - - -# NOTE: custom isolated function is used here instead of `get_module_attribute('gribapi.bindings', 'library_path')` -# hook utility function because with eccodes 2.37.0, `eccodes` needs to be imported before `gribapi` to avoid circular -# imports... Also, this way, we can obtain the root directory of eccodes package at the same time. -@isolated.decorate -def get_eccodes_library_path(): - import eccodes - import gribapi.bindings - - return ( - # Path to eccodes shared library used by the gribapi bindings. - str(gribapi.bindings.library_path), - # Path to eccodes package (implicitly assumed to be next to the gribapi package, since they are part of the - # same eccodes dist). - str(eccodes.__path__[0]), - ) - - -binaries = [] -hiddenimports = [] - -try: - library_path, package_path = get_eccodes_library_path() -except Exception: - logger.warning("hook-gribapi: failed to query gribapi.bindings.library_path!", exc_info=True) - library_path = None - -if library_path: - if not os.path.isabs(library_path): - from PyInstaller.depend.utils import _resolveCtypesImports - resolved_binary = _resolveCtypesImports([os.path.basename(library_path)]) - if resolved_binary: - library_path = resolved_binary[0][1] - else: - logger.warning("hook-gribapi: failed to resolve shared library name %r!", library_path) - library_path = None -else: - logger.warning("hook-gribapi: could not determine path to eccodes shared library!") - -if library_path: - # If we are collecting eccodes shared library that is bundled with eccodes >= 2.37.0 binary wheel, attempt to - # preserve its parent directory layout. This ensures that the library is found at run-time, but implicitly requires - # PyInstaller 6.x, whose binary dependency analysis (that might also pick up this shared library) also preserves the - # parent directory layout of discovered shared libraries. With PyInstaller 5.x, this will result in duplication - # because binary dependency analysis collects into top-level application directory, but that copy will not be - # discovered at run-time, so duplication is unavoidable. - library_parent_path = pathlib.PurePath(library_path).parent - package_parent_path = pathlib.PurePath(package_path).parent - - if package_parent_path in library_parent_path.parents: - # Should end up being `eccodes.libs` on Linux, `eccodes/.dylib` on macOS, and `eccodes` on Windows. - dest_dir = str(library_parent_path.relative_to(package_parent_path)) - else: - # External copy; collect into top-level application directory. - dest_dir = '.' - - logger.info( - "hook-gribapi: collecting eccodes shared library %r to destination directory %r", library_path, dest_dir - ) - binaries.append((library_path, dest_dir)) - - # If the shared library is available in the stand-alone `eccodeslib` package, add this package to to hidden imports, - # so that `findlibs.find()` can import it and query its `__file__` attribute. - if 'eccodeslib' in library_parent_path.parts: - hiddenimports += ['eccodeslib'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-grpc.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-grpc.py deleted file mode 100644 index a592be2..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-grpc.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('grpc') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gtk.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gtk.py deleted file mode 100644 index 64b3a4b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gtk.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -hiddenimports = ['gtkglext', 'gdkgl', 'gdkglext', 'gdk', 'gtk.gdk', 'gtk.gtkgl', - 'gtk.gtkgl._gtkgl', 'gtkgl', 'pangocairo', 'pango', 'atk', - 'gobject', 'gtk.glade', 'cairo', 'gio', - 'gtk.keysyms'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-h3.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-h3.py deleted file mode 100644 index 89f112b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-h3.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies, copy_metadata - -# Starting with v4.0.0, h3 determines its version from its metadata. -if is_module_satisfies("h3 >= 4.0.0"): - datas = copy_metadata("h3") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-h5py.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-h5py.py deleted file mode 100644 index fcc002f..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-h5py.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Hook for http://pypi.python.org/pypi/h5py/ -""" - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules("h5py", lambda x: "tests" not in x) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-hdf5plugin.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-hdf5plugin.py deleted file mode 100644 index b3ef44d..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-hdf5plugin.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for hdf5plugin: https://pypi.org/project/hdf5plugin/ - -from PyInstaller.utils.hooks import collect_dynamic_libs - -datas = collect_dynamic_libs("hdf5plugin") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-hexbytes.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-hexbytes.py deleted file mode 100644 index 8e29e8c..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-hexbytes.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies, copy_metadata - -# Starting with v1.1.0, `hexbytes` queries its version from metadata. -if is_module_satisfies("hexbytes >= 1.1.0"): - datas = copy_metadata('hexbytes') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-httplib2.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-httplib2.py deleted file mode 100644 index 7789c1f..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-httplib2.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# This is needed to bundle cacerts.txt that comes with httplib2 module - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('httplib2') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-humanize.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-humanize.py deleted file mode 100644 index 598dac7..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-humanize.py +++ /dev/null @@ -1,23 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -This modest package contains various common humanization utilities, like turning a number into a fuzzy human -readable duration ("3 minutes ago") or into a human readable size or throughput. - -https://pypi.org/project/humanize - -This hook was tested against humanize 3.5.0. -""" - -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata('humanize') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-hydra.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-hydra.py deleted file mode 100644 index 0c61977..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-hydra.py +++ /dev/null @@ -1,36 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.compat import is_py310 -from PyInstaller.utils.hooks import collect_submodules, collect_data_files, is_module_satisfies - -# Collect core plugins. -hiddenimports = collect_submodules('hydra._internal.core_plugins') - -# Hydra's plugin manager (`hydra.core.plugins.Plugins`) uses PEP-302 `find_module` / `load_module`, which has been -# deprecated since python 3.4, and has been removed from PyInstaller's frozen importer in PyInstaller 5.8. For python -# 3.10 and newer, they implemented new codepath that uses `find_spec`, but for earlier python versions, they opted to -# keep using the old codepath. -# -# See: https://github.com/facebookresearch/hydra/pull/2531 -# -# To work around the incompatibility with PyInstaller >= 5.8 when using python < 3.10, force collection of plugins as -# source .py files. This way, they end up handled by python's built-in finder/importer instead of PyInstaller's -# frozen importer. -if not is_py310 and is_module_satisfies("PyInstaller >= 5.8"): - module_collection_mode = { - 'hydra._internal.core_plugins': 'py', - 'hydra_plugins': 'py', - } - -# Collect package's data files, such as default configuration files. -datas = collect_data_files('hydra') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ijson.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ijson.py deleted file mode 100644 index 60fa40c..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ijson.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules("ijson.backends") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-imageio.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-imageio.py deleted file mode 100644 index 1cf0e6e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-imageio.py +++ /dev/null @@ -1,21 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for imageio: http://imageio.github.io/ - -from PyInstaller.utils.hooks import collect_data_files, collect_submodules - -datas = collect_data_files('imageio', subdir="resources") - -# imageio plugins are imported lazily since ImageIO version 2.11.0. -# They are very light-weight, so we can safely include all of them. -hiddenimports = collect_submodules('imageio.plugins') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-imageio_ffmpeg.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-imageio_ffmpeg.py deleted file mode 100644 index 4fd469b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-imageio_ffmpeg.py +++ /dev/null @@ -1,22 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for imageio: http://imageio.github.io/ - -from PyInstaller.utils.hooks import collect_data_files, is_module_satisfies - -datas = collect_data_files('imageio_ffmpeg', subdir="binaries") - -# Starting with imageio_ffmpeg 0.5.0, `imageio_ffmpeg.binaries` is a package accessed via `importlib.resources`. Since -# it is not directly imported anywhere, we need to add it to hidden imports. -if is_module_satisfies('imageio_ffmpeg >= 0.5.0'): - hiddenimports = ['imageio_ffmpeg.binaries'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-imagingcontrol4.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-imagingcontrol4.py deleted file mode 100644 index 12cc0a8..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-imagingcontrol4.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2026 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_dynamic_libs - -binaries = collect_dynamic_libs("imagingcontrol4") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-iminuit.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-iminuit.py deleted file mode 100644 index 4cbb6cb..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-iminuit.py +++ /dev/null @@ -1,25 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# add hooks for iminuit: https://github.com/scikit-hep/iminuit - -# iminuit imports subpackages through a cython module which aren't -# found by default - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = [] - -# the iminuit package contains tests which aren't needed when distributing -for mod in collect_submodules('iminuit'): - if not mod.startswith('iminuit.tests'): - hiddenimports.append(mod) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-intake.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-intake.py deleted file mode 100644 index 84a52a8..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-intake.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_entry_point - -datas, hiddenimports = collect_entry_point('intake.drivers') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-iso639.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-iso639.py deleted file mode 100644 index 974e73e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-iso639.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -# Collect data files for iso639 -datas = collect_data_files("iso639") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-itk.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-itk.py deleted file mode 100644 index 54bf624..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-itk.py +++ /dev/null @@ -1,21 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules("itk.Configuration") - -# `itk` requires `itk/Configuration` directory to exist on filesystem; collect source .py files from `itk.Configuration` -# as a work-around that ensures the existence of this directory. -module_collection_mode = { - "itk.Configuration": "pyz+py", -} diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jaraco.text.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jaraco.text.py deleted file mode 100644 index 7126079..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jaraco.text.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for jaraco: https://pypi.python.org/pypi/jaraco.text/3.2.0 - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('jaraco.text') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jedi.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jedi.py deleted file mode 100644 index 9601dbe..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jedi.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for Jedi, a static analysis tool https://pypi.org/project/jedi/ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('jedi') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jieba.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jieba.py deleted file mode 100644 index cc53edf..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jieba.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('jieba') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jinja2.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jinja2.py deleted file mode 100644 index f017894..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jinja2.py +++ /dev/null @@ -1,13 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -hiddenimports = ['jinja2.ext'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jinxed.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jinxed.py deleted file mode 100644 index 28e7f36..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jinxed.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -hiddenimports = [ - 'jinxed.terminfo.ansicon', 'jinxed.terminfo.vtwin10' -] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jira.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jira.py deleted file mode 100644 index dd64b1e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jira.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Hook for https://pypi.python.org/pypi/jira/ -""" - -from PyInstaller.utils.hooks import copy_metadata, collect_submodules - -datas = copy_metadata('jira') -hiddenimports = collect_submodules('jira') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jsonpath_rw_ext.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jsonpath_rw_ext.py deleted file mode 100644 index 1914af4..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jsonpath_rw_ext.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata('jsonpath_rw_ext') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jsonrpcserver.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jsonrpcserver.py deleted file mode 100644 index 71947a1..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jsonrpcserver.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# This is needed to bundle request-schema.json file needed by -# jsonrpcserver package - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('jsonrpcserver') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jsonschema.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jsonschema.py deleted file mode 100644 index ca1289c..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jsonschema.py +++ /dev/null @@ -1,20 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# This is needed to bundle draft3.json and draft4.json files that come with jsonschema module. -# NOTE: with jsonschema >= 4.18.0, the specification files are part of jsonschema_specifications package, and are -# handled by the corresponding hook-jsonschema. - -from PyInstaller.utils.hooks import collect_data_files, copy_metadata - -datas = collect_data_files('jsonschema') -datas += copy_metadata('jsonschema') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jsonschema_specifications.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jsonschema_specifications.py deleted file mode 100644 index bbbdafb..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jsonschema_specifications.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files -datas = collect_data_files('jsonschema_specifications') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jupyterlab.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jupyterlab.py deleted file mode 100644 index ba77523..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jupyterlab.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('jupyterlab') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-kaleido.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-kaleido.py deleted file mode 100644 index e21c5eb..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-kaleido.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('kaleido') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-khmernltk.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-khmernltk.py deleted file mode 100644 index 021d23c..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-khmernltk.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('khmernltk') -hiddenimports = ['sklearn_crfsuite'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-kinterbasdb.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-kinterbasdb.py deleted file mode 100644 index dff9f4b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-kinterbasdb.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# kinterbasdb -hiddenimports = ['k_exceptions', 'services', 'typeconv_naked', - 'typeconv_backcompat', 'typeconv_23plus', - 'typeconv_datetime_stdlib', 'typeconv_datetime_mx', - 'typeconv_datetime_naked', 'typeconv_fixed_fixedpoint', - 'typeconv_fixed_stdlib', 'typeconv_text_unicode', - 'typeconv_util_isinstance', '_kinterbasdb', '_kiservices'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-langchain.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-langchain.py deleted file mode 100644 index 6362f10..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-langchain.py +++ /dev/null @@ -1,53 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files, is_module_satisfies - -# This was required with langchain < 1.0.0; in contemporary versions, the package does not contain any data files, -# so this should be effectively a no-op. -datas = collect_data_files('langchain') - -# In langchain 1.2.1 the import logic for optional add-on packages was refactored, and direct imports in conditional -# blocks were replaced with dictionary-based look-up; see https://github.com/langchain-ai/langchain/pull/32813 -# So now we need to use that same dictionary to explicitly collect the optional packages that happen to be installed -# in the build environment. -if is_module_satisfies('langchain >= 1.2.1'): - from PyInstaller import isolated - - @isolated.decorate - def get_optional_packages(var_name): - packages = set() - - try: - import langchain.chat_models.base - providers = getattr(langchain.chat_models.base, var_name) - packages.update(package_name for package_name, *_ in providers.values()) - except Exception: - pass - - try: - import langchain.embeddings.base - providers = getattr(langchain.embeddings.base, var_name) - packages.update(package_name for package_name, *_ in providers.values()) - except Exception: - pass - - return sorted(packages) - - # langchain 1.2.10 renamed the `_SUPPORTED_PROVIDERS` into `_BUILTIN_PROVIDERS`. - if is_module_satisfies('langchain >= 1.2.10'): - var_name = '_BUILTIN_PROVIDERS' - else: - var_name = '_SUPPORTED_PROVIDERS' - - hiddenimports = get_optional_packages(var_name) - warn_on_missing_hiddenimports = False diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-langchain_classic.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-langchain_classic.py deleted file mode 100644 index 0a7d5bc..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-langchain_classic.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('langchain_classic') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-langcodes.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-langcodes.py deleted file mode 100644 index 65c4723..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-langcodes.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('langcodes') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-langdetect.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-langdetect.py deleted file mode 100644 index 2bfe9ac..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-langdetect.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("langdetect") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-laonlp.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-laonlp.py deleted file mode 100644 index 2c8b577..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-laonlp.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('laonlp') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lark.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lark.py deleted file mode 100644 index 653f810..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lark.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("lark") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ldfparser.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ldfparser.py deleted file mode 100644 index 42e9033..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ldfparser.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -#----------------------------------------------------------------------------- - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('ldfparser') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lensfunpy.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lensfunpy.py deleted file mode 100644 index a44d5e4..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lensfunpy.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files -# bundle xml DB files, skip other files (like DLL files on Windows) -datas = list(filter(lambda p: p[0].endswith('.xml'), collect_data_files('lensfunpy'))) -hiddenimports = ['numpy', 'enum'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-libaudioverse.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-libaudioverse.py deleted file mode 100644 index 9d28d60..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-libaudioverse.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Libaudioverse: https://github.com/libaudioverse/libaudioverse -""" - -from PyInstaller.utils.hooks import collect_dynamic_libs - -binaries = collect_dynamic_libs('libaudioverse') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-librosa.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-librosa.py deleted file mode 100644 index 2767038..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-librosa.py +++ /dev/null @@ -1,25 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files, collect_submodules - -# Collect all data files from the package. These include: -# - package's and subpackages' .pyi files for `lazy_loader` -# - example data in librosa/util, required by `librosa.util.files` -# - librosa/core/intervals.msgpack, required by `librosa.core.intervals` -# -# We explicitly exclude `__pycache__` because it might contain .nbi and .nbc files from `numba` cache, which are not -# re-used by `numba` codepaths in the frozen application and are instead re-compiled in user-global cache directory. -datas = collect_data_files("librosa", excludes=['**/__pycache__']) - -# And because modules are lazily loaded, we need to collect them all. -hiddenimports = collect_submodules("librosa") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lightgbm.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lightgbm.py deleted file mode 100644 index 3718cc4..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lightgbm.py +++ /dev/null @@ -1,27 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -# -# A fast, distributed, high performance gradient boosting -# (GBT, GBDT, GBRT, GBM or MART) framework based on decision -# tree algorithms, used for ranking, classification and -# many other machine learning tasks. -# -# https://github.com/microsoft/LightGBM -# -# Tested with: -# Tested on Windows 10 & macOS 10.14 with Python 3.7.5 - -from PyInstaller.utils.hooks import collect_dynamic_libs - -binaries = collect_dynamic_libs('lightgbm') -binaries += collect_dynamic_libs('sklearn') -binaries += collect_dynamic_libs('scipy') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lightning.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lightning.py deleted file mode 100644 index 840bdb9..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lightning.py +++ /dev/null @@ -1,21 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -# Collect version.info (which is read during package import at run-time). Avoid collecting data from `lightning.app`, -# which likely does not work with PyInstaller without additional tricks (if we need to collect that data, it should -# be done in separate `lightning.app` hook). -datas = collect_data_files( - 'lightning', - includes=['version.info'], -) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-limits.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-limits.py deleted file mode 100644 index 3bd9810..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-limits.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("limits") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-linear_operator.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-linear_operator.py deleted file mode 100644 index 73c8621..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-linear_operator.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# --------------------------------------------------- - -# Collect source .py files for JIT/torchscript. Requires PyInstaller >= 5.3, no-op in older versions. -module_collection_mode = 'pyz+py' diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lingua.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lingua.py deleted file mode 100644 index 2d6fbb5..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lingua.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('lingua') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-litestar.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-litestar.py deleted file mode 100644 index ca35e5a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-litestar.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules -hiddenimports = collect_submodules('litestar.logging') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-llvmlite.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-llvmlite.py deleted file mode 100644 index 108f521..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-llvmlite.py +++ /dev/null @@ -1,21 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -# -# A lightweight LLVM python binding for writing JIT compilers -# https://github.com/numba/llvmlite -# -# Tested with: -# llvmlite 0.11 (Anaconda 4.1.1, Windows), llvmlite 0.13 (Linux) - -from PyInstaller.utils.hooks import collect_dynamic_libs - -binaries = collect_dynamic_libs("llvmlite") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-logilab.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-logilab.py deleted file mode 100644 index 074fc40..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-logilab.py +++ /dev/null @@ -1,26 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -# -# *************************************************** -# hook-logilab.py - PyInstaller hook file for logilab -# *************************************************** -# The following was written about logilab, version 1.1.0, based on executing -# ``pip show logilab-common``. -# -# In logilab.common, line 33:: -# -# __version__ = pkg_resources.get_distribution('logilab-common').version -# -# Therefore, we need metadata for logilab. -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata('logilab-common') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lxml.etree.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lxml.etree.py deleted file mode 100644 index b53e89e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lxml.etree.py +++ /dev/null @@ -1,13 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -hiddenimports = ['lxml._elementpath', 'gzip', 'contextlib'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lxml.isoschematron.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lxml.isoschematron.py deleted file mode 100644 index 8ed7659..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lxml.isoschematron.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files -import os - -# Auxiliary data for isoschematron -datas = collect_data_files('lxml', subdir=os.path.join('isoschematron', 'resources')) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lxml.objectify.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lxml.objectify.py deleted file mode 100644 index e8cb2bf..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lxml.objectify.py +++ /dev/null @@ -1,13 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -hiddenimports = ['lxml.etree'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lxml.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lxml.py deleted file mode 100644 index 4a70af6..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lxml.py +++ /dev/null @@ -1,20 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -# -# lxml is not fully embedded when using standard hiddenimports -# see https://github.com/pyinstaller/pyinstaller/issues/5306 -# -# Tested with lxml 4.6.1 - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules('lxml') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lz4.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lz4.py deleted file mode 100644 index 1b01cd4..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lz4.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -# hook for https://github.com/python-lz4/python-lz4 - -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata('lz4') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-magic.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-magic.py deleted file mode 100644 index e5efe63..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-magic.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# hook for https://pypi.org/project/python-magic-bin - -from PyInstaller.utils.hooks import collect_data_files, collect_dynamic_libs - -datas = collect_data_files('magic') -binaries = collect_dynamic_libs('magic') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mako.codegen.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mako.codegen.py deleted file mode 100644 index dcaefa3..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mako.codegen.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -codegen generates Python code that is then executed through exec(). -This Python code imports the following modules. -""" - -hiddenimports = ['mako.cache', 'mako.runtime', 'mako.filters'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mariadb.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mariadb.py deleted file mode 100644 index 6466ba1..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mariadb.py +++ /dev/null @@ -1,25 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies, collect_submodules - -# The MariaDB uses a .pyd file that imports ``decimal`` module within its -# module initialization function. On recent python versions (> 3.8), the decimal -# module seems to be picked up nevertheless (presumably due to import in some -# other module), but it is better not to rely on that, and ensure it is always -# collected as a hidden import. -hiddenimports = ['decimal'] - -# mariadb >= 1.1.0 requires several hidden imports from mariadb.constants. -# Collect them all, just to be on the safe side... -if is_module_satisfies("mariadb >= 1.1.0"): - hiddenimports += collect_submodules("mariadb.constants") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-markdown.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-markdown.py deleted file mode 100644 index 9918feb..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-markdown.py +++ /dev/null @@ -1,28 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import ( - collect_submodules, - copy_metadata, - is_module_satisfies, -) - -hiddenimports = collect_submodules('markdown.extensions') - -# Markdown 3.3 introduced markdown.htmlparser submodule with hidden -# dependency on html.parser -if is_module_satisfies("markdown >= 3.3"): - hiddenimports += ['html.parser'] - -# Extensions can be referenced by short names, e.g. "extra", through a mechanism -# using entry-points. Thus we need to collect the package metadata as well. -datas = copy_metadata("markdown") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mecab.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mecab.py deleted file mode 100644 index 2b30f86..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mecab.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('mecab') -datas += collect_data_files('mecab_ko_dic') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-metpy.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-metpy.py deleted file mode 100644 index be84bb9..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-metpy.py +++ /dev/null @@ -1,21 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata, collect_data_files - -# MetPy requires metadata, because it queries its version via -# pkg_resources.get_distribution(__package__).version or, in newer -# versions, importlib.metadata.version(__package__) -datas = copy_metadata('metpy') - -# Collect data files -datas += collect_data_files('metpy') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-migrate.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-migrate.py deleted file mode 100644 index b1ec0c9..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-migrate.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -# hook for https://github.com/openstack/sqlalchemy-migrate -# Since v0.12.0 importing migrate requires metadata to resolve __version__ -# attribute - -from PyInstaller.utils.hooks import copy_metadata, is_module_satisfies - -if is_module_satisfies('sqlalchemy-migrate >= 0.12.0'): - datas = copy_metadata('sqlalchemy-migrate') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mimesis.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mimesis.py deleted file mode 100644 index 5accde1..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mimesis.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# The bundled 'data/' directory containing locale .json files needs to be collected (as data file). - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('mimesis') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-minecraft_launcher_lib.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-minecraft_launcher_lib.py deleted file mode 100644 index e06a0a9..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-minecraft_launcher_lib.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("minecraft_launcher_lib") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mistune.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mistune.py deleted file mode 100644 index ea9a804..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mistune.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for nanite: https://pypi.python.org/pypi/nanite - -from PyInstaller.utils.hooks import is_module_satisfies, collect_submodules - -# As of version 3.0.0, mistune loads its plugins indirectly (but does so during package import nevertheless). -if is_module_satisfies("mistune >= 3.0.0"): - hiddenimports = collect_submodules("mistune.plugins") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mnemonic.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mnemonic.py deleted file mode 100644 index 68c56e5..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mnemonic.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('mnemonic') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-monai.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-monai.py deleted file mode 100644 index 82676db..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-monai.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Collect source .py files for JIT/torchscript. Requires PyInstaller >= 5.3, no-op in older versions. -module_collection_mode = "pyz+py" diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-moviepy.audio.fx.all.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-moviepy.audio.fx.all.py deleted file mode 100644 index 4bb9c78..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-moviepy.audio.fx.all.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# `moviepy.audio.fx.all` programmatically imports and forwards all submodules of `moviepy.audio.fx`, so we need to -# collect those as hidden imports. -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules('moviepy.audio.fx') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-moviepy.video.fx.all.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-moviepy.video.fx.all.py deleted file mode 100644 index cc0b924..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-moviepy.video.fx.all.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# `moviepy.video.fx.all` programmatically imports and forwards all submodules of `moviepy.video.fx`, so we need to -# collect those as hidden imports. -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules('moviepy.video.fx') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mpl_toolkits.basemap.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mpl_toolkits.basemap.py deleted file mode 100644 index 839b072..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mpl_toolkits.basemap.py +++ /dev/null @@ -1,36 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files -from PyInstaller.compat import is_win, base_prefix - -import os - -# mpl_toolkits.basemap (tested with v.1.0.7) is shipped with auxiliary data, -# usually stored in mpl_toolkits\basemap\data and used to plot maps -datas = collect_data_files('mpl_toolkits.basemap', subdir='data') - -# check if the data has been effectively found -if len(datas) == 0: - - # - conda-specific - - if is_win: - tgt_basemap_data = os.path.join('Library', 'share', 'basemap') - src_basemap_data = os.path.join(base_prefix, 'Library', 'share', 'basemap') - - else: # both linux and darwin - tgt_basemap_data = os.path.join('share', 'basemap') - src_basemap_data = os.path.join(base_prefix, 'share', 'basemap') - - if os.path.exists(src_basemap_data): - datas.append((src_basemap_data, tgt_basemap_data)) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-msoffcrypto.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-msoffcrypto.py deleted file mode 100644 index 74f75e0..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-msoffcrypto.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -msoffcrypto contains hidden metadata as of v4.12.0 -""" - -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata('msoffcrypto-tool') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nacl.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nacl.py deleted file mode 100644 index 9694133..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nacl.py +++ /dev/null @@ -1,30 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Tested with PyNaCl 0.3.0 on Mac OS X. - -import os.path -import glob - -from PyInstaller.compat import EXTENSION_SUFFIXES -from PyInstaller.utils.hooks import collect_data_files, get_module_file_attribute - -datas = collect_data_files('nacl') - -# Include the cffi extensions as binaries in a subfolder named like the package. -binaries = [] -nacl_dir = os.path.dirname(get_module_file_attribute('nacl')) -for ext in EXTENSION_SUFFIXES: - ffimods = glob.glob(os.path.join(nacl_dir, '_lib', '*_cffi_*%s*' % ext)) - dest_dir = os.path.join('nacl', '_lib') - for f in ffimods: - binaries.append((f, dest_dir)) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-names.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-names.py deleted file mode 100644 index ff33b59..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-names.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# names: generate random names -# Module PyPI Homepage: https://pypi.python.org/pypi/names/0.3.0 - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('names') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nanite.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nanite.py deleted file mode 100644 index 9d37ecc..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nanite.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for nanite: https://pypi.python.org/pypi/nanite - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('nanite') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-narwhals.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-narwhals.py deleted file mode 100644 index 0c8109f..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-narwhals.py +++ /dev/null @@ -1,22 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -import sys -from PyInstaller.utils.hooks import can_import_module, copy_metadata, is_module_satisfies - -# Starting with narwhals 1.35.0, we need to collect metadata for `typing_extensions` if the module is available. -# The codepath that checks metadata for `typing_extensions` is not executed under python >= 3.13, so we can avoid -# collection there. -datas = [] -if sys.version_info < (3, 13): # PyInstaller.compat.is_py313 is available only in PyInstaller >= 6.10.0. - if is_module_satisfies("narwhals >= 1.35.0") and can_import_module("typing_extensions"): - datas += copy_metadata("typing_extensions") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nbconvert.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nbconvert.py deleted file mode 100644 index fefb5ae..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nbconvert.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files, copy_metadata - -datas = collect_data_files('nbconvert') - -# nbconvert uses entrypoints to read nbconvert.exporters from metadata file entry_points.txt. -datas += copy_metadata('nbconvert') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nbdime.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nbdime.py deleted file mode 100644 index 38452ca..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nbdime.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('nbdime') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nbformat.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nbformat.py deleted file mode 100644 index d193864..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nbformat.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('nbformat') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nbt.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nbt.py deleted file mode 100644 index 676ee32..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nbt.py +++ /dev/null @@ -1,12 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -hiddenimports = ["nbt.nbt", "nbt.world", "nbt.region", "nbt.chunk"] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ncclient.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ncclient.py deleted file mode 100644 index d41c061..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ncclient.py +++ /dev/null @@ -1,23 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Hook for ncclient. ncclient is a Python library that facilitates client-side -scripting and application development around the NETCONF protocol. -https://pypi.python.org/pypi/ncclient - -This hook was tested with ncclient 0.4.3. -""" -from PyInstaller.utils.hooks import collect_submodules - -# Modules 'ncclient.devices.*' are dynamically loaded and PyInstaller -# is not able to find them. -hiddenimports = collect_submodules('ncclient.devices') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-netCDF4.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-netCDF4.py deleted file mode 100644 index 259d71c..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-netCDF4.py +++ /dev/null @@ -1,37 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.compat import is_win -from PyInstaller.utils.hooks import is_module_satisfies - -# netCDF4 (tested with v.1.1.9) has some hidden imports -hiddenimports = ['netCDF4.utils'] - -# Around netCDF4 1.4.0, netcdftime changed name to cftime -if is_module_satisfies("netCDF4 < 1.4.0"): - hiddenimports += ['netcdftime'] -else: - hiddenimports += ['cftime'] - -# Starting with netCDF 1.6.4, certifi is a hidden import made in -# netCDF4/_netCDF4.pyx. -if is_module_satisfies("netCDF4 >= 1.6.4"): - hiddenimports += ['certifi'] - -# netCDF 1.6.2 is the first version that uses `delvewheel` for bundling DLLs in Windows PyPI wheels. While contemporary -# PyInstaller versions automatically pick up DLLs from external `netCDF4.libs` directory, this does not work on Anaconda -# python 3.8 and 3.9 due to defunct `os.add_dll_directory`, which forces `delvewheel` to use the old load-order file -# approach. So we need to explicitly ensure that load-order file as well as DLLs are collected. -if is_win and is_module_satisfies("netCDF4 >= 1.6.2"): - if is_module_satisfies("PyInstaller >= 5.6"): - from PyInstaller.utils.hooks import collect_delvewheel_libs_directory - datas, binaries = collect_delvewheel_libs_directory("netCDF4") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nicegui.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nicegui.py deleted file mode 100644 index 539dfe0..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nicegui.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('nicegui') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-niquests.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-niquests.py deleted file mode 100644 index b9ec1d0..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-niquests.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules("niquests") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nltk.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nltk.py deleted file mode 100644 index fa1cf2b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nltk.py +++ /dev/null @@ -1,27 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# hook for nltk -import nltk -import os -from PyInstaller.utils.hooks import collect_data_files - -# add datas for nltk -datas = collect_data_files('nltk', False) - -# loop through the data directories and add them -for p in nltk.data.path: - if os.path.exists(p): - datas.append((p, "nltk_data")) - -# nltk.chunk.named_entity should be included -hiddenimports = ["nltk.chunk.named_entity"] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nnpy.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nnpy.py deleted file mode 100644 index e4d3951..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nnpy.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Hook for https://pypi.org/project/nnpy/ -""" - -hiddenimports = ['_cffi_backend'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-notebook.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-notebook.py deleted file mode 100644 index ea91dec..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-notebook.py +++ /dev/null @@ -1,27 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -import os -from PyInstaller.utils.hooks import collect_data_files, collect_submodules -from jupyter_core.paths import jupyter_config_path, jupyter_path - -# collect modules for handlers -hiddenimports = collect_submodules('notebook', filter=lambda name: name.endswith('.handles')) -hiddenimports.append('notebook.services.shutdown') - -datas = collect_data_files('notebook') - -# Collect share and etc folder for pre-installed extensions -datas += [(path, 'share/jupyter') - for path in jupyter_path() if os.path.exists(path)] -datas += [(path, 'etc/jupyter') - for path in jupyter_config_path() if os.path.exists(path)] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-numba.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-numba.py deleted file mode 100644 index 9f69d34..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-numba.py +++ /dev/null @@ -1,55 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -# -# NumPy aware dynamic Python compiler using LLVM -# https://github.com/numba/numba -# -# Tested with: -# numba 0.26 (Anaconda 4.1.1, Windows), numba 0.28 (Linux) - -from PyInstaller.utils.hooks import is_module_satisfies - -excludedimports = ["IPython", "scipy"] -hiddenimports = ["llvmlite"] - -# numba 0.59.0 updated its vendored version of cloudpickle to 3.0.0; this version keeps `cloudpickle_fast` module -# around for backward compatibility with existing pickled data, but does not import it directly anymore. -if is_module_satisfies("numba >= 0.59.0"): - hiddenimports += ["numba.cloudpickle.cloudpickle_fast"] - -# numba 0.61 introduced new type system with several dynamic redirects using `numba.core.utils._RedirectSubpackage`; -# depending on the run-time value of `numba.config.USE_LEGACY_TYPE_SYSTEM`, either "old" or "new" module variant is -# loaded. All of these seem to be loaded when `numba` is imported, so there is no need for finer granularity. Also, -# as the config value might be manipulated at run-time (e.g., via environment variable), we need to collect both old -# and new module variants. -# numba 0.62 reverted the change, removing the new type system. -if is_module_satisfies("numba >= 0.61.0rc1, < 0.62.0rc1"): - # NOTE: `numba.core.typing` is also referenced indirectly via `_RedirectSubpackage`, but we do not need a - # hidden import entry for it, because we have entries for its submodules. - modules_old = [ - 'numba.core.datamodel.old_models', - 'numba.core.old_boxing', - 'numba.core.types.old_scalars', - 'numba.core.typing.old_builtins', - 'numba.core.typing.old_cmathdecl', - 'numba.core.typing.old_mathdecl', - 'numba.cpython.old_builtins', - 'numba.cpython.old_hashing', - 'numba.cpython.old_mathimpl', - 'numba.cpython.old_numbers', - 'numba.cpython.old_tupleobj', - 'numba.np.old_arraymath', - 'numba.np.random.old_distributions', - 'numba.np.random.old_random_methods', - ] - modules_new = [name.replace('.old_', '.new_') for name in modules_old] - hiddenimports += modules_old + modules_new diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-numbers_parser.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-numbers_parser.py deleted file mode 100644 index d6fd535..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-numbers_parser.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -# Ensure that `numbers_parser/data/empty.numbers` is collected. -datas = collect_data_files('numbers_parser') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-numcodecs.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-numcodecs.py deleted file mode 100644 index 7a6f6fd..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-numcodecs.py +++ /dev/null @@ -1,20 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies - -# compat_ext is only imported from pyx files, so it is missed -hiddenimports = ['numcodecs.compat_ext'] - -# numcodecs v0.15.0 added an import of `deprecated` (from `Deprecated` dist) in one of its cythonized extension. -if is_module_satisfies('numcodecs >= 0.15.0'): - hiddenimports += ['deprecated'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cublas.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cublas.py deleted file mode 100644 index 3404162..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cublas.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.nvidia_cuda import ( - collect_nvidia_cuda_binaries, - create_symlink_suppression_patterns, -) - -binaries = collect_nvidia_cuda_binaries(__file__) -bindepend_symlink_suppression = create_symlink_suppression_patterns(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cuda_cupti.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cuda_cupti.py deleted file mode 100644 index 3404162..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cuda_cupti.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.nvidia_cuda import ( - collect_nvidia_cuda_binaries, - create_symlink_suppression_patterns, -) - -binaries = collect_nvidia_cuda_binaries(__file__) -bindepend_symlink_suppression = create_symlink_suppression_patterns(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cuda_nvcc.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cuda_nvcc.py deleted file mode 100644 index 13172ae..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cuda_nvcc.py +++ /dev/null @@ -1,30 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files -from _pyinstaller_hooks_contrib.utils.nvidia_cuda import ( - collect_nvidia_cuda_binaries, - create_symlink_suppression_patterns, -) - -# Ensures that versioned .so files are collected -binaries = collect_nvidia_cuda_binaries(__file__) - -# Prevent binary dependency analysis from creating symlinks to top-level application directory for shared libraries -# from this package. Requires PyInstaller >= 6.11.0; no-op in earlier versions. -bindepend_symlink_suppression = create_symlink_suppression_patterns(__file__) - -# Collect additional resources: -# - ptxas executable (which strictly speaking, should be collected as a binary) -# - nvvm/libdevice/libdevice.10.bc file -# - C headers; assuming ptxas requires them - if that is not the case, we could filter them out. -datas = collect_data_files('nvidia.cuda_nvcc') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cuda_nvrtc.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cuda_nvrtc.py deleted file mode 100644 index 3404162..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cuda_nvrtc.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.nvidia_cuda import ( - collect_nvidia_cuda_binaries, - create_symlink_suppression_patterns, -) - -binaries = collect_nvidia_cuda_binaries(__file__) -bindepend_symlink_suppression = create_symlink_suppression_patterns(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cuda_runtime.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cuda_runtime.py deleted file mode 100644 index 3404162..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cuda_runtime.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.nvidia_cuda import ( - collect_nvidia_cuda_binaries, - create_symlink_suppression_patterns, -) - -binaries = collect_nvidia_cuda_binaries(__file__) -bindepend_symlink_suppression = create_symlink_suppression_patterns(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cudnn.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cudnn.py deleted file mode 100644 index 3404162..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cudnn.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.nvidia_cuda import ( - collect_nvidia_cuda_binaries, - create_symlink_suppression_patterns, -) - -binaries = collect_nvidia_cuda_binaries(__file__) -bindepend_symlink_suppression = create_symlink_suppression_patterns(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cufft.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cufft.py deleted file mode 100644 index 3404162..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cufft.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.nvidia_cuda import ( - collect_nvidia_cuda_binaries, - create_symlink_suppression_patterns, -) - -binaries = collect_nvidia_cuda_binaries(__file__) -bindepend_symlink_suppression = create_symlink_suppression_patterns(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.curand.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.curand.py deleted file mode 100644 index 3404162..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.curand.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.nvidia_cuda import ( - collect_nvidia_cuda_binaries, - create_symlink_suppression_patterns, -) - -binaries = collect_nvidia_cuda_binaries(__file__) -bindepend_symlink_suppression = create_symlink_suppression_patterns(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cusolver.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cusolver.py deleted file mode 100644 index 3404162..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cusolver.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.nvidia_cuda import ( - collect_nvidia_cuda_binaries, - create_symlink_suppression_patterns, -) - -binaries = collect_nvidia_cuda_binaries(__file__) -bindepend_symlink_suppression = create_symlink_suppression_patterns(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cusparse.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cusparse.py deleted file mode 100644 index 3404162..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cusparse.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.nvidia_cuda import ( - collect_nvidia_cuda_binaries, - create_symlink_suppression_patterns, -) - -binaries = collect_nvidia_cuda_binaries(__file__) -bindepend_symlink_suppression = create_symlink_suppression_patterns(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.nccl.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.nccl.py deleted file mode 100644 index 3404162..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.nccl.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.nvidia_cuda import ( - collect_nvidia_cuda_binaries, - create_symlink_suppression_patterns, -) - -binaries = collect_nvidia_cuda_binaries(__file__) -bindepend_symlink_suppression = create_symlink_suppression_patterns(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.nvjitlink.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.nvjitlink.py deleted file mode 100644 index 3404162..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.nvjitlink.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.nvidia_cuda import ( - collect_nvidia_cuda_binaries, - create_symlink_suppression_patterns, -) - -binaries = collect_nvidia_cuda_binaries(__file__) -bindepend_symlink_suppression = create_symlink_suppression_patterns(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.nvtx.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.nvtx.py deleted file mode 100644 index 3404162..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.nvtx.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.nvidia_cuda import ( - collect_nvidia_cuda_binaries, - create_symlink_suppression_patterns, -) - -binaries = collect_nvidia_cuda_binaries(__file__) -bindepend_symlink_suppression = create_symlink_suppression_patterns(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-office365.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-office365.py deleted file mode 100644 index 37a007f..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-office365.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Office365-REST-Python-Client contains xml templates that are needed by some methods -This hook ensures that all of the data used by the package is bundled -""" - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("office365") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-onnxruntime.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-onnxruntime.py deleted file mode 100644 index 9c7e807..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-onnxruntime.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_dynamic_libs - -# Collect provider plugins from onnxruntime/capi. -binaries = collect_dynamic_libs("onnxruntime") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-opencc.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-opencc.py deleted file mode 100644 index 9204053..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-opencc.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('opencc') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-openpyxl.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-openpyxl.py deleted file mode 100644 index 299a1be..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-openpyxl.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for the openpyxl module: https://pypi.python.org/pypi/openpyxl -# Tested with openpyxl 2.3.4, Python 2.7, Windows - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('openpyxl') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-opentelemetry.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-opentelemetry.py deleted file mode 100644 index d8e3e9e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-opentelemetry.py +++ /dev/null @@ -1,41 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_entry_point - -# All known `opentelementry_` entry-point groups -ENTRY_POINT_GROUPS = ( - 'opentelemetry_context', - 'opentelemetry_environment_variables', - 'opentelemetry_id_generator', - 'opentelemetry_logger_provider', - 'opentelemetry_logs_exporter', - 'opentelemetry_meter_provider', - 'opentelemetry_metrics_exporter', - 'opentelemetry_propagator', - 'opentelemetry_resource_detector', - 'opentelemetry_tracer_provider', - 'opentelemetry_traces_exporter', - 'opentelemetry_traces_sampler', -) - -# Collect entry points -datas = set() -hiddenimports = set() - -for entry_point_group in ENTRY_POINT_GROUPS: - ep_datas, ep_hiddenimports = collect_entry_point(entry_point_group) - datas.update(ep_datas) - hiddenimports.update(ep_hiddenimports) - -datas = list(datas) -hiddenimports = list(hiddenimports) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-orjson.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-orjson.py deleted file mode 100644 index 04092dc..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-orjson.py +++ /dev/null @@ -1,21 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Forced import of these modules happens on first orjson import -# and orjson is a compiled extension module. -hiddenimports = [ - 'uuid', - 'zoneinfo', - 'enum', - 'json', - 'dataclasses', -] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-osgeo.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-osgeo.py deleted file mode 100644 index dbc0b4a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-osgeo.py +++ /dev/null @@ -1,81 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files -from PyInstaller.compat import is_win, is_darwin - -import os -import sys - -# The osgeo libraries require auxiliary data and may have hidden dependencies. -# There are several possible configurations on how these libraries can be -# deployed. -# This hook evaluates the cases when: -# - the `data` folder is present "in-source" (sharing the same namespace folder -# as the code libraries) -# - the `data` folder is present "out-source" (for instance, on Anaconda for -# Windows, in PYTHONHOME/Library/data) -# In this latter case, the hook also checks for the presence of `proj` library -# (e.g., on Windows in PYTHONHOME) for being added to the bundle. -# -# This hook has been tested with gdal (v.1.11.2 and 1.11.3) on: -# - Win 7 and 10 64bit -# - Ubuntu 15.04 64bit -# - Mac OS X Yosemite 10.10 -# -# TODO: Fix for gdal>=2.0.0, <2.0.3: 'NameError: global name 'help' is not defined' - -# flag used to identify an Anaconda environment -is_conda = False - -# Auxiliary data: -# -# - general case (data in 'osgeo/data'): -datas = collect_data_files('osgeo', subdir='data') - -# check if the data has been effectively found in 'osgeo/data/gdal' -if len(datas) == 0: - - if hasattr(sys, 'real_prefix'): # check if in a virtual environment - root_path = sys.real_prefix - else: - root_path = sys.prefix - - # - conda-specific - if is_win: - tgt_gdal_data = os.path.join('Library', 'share', 'gdal') - src_gdal_data = os.path.join(root_path, 'Library', 'share', 'gdal') - if not os.path.exists(src_gdal_data): - tgt_gdal_data = os.path.join('Library', 'data') - src_gdal_data = os.path.join(root_path, 'Library', 'data') - - else: # both linux and darwin - tgt_gdal_data = os.path.join('share', 'gdal') - src_gdal_data = os.path.join(root_path, 'share', 'gdal') - - if os.path.exists(src_gdal_data): - is_conda = True - datas.append((src_gdal_data, tgt_gdal_data)) - # a real-time hook takes case to define the path for `GDAL_DATA` - -# Hidden dependencies -if is_conda: - # if `proj.4` is present, it provides additional functionalities - if is_win: - proj4_lib = os.path.join(root_path, 'proj.dll') - elif is_darwin: - proj4_lib = os.path.join(root_path, 'lib', 'libproj.dylib') - else: # assumed linux-like settings - proj4_lib = os.path.join(root_path, 'lib', 'libproj.so') - - if os.path.exists(proj4_lib): - binaries = [(proj4_lib, ".")] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pandas_flavor.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pandas_flavor.py deleted file mode 100644 index a41c36a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pandas_flavor.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies - -# As of version 0.3.0, pandas_flavor uses lazy loader to import `register` and `xarray` sub-modules. In earlier -# versions, these used to be imported directly. This was removed in 0.7.0. -if is_module_satisfies("pandas_flavor >= 0.3.0, < 0.7.0"): - hiddenimports = ['pandas_flavor.register', 'pandas_flavor.xarray'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-panel.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-panel.py deleted file mode 100644 index 51c411f..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-panel.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files, collect_submodules - -datas = collect_data_files("panel") - -# Some models are lazy-loaded on runtime, so we need to collect them -hiddenimports = collect_submodules("panel.models") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-parsedatetime.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-parsedatetime.py deleted file mode 100644 index 5392a72..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-parsedatetime.py +++ /dev/null @@ -1,29 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2020, PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -#----------------------------------------------------------------------------- -""" -Fixes https://github.com/pyinstaller/pyinstaller/issues/4995 - -Modules under parsedatetime.pdt_locales.* are lazily loaded using __import__. -But they are conviniently listed in parsedatetime.pdt_locales.locales. - -Tested on versions: - -- 1.1.1 -- 1.5 -- 2.0 -- 2.6 (latest) - -""" - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules("parsedatetime.pdt_locales") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-parso.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-parso.py deleted file mode 100644 index c00caf1..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-parso.py +++ /dev/null @@ -1,17 +0,0 @@ -# ----------------------------------------------------------------------------- -# Copyright (c) 2013-2018, PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ----------------------------------------------------------------------------- - -# Hook for Parso, a static analysis tool https://pypi.org/project/jedi/ (IPython dependency) - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('parso') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-passlib.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-passlib.py deleted file mode 100644 index 9189b8e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-passlib.py +++ /dev/null @@ -1,21 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Handlers are imported by a lazy-load proxy, based on a -# name-to-package mapping. Collect all handlers to ease packaging. -# If you want to reduce the size of your application, used -# `--exclude-module` to remove unused ones. -hiddenimports = [ - "passlib.handlers", - "passlib.handlers.digests", - "configparser", -] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-paste.exceptions.reporter.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-paste.exceptions.reporter.py deleted file mode 100644 index 9b80044..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-paste.exceptions.reporter.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Some modules use the old-style import: explicitly include -the new module when the old one is referenced. -""" - -hiddenimports = ["email.mime.text", "email.mime.multipart"] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-patoolib.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-patoolib.py deleted file mode 100644 index 57d1aa6..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-patoolib.py +++ /dev/null @@ -1,19 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (c) 2017-2024, PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -#----------------------------------------------------------------------------- - - -""" -patoolib uses importlib and pyinstaller doesn't find it and add it to the list of needed modules -""" - -from PyInstaller.utils.hooks import collect_submodules -hiddenimports = collect_submodules('patoolib.programs') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-patsy.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-patsy.py deleted file mode 100644 index 39dbf7b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-patsy.py +++ /dev/null @@ -1,13 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -hiddenimports = ['patsy.builtins'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pdfminer.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pdfminer.py deleted file mode 100644 index e4da9a7..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pdfminer.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('pdfminer') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pendulum.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pendulum.py deleted file mode 100644 index 5649b4a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pendulum.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files, collect_submodules - -# Pendulum checks for locale modules via os.path.exists before import. -# If the include_py_files option is turned off, this check fails, pendulum -# will raise a ValueError. -datas = collect_data_files("pendulum.locales", include_py_files=True) -hiddenimports = collect_submodules("pendulum.locales") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-phonenumbers.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-phonenumbers.py deleted file mode 100644 index 1494a21..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-phonenumbers.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -# -# Hook for the phonenumbers package: https://pypi.org/project/phonenumbers/ -# -# Tested with phonenumbers 8.9.7 and Python 3.6.1, on Ubuntu 16.04 64bit. - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules('phonenumbers') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pingouin.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pingouin.py deleted file mode 100644 index dd9989b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pingouin.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('pingouin') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pint.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pint.py deleted file mode 100644 index 49d2dee..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pint.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files, copy_metadata - -datas = collect_data_files('pint') -datas += copy_metadata('pint') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pinyin.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pinyin.py deleted file mode 100644 index ad8c547..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pinyin.py +++ /dev/null @@ -1,20 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for the pinyin package: https://pypi.python.org/pypi/pinyin -# Tested with pinyin 0.4.0 and Python 3.6.2, on Windows 10 x64. - -from PyInstaller.utils.hooks import collect_data_files - -# pinyin relies on 'Mandarin.dat' and 'cedict.txt.gz' -# for character and word translation. -datas = collect_data_files('pinyin') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-platformdirs.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-platformdirs.py deleted file mode 100644 index 4d6b250..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-platformdirs.py +++ /dev/null @@ -1,27 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.compat import is_darwin, is_win - -modules = ["platformdirs"] - -# platfromdirs contains dynamically loaded per-platform submodules. -if is_darwin: - modules.append("platformdirs.macos") -elif is_win: - modules.append("platformdirs.windows") -else: - # default to unix for all other platforms - # this includes unix, cygwin, and msys2 - modules.append("platformdirs.unix") - -hiddenimports = modules diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-plotly.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-plotly.py deleted file mode 100644 index be8714e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-plotly.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files -from PyInstaller.utils.hooks import collect_submodules - -datas = collect_data_files('plotly', includes=['package_data/**/*.*', 'validators/**/*.*']) -hiddenimports = collect_submodules('plotly.validators') + ['pandas', 'cmath'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pointcept.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pointcept.py deleted file mode 100644 index 5d36ef1..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pointcept.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Collect source .py files for JIT/torchscript. -module_collection_mode = 'pyz+py' diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pptx.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pptx.py deleted file mode 100644 index fae9505..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pptx.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('pptx.templates') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-prettytable.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-prettytable.py deleted file mode 100644 index d049b3a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-prettytable.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata, is_module_satisfies - -# Starting with v3.12.0, `prettytable` does not query its version from metadata. -if is_module_satisfies('prettytable < 3.12.0'): - datas = copy_metadata('prettytable') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-psutil.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-psutil.py deleted file mode 100644 index 9976cad..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-psutil.py +++ /dev/null @@ -1,50 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -import os -import sys - -# see https://github.com/giampaolo/psutil/blob/release-5.9.5/psutil/_common.py#L82 -WINDOWS = os.name == "nt" -LINUX = sys.platform.startswith(("linux", "android")) -MACOS = sys.platform.startswith("darwin") -FREEBSD = sys.platform.startswith(("freebsd", "midnightbsd")) -OPENBSD = sys.platform.startswith("openbsd") -NETBSD = sys.platform.startswith("netbsd") -BSD = FREEBSD or OPENBSD or NETBSD -SUNOS = sys.platform.startswith(("sunos", "solaris")) -AIX = sys.platform.startswith("aix") - -excludedimports = [ - "psutil._pslinux", - "psutil._pswindows", - "psutil._psosx", - "psutil._psbsd", - "psutil._pssunos", - "psutil._psaix", -] - -# see https://github.com/giampaolo/psutil/blob/release-5.9.5/psutil/__init__.py#L97 -if LINUX: - excludedimports.remove("psutil._pslinux") -elif WINDOWS: - excludedimports.remove("psutil._pswindows") - # see https://github.com/giampaolo/psutil/blob/release-5.9.5/psutil/_common.py#L856 - # This will exclude `curses` for windows - excludedimports.append("curses") -elif MACOS: - excludedimports.remove("psutil._psosx") -elif BSD: - excludedimports.remove("psutil._psbsd") -elif SUNOS: - excludedimports.remove("psutil._pssunos") -elif AIX: - excludedimports.remove("psutil._psaix") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-psychopy.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-psychopy.py deleted file mode 100644 index 4bee8d6..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-psychopy.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Tested on Windows 7 64bit with python 2.7.6 and PsychoPy 1.81.03 - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('psychopy') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-psycopg2.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-psycopg2.py deleted file mode 100644 index 7698bbb..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-psycopg2.py +++ /dev/null @@ -1,13 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -hiddenimports = ['mx.DateTime'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-psycopg_binary.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-psycopg_binary.py deleted file mode 100644 index 77494c3..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-psycopg_binary.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# The `pyscopg_binary._uuid` module is imported from the `psycopg_binary._psycopg` binary extension when working with -# data of UUID data type. -hiddenimports = ['psycopg_binary._uuid'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-publicsuffix2.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-publicsuffix2.py deleted file mode 100644 index 01a5ec2..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-publicsuffix2.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('publicsuffix2') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pubsub.core.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pubsub.core.py deleted file mode 100644 index dea0737..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pubsub.core.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('pubsub.core', include_py_files=True, excludes=['*.txt', '**/__pycache__']) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-puremagic.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-puremagic.py deleted file mode 100644 index 8aa599f..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-puremagic.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("puremagic") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-py.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-py.py deleted file mode 100644 index b3bd685..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-py.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules("py._path") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyarrow.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyarrow.py deleted file mode 100644 index ef98062..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyarrow.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for https://pypi.org/project/pyarrow/ - -from PyInstaller.utils.hooks import collect_submodules, collect_data_files, collect_dynamic_libs - -hiddenimports = collect_submodules('pyarrow', filter=lambda x: "tests" not in x) -datas = collect_data_files('pyarrow') -binaries = collect_dynamic_libs('pyarrow') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pycountry.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pycountry.py deleted file mode 100644 index 9dd4f9a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pycountry.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files, copy_metadata - -# pycountry requires the ISO databases for country data. -# Tested v1.15 on Linux/Ubuntu. -# https://pypi.python.org/pypi/pycountry -datas = copy_metadata('pycountry') + collect_data_files('pycountry') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pycparser.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pycparser.py deleted file mode 100644 index 1f2e968..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pycparser.py +++ /dev/null @@ -1,23 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# pycparser needs two modules -- lextab.py and yacctab.py -- which it -# generates at runtime if they cannot be imported. -# -# Those modules are written to the current working directory for which -# the running process may not have write permissions, leading to a runtime -# exception. -# -# This hook tells pyinstaller about those hidden imports, avoiding the -# possibility of such runtime failures. - -hiddenimports = ['pycparser.lextab', 'pycparser.yacctab'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pycrfsuite.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pycrfsuite.py deleted file mode 100644 index 8b64162..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pycrfsuite.py +++ /dev/null @@ -1,13 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -hiddenimports = ['pycrfsuite._dumpparser', 'pycrfsuite._logparser', 'tempfile'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pydantic.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pydantic.py deleted file mode 100644 index 2e2d288..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pydantic.py +++ /dev/null @@ -1,49 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import get_module_attribute, collect_submodules -from PyInstaller.utils.hooks import is_module_satisfies - -# By default, PyPi wheels for pydantic < 2.0.0 come with all modules compiled as cython extensions, which prevents -# PyInstaller from automatically picking up the submodules. -if is_module_satisfies('pydantic >= 2.0.0'): - # The `pydantic.compiled` attribute was removed in v2. - is_compiled = False -else: - # NOTE: in PyInstaller 4.x and earlier, get_module_attribute() returns the string representation of the value - # ('True'), while in PyInstaller 5.x and later, the actual value is returned (True). - is_compiled = get_module_attribute('pydantic', 'compiled') in {'True', True} - -# Collect submodules from pydantic; even if the package is not compiled, contemporary versions (2.11.1 at the time -# of writing) contain redirections and programmatic imports. -hiddenimports = collect_submodules('pydantic') - -if is_compiled: - # In compiled version, we need to collect the following modules from the standard library. - hiddenimports += [ - 'colorsys', - 'dataclasses', - 'decimal', - 'json', - 'ipaddress', - 'pathlib', - 'uuid', - # Optional dependencies. - 'dotenv', - 'email_validator' - ] - # Older releases (prior 1.4) also import distutils.version - if not is_module_satisfies('pydantic >= 1.4'): - hiddenimports += ['distutils.version'] - # Version 1.8.0 introduced additional dependency on typing_extensions - if is_module_satisfies('pydantic >= 1.8'): - hiddenimports += ['typing_extensions'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pydicom.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pydicom.py deleted file mode 100644 index 8b3d497..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pydicom.py +++ /dev/null @@ -1,69 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies, collect_data_files - -hiddenimports = [] -datas = [] - -# In pydicom 3.0.0, the `pydicom.encoders` plugins were renamed to `pydicom.pixels.encoders`, and -# `pydicom.pixels.decoders` were also added. We need to collect them all, because they are loaded during -# `pydicom` module initialization. We intentionally avoid using `collect_submodules` here, because that causes -# import of `pydicom` with logging framework initialized, which results in error tracebacks being logged for all plugins -# with missing libraries (see https://github.com/pydicom/pydicom/issues/2128). -if is_module_satisfies('pydicom >= 3.0.0'): - hiddenimports += [ - "pydicom.pixels.decoders.gdcm", - "pydicom.pixels.decoders.pylibjpeg", - "pydicom.pixels.decoders.pillow", - "pydicom.pixels.decoders.pyjpegls", - "pydicom.pixels.decoders.rle", - "pydicom.pixels.encoders.gdcm", - "pydicom.pixels.encoders.pylibjpeg", - "pydicom.pixels.encoders.native", - "pydicom.pixels.encoders.pyjpegls", - ] - - # With pydicom 3.0.0, initialization of `pydicom` (unnecessarily) imports `pydicom.examples`, which attempts to set - # up several test datasets: https://github.com/pydicom/pydicom/blob/v3.0.0/src/pydicom/examples/__init__.py#L10-L24 - # Some of those are bundled with the package itself, some are downloaded (into `.pydicom/data` directory in user's - # home directory) on he first `pydicom.examples` import. - # - # The download code requires `pydicom/data/urls.json` and `pydicom/data/hashes.json`; the lack of former results in - # run-time error, while the lack of latter results in warnings about dataset download failure. - # - # The test data files that are bundled with the package are not listed in `urls.json`, so if they are missing, there - # is not attempt to download them. Therefore, try to get away without collecting them here - if anyone actually - # requires them in the frozen application, let them explicitly collect them. - additional_data_patterns = [ - 'urls.json', - 'hashes.json', - ] -else: - hiddenimports += [ - "pydicom.encoders.gdcm", - "pydicom.encoders.pylibjpeg", - "pydicom.encoders.native", - ] - additional_data_patterns = [] - -# Collect data files from `pydicom.data`; charset files and palettes might be needed during processing, so always -# collect them. Some other data files became required in v3.0.0 - the corresponding patterns are set accordingly in -# `additional_data_patterns` in the above if/else block. -datas += collect_data_files( - 'pydicom.data', - includes=[ - 'charset_files/*', - 'palettes/*', - *additional_data_patterns, - ], -) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pydivert.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pydivert.py deleted file mode 100644 index dab32b8..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pydivert.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('pydivert.windivert_dll') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyecharts.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyecharts.py deleted file mode 100644 index 69f2e40..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyecharts.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('pyecharts') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-io.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-io.py deleted file mode 100644 index 55fd56a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-io.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# This hook was tested with pyexcel-io 0.5.18: -# https://github.com/pyexcel/pyexcel-io - -hiddenimports = ['pyexcel_io'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-ods.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-ods.py deleted file mode 100644 index 160e1b2..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-ods.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# This hook was tested with pyexcel-ods 0.5.6: -# https://github.com/pyexcel/pyexcel-ods - -hiddenimports = ['pyexcel_ods'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-ods3.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-ods3.py deleted file mode 100644 index a01beed..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-ods3.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# This hook was tested with pyexcel-ods3 0.5.3: -# https://github.com/pyexcel/pyexcel-ods3 - -hiddenimports = ['pyexcel_ods3'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-odsr.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-odsr.py deleted file mode 100644 index 0d10d71..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-odsr.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# This hook was tested with pyexcel-io 0.5.2: -# https://github.com/pyexcel/pyexcel-io - -hiddenimports = ['pyexcel_odsr'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-xls.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-xls.py deleted file mode 100644 index 60acc3f..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-xls.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# This hook was tested with pyexcel-xls 0.5.8: -# https://github.com/pyexcel/pyexcel-xls - -hiddenimports = ['pyexcel_xls'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-xlsx.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-xlsx.py deleted file mode 100644 index 1f12497..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-xlsx.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# This hook was tested with pyexcel-xlsx 0.4.2: -# https://github.com/pyexcel/pyexcel-xlsx - -hiddenimports = ['pyexcel_xlsx'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-xlsxw.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-xlsxw.py deleted file mode 100644 index c0b6778..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-xlsxw.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# This hook was tested with pyexcel-xlsxw 0.4.2: -# https://github.com/pyexcel/pyexcel-xlsxw - -hiddenimports = ['pyexcel_xlsxw'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel.py deleted file mode 100644 index f000b2d..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel.py +++ /dev/null @@ -1,29 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# This hook was tested with pyexcel 0.5.13: -# https://github.com/pyexcel/pyexcel - -hiddenimports = [ - 'pyexcel.plugins.renderers.sqlalchemy', 'pyexcel.plugins.renderers.django', - 'pyexcel.plugins.renderers.excel', 'pyexcel.plugins.renderers._texttable', - 'pyexcel.plugins.parsers.excel', 'pyexcel.plugins.parsers.sqlalchemy', - 'pyexcel.plugins.sources.http', 'pyexcel.plugins.sources.file_input', - 'pyexcel.plugins.sources.memory_input', - 'pyexcel.plugins.sources.file_output', - 'pyexcel.plugins.sources.output_to_memory', - 'pyexcel.plugins.sources.pydata.bookdict', - 'pyexcel.plugins.sources.pydata.dictsource', - 'pyexcel.plugins.sources.pydata.arraysource', - 'pyexcel.plugins.sources.pydata.records', 'pyexcel.plugins.sources.django', - 'pyexcel.plugins.sources.sqlalchemy', 'pyexcel.plugins.sources.querysets' -] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_io.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_io.py deleted file mode 100644 index 2096a74..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_io.py +++ /dev/null @@ -1,26 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# This hook was tested with pyexcel-io 0.5.18: -# https://github.com/pyexcel/pyexcel-io - -hiddenimports = [ - 'pyexcel_io.readers.csvr', 'pyexcel_io.readers.csvz', - 'pyexcel_io.readers.tsv', 'pyexcel_io.readers.tsvz', - 'pyexcel_io.writers.csvw', 'pyexcel_io.writers.csvz', - 'pyexcel_io.writers.tsv', 'pyexcel_io.writers.tsvz', - 'pyexcel_io.readers.csvz', 'pyexcel_io.readers.tsv', - 'pyexcel_io.readers.tsvz', 'pyexcel_io.database.importers.django', - 'pyexcel_io.database.importers.sqlalchemy', - 'pyexcel_io.database.exporters.django', - 'pyexcel_io.database.exporters.sqlalchemy' -] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_ods.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_ods.py deleted file mode 100644 index f856a0e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_ods.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# This hook was tested with pyexcel-ods 0.5.6: -# https://github.com/pyexcel/pyexcel-ods - -hiddenimports = ['pyexcel_ods', 'pyexcel_ods.odsr', 'pyexcel_ods.odsw', "pyexcel_io.writers"] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_ods3.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_ods3.py deleted file mode 100644 index c4f54eb..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_ods3.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# This hook was tested with pyexcel-ods3 0.5.3: -# https://github.com/pyexcel/pyexcel-ods3 - -hiddenimports = ['pyexcel_ods3', 'pyexcel_ods3.odsr', 'pyexcel_ods3.odsw'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_odsr.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_odsr.py deleted file mode 100644 index d895ed1..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_odsr.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# This hook was tested with pyexcel-io 0.5.2: -# https://github.com/pyexcel/pyexcel-io - -hiddenimports = ['pyexcel_odsr', 'pyexcel_odsr.odsr'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_xls.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_xls.py deleted file mode 100644 index 4875412..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_xls.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# This hook was tested with pyexcel-xls 0.5.8: -# https://github.com/pyexcel/pyexcel-xls - -hiddenimports = ['pyexcel_xls', 'pyexcel_xls.xlsr', 'pyexcel_xls.xlsw'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_xlsx.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_xlsx.py deleted file mode 100644 index 438aab6..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_xlsx.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# This hook was tested with pyexcel-xlsx 0.4.2: -# https://github.com/pyexcel/pyexcel-xlsx - -hiddenimports = ['pyexcel_xlsx', 'pyexcel_xlsx.xlsxr', 'pyexcel_xlsx.xlsxw'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_xlsxw.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_xlsxw.py deleted file mode 100644 index 72f7593..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_xlsxw.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# This hook was tested with pyexcel-xlsxw 0.4.2: -# https://github.com/pyexcel/pyexcel-xlsxw - -hiddenimports = ['pyexcel_xlsxw', 'pyexcel_xlsxw.xlsxw'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcelerate.Writer.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcelerate.Writer.py deleted file mode 100644 index ff9dbc8..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcelerate.Writer.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('pyexcelerate') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pygraphviz.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pygraphviz.py deleted file mode 100644 index 7a6028f..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pygraphviz.py +++ /dev/null @@ -1,145 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -import os -import pathlib -import shutil - -from PyInstaller import compat -from PyInstaller.depend import bindepend -from PyInstaller.utils.hooks import logger - - -def _collect_graphviz_files(): - binaries = [] - datas = [] - - # A working `pygraphviz` installation requires graphviz programs in PATH. Attempt to resolve the `dot` executable to - # see if this is the case. - dot_binary = shutil.which('dot') - if not dot_binary: - logger.warning( - "hook-pygraphviz: 'dot' program not found in PATH!" - ) - return binaries, datas - logger.info("hook-pygraphviz: found 'dot' program: %r", dot_binary) - bin_dir = pathlib.Path(dot_binary).parent - - # Collect graphviz programs that might be called from `pygaphviz.agraph.AGraph`: - # https://github.com/pygraphviz/pygraphviz/blob/pygraphviz-1.14/pygraphviz/agraph.py#L1330-L1348 - # On macOS and on Linux, several of these are symbolic links to a single executable. - progs = ( - "neato", - "dot", - "twopi", - "circo", - "fdp", - "nop", - "osage", - "patchwork", - "gc", - "acyclic", - "gvpr", - "gvcolor", - "ccomps", - "sccmap", - "tred", - "sfdp", - "unflatten", - ) - - logger.debug("hook-pygraphviz: collecting graphviz program executables...") - for program_name in progs: - program_binary = shutil.which(program_name) - if not program_binary: - logger.debug("hook-pygaphviz: graphviz program %r not found!", program_name) - continue - - # Ensure that the program executable was found in the same directory as the `dot` executable. This should - # prevent us from falling back to other graphviz installations that happen to be in PATH. - if pathlib.Path(program_binary).parent != bin_dir: - logger.debug( - "hook-pygraphviz: found program %r (%r) outside of directory %r - ignoring!", - program_name, program_binary, str(bin_dir) - ) - continue - - logger.debug("hook-pygraphviz: collecting graphviz program %r: %r", program_name, program_binary) - binaries += [(program_binary, '.')] - - # Graphviz shared libraries should be automatically collected when PyInstaller performs binary dependency - # analysis of the collected program executables as part of the main build process. However, we need to manually - # collect plugins and their accompanying config file. - logger.debug("hook-pygraphviz: looking for graphviz plugin directory...") - if compat.is_win: - # Under Windows, we have several installation variants: - # - official installers and builds from https://gitlab.com/graphviz/graphviz/-/releases - # - chocolatey - # - msys2 - # - Anaconda - # In all variants, the plugins and the config file are located in the `bin` directory, next to the program - # executables. - plugin_dir = bin_dir - plugin_dest_dir = '.' # Collect into top-level application directory. - # Official builds and Anaconda use unversioned `gvplugin-{name}.dll` plugin names, while msys2 uses - # versioned `libgvplugin-{name}-{version}.dll` plugin names (with "lib" prefix). - plugin_pattern = '*gvplugin*.dll' - else: - # Perform binary dependency analysis on the `dot` executable to obtain the path to graphiz shared libraries. - # These need to be in the library search path for the programs to work, or discoverable via run-paths - # (e.g., Anaconda on Linux and macOS, Homebrew on macOS). - graphviz_lib_candidates = ['cdt', 'gvc', 'cgraph'] - - if hasattr(bindepend, 'get_imports'): - # PyInstaller >= 6.0 - dot_imports = [path for name, path in bindepend.get_imports(dot_binary) if path is not None] - else: - # PyInstaller < 6.0 - dot_imports = bindepend.getImports(dot_binary) - - graphviz_lib_paths = [ - path for path in dot_imports - if any(candidate in os.path.basename(path) for candidate in graphviz_lib_candidates) - ] - - if not graphviz_lib_paths: - logger.warning("hook-pygraphviz: could not determine location of graphviz shared libraries!") - return binaries, datas - - graphviz_lib_dir = pathlib.Path(graphviz_lib_paths[0]).parent - logger.debug("hook-pygraphviz: location of graphviz shared libraries: %r", str(graphviz_lib_dir)) - - # Plugins should be located in `graphviz` directory next to shared libraries. - plugin_dir = graphviz_lib_dir / 'graphviz' - plugin_dest_dir = 'graphviz' # Collect into graphviz sub-directory. - - if compat.is_darwin: - plugin_pattern = '*gvplugin*.dylib' - else: - # Collect only versioned .so library files (for example, `/lib64/graphviz/libgvplugin_core.so.6` and - # `/lib64/graphviz/libgvplugin_core.so.6.0.0`; the former usually being a symbolic link to the latter). - # The unversioned .so library files (such as `lib64/graphviz/libgvplugin_core.so`), if available, are - # meant for linking (and are usually installed as part of development package). - plugin_pattern = '*gvplugin*.so.*' - - if not plugin_dir.is_dir(): - logger.warning("hook-pygraphviz: could not determine location of graphviz plugins!") - return binaries, datas - - logger.info("hook-pygraphviz: collecting graphviz plugins from directory: %r", str(plugin_dir)) - - binaries += [(str(file), plugin_dest_dir) for file in plugin_dir.glob(plugin_pattern)] - datas += [(str(file), plugin_dest_dir) for file in plugin_dir.glob("config*")] # e.g., `config6` - - return binaries, datas - - -binaries, datas = _collect_graphviz_files() diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pygwalker.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pygwalker.py deleted file mode 100644 index 9e78db1..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pygwalker.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('pygwalker') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pylibmagic.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pylibmagic.py deleted file mode 100644 index 5fb8024..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pylibmagic.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Pylibmagic contains data files (libmagic compiled and configurations) required to use the python-magic package. -""" - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("pylibmagic") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pylint.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pylint.py deleted file mode 100644 index 3e2e804..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pylint.py +++ /dev/null @@ -1,75 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -# -# ************************************************* -# hook-pylint.py - PyInstaller hook file for pylint -# ************************************************* -# The pylint package, in __pkginfo__.py, is version 1.4.3. Looking at its -# source: -# -# From checkers/__init__.py, starting at line 122:: -# -# def initialize(linter): -# """initialize linter with checkers in this package """ -# register_plugins(linter, __path__[0]) -# -# From reporters/__init__.py, starting at line 131:: -# -# def initialize(linter): -# """initialize linter with reporters in this package """ -# utils.register_plugins(linter, __path__[0]) -# -# From utils.py, starting at line 881:: -# -# def register_plugins(linter, directory): -# """load all module and package in the given directory, looking for a -# 'register' function in each one, used to register pylint checkers -# """ -# imported = {} -# for filename in os.listdir(directory): -# base, extension = splitext(filename) -# if base in imported or base == '__pycache__': -# continue -# if extension in PY_EXTS and base != '__init__' or ( -# not extension and isdir(join(directory, base))): -# try: -# module = load_module_from_file(join(directory, filename)) -# -# -# So, we need all the Python source in the ``checkers/`` and ``reporters/`` -# subdirectories, since these are run-time discovered and loaded. Therefore, -# these files are all data files. In addition, since this is a module, the -# pylint/__init__.py file must be included, since submodules must be children of -# a module. - -from PyInstaller.utils.hooks import ( - collect_data_files, collect_submodules, is_module_or_submodule, get_module_file_attribute -) - -datas = ( - [(get_module_file_attribute('pylint.__init__'), 'pylint')] + - collect_data_files('pylint.checkers', True) + - collect_data_files('pylint.reporters', True) -) - - -# Add imports from dynamically loaded modules, excluding pylint.test -# subpackage (pylint <= 2.3) and pylint.testutils submodule (pylint < 2.7) -# or subpackage (pylint >= 2.7) -def _filter_func(name): - return ( - not is_module_or_submodule(name, 'pylint.test') and - not is_module_or_submodule(name, 'pylint.testutils') - ) - - -hiddenimports = collect_submodules('pylint', _filter_func) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pylsl.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pylsl.py deleted file mode 100644 index f3c7960..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pylsl.py +++ /dev/null @@ -1,42 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -import os -from PyInstaller.utils.hooks import logger, isolated - - -def find_library(): - # Try importing pylsl - this will fail if the shared library is unavailable. - try: - import pylsl # noqa: F401 - except Exception: - return None - - # Return the path to shared library that is used by pylsl. - try: - from pylsl.lib import lib as cdll # pylsl >= 0.17.0 - except ImportError: - from pylsl.pylsl import lib as cdll # older versions - - return cdll._name - - -# whenever a hook needs to load a 3rd party library, it needs to be done in an isolated subprocess -libfile = isolated.call(find_library) - -if libfile: - # add the liblsl library to the binaries - # it gets packaged in pylsl/lib, which is where pylsl will look first - binaries = [(libfile, os.path.join('pylsl', 'lib'))] -else: - logger.warning("liblsl shared library not found - pylsl will likely fail to work!") - binaries = [] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pymediainfo.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pymediainfo.py deleted file mode 100644 index 6b39abc..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pymediainfo.py +++ /dev/null @@ -1,44 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.compat import is_win, is_darwin -from PyInstaller.utils.hooks import collect_dynamic_libs, logger - -# Collect bundled mediainfo shared library (available in Windows and macOS wheels on PyPI). -binaries = collect_dynamic_libs("pymediainfo") - -# On linux, no wheels are available, and pymediainfo uses system shared library. -if not binaries and not (is_win or is_darwin): - - def _find_system_mediainfo_library(): - import os - import ctypes.util - from PyInstaller.depend.utils import _resolveCtypesImports - - libname = ctypes.util.find_library("mediainfo") - if libname is not None: - resolved_binary = _resolveCtypesImports([os.path.basename(libname)]) - if resolved_binary: - return resolved_binary[0][1] - - try: - mediainfo_lib = _find_system_mediainfo_library() - except Exception as e: - logger.warning("Error while trying to find system-installed MediaInfo library: %s", e) - mediainfo_lib = None - - if mediainfo_lib: - # Put the library into pymediainfo sub-directory, to keep layout consistent with that of wheels. - binaries += [(mediainfo_lib, 'pymediainfo')] - -if not binaries: - logger.warning("MediaInfo shared library not found - pymediainfo will likely fail to work!") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pymeshlab.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pymeshlab.py deleted file mode 100644 index daf9a2a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pymeshlab.py +++ /dev/null @@ -1,41 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller import compat -from PyInstaller.utils.hooks import collect_dynamic_libs, collect_data_files - -if compat.is_win: - # On Windows, pymeshlab wheel seems to include Qt libraries and plugins (and their dependencies, as well as meshlab - # plugins), as well as some of data files (such as translation files); all in the top-level package directory. - binaries = collect_dynamic_libs('pymeshlab') - datas = collect_data_files('pymeshlab') -elif compat.is_linux: - # On linux, only Qt libraries and plugins (and their dependencies, as well as meshlab plugins) seem to be included; - # all in lib subdir. - # NOTE: collect_dynamic_libs() does not collect versioned .so files; those are picked up by collect_data_files(). - binaries = collect_dynamic_libs('pymeshlab.lib') + collect_data_files('pymeshlab.lib') -elif compat.is_darwin: - # On macOS, Frameworks sub-directory contains Qt .framework bundles and other shared libraries, all of which seem - # to be picked up by binary dependency analysis. Avoid explicitly collecting anything from there to avoid - # interfering with PyInstaller's attempts to fix-up .framework bundle structure (see pyinstaller/pyinstaller#9335). - # The plugins for both meshlab and Qt are in PlugIns directory, and we need to collect those. - binaries = collect_dynamic_libs('pymeshlab.PlugIns') - -# On linux, prevent binary dependency analysis from generating symbolic links for bundles shared libraries to the -# top-level application directory. For some god-forsaken reason, the wheel includes a copy of python shared library, -# which might actually be ABI incompatible with version of python that frozen application is built with (for example, -# libpython3.13.so.1.0 shipped with pymeshlab 2025.7 causes `undefined symbol: _Py_GetExecutor` in `_opcode` extension -# collected from Fedora-provided python 3.13.11). -if compat.is_linux: - bindepend_symlink_suppression = [ - '**/pymeshlab/lib/*', - ] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pymorphy3.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pymorphy3.py deleted file mode 100644 index 7282272..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pymorphy3.py +++ /dev/null @@ -1,25 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import can_import_module, copy_metadata, collect_data_files - -datas = copy_metadata('pymorphy3_dicts_ru') -datas += collect_data_files('pymorphy3_dicts_ru') - -hiddenimports = ['pymorphy3_dicts_ru'] - -# Check if the Ukrainian model is installed -if can_import_module('pymorphy3_dicts_uk'): - datas += copy_metadata('pymorphy3_dicts_uk') - datas += collect_data_files('pymorphy3_dicts_uk') - - hiddenimports += ['pymorphy3_dicts_uk'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pymssql.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pymssql.py deleted file mode 100644 index f3a3c96..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pymssql.py +++ /dev/null @@ -1,20 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020-2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies - -hiddenimports = ["decimal"] -# In newer versions of pymssql, the _mssql was under pymssql -if is_module_satisfies("pymssql > 2.1.5"): - hiddenimports += ["pymssql._mssql", "uuid"] -else: - hiddenimports += ["_mssql"] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pynng.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pynng.py deleted file mode 100644 index f3b7499..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pynng.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Hook for https://pypi.org/project/pynng/ -""" - -hiddenimports = ['_cffi_backend'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pynput.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pynput.py deleted file mode 100644 index 0776e1d..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pynput.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules("pynput") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyodbc.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyodbc.py deleted file mode 100644 index bfa2f42..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyodbc.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import get_pyextension_imports - -# It's hard to detect imports of binary Python module without importing it. -# Let's try importing that module in a subprocess. -# TODO function get_pyextension_imports() is experimental and we need -# to evaluate its usage here and its suitability for other hooks. -hiddenimports = get_pyextension_imports('pyodbc') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyopencl.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyopencl.py deleted file mode 100644 index 9646426..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyopencl.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for the pyopencl module: https://github.com/pyopencl/pyopencl - -from PyInstaller.utils.hooks import copy_metadata, collect_data_files - -datas = copy_metadata('pyopencl') -datas += collect_data_files('pyopencl') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pypdfium2.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pypdfium2.py deleted file mode 100644 index 1005a8b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pypdfium2.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -# Collect `version.json`. -datas = collect_data_files("pypdfium2") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pypdfium2_raw.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pypdfium2_raw.py deleted file mode 100644 index 01a349d..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pypdfium2_raw.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_dynamic_libs, collect_data_files - -# Collect the bundled pdfium shared library. -binaries = collect_dynamic_libs('pypdfium2_raw') - -# Collect `version.json`. -datas = collect_data_files("pypdfium2_raw") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pypemicro.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pypemicro.py deleted file mode 100644 index 7a6e873..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pypemicro.py +++ /dev/null @@ -1,43 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for the pypemicro module: https://github.com/nxpmicro/pypemicro - -import os -from PyInstaller.utils.hooks import get_package_paths, is_module_satisfies -from PyInstaller.log import logger -from PyInstaller.compat import is_darwin - -binaries = list() -if is_module_satisfies('pyinstaller >= 5.0'): - from PyInstaller import isolated - - @isolated.decorate - def get_safe_libs(): - from pypemicro import PyPemicro - libs = PyPemicro.get_pemicro_lib_list() - return libs - - pkg_base, pkg_dir = get_package_paths("pypemicro") - for lib in get_safe_libs(): - source_path = lib['path'] - source_name = lib['name'] - dest = os.path.relpath(source_path, pkg_base) - binaries.append((os.path.join(source_path, source_name), dest)) - if is_darwin: - libusb = os.path.join(source_path, 'libusb.dylib') - if os.path.exists(libusb): - binaries.append((libusb, dest)) - else: - logger.warning("libusb.dylib was not found for Mac OS, ignored") -else: - logger.warning("hook-pypemicro requires pyinstaller >= 5.0") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyphen.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyphen.py deleted file mode 100644 index 9f0be6f..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyphen.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('pyphen') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyppeteer.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyppeteer.py deleted file mode 100644 index 8c15c18..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyppeteer.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata - -# pyppeteer uses importlib.metadata to query its own version. -datas = copy_metadata("pyppeteer") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyproj.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyproj.py deleted file mode 100644 index 83390ef..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyproj.py +++ /dev/null @@ -1,72 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -import os -import sys -from PyInstaller.utils.hooks import collect_data_files, is_module_satisfies, copy_metadata -from PyInstaller.compat import is_win - -hiddenimports = [ - "pyproj.datadir" -] - -binaries = [] - -# Versions prior to 2.3.0 also require pyproj._datadir -if not is_module_satisfies("pyproj >= 2.3.0"): - hiddenimports += ["pyproj._datadir"] - -# Starting with version 3.0.0, pyproj._compat is needed -if is_module_satisfies("pyproj >= 3.0.0"): - hiddenimports += ["pyproj._compat"] - # Linux and macOS also require distutils. - if not is_win: - hiddenimports += ["distutils.util"] - -# Data collection -datas = collect_data_files('pyproj') - -# Repackagers may de-vendor the proj data directory (Conda, Debian) -if not any(dest.startswith("pyproj/proj_dir") for (_, dest) in datas): - if hasattr(sys, 'real_prefix'): # check if in a virtual environment - root_path = sys.real_prefix - else: - root_path = sys.prefix - - if is_win: - tgt_proj_data = os.path.join('Library', 'share', 'proj') - src_proj_data = os.path.join(root_path, 'Library', 'share', 'proj') - - else: # both linux and darwin - tgt_proj_data = os.path.join('share', 'proj') - src_proj_data = os.path.join(root_path, 'share', 'proj') - - if os.path.exists(src_proj_data): - datas.append((src_proj_data, tgt_proj_data)) - # A runtime hook defines the path for `PROJ_LIB` - else: - from PyInstaller.utils.hooks import logger - logger.warning("Datas for pyproj not found at:\n{}".format(src_proj_data)) - -# With pyproj 3.4.0, we need to collect package's metadata due to `importlib.metadata.version(__package__)` call in -# `__init__.py`. This change was reverted in subsequent releases of pyproj, so we collect metadata only for 3.4.0. -if is_module_satisfies("pyproj == 3.4.0"): - datas += copy_metadata("pyproj") - -# pyproj 3.4.0 was also the first release that used `delvewheel` for its Windows PyPI wheels. While contemporary -# PyInstaller versions automatically pick up DLLs from external `pyproj.libs` directory, this does not work on Anaconda -# python 3.8 and 3.9 due to defunct `os.add_dll_directory`, which forces `delvewheel` to use the old load-order file -# approach. So we need to explicitly ensure that load-order file as well as DLLs are collected. -if is_win and is_module_satisfies("pyproj >= 3.4.0"): - if is_module_satisfies("PyInstaller >= 5.6"): - from PyInstaller.utils.hooks import collect_delvewheel_libs_directory - datas, binaries = collect_delvewheel_libs_directory("pyproj", datas=datas, binaries=binaries) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pypsexec.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pypsexec.py deleted file mode 100644 index c96a56e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pypsexec.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# The bundled paexec.exe file needs to be collected (as data file; on any platform) -# because it is deployed to the remote side during execution. - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('pypsexec') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pypylon.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pypylon.py deleted file mode 100644 index 395aaf9..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pypylon.py +++ /dev/null @@ -1,48 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# PyPylon is a tricky library to bundle. It encapsulates the pylon C++ SDK inside -# it with modified library references to make the module relocatable. -# PyInstaller is able to find those libraries and preserve the linkage for almost -# all of them. However - there is an additional linking step happening at runtime, -# when the library is creating the transport layer for the camera. This linking -# will fail with the library files modified by pyinstaller. -# As the module is already relocatable, we circumvent this issue by bundling -# pypylon as-is - for pyinstaller we treat the shared library files as just data. - -import os - -from PyInstaller.utils.hooks import ( - collect_data_files, - collect_dynamic_libs, - is_module_satisfies -) - -# Collect dynamic libs as data (to prevent pyinstaller from modifying them). -# NOTE: under PyInstaller 6.x, these files end up re-classified as binaries anyway. -datas = collect_dynamic_libs('pypylon') - -# Collect data files, looking for pypylon/pylonCXP/bin/ProducerCXP.cti, but other files may also be needed -datas += collect_data_files('pypylon') - -# NOTE: the part below is incompatible with PyInstaller 6.x, because `collect_data_files(..., include_py_files=True)` -# does not include binary extensions anymore. In addition, `pyinstaller/pyinstaller@ecc218c` in PyInstaller 6.2 fixed -# the module exclusion for relative imports, so the modules listed below actually end up excluded. Presumably this -# part was necessary with older PyInstaller versions, so we keep it around, but disable it for PyInstaller >= 6.0. -if is_module_satisfies('PyInstaller < 6.0'): - # Exclude the C++-extensions from automatic search, add them manually as data files - # their dependencies were already handled with collect_dynamic_libs - excludedimports = ['pypylon._pylon', 'pypylon._genicam'] - for filename, module in collect_data_files('pypylon', include_py_files=True): - if (os.path.basename(filename).startswith('_pylon.') - or os.path.basename(filename).startswith('_genicam.')): - datas += [(filename, module)] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyqtgraph.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyqtgraph.py deleted file mode 100644 index 0d8bf9c..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyqtgraph.py +++ /dev/null @@ -1,56 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files, collect_submodules - -# Collect all data files, excluding the examples' data -datas = collect_data_files('pyqtgraph', excludes=['**/examples/*']) - -# pyqtgraph uses Qt-version-specific templates for the UI elements. -# There are templates for different versions of PySide and PyQt, e.g. -# -# - pyqtgraph.graphicsItems.ViewBox.axisCtrlTemplate_pyqt5 -# - pyqtgraph.graphicsItems.ViewBox.axisCtrlTemplate_pyqt6 -# - pyqtgraph.graphicsItems.ViewBox.axisCtrlTemplate_pyside2 -# - pyqtgraph.graphicsItems.ViewBox.axisCtrlTemplate_pyside6 -# - pyqtgraph.graphicsItems.PlotItem.plotConfigTemplate_pyqt5 -# - pyqtgraph.graphicsItems.PlotItem.plotConfigTemplate_pyqt6 -# - pyqtgraph.graphicsItems.PlotItem.plotConfigTemplate_pyside2 -# - pyqtgraph.graphicsItems.PlotItem.plotConfigTemplate_pyside6 -# -# To be future-proof, we collect all modules by -# using collect-submodules, and filtering the modules -# which appear to be templates. -# We need to avoid recursing into `pyqtgraph.examples`, because that -# triggers instantiation of `QApplication` (which requires X/Wayland -# session on linux). -# Tested with pyqtgraph master branch (commit c1900aa). -all_imports = collect_submodules("pyqtgraph", filter=lambda name: name != "pyqtgraph.examples") -hiddenimports = [name for name in all_imports if "Template" in name] - -# Collect the pyqtgraph/multiprocess/bootstrap.py as a module; this is required by our pyqtgraph.multiprocess runtime -# hook to handle the pyqtgraph's multiprocessing implementation. The pyqtgraph.multiprocess seems to be imported -# automatically on the import of pyqtgraph itself, so there is no point in creating a separate hook for this. -hiddenimports += ['pyqtgraph.multiprocess.bootstrap'] - -# Attempt to auto-select applicable Qt bindings and exclude extraneous Qt bindings. -# Available in PyInstaller >= 6.5, which has `PyInstaller.utils.hooks.qt.exclude_extraneous_qt_bindings` helper. -try: - from PyInstaller.utils.hooks.qt import exclude_extraneous_qt_bindings -except ImportError: - pass -else: - # Use the helper's default preference order, to keep it consistent across multiple hooks that use the same helper. - excludedimports = exclude_extraneous_qt_bindings( - hook_name="hook-pyqtgraph", - qt_bindings_order=None, - ) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyshark.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyshark.py deleted file mode 100644 index 46aae20..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyshark.py +++ /dev/null @@ -1,25 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Python wrapper for pyshark(https://pypi.org/project/pyshark/) -# Tested with version 0.4.5 - -from PyInstaller.utils.hooks import collect_data_files, is_module_satisfies - -hiddenimports = ['pyshark.config'] - -if is_module_satisfies("pyshark < 0.6"): - hiddenimports += ['py._path.local', 'py._vendored_packages.iniconfig'] - if is_module_satisfies("pyshark >= 0.5"): - hiddenimports += ["py._io.terminalwriter", "py._builtin"] - -datas = collect_data_files('pyshark') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pysnmp.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pysnmp.py deleted file mode 100644 index 5824b58..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pysnmp.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules, collect_data_files - -hiddenimports = collect_submodules('pysnmp.smi.mibs') -datas = collect_data_files('pysnmp.smi.mibs', include_py_files=True) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pystray.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pystray.py deleted file mode 100644 index 835b0be..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pystray.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules -# https://github.com/moses-palmer/pystray/tree/feature-explicit-backends -# if this get merged then we don't need this hook -hiddenimports = collect_submodules("pystray") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pytest.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pytest.py deleted file mode 100644 index 080d2e7..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pytest.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Hook for http://pypi.python.org/pypi/pytest/ -""" - -import pytest - -hiddenimports = pytest.freeze_includes() diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pythainlp.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pythainlp.py deleted file mode 100644 index d5bdcc5..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pythainlp.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('pythainlp') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pythoncom.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pythoncom.py deleted file mode 100644 index 05b0c1d..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pythoncom.py +++ /dev/null @@ -1,31 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# pywin32 supports frozen mode; in that mode, it is looking at sys.path for pythoncomXY.dll. However, as of -# PyInstaller 5.4, we may collect that DLL into its original pywin32_system32 sub-directory as part of the -# binary dependency analysis (and add it to sys.path by means of a runtime hook). - -import pathlib - -from PyInstaller.utils.hooks import is_module_satisfies, get_pywin32_module_file_attribute - -dll_filename = get_pywin32_module_file_attribute('pythoncom') -dst_dir = '.' # Top-level application directory - -if is_module_satisfies('PyInstaller >= 5.4'): - # Try preserving the original pywin32_system directory, if applicable (it is not applicable in Anaconda, - # where the DLL is located in Library/bin). - dll_path = pathlib.Path(dll_filename) - if dll_path.parent.name == 'pywin32_system32': - dst_dir = 'pywin32_system32' - -binaries = [(dll_filename, dst_dir)] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pytokens.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pytokens.py deleted file mode 100644 index 4810bf7..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pytokens.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2026 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -from _pyinstaller_hooks_contrib.utils.mypy import find_mypyc_module_for_dist - -# pytokens >= 0.4.0 uses `mypy`, and includes a top-level module with dynamically-generated name prefix; -# for example, `fd7dcdb10166ebd4db98__mypyc`. -hiddenimports = find_mypyc_module_for_dist('pytokens') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyttsx.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyttsx.py deleted file mode 100644 index 36fceb2..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyttsx.py +++ /dev/null @@ -1,23 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -pyttsx imports drivers module based on specific platform. -Found at http://mrmekon.tumblr.com/post/5272210442/pyinstaller-and-pyttsx -""" - -hiddenimports = [ - 'drivers', - 'drivers.dummy', - 'drivers.espeak', - 'drivers.nsss', - 'drivers.sapi5', -] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyttsx3.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyttsx3.py deleted file mode 100644 index ac3edf8..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyttsx3.py +++ /dev/null @@ -1,30 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# pyttsx3 conditionally imports drivers module based on specific platform. -# https://github.com/nateshmbhat/pyttsx3/blob/5a19376a94fdef6bfaef8795539e755b1f363fbf/pyttsx3/driver.py#L40-L50 - -import sys - -hiddenimports = ["pyttsx3.drivers", "pyttsx3.drivers.dummy"] - -# Take directly from the link above. -if sys.platform == 'darwin': - driverName = 'nsss' -elif sys.platform == 'win32': - driverName = 'sapi5' -else: - driverName = 'espeak' -# import driver module -name = 'pyttsx3.drivers.%s' % driverName - -hiddenimports.append(name) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyviz_comms.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyviz_comms.py deleted file mode 100644 index 5a882c9..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyviz_comms.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("pyviz_comms") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyvjoy.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyvjoy.py deleted file mode 100644 index d72e13e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyvjoy.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -from PyInstaller.utils.hooks import collect_dynamic_libs - -binaries = collect_dynamic_libs("pyvjoy") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pywintypes.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pywintypes.py deleted file mode 100644 index b452e93..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pywintypes.py +++ /dev/null @@ -1,31 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# pywin32 supports frozen mode; in that mode, it is looking at sys.path for pywintypesXY.dll. However, as of -# PyInstaller 5.4, we may collect that DLL into its original pywin32_system32 sub-directory as part of the -# binary dependency analysis (and add it to sys.path by means of a runtime hook). - -import pathlib - -from PyInstaller.utils.hooks import is_module_satisfies, get_pywin32_module_file_attribute - -dll_filename = get_pywin32_module_file_attribute('pywintypes') -dst_dir = '.' # Top-level application directory - -if is_module_satisfies('PyInstaller >= 5.4'): - # Try preserving the original pywin32_system directory, if applicable (it is not applicable in Anaconda, - # where the DLL is located in Library/bin). - dll_path = pathlib.Path(dll_filename) - if dll_path.parent.name == 'pywin32_system32': - dst_dir = 'pywin32_system32' - -binaries = [(dll_filename, dst_dir)] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pywt.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pywt.py deleted file mode 100644 index e1b5f36..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pywt.py +++ /dev/null @@ -1,21 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for https://github.com/PyWavelets/pywt - -hiddenimports = ['pywt._extensions._cwt'] - -# NOTE: There is another project `https://github.com/Knapstad/pywt installing -# a packagre `pywt`, too. This name clash is not much of a problem, even if -# this hook is picked up for the other package, since PyInstaller will simply -# skip any module added by this hook but acutally missing. If the other project -# requires a hook, too, simply add it to this file. diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-qtmodern.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-qtmodern.py deleted file mode 100644 index 2adb2b7..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-qtmodern.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("qtmodern", includes=["**/*.qss"]) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-radicale.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-radicale.py deleted file mode 100644 index 56b487a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-radicale.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata, collect_data_files - -datas = copy_metadata('radicale') -datas += collect_data_files('radicale') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-raven.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-raven.py deleted file mode 100644 index fe6f8e6..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-raven.py +++ /dev/null @@ -1,13 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -hiddenimports = ['raven.events', 'raven.processors'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rawpy.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rawpy.py deleted file mode 100644 index 7daf325..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rawpy.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Python wrapper for LibRaw (https://pypi.python.org/pypi/rawpy) -# Tested with version 0.3.5 - -hiddenimports = ['numpy', 'enum'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rdflib.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rdflib.py deleted file mode 100644 index 7fc6631..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rdflib.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules('rdflib.plugins') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-redmine.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-redmine.py deleted file mode 100644 index 1291095..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-redmine.py +++ /dev/null @@ -1,13 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -hiddenimports = ['redmine.resources'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-regex.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-regex.py deleted file mode 100644 index e55764e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-regex.py +++ /dev/null @@ -1,13 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -hiddenimports = ['warnings'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-reportlab.lib.utils.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-reportlab.lib.utils.py deleted file mode 100644 index eb3ce68..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-reportlab.lib.utils.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Needed for ReportLab 3 -hiddenimports = [ - 'reportlab.rl_settings', -] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-reportlab.pdfbase._fontdata.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-reportlab.pdfbase._fontdata.py deleted file mode 100644 index e4e8e9a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-reportlab.pdfbase._fontdata.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules - -# Tested on Windows 7 x64 with Python 2.7.6 x32 using ReportLab 3.0 -# This has been observed to *not* work on ReportLab 2.7 -hiddenimports = collect_submodules('reportlab.pdfbase', - lambda name: name.startswith('reportlab.pdfbase._fontdata_')) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-resampy.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-resampy.py deleted file mode 100644 index 8b45d2c..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-resampy.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for resampy -from PyInstaller.utils.hooks import collect_data_files - -# resampy has two data files that need to be included. -datas = collect_data_files('resampy', False) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rich.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rich.py deleted file mode 100644 index 239056a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rich.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2026 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules, is_module_satisfies - -# Starting with v14.3.0, we need to collect modules from `rich._unicode_data`. -if is_module_satisfies('rich >= 14.3.0'): - hiddenimports = collect_submodules('rich._unicode_data') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rlp.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rlp.py deleted file mode 100644 index c59c1b6..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rlp.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies, copy_metadata - -# Starting with v4.0.0, `rlp` queries its version from metadata. -if is_module_satisfies("rlp >= 4.0.0"): - datas = copy_metadata('rlp') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rpy2.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rpy2.py deleted file mode 100644 index f37c2b6..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rpy2.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -hiddenimports = [ - "rpy2", - "rpy2.robjects", - "rpy2.robjects.packages", - "rpy2.situation", -] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rtree.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rtree.py deleted file mode 100644 index 67899d3..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rtree.py +++ /dev/null @@ -1,46 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -import pathlib - -from PyInstaller import compat -from PyInstaller.utils.hooks import collect_dynamic_libs, get_installer, get_package_paths - - -# Query the installer of the `rtree` package; in PyInstaller prior to 6.0, this might raise an exception, whereas in -# later versions, None is returned. -try: - package_installer = get_installer('rtree') -except Exception: - package_installer = None - -if package_installer == 'conda': - from PyInstaller.utils.hooks import conda - - # In Anaconda-packaged `rtree`, `libspatialindex` and `libspatialindex_c` shared libs are packaged in a separate - # `libspatialindex` package. Collect the libraries into `rtree/lib` sub-directory to simulate PyPI wheel layout. - binaries = conda.collect_dynamic_libs('libspatialindex', dest='rtree/lib', dependencies=False) -else: - # pip-installed package. The shared libs are usually placed in `rtree/lib` directory. - binaries = collect_dynamic_libs('rtree') - - # With rtree >= 1.1.0, Linux PyPI wheels place the shared library in a `Rtree.libs` top-level directory. - # In rtree 1.4.0, the directory was renamed to `rtree.libs` - if compat.is_linux: - _, rtree_dir = get_package_paths('rtree') - for candidate_dir_name in ('rtree.libs', 'Rtree.libs'): - rtree_libs_dir = pathlib.Path(rtree_dir).parent / candidate_dir_name - if not rtree_libs_dir.is_dir(): - continue - binaries += [ - (str(lib_file), candidate_dir_name) for lib_file in rtree_libs_dir.glob("libspatialindex*.so*") - ] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ruamel.yaml.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ruamel.yaml.py deleted file mode 100644 index 23339e9..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ruamel.yaml.py +++ /dev/null @@ -1,39 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# `ruamel.yaml` offers several optional plugins that can be installed via additional packages -# (e.g., `runamel.yaml.string`). Unfortunately, the discovery of these plugins is predicated on their `__plug_in__.py` -# files being visible on filesystem. -# See: https://sourceforge.net/p/ruamel-yaml/code/ci/0bef9fa8b3c43637cd90ce3f2e299e81c2122128/tree/main.py#l757 - -import pathlib - -from PyInstaller.utils.hooks import get_module_file_attribute, logger - -ruamel_path = pathlib.Path(get_module_file_attribute('ruamel.yaml')).parent - -plugin_files = ruamel_path.glob('*/__plug_in__.py') -plugin_names = [plugin_file.parent.name for plugin_file in plugin_files] -logger.debug("hook-ruamel.yaml: found plugins: %r", plugin_names) - -# Add `__plug_in__` modules to hiddenimports to ensure they are collected and scanned for imports. This also implicitly -# collects the plugin's `__init__` module. -plugin_modules = [f"ruamel.yaml.{plugin_name}.__plug_in__" for plugin_name in plugin_names] - -hiddenimports = plugin_modules - -# Collect the plugins' `__plug_in__` modules both as byte-compiled .pyc in PYZ archive (to be actually loaded) and -# source .py file (which allows plugin to be discovered). -module_collection_mode = { - plugin_module: "pyz+py" - for plugin_module in plugin_modules -} diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rubicon.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rubicon.py deleted file mode 100644 index 68116a1..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rubicon.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Prevent this package from pulling `setuptools_scm` into frozen application, as it makes no sense in that context. -excludedimports = ["setuptools_scm"] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sacremoses.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sacremoses.py deleted file mode 100644 index 23b00db..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sacremoses.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('sacremoses') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sam2.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sam2.py deleted file mode 100644 index 321da39..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sam2.py +++ /dev/null @@ -1,30 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for Segment Anything Model 2 (SAM 2): https://pypi.org/project/sam2 - -from PyInstaller.utils.hooks import collect_data_files, collect_submodules - -# Collect config .yaml files. -datas = collect_data_files('sam2') - -# Ensure that all indirectly-imported modules are collected (e.g., `sam2.modeling.backbones`). -hiddenimports = collect_submodules('sam2') - -# Due to use of `torch.script`, we need to collect source .py files for `sam2`. The `sam2/__init__.py` also seems to be -# required by `hydra`. Furthermore, the source-based introspection attempts to load the source of stdlib `enum` module. -# The module collection mode support and run-time discovery of source .py files for modules that are collected into -# `base_library.zip` archive was added in pyinstaller/pyinstaller#8971 (i.e., PyInstaller > 6.11.1). -module_collection_mode = { - 'sam2': 'pyz+py', - 'enum': 'pyz+py', # requires PyInstaller > 6.11.1; no-op in earlier versions -} diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-saml2.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-saml2.py deleted file mode 100644 index 244944a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-saml2.py +++ /dev/null @@ -1,25 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for https://github.com/IdentityPython/pysaml2 -from PyInstaller.utils.hooks import collect_data_files, copy_metadata, collect_submodules - -datas = copy_metadata("pysaml2") - -# The library contains a bunch of XSD schemas that are loaded by the code: -# https://github.com/IdentityPython/pysaml2/blob/7cb4f09dce87a7e8098b9c7552ebab8bc77bc896/src/saml2/xml/schema/__init__.py#L23 -# On the other hand, runtime tools are not needed. -datas += collect_data_files("saml2", excludes=["**/tools"]) - -# Submodules are loaded dynamically by: -# https://github.com/IdentityPython/pysaml2/blob/7cb4f09dce87a7e8098b9c7552ebab8bc77bc896/src/saml2/attribute_converter.py#L52 -hiddenimports = collect_submodules("saml2.attributemaps") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-schwifty.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-schwifty.py deleted file mode 100644 index a8b30ca..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-schwifty.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata, collect_data_files - -datas = copy_metadata('schwifty') -datas += collect_data_files('schwifty') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-seedir.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-seedir.py deleted file mode 100644 index 28ed6b5..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-seedir.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('seedir') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-selectolax.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-selectolax.py deleted file mode 100644 index 53b3086..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-selectolax.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("selectolax") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-selenium.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-selenium.py deleted file mode 100644 index 13a312a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-selenium.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('selenium') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sentry_sdk.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sentry_sdk.py deleted file mode 100644 index 02afaf3..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sentry_sdk.py +++ /dev/null @@ -1,39 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller import isolated - -hiddenimports = [ - "sentry_sdk.integrations.stdlib", - "sentry_sdk.integrations.excepthook", - "sentry_sdk.integrations.dedupe", - "sentry_sdk.integrations.atexit", - "sentry_sdk.integrations.modules", - "sentry_sdk.integrations.argv", - "sentry_sdk.integrations.logging", - "sentry_sdk.integrations.threading", -] - - -@isolated.decorate -def _get_integration_modules(): - import sentry_sdk.integrations as si - - # _AUTO_ENABLING_INTEGRATIONS is a list of strings with default enabled integrations - # https://github.com/getsentry/sentry-python/blob/c6b6f2086b58ffc674df5c25a600b8a615079fb5/sentry_sdk/integrations/__init__.py#L54-L66 - integrations = getattr(si, '_AUTO_ENABLING_INTEGRATIONS', []) - - # The list contains fully-qualified class names; turn them into module names by removing the last component. - return [integration_name.rsplit('.', maxsplit=1)[0] for integration_name in integrations] - - -hiddenimports += _get_integration_modules() diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-setuptools_scm.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-setuptools_scm.py deleted file mode 100644 index 8e22d91..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-setuptools_scm.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata - -# Ensure `metadata of setuptools` dist is collected, to avoid run-time warning about unknown/incompatible `setuptools` -# version. -datas = copy_metadata('setuptools') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-shapely.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-shapely.py deleted file mode 100644 index 6899367..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-shapely.py +++ /dev/null @@ -1,105 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -import os -from ctypes.util import find_library - -from PyInstaller.utils.hooks import get_package_paths -from PyInstaller.utils.hooks import is_module_satisfies -from PyInstaller import compat - -# Necessary when using the vectorized subpackage -hiddenimports = ['shapely.prepared'] - -if is_module_satisfies('shapely >= 2.0.0'): - # An import made in the `shapely.geometry_helpers` extension; both `shapely.geometry_helpers` and `shapely._geos` - # extensions were introduced in v2.0.0. - hiddenimports += ['shapely._geos'] - -pkg_base, pkg_dir = get_package_paths('shapely') - -binaries = [] -datas = [] -if compat.is_win: - geos_c_dll_found = False - - # Search conda directory if conda is active, then search standard - # directory. This is the same order of precidence used in shapely. - standard_path = os.path.join(pkg_dir, 'DLLs') - lib_paths = [standard_path, os.environ['PATH']] - if compat.is_conda: - conda_path = os.path.join(compat.base_prefix, 'Library', 'bin') - lib_paths.insert(0, conda_path) - original_path = os.environ['PATH'] - try: - os.environ['PATH'] = os.pathsep.join(lib_paths) - dll_path = find_library('geos_c') or find_library('libgeos_c') - finally: - os.environ['PATH'] = original_path - if dll_path is not None: - binaries += [(dll_path, '.')] - geos_c_dll_found = True - - # Starting with shapely 1.8.1, the DLLs shipped with PyPI wheels are stored in - # site-packages/Shapely.libs instead of sub-directory in site-packages/shapely. - if is_module_satisfies("shapely >= 1.8.1"): - lib_dir = os.path.join(pkg_base, "Shapely.libs") - if os.path.isdir(lib_dir): - # We collect DLLs as data files instead of binaries to suppress binary - # analysis, which would result in duplicates (because it collects a copy - # into the top-level directory instead of preserving the original layout). - # In addition to DLls, this also collects .load-order* file (required on - # python < 3.8), and ensures that Shapely.libs directory exists (required - # on python >= 3.8 due to os.add_dll_directory call). - datas += [ - (os.path.join(lib_dir, lib_file), 'Shapely.libs') - for lib_file in os.listdir(lib_dir) - ] - - geos_c_dll_found |= any([ - os.path.basename(lib_file).startswith("geos_c") - for lib_file, _ in datas - ]) - - if not geos_c_dll_found: - raise SystemExit( - "Error: geos_c.dll not found, required by hook-shapely.py.\n" - "Please check your installation or provide a pull request to " - "PyInstaller to update hook-shapely.py.") -elif compat.is_linux and is_module_satisfies('shapely < 1.7'): - # This duplicates the libgeos*.so* files in the build. PyInstaller will - # copy them into the root of the build by default, but shapely cannot load - # them from there in linux IF shapely was installed via a whl file. The - # whl bundles its own libgeos with a different name, something like - # libgeos_c-*.so.* but shapely tries to load libgeos_c.so if there isn't a - # ./libs directory under its package. - # - # The fix for this (https://github.com/Toblerity/Shapely/pull/485) has - # been available in shapely since version 1.7. - lib_dir = os.path.join(pkg_dir, '.libs') - dest_dir = os.path.join('shapely', '.libs') - - binaries += [(os.path.join(lib_dir, f), dest_dir) for f in os.listdir(lib_dir)] -elif compat.is_darwin and is_module_satisfies('shapely >= 1.8.1'): - # In shapely 1.8.1, the libgeos_c library bundled in macOS PyPI wheels is not - # called libgeos.1.dylib anymore, but rather has a fullly-versioned name - # (e.g., libgeos_c.1.16.0.dylib). - # Shapely fails to find such a library unless it is located in the .dylibs - # directory. So we need to ensure that the libraries are collected into - # .dylibs directory; however, this will result in duplication due to binary - # analysis of the python extensions that are linked against these libraries - # as well (as that will copy the libraries to top-level directory). - lib_dir = os.path.join(pkg_dir, '.dylibs') - dest_dir = os.path.join('shapely', '.dylibs') - - if os.path.isdir(lib_dir): - binaries += [(os.path.join(lib_dir, f), dest_dir) for f in os.listdir(lib_dir)] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-shotgun_api3.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-shotgun_api3.py deleted file mode 100644 index 3ccf68a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-shotgun_api3.py +++ /dev/null @@ -1,23 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -# Shotgun is using "six" to import these and -# PyInstaller does not seem to catch them correctly. -hiddenimports = ["xmlrpc", "xmlrpc.client"] - -# Collect the following files: -# /shotgun_api3/lib/httplib2/python2/cacerts.txt -# /shotgun_api3/lib/httplib2/python3/cacerts.txt -# /shotgun_api3/lib/certifi/cacert.pem -datas = collect_data_files("shotgun_api3") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-simplemma.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-simplemma.py deleted file mode 100644 index a233c66..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-simplemma.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('simplemma') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.color.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.color.py deleted file mode 100644 index d79f3fd..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.color.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies, collect_data_files, collect_submodules - -# As of scikit-image 0.21.0, we need to collect the __init__.pyi file for `lazy_loader`, as well as collect submodules -# due to lazy loading. -if is_module_satisfies("scikit-image >= 0.21.0"): - datas = collect_data_files("skimage.color", includes=["*.pyi"]) - hiddenimports = collect_submodules('skimage.color', filter=lambda name: name != 'skimage.color.tests') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.data.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.data.py deleted file mode 100644 index 8f59def..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.data.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies, collect_data_files, collect_submodules - -# As of scikit-image 0.20.0, we need to collect the __init__.pyi file for `lazy_loader`, as well as collect submodules -# due to lazy loading. -if is_module_satisfies('scikit-image >= 0.20.0'): - datas = collect_data_files("skimage.data", includes=["*.pyi"]) - hiddenimports = collect_submodules('skimage.data', filter=lambda name: name != 'skimage.data.tests') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.draw.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.draw.py deleted file mode 100644 index e52d351..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.draw.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies, collect_data_files, collect_submodules - -# As of scikit-image 0.21.0, we need to collect the __init__.pyi file for `lazy_loader`, as well as collect submodules -# due to lazy loading. -if is_module_satisfies("scikit-image >= 0.21.0"): - datas = collect_data_files("skimage.draw", includes=["*.pyi"]) - hiddenimports = collect_submodules('skimage.draw', filter=lambda name: name != 'skimage.draw.tests') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.exposure.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.exposure.py deleted file mode 100644 index e737efb..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.exposure.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies, collect_data_files, collect_submodules - -# As of scikit-image 0.21.0, we need to collect the __init__.pyi file for `lazy_loader`, as well as collect submodules -# due to lazy loading. -if is_module_satisfies("scikit-image >= 0.21.0"): - datas = collect_data_files("skimage.exposure", includes=["*.pyi"]) - hiddenimports = collect_submodules('skimage.exposure', filter=lambda name: name != 'skimage.exposure.tests') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.feature.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.feature.py deleted file mode 100644 index 29d376d..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.feature.py +++ /dev/null @@ -1,26 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies, collect_data_files, collect_submodules - -# The following missing module prevents import of skimage.feature with skimage 0.17.x. -hiddenimports = ['skimage.feature._orb_descriptor_positions', ] - -# Collect the data file with ORB descriptor positions. In earlier versions of scikit-image, this file was in -# `skimage/data` directory, and it was moved to `skimage/feature` in v0.17.0. Collect if from wherever it is. -datas = collect_data_files('skimage', includes=['**/orb_descriptor_positions.txt']) - -# As of scikit-image 0.22.0, we need to collect the __init__.pyi file for `lazy_loader`, as well as collect submodules -# due to lazy loading. -if is_module_satisfies("scikit-image >= 0.22.0"): - datas += collect_data_files("skimage.feature", includes=["*.pyi"]) - hiddenimports = collect_submodules('skimage.feature', filter=lambda name: name != 'skimage.feature.tests') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.filters.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.filters.py deleted file mode 100644 index e88726c..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.filters.py +++ /dev/null @@ -1,24 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies, collect_data_files, collect_submodules - -if is_module_satisfies("scikit-image >= 0.19.0"): - # In scikit-image 0.19.x, `skimage.filters` switched to lazy module loading, so we need to collect all submodules. - hiddenimports = collect_submodules('skimage.filters', filter=lambda name: name != 'skimage.filters.tests') - - # In scikit-image 0.20.0, `lazy_loader` is used, so we need to collect `__init__.pyi` file. - if is_module_satisfies("scikit-image >= 0.20.0"): - datas = collect_data_files("skimage.filters", includes=["*.pyi"]) -elif is_module_satisfies("scikit-image >= 0.18.0"): - # The following missing module prevents import of skimage.feature with skimage 0.18.x. - hiddenimports = ['skimage.filters.rank.core_cy_3d', ] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.future.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.future.py deleted file mode 100644 index 41905d4..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.future.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies, collect_data_files, collect_submodules - -# As of scikit-image 0.21.0, we need to collect the __init__.pyi file for `lazy_loader`, as well as collect submodules -# due to lazy loading. -if is_module_satisfies("scikit-image >= 0.21.0"): - datas = collect_data_files("skimage.future", includes=["*.pyi"]) - hiddenimports = collect_submodules('skimage.future', filter=lambda name: name != 'skimage.future.tests') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.graph.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.graph.py deleted file mode 100644 index 2caffd4..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.graph.py +++ /dev/null @@ -1,22 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies, collect_data_files, collect_submodules - -# The following missing module prevents import of skimage.graph with skimage 0.17.x. -hiddenimports = ['skimage.graph.heap', ] - -# As of scikit-image 0.22.0, we need to collect the __init__.pyi file for `lazy_loader`, as well as collect submodules -# due to lazy loading. -if is_module_satisfies("scikit-image >= 0.22.0"): - datas = collect_data_files("skimage.graph", includes=["*.pyi"]) - hiddenimports = collect_submodules('skimage.graph', filter=lambda name: name != 'skimage.graph.tests') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.io.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.io.py deleted file mode 100644 index 45d6663..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.io.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# This hook was tested with scikit-image (skimage) 0.14.1: -# https://scikit-image.org - -from PyInstaller.utils.hooks import collect_data_files, collect_submodules - -datas = collect_data_files("skimage.io._plugins") -hiddenimports = collect_submodules('skimage.io._plugins') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.measure.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.measure.py deleted file mode 100644 index 1cdaa2c..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.measure.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies, collect_data_files, collect_submodules - -# As of scikit-image 0.22.0, we need to collect the __init__.pyi file for `lazy_loader`, as well as collect submodules -# due to lazy loading. -if is_module_satisfies("scikit-image >= 0.22.0"): - datas = collect_data_files("skimage.measure", includes=["*.pyi"]) - hiddenimports = collect_submodules('skimage.measure', filter=lambda name: name != 'skimage.measure.tests') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.metrics.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.metrics.py deleted file mode 100644 index 7d575f5..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.metrics.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies, collect_data_files, collect_submodules - -# As of scikit-image 0.23.0, we need to collect the __init__.pyi file for `lazy_loader`, as well as collect submodules -# due to lazy loading. -if is_module_satisfies("scikit-image >= 0.23.0"): - datas = collect_data_files("skimage.metrics", includes=["*.pyi"]) - hiddenimports = collect_submodules('skimage.metrics', filter=lambda name: name != 'skimage.metrics.tests') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.morphology.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.morphology.py deleted file mode 100644 index dc5c6c2..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.morphology.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files, is_module_satisfies - -# As of scikit-image 0.20.0, we need to collect .npy data files for `skimage.morphology` -if is_module_satisfies('scikit-image >= 0.20'): - datas = collect_data_files("skimage.morphology", includes=["*.npy"]) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.py deleted file mode 100644 index 03e3ec0..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files, is_module_satisfies - -# As of scikit-image 0.20.0, we need to collect the __init__.pyi file for `lazy_loader`. -if is_module_satisfies('scikit-image >= 0.20.0'): - datas = collect_data_files("skimage", includes=["*.pyi"]) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.registration.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.registration.py deleted file mode 100644 index 0ffeee8..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.registration.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies, collect_data_files, collect_submodules - -# As of scikit-image 0.22.0, we need to collect the __init__.pyi file for `lazy_loader`, as well as collect submodules -# due to lazy loading. -if is_module_satisfies("scikit-image >= 0.22.0"): - datas = collect_data_files("skimage.registration", includes=["*.pyi"]) - hiddenimports = collect_submodules('skimage.registration', filter=lambda name: name != 'skimage.registration.tests') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.restoration.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.restoration.py deleted file mode 100644 index a048738..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.restoration.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies, collect_data_files, collect_submodules - -# As of scikit-image 0.22.0, we need to collect the __init__.pyi file for `lazy_loader`, as well as collect submodules -# due to lazy loading. -if is_module_satisfies("scikit-image >= 0.22.0"): - datas = collect_data_files("skimage.restoration", includes=["*.pyi"]) - hiddenimports = collect_submodules('skimage.restoration', filter=lambda name: name != 'skimage.restoration.tests') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.segmentation.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.segmentation.py deleted file mode 100644 index 48a3821..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.segmentation.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies, collect_data_files, collect_submodules - -# As of scikit-image 0.26.0, we need to collect the __init__.pyi file for `lazy_loader`, as well as collect submodules -# due to lazy loading. -if is_module_satisfies("scikit-image >= 0.26.0"): - datas = collect_data_files("skimage.segmentation", includes=["*.pyi"]) - hiddenimports = collect_submodules('skimage.segmentation', filter=lambda name: name != 'skimage.segmentation.tests') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.transform.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.transform.py deleted file mode 100644 index 3841a4e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.transform.py +++ /dev/null @@ -1,24 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -from PyInstaller.utils.hooks import is_module_satisfies, collect_data_files, collect_submodules - -# Hook tested with scikit-image (skimage) 0.9.3 on Mac OS 10.9 and Windows 7 64-bit -hiddenimports = ['skimage.draw.draw', - 'skimage._shared.geometry', - 'skimage._shared.transform', - 'skimage.filters.rank.core_cy'] - -# As of scikit-image 0.22.0, we need to collect the __init__.pyi file for `lazy_loader`, as well as collect submodules -# due to lazy loading. -if is_module_satisfies("scikit-image >= 0.22.0"): - datas = collect_data_files("skimage.transform", includes=["*.pyi"]) - hiddenimports += collect_submodules('skimage.transform', filter=lambda name: name != 'skimage.transform.tests') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.cluster.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.cluster.py deleted file mode 100644 index a855309..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.cluster.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies - -# sklearn.cluster in scikit-learn 0.23.x has a hidden import of -# threadpoolctl -if is_module_satisfies("scikit_learn >= 0.23"): - hiddenimports = ['threadpoolctl', ] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.externals.array_api_compat.cupy.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.externals.array_api_compat.cupy.py deleted file mode 100644 index 4c2275a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.externals.array_api_compat.cupy.py +++ /dev/null @@ -1,21 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# These hidden imports are required due to the following statements found in the package's `__init__.py`: -# ``` -# __import__(__package__ + '.linalg') -# __import__(__package__ + '.fft') -# ``` -hiddenimports = [ - 'sklearn.externals.array_api_compat.cupy.fft', - 'sklearn.externals.array_api_compat.cupy.linalg', -] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.externals.array_api_compat.dask.array.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.externals.array_api_compat.dask.array.py deleted file mode 100644 index 7779374..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.externals.array_api_compat.dask.array.py +++ /dev/null @@ -1,21 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# These hidden imports are required due to the following statements found in the package's `__init__.py`: -# ``` -# __import__(__package__ + '.linalg') -# __import__(__package__ + '.fft') -# ``` -hiddenimports = [ - 'sklearn.externals.array_api_compat.dask.array.fft', - 'sklearn.externals.array_api_compat.dask.array.linalg', -] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.externals.array_api_compat.numpy.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.externals.array_api_compat.numpy.py deleted file mode 100644 index 042a73a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.externals.array_api_compat.numpy.py +++ /dev/null @@ -1,21 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# These hidden imports are required due to the following statements found in the package's `__init__.py`: -# ``` -# __import__(__package__ + '.linalg') -# __import__(__package__ + '.fft') -# ``` -hiddenimports = [ - 'sklearn.externals.array_api_compat.numpy.fft', - 'sklearn.externals.array_api_compat.numpy.linalg', -] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.externals.array_api_compat.torch.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.externals.array_api_compat.torch.py deleted file mode 100644 index 207bb3d..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.externals.array_api_compat.torch.py +++ /dev/null @@ -1,21 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# These hidden imports are required due to the following statements found in the package's `__init__.py`: -# ``` -# __import__(__package__ + '.linalg') -# __import__(__package__ + '.fft') -# ``` -hiddenimports = [ - 'sklearn.externals.array_api_compat.torch.fft', - 'sklearn.externals.array_api_compat.torch.linalg', -] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.linear_model.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.linear_model.py deleted file mode 100644 index ce5a884..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.linear_model.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies - -# sklearn.linear_model in scikit-learn 0.24.x has a hidden import of -# sklearn.utils._weight_vector -if is_module_satisfies("scikit_learn >= 0.24"): - hiddenimports = ['sklearn.utils._weight_vector', ] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.metrics.cluster.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.metrics.cluster.py deleted file mode 100644 index 3cbeb64..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.metrics.cluster.py +++ /dev/null @@ -1,27 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Required by scikit-learn 0.21 -from PyInstaller.utils.hooks import is_module_satisfies - -if is_module_satisfies("scikit-learn < 0.22"): - hiddenimports = [ - 'sklearn.utils.lgamma', - 'sklearn.utils.weight_vector' - ] -else: - # lgamma was removed and weight_vector privatised in 0.22. - # https://github.com/scikit-learn/scikit-learn/commit/58be9a671b0b8fcb4b75f4ae99f4469ca33a2158#diff-dbca16040fd2b85a499ba59833b37f1785c58e52d2e89ce5cdfc7fff164bd5f3 - # https://github.com/scikit-learn/scikit-learn/commit/150e82b52bf28c88c5a8b1a10f9777d0452b3ef2 - hiddenimports = [ - 'sklearn.utils._weight_vector' - ] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.metrics.pairwise.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.metrics.pairwise.py deleted file mode 100644 index 188c1af..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.metrics.pairwise.py +++ /dev/null @@ -1,21 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Required by scikit-learn 1.1.0 -from PyInstaller.utils.hooks import is_module_satisfies - -if is_module_satisfies("scikit-learn >= 1.1.0"): - hiddenimports = [ - 'sklearn.utils._heap', - 'sklearn.utils._sorting', - 'sklearn.utils._vector_sentinel', - ] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.metrics.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.metrics.py deleted file mode 100644 index 8bdea5f..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.metrics.py +++ /dev/null @@ -1,25 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies, collect_submodules - -hiddenimports = [] - -# Required by scikit-learn 1.0.0 -if is_module_satisfies("scikit-learn >= 1.0.0"): - hiddenimports += [ - 'sklearn.utils._typedefs', - ] - -# Required by scikit-learn 1.2.0 -if is_module_satisfies("scikit-learn >= 1.2.0"): - hiddenimports += collect_submodules("sklearn.metrics._pairwise_distances_reduction") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.neighbors.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.neighbors.py deleted file mode 100644 index 937fe75..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.neighbors.py +++ /dev/null @@ -1,41 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies - -hiddenimports = [] - -if is_module_satisfies("scikit_learn > 1.0.1"): - # 1.0.2 and later - hiddenimports += [ - 'sklearn.neighbors._quad_tree', - ] -elif is_module_satisfies("scikit_learn < 0.22 "): - # 0.21 and below - hiddenimports += [ - 'sklearn.neighbors.typedefs', - 'sklearn.neighbors.quad_tree', - ] -else: - # between and including 0.22 and 1.0.1 - hiddenimports += [ - 'sklearn.neighbors._typedefs', - 'sklearn.neighbors._quad_tree', - ] - -# The following hidden import must be added here -# (as opposed to sklearn.tree) -hiddenimports += ['sklearn.tree._criterion'] - -# Additional hidden imports introduced in v1.0.0 -if is_module_satisfies("scikit_learn >= 1.0.0"): - hiddenimports += ["sklearn.neighbors._partition_nodes"] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.py deleted file mode 100644 index 25724f3..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Tested on Windows 10 64bit with python 3.7.1 - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('sklearn') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.tree.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.tree.py deleted file mode 100644 index 7a222e2..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.tree.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies - -hiddenimports = ['sklearn.tree._utils'] - -if is_module_satisfies('scikit-learn >= 1.6.0'): - hiddenimports += ['sklearn.tree._partitioner'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.utils.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.utils.py deleted file mode 100644 index 10f44d7..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.utils.py +++ /dev/null @@ -1,20 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies - -hiddenimports = ['sklearn.utils._cython_blas'] - -# As of scikit-learn 1.7.1, the `sklearn.utils._isfinite` extension started to depend on newly-introduced -# `sklearn._cyutility`. -if is_module_satisfies('scikit-learn >= 1.7.1'): - hiddenimports += ['sklearn._cyutility'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skyfield.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skyfield.py deleted file mode 100644 index 8394b34..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skyfield.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files -datas = collect_data_files('skyfield') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-slixmpp.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-slixmpp.py deleted file mode 100644 index 93bd8a1..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-slixmpp.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules("slixmpp.features") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sound_lib.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sound_lib.py deleted file mode 100644 index ed290ea..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sound_lib.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -sound_lib: http://hg.q-continuum.net/sound_lib -""" - -from PyInstaller.utils.hooks import collect_dynamic_libs - -binaries = collect_dynamic_libs('sound_lib') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sounddevice.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sounddevice.py deleted file mode 100644 index 6316b03..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sounddevice.py +++ /dev/null @@ -1,62 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -sounddevice: -https://github.com/spatialaudio/python-sounddevice/ -""" - -import pathlib - -from PyInstaller.utils.hooks import get_module_file_attribute, logger - -binaries = [] -datas = [] - -# PyPI wheels for Windows and macOS ship the sndfile shared library in _sounddevice_data directory, -# located next to the sounddevice.py module file (i.e., in the site-packages directory). -module_dir = pathlib.Path(get_module_file_attribute('sounddevice')).parent -data_dir = module_dir / '_sounddevice_data' / 'portaudio-binaries' -if data_dir.is_dir(): - destdir = str(data_dir.relative_to(module_dir)) - - # Collect the shared library (known variants: libportaudio64bit.dll, libportaudio32bit.dll, libportaudio.dylib) - for lib_file in data_dir.glob("libportaudio*.*"): - binaries += [(str(lib_file), destdir)] - - # Collect the README.md file - readme_file = data_dir / "README.md" - if readme_file.is_file(): - datas += [(str(readme_file), destdir)] -else: - # On linux and in Anaconda in all OSes, the system-installed portaudio library needs to be collected. - def _find_system_portaudio_library(): - import os - import ctypes.util - from PyInstaller.depend.utils import _resolveCtypesImports - - libname = ctypes.util.find_library("portaudio") - if libname is not None: - resolved_binary = _resolveCtypesImports([os.path.basename(libname)]) - if resolved_binary: - return resolved_binary[0][1] - - try: - lib_file = _find_system_portaudio_library() - except Exception as e: - logger.warning("Error while trying to find system-installed portaudio library: %s", e) - lib_file = None - - if lib_file: - binaries += [(lib_file, '.')] - -if not binaries: - logger.warning("portaudio shared library not found - sounddevice will likely fail to work!") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-soundfile.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-soundfile.py deleted file mode 100644 index f788c38..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-soundfile.py +++ /dev/null @@ -1,62 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -pysoundfile: -https://github.com/bastibe/SoundFile -""" - -import pathlib - -from PyInstaller.utils.hooks import get_module_file_attribute, logger - -binaries = [] -datas = [] - -# PyPI wheels for Windows and macOS ship the sndfile shared library in _soundfile_data directory, -# located next to the soundfile.py module file (i.e., in the site-packages directory). -module_dir = pathlib.Path(get_module_file_attribute('soundfile')).parent -data_dir = module_dir / '_soundfile_data' -if data_dir.is_dir(): - destdir = str(data_dir.relative_to(module_dir)) - - # Collect the shared library (known variants: libsndfile64bit.dll, libsndfile32bit.dll, libsndfile.dylib) - for lib_file in data_dir.glob("libsndfile*.*"): - binaries += [(str(lib_file), destdir)] - - # Collect the COPYING file - copying_file = data_dir / "COPYING" - if copying_file.is_file(): - datas += [(str(copying_file), destdir)] -else: - # On linux and in Anaconda in all OSes, the system-installed sndfile library needs to be collected. - def _find_system_sndfile_library(): - import os - import ctypes.util - from PyInstaller.depend.utils import _resolveCtypesImports - - libname = ctypes.util.find_library("sndfile") - if libname is not None: - resolved_binary = _resolveCtypesImports([os.path.basename(libname)]) - if resolved_binary: - return resolved_binary[0][1] - - try: - lib_file = _find_system_sndfile_library() - except Exception as e: - logger.warning("Error while trying to find system-installed sndfile library: %s", e) - lib_file = None - - if lib_file: - binaries += [(lib_file, '.')] - -if not binaries: - logger.warning("sndfile shared library not found - soundfile will likely fail to work!") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-spacy.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-spacy.py deleted file mode 100644 index 25ee44e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-spacy.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Spacy contains hidden imports and data files which are needed to import it -""" - -from PyInstaller.utils.hooks import collect_data_files, collect_submodules - -datas = collect_data_files("spacy") -hiddenimports = collect_submodules("spacy") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-speech_recognition.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-speech_recognition.py deleted file mode 100644 index fb7d179..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-speech_recognition.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for speech_recognition: https://pypi.python.org/pypi/SpeechRecognition/ -# Tested on Windows 8.1 x64 with SpeechRecognition 1.5 - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("speech_recognition") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-spiceypy.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-spiceypy.py deleted file mode 100644 index 3444d93..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-spiceypy.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for spiceypy: https://pypi.org/project/spiceypy/ -# Tested on Ubuntu 20.04 with spiceypy 5.1.1 - -from PyInstaller.utils.hooks import collect_dynamic_libs - -binaries = collect_dynamic_libs("spiceypy") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-spnego.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-spnego.py deleted file mode 100644 index b038573..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-spnego.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules('spnego') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-srsly.msgpack._packer.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-srsly.msgpack._packer.py deleted file mode 100644 index 519cd0b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-srsly.msgpack._packer.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -srsly.msgpack._packer contains hidden imports which are needed to import it -This hook was created to make spacy work correctly. -""" - -hiddenimports = ['srsly.msgpack.util'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sspilib.raw.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sspilib.raw.py deleted file mode 100644 index 7fbd239..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sspilib.raw.py +++ /dev/null @@ -1,20 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules - -# This seems to be required in python <= 3.9; in later versions, the `dataclasses` module ends up included via a -# different import chain. But for the sake of consistency, keep the hiddenimport for all python versions. -hiddenimports = ['dataclasses'] - -# Collect submodules of `sspilib.raw` - most of which are cythonized extensions. -hiddenimports += collect_submodules('sspilib.raw') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-statsmodels.tsa.statespace.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-statsmodels.tsa.statespace.py deleted file mode 100644 index 547d706..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-statsmodels.tsa.statespace.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules('statsmodels.tsa.statespace._filters') \ - + collect_submodules('statsmodels.tsa.statespace._smoothers') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-stdnum.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-stdnum.py deleted file mode 100644 index 068e960..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-stdnum.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2022 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Collect data files that are required by some of the stdnum's sub-modules -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("stdnum") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-storm.database.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-storm.database.py deleted file mode 100644 index 1cde580..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-storm.database.py +++ /dev/null @@ -1,20 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Hook for storm ORM. -""" - -hiddenimports = [ - 'storm.databases.sqlite', - 'storm.databases.postgres', - 'storm.databases.mysql' -] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sudachipy.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sudachipy.py deleted file mode 100644 index 1abb48e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sudachipy.py +++ /dev/null @@ -1,30 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import can_import_module, collect_data_files, is_module_satisfies - -datas = collect_data_files('sudachipy') -hiddenimports = [] - -# In v0.6.8, `sudachipy.config` and `sudachipy.errors` modules were added, and are referenced from binary extension. -if is_module_satisfies('sudachipy >= 0.6.8'): - hiddenimports += [ - 'sudachipy.config', - 'sudachipy.errors', - ] - -# Check which types of dictionary are installed -for sudachi_dict in ['sudachidict_small', 'sudachidict_core', 'sudachidict_full']: - if can_import_module(sudachi_dict): - datas += collect_data_files(sudachi_dict) - - hiddenimports += [sudachi_dict] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sunpy.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sunpy.py deleted file mode 100644 index 4a069e4..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sunpy.py +++ /dev/null @@ -1,20 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files, collect_submodules, copy_metadata - -hiddenimports = collect_submodules("sunpy", filter=lambda x: "tests" not in x.split(".")) -datas = collect_data_files("sunpy", excludes=['**/tests/', '**/test/']) -datas += collect_data_files("drms") -datas += copy_metadata("sunpy") - -# Note : sunpy > 3.1.0 comes with it's own hook for running tests. diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sv_ttk.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sv_ttk.py deleted file mode 100644 index 0f37e32..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sv_ttk.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -# Collect all files in the sv_ttk package -datas = collect_data_files(package="sv_ttk") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-swagger_spec_validator.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-swagger_spec_validator.py deleted file mode 100644 index bb4b4d1..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-swagger_spec_validator.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("swagger_spec_validator") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tableauhyperapi.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tableauhyperapi.py deleted file mode 100644 index 210daef..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tableauhyperapi.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_dynamic_libs - -binaries = collect_dynamic_libs("tableauhyperapi") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tables.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tables.py deleted file mode 100644 index 440c6a1..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tables.py +++ /dev/null @@ -1,30 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.compat import is_win -from PyInstaller.utils.hooks import collect_dynamic_libs, is_module_satisfies - -# PyTables is a package for managing hierarchical datasets -hiddenimports = ["tables._comp_lzo", "tables._comp_bzip2"] - -# Collect the bundled copy of blosc2 shared library. -binaries = collect_dynamic_libs('tables') -datas = [] - -# tables 3.7.0 started using `delvewheel` for its Windows PyPI wheels. While contemporary PyInstaller versions -# automatically pick up DLLs from external `pyproj.libs` directory, this does not work on Anaconda python 3.8 and 3.9 -# due to defunct `os.add_dll_directory`, which forces `delvewheel` to use the old load-order file approach. So we need -# to explicitly ensure that load-order file as well as DLLs are collected. -if is_win and is_module_satisfies("tables >= 3.7.0"): - if is_module_satisfies("PyInstaller >= 5.6"): - from PyInstaller.utils.hooks import collect_delvewheel_libs_directory - datas, binaries = collect_delvewheel_libs_directory("tables", datas=datas, binaries=binaries) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tcod.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tcod.py deleted file mode 100644 index d5b076e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tcod.py +++ /dev/null @@ -1,20 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Hook for https://github.com/libtcod/python-tcod -""" -from PyInstaller.utils.hooks import collect_dynamic_libs - -hiddenimports = ['_cffi_backend'] - -# Install shared libraries to the working directory. -binaries = collect_dynamic_libs('tcod', destdir='.') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tensorflow.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tensorflow.py deleted file mode 100644 index 6a7a50a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tensorflow.py +++ /dev/null @@ -1,188 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.compat import importlib_metadata -from packaging.version import Version - -from PyInstaller.compat import is_linux -from PyInstaller.utils.hooks import ( - collect_data_files, - collect_dynamic_libs, - collect_submodules, - get_module_attribute, - is_module_satisfies, - logger, -) - -# Determine the name of `tensorflow` dist; this is available under different names (releases vs. nightly, plus build -# variants). We need to determine the dist that we are dealing with, so we can query its version and metadata. -_CANDIDATE_DIST_NAMES = ( - "tensorflow", - "tensorflow-cpu", - "tensorflow-gpu", - "tensorflow-intel", - "tensorflow-rocm", - "tensorflow-macos", - "tensorflow-aarch64", - "tensorflow-cpu-aws", - "tf-nightly", - "tf-nightly-cpu", - "tf-nightly-gpu", - "tf-nightly-rocm", - "intel-tensorflow", - "intel-tensorflow-avx512", -) -dist = None -for candidate_dist_name in _CANDIDATE_DIST_NAMES: - try: - dist = importlib_metadata.distribution(candidate_dist_name) - break - except importlib_metadata.PackageNotFoundError: - continue - -version = None -if dist is None: - logger.warning( - "hook-tensorflow: failed to determine tensorflow dist name! Reading version from tensorflow.__version__!" - ) - try: - version = get_module_attribute("tensorflow", "__version__") - except Exception as e: - raise Exception("Failed to read tensorflow.__version__") from e -else: - logger.info("hook-tensorflow: tensorflow dist name: %s", dist.name) - version = dist.version - -# Parse version -logger.info("hook-tensorflow: tensorflow version: %s", version) -try: - version = Version(version) -except Exception as e: - raise Exception("Failed to parse tensorflow version!") from e - -# Exclude from data collection: -# - development headers in include subdirectory -# - XLA AOT runtime sources -# - libtensorflow_framework and libtensorflow_cc (since TF 2.12) shared libraries (to avoid duplication) -# - import library (.lib) files (Windows-only) -data_excludes = [ - "include", - "xla_aot_runtime_src", - "libtensorflow_framework.*", - "libtensorflow_cc.*", - "**/*.lib", -] - -# Under tensorflow 2.3.0 (the most recent version at the time of writing), _pywrap_tensorflow_internal extension module -# ends up duplicated; once as an extension, and once as a shared library. In addition to increasing program size, this -# also causes problems on macOS, so we try to prevent the extension module "variant" from being picked up. -# -# See pyinstaller/pyinstaller-hooks-contrib#49 for details. -# -# With PyInstaller >= 6.0, this issue is alleviated, because the binary dependency analysis (which picks up the -# extension in question as a shared library that other extensions are linked against) now preserves the parent directory -# layout, and creates a symbolic link to the top-level application directory. -if is_module_satisfies('PyInstaller >= 6.0'): - excluded_submodules = [] -else: - excluded_submodules = ['tensorflow.python._pywrap_tensorflow_internal'] - - -def _submodules_filter(x): - return x not in excluded_submodules - - -if version < Version("1.15.0a0"): - # 1.14.x and earlier: collect everything from tensorflow - hiddenimports = collect_submodules('tensorflow', filter=_submodules_filter) - datas = collect_data_files('tensorflow', excludes=data_excludes) -elif version >= Version("1.15.0a0") and version < Version("2.2.0a0"): - # 1.15.x - 2.1.x: collect everything from tensorflow_core - hiddenimports = collect_submodules('tensorflow_core', filter=_submodules_filter) - datas = collect_data_files('tensorflow_core', excludes=data_excludes) - - # Under 1.15.x, we seem to fail collecting a specific submodule, and need to add it manually... - if version < Version("2.0.0a0"): - hiddenimports += ['tensorflow_core._api.v1.compat.v2.summary.experimental'] -else: - # 2.2.0 and newer: collect everything from tensorflow again - hiddenimports = collect_submodules('tensorflow', filter=_submodules_filter) - datas = collect_data_files('tensorflow', excludes=data_excludes) - - # From 2.6.0 on, we also need to explicitly collect keras (due to lazy mapping of tensorflow.keras.xyz -> keras.xyz) - if version >= Version("2.6.0a0"): - hiddenimports += collect_submodules('keras') - - # Starting with 2.14.0, we need `ml_dtypes` among hidden imports. - if version >= Version("2.14.0"): - hiddenimports += ['ml_dtypes'] - -binaries = [] -excludedimports = excluded_submodules - -# Suppress warnings for missing hidden imports generated by this hook. -# Requires PyInstaller > 5.1 (with pyinstaller/pyinstaller#6914 merged); no-op otherwise. -warn_on_missing_hiddenimports = False - -# Collect the AutoGraph part of `tensorflow` code, to avoid a run-time warning about AutoGraph being unavailable: -# `WARNING:tensorflow:AutoGraph is not available in this environment: functions lack code information. ...` -# The warning is emitted if source for `log` function from `tensorflow.python.autograph.utils.ag_logging` cannot be -# looked up. Not sure if we need sources for other parts of `tesnorflow`, though. -# Requires PyInstaller >= 5.3, no-op in older versions. -module_collection_mode = { - 'tensorflow.python.autograph': 'py+pyz', -} - -# Linux builds of tensorflow can optionally use CUDA from nvidia-* packages. If we managed to obtain dist, query the -# requirements from metadata (the `and-cuda` extra marker), and convert them to module names. -# -# NOTE: while the installation of nvidia-* packages via `and-cuda` extra marker is not gated by the OS version check, -# it is effectively available only on Linux (last Windows-native build that supported GPU is v2.10.0, and assumed that -# CUDA is externally available). -if is_linux and dist is not None: - def _infer_nvidia_hiddenimports(): - import packaging.requirements - from _pyinstaller_hooks_contrib.utils import nvidia_cuda as cudautils - - requirements = [packaging.requirements.Requirement(req) for req in dist.requires or []] - env = {'extra': 'and-cuda'} - requirements = [req.name for req in requirements if req.marker is None or req.marker.evaluate(env)] - - return cudautils.infer_hiddenimports_from_requirements(requirements) - - try: - nvidia_hiddenimports = _infer_nvidia_hiddenimports() - except Exception: - # Log the exception, but make it non-fatal - logger.warning("hook-tensorflow: failed to infer NVIDIA CUDA hidden imports!", exc_info=True) - nvidia_hiddenimports = [] - logger.info("hook-tensorflow: inferred hidden imports for CUDA libraries: %r", nvidia_hiddenimports) - hiddenimports += nvidia_hiddenimports - - -# Collect the tensorflow-plugins (pluggable device plugins) -hiddenimports += ['tensorflow-plugins'] -binaries += collect_dynamic_libs('tensorflow-plugins') - -# On Linux, prevent binary dependency analysis from generating symbolic links for libtensorflow_cc.so.2, -# libtensorflow_framework.so.2, and _pywrap_tensorflow_internal.so to the top-level application directory. These -# symbolic links seem to confuse tensorflow about its location (likely because code in one of the libraries looks up the -# library file's location, but does not fully resolve it), which in turn prevents it from finding the collected CUDA -# libraries in the nvidia/cu* package directories. -# -# The `bindepend_symlink_suppression` hook attribute requires PyInstaller >= 6.11, and is no-op in earlier versions. -if is_linux: - bindepend_symlink_suppression = [ - '**/libtensorflow_cc.so*', - '**/libtensorflow_framework.so*', - '**/_pywrap_tensorflow_internal.so', - ] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-text_unidecode.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-text_unidecode.py deleted file mode 100644 index 68902ca..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-text_unidecode.py +++ /dev/null @@ -1,25 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -# ----------------------------------------------------------------------------- -""" -text-unidecode: -https://github.com/kmike/text-unidecode/ -""" - -import os -from PyInstaller.utils.hooks import get_package_paths - -package_path = get_package_paths("text_unidecode") -data_bin_path = os.path.join(package_path[1], "data.bin") - -if os.path.exists(data_bin_path): - datas = [(data_bin_path, 'text_unidecode')] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-textdistance.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-textdistance.py deleted file mode 100644 index 4859014..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-textdistance.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for textdistance: https://pypi.org/project/textdistance/4.1.3/ - -from PyInstaller.utils.hooks import collect_all - -datas, binaries, hiddenimports = collect_all('textdistance') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-thinc.backends.numpy_ops.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-thinc.backends.numpy_ops.py deleted file mode 100644 index fcb3e88..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-thinc.backends.numpy_ops.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -thinc.banckends.numpy_ops contains hidden imports which are needed to import it -This hook was created to make spacy work correctly. -""" - -hiddenimports = ['cymem.cymem', 'preshed.maps', 'blis.py'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-thinc.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-thinc.py deleted file mode 100644 index 7623253..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-thinc.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Thinc contains data files and hidden imports. This hook was created to make spacy work correctly. -""" -from PyInstaller.utils.hooks import collect_data_files, collect_submodules - -datas = collect_data_files("thinc") -hiddenimports = collect_submodules("thinc") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-timezonefinder.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-timezonefinder.py deleted file mode 100644 index e5cd309..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-timezonefinder.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('timezonefinder') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-timm.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-timm.py deleted file mode 100644 index 1ff1a61..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-timm.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Collect source .py files for JIT/torchscript. Requires PyInstaller >= 5.3, no-op in older versions. -module_collection_mode = 'pyz+py' diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tinycss2.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tinycss2.py deleted file mode 100644 index d06ab79..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tinycss2.py +++ /dev/null @@ -1,21 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Hook for tinycss2. tinycss2 is a low-level CSS parser and generator. -https://github.com/Kozea/tinycss2 -""" -from PyInstaller.utils.hooks import collect_data_files - - -# Hook no longer required for tinycss2 >= 1.0.0 -def hook(hook_api): - hook_api.add_datas(collect_data_files(hook_api.__name__)) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tkinterdnd2.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tkinterdnd2.py deleted file mode 100644 index 4b07d33..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tkinterdnd2.py +++ /dev/null @@ -1,90 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -import os -import pathlib -import platform - -from PyInstaller.utils.hooks import get_package_paths, logger - - -# tkinterdnd2 contains a tkdnd sub-directory which contains platform-specific directories with shared library and .tcl -# files. Collect only the relevant directory, by matching the decision logic from: -# https://github.com/Eliav2/tkinterdnd2/blob/9a55907e430234bf8ab72ea614f84af9cc89598c/tkinterdnd2/TkinterDnD.py#L33-L51 -def _collect_platform_subdir(system, machine): - datas = [] - binaries = [] - - # Under Windows, `platform.machine()` returns the identifier of the *host* architecture, which does not necessarily - # match the architecture of the running process (for example, when running x86 process under x64 Windows, or when - # running either x86 or x64 process under arm64 Windows). The architecture of the running process can be obtained - # from the `PROCESSOR_ARCHITECTURE` environment variable, which is automatically set by Windows / WOW64 subsystem. - # - # NOTE: at the time of writing (tkinterdnd2 v0.4.2), tkinterdnd2 does not account for this, and attempts to load - # the shared library from incorrect directory; as this fails due to architecture mismatch, there is no point in - # us trying to collect that (incorrect) directory. - if system == "Windows": - machine = os.environ.get("PROCESSOR_ARCHITECTURE", machine) - - # Resolve the platform-specific sub-directory name and shared library suffix. - DIR_NAMES = { - "Darwin": { - "arm64": "osx-arm64", - "x86_64": "osx-x64", - }, - "Linux": { - "aarch64": "linux-arm64", - "x86_64": "linux-x64", - }, - "Windows": { - "ARM64": "win-arm64", - "AMD64": "win-x64", - "x86": "win-x86", - } - } - dir_name = DIR_NAMES.get(system, {}).get(machine, None) - - LIB_SUFFICES = { - "Darwin": "*.dylib", - "Linux": "*.so", - "Windows": "*.dll", - } - lib_suffix = LIB_SUFFICES.get(system, None) - - if dir_name is None or lib_suffix is None: - logger.warning( - "hook-tkinterdnd2: unsupported platform (%s, %s)! Platform-specific directory will not be collected!", - system, machine - ) - return datas, binaries - - pkg_base, pkg_dir = get_package_paths("tkinterdnd2") - - dest_dir = os.path.join("tkinterdnd2", "tkdnd", dir_name) - src_path = pathlib.Path(pkg_dir) / "tkdnd" / dir_name - - if not src_path.is_dir(): - logger.warning("hook-tkinterdnd2: platform-specific sub-directory %r does not exist!", str(src_path)) - return datas, binaries - - # Collect the shared library. - for entry in src_path.glob(lib_suffix): - binaries.append((str(entry), dest_dir)) - - # Collect the .tcl files. - for entry in src_path.glob("*.tcl"): - datas.append((str(entry), dest_dir)) - - return datas, binaries - - -datas, binaries = _collect_platform_subdir(platform.system(), platform.machine()) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tkinterweb.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tkinterweb.py deleted file mode 100644 index bb02c6c..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tkinterweb.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -# Collect files from 'resources' -datas = collect_data_files('tkinterweb') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tkinterweb_tkhtml.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tkinterweb_tkhtml.py deleted file mode 100644 index 33c6374..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tkinterweb_tkhtml.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files, collect_dynamic_libs - -# Collect files from 'tkhtml' -datas = collect_data_files('tkinterweb_tkhtml') - -# Collect binaries from 'tkhtml' -binaries = collect_dynamic_libs('tkinterweb_tkhtml') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tkinterweb_tkhtml_extras.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tkinterweb_tkhtml_extras.py deleted file mode 100644 index 6ec0db4..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tkinterweb_tkhtml_extras.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files, collect_dynamic_libs - -# Collect files from 'tkhtml' -datas = collect_data_files('tkinterweb_tkhtml_extras') - -# Collect binaries from 'tkhtml' -binaries = collect_dynamic_libs('tkinterweb_tkhtml_extras') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-toga.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-toga.py deleted file mode 100644 index be80488..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-toga.py +++ /dev/null @@ -1,44 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller import compat -from PyInstaller.utils.hooks import collect_data_files, collect_submodules, copy_metadata, is_module_satisfies - -hiddenimports = [] - -# Select the platform-specific backend. -if compat.is_darwin: - backend = 'cocoa' -elif compat.is_linux: - backend = 'gtk' -elif compat.is_win: - backend = 'winforms' -else: - backend = None - -if backend is not None: - hiddenimports += [f'toga_{backend}', f'toga_{backend}.factory'] - -# Collect metadata for toga-core dist, which is used by toga module to determine its version. -datas = copy_metadata("toga-core") - -# Prevent `toga` from pulling `setuptools_scm` into frozen application, as it makes no sense in that context. -excludedimports = ["setuptools_scm"] - -# `toga` 0.5.0 refactored its `__init__.py` to lazy-load its core modules. Therefore, we now need to collect -# submodules via `collect_submodules`... -if is_module_satisfies("toga >= 0.5.0"): - hiddenimports += collect_submodules("toga") - -# Starting with `toga` 0.5.2, we need to collect .pyi files. -if is_module_satisfies("toga >= 0.5.2"): - datas += collect_data_files("toga") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-toga_cocoa.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-toga_cocoa.py deleted file mode 100644 index c6142f4..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-toga_cocoa.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files, copy_metadata - -# Collect icons from `resources`. -datas = collect_data_files('toga_cocoa') - -# Collect metadata so that the backend can be discovered via `toga.backends` entry-point. -datas += copy_metadata("toga-cocoa") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-toga_gtk.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-toga_gtk.py deleted file mode 100644 index 2e0353e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-toga_gtk.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files, copy_metadata - -# Collect default icon from `resources`. -datas = collect_data_files('toga_gtk') - -# Collect metadata so that the backend can be discovered via `toga.backends` entry-point. -datas += copy_metadata("toga-gtk") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-toga_winforms.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-toga_winforms.py deleted file mode 100644 index adebb9a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-toga_winforms.py +++ /dev/null @@ -1,40 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -import os - -from PyInstaller.utils.hooks import collect_data_files, copy_metadata - -# Collect default icon from `resources`, and license/readme file from `toga_winforms/libs/WebView2`. Use the same call -# to also collect bundled WebView2 DLLs from `toga_winforms/libs/WebView2`. -include_patterns = [ - 'resources/*', - 'libs/WebView2/*.md', - 'libs/WebView2/*.dll', -] - -# The package seems to bundle WebView2 runtimes for x86, x64, and arm64. We need to collect only the one for the -# running platform, which can be reliably identified by `PROCESSOR_ARCHITECTURE` environment variable, which properly -# reflects the processor architecture of running process (even if running x86 python on x64 machine, or x64 python on -# arm64 machine). -machine = os.environ["PROCESSOR_ARCHITECTURE"].lower() -if machine == 'x86': - include_patterns += ['libs/WebView2/runtimes/win-x86/*'] -elif machine == 'amd64': - include_patterns += ['libs/WebView2/runtimes/win-x64/*'] -elif machine == 'arm64': - include_patterns += ['libs/WebView2/runtimes/win-arm64/*'] - -datas = collect_data_files('toga_winforms', includes=include_patterns) - -# Collect metadata so that the backend can be discovered via `toga.backends` entry-point. -datas += copy_metadata("toga-winforms") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-torch.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-torch.py deleted file mode 100644 index 85e75cf..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-torch.py +++ /dev/null @@ -1,179 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -import os - -from PyInstaller.utils.hooks import ( - logger, - collect_data_files, - is_module_satisfies, - collect_dynamic_libs, - collect_submodules, - get_package_paths, -) - -if is_module_satisfies("PyInstaller >= 6.0"): - from PyInstaller import compat - from PyInstaller.utils.hooks import PY_DYLIB_PATTERNS - - module_collection_mode = "pyz+py" - warn_on_missing_hiddenimports = False - - datas = collect_data_files( - "torch", - excludes=[ - "**/*.h", - "**/*.hpp", - "**/*.cuh", - "**/*.lib", - "**/*.cpp", - "**/*.pyi", - "**/*.cmake", - ], - ) - hiddenimports = collect_submodules("torch") - binaries = collect_dynamic_libs( - "torch", - # Ensure we pick up fully-versioned .so files as well - search_patterns=PY_DYLIB_PATTERNS + ['*.so.*'], - ) - - # On Linux, torch wheels built with non-default CUDA version bundle CUDA libraries themselves (and should be handled - # by the above `collect_dynamic_libs`). Wheels built with default CUDA version (which are available on PyPI), on the - # other hand, use CUDA libraries provided by nvidia-* packages. Due to all possible combinations (CUDA libs from - # nvidia-* packages, torch-bundled CUDA libs, CPU-only CUDA libs) we do not add hidden imports directly, but instead - # attempt to infer them from requirements listed in the `torch` metadata. - if compat.is_linux: - def _infer_nvidia_hiddenimports(): - import packaging.requirements - from _pyinstaller_hooks_contrib.compat import importlib_metadata - from _pyinstaller_hooks_contrib.utils import nvidia_cuda as cudautils - - dist = importlib_metadata.distribution("torch") - requirements = [packaging.requirements.Requirement(req) for req in dist.requires or []] - requirements = [req.name for req in requirements if req.marker is None or req.marker.evaluate()] - - return cudautils.infer_hiddenimports_from_requirements(requirements) - - try: - nvidia_hiddenimports = _infer_nvidia_hiddenimports() - except Exception: - # Log the exception, but make it non-fatal - logger.warning("hook-torch: failed to infer NVIDIA CUDA hidden imports!", exc_info=True) - nvidia_hiddenimports = [] - logger.info("hook-torch: inferred hidden imports for CUDA libraries: %r", nvidia_hiddenimports) - hiddenimports += nvidia_hiddenimports - - # On Linux, prevent binary dependency analysis from generating symbolic links for libraries from `torch/lib` to - # the top-level application directory. These symbolic links seem to confuse `torch` about location of its shared - # libraries (likely because code in one of the libraries looks up the library file's location, but does not - # fully resolve it), and prevent it from finding dynamically-loaded libraries in `torch/lib` directory, such as - # `torch/lib/libtorch_cuda_linalg.so`. The issue was observed with earlier versions of `torch` builds provided - # by https://download.pytorch.org/whl/torch, specifically 1.13.1+cu117, 2.0.1+cu117, and 2.1.2+cu118; later - # versions do not seem to be affected. The wheels provided on PyPI do not seem to be affected, either, even - # for torch 1.13.1, 2.01, and 2.1.2. However, these symlinks should be not necessary on linux in general, so - # there should be no harm in suppressing them for all versions. - # - # The `bindepend_symlink_suppression` hook attribute requires PyInstaller >= 6.11, and is no-op in earlier - # versions. - bindepend_symlink_suppression = ['**/torch/lib/*.so*'] - - # The Windows nightly build for torch 2.3.0 added dependency on MKL. The `mkl` distribution does not provide an - # importable package, but rather installs the DLLs in /Library/bin directory. Therefore, we cannot write a - # separate hook for it, and must collect the DLLs here. (Most of these DLLs are missed by PyInstaller's binary - # dependency analysis due to being dynamically loaded at run-time). - if compat.is_win: - def _collect_mkl_dlls(): - # Determine if torch is packaged by Anaconda or not. Ideally, we would use our `get_installer()` hook - # utility function to check if installer is `conda`. However, it seems that some builds (e.g., those from - # `pytorch` and `nvidia` channels) provide legacy metadata in form of .egg-info directory, which does not - # include an INSTALLER file. So instead, search the conda metadata for a conda distribution/package that - # provides a `torch` importable package, if any. - conda_torch_dist = None - if compat.is_conda: - from PyInstaller.utils.hooks import conda_support - try: - conda_torch_dist = conda_support.package_distribution('torch') - except ModuleNotFoundError: - conda_torch_dist = None - - if conda_torch_dist: - # Anaconda-packaged torch - if 'mkl' not in conda_torch_dist.dependencies: - logger.info('hook-torch: this torch build (Anaconda package) does not depend on MKL...') - return [] - - logger.info('hook-torch: collecting DLLs from MKL and its dependencies (Anaconda packages)') - mkl_binaries = conda_support.collect_dynamic_libs('mkl', dependencies=True) - else: - # Non-Anaconda torch (e.g., PyPI wheel) - import packaging.requirements - from _pyinstaller_hooks_contrib.compat import importlib_metadata - - # Check if torch depends on `mkl` - dist = importlib_metadata.distribution("torch") - requirements = [packaging.requirements.Requirement(req) for req in dist.requires or []] - requirements = [req.name for req in requirements if req.marker is None or req.marker.evaluate()] - if 'mkl' not in requirements: - logger.info('hook-torch: this torch build does not depend on MKL...') - return [] - - # Find requirements of mkl - this should yield `intel-openmp` and `tbb`, which install DLLs in the same - # way as `mkl`. - try: - dist = importlib_metadata.distribution("mkl") - except importlib_metadata.PackageNotFoundError: - return [] # For some reason, `mkl` distribution is unavailable. - requirements = [packaging.requirements.Requirement(req) for req in dist.requires or []] - requirements = [req.name for req in requirements if req.marker is None or req.marker.evaluate()] - - requirements = ['mkl'] + requirements - - mkl_binaries = [] - logger.info('hook-torch: collecting DLLs from MKL and its dependencies: %r', requirements) - for requirement in requirements: - try: - dist = importlib_metadata.distribution(requirement) - except importlib_metadata.PackageNotFoundError: - continue - - # Go over files, and match DLLs in /Library/bin directory - for dist_file in (dist.files or []): - # NOTE: `importlib_metadata.PackagePath.match()` does not seem to properly normalize the - # separator, and on Windows, RECORD can apparently end up with entries that use either Windows - # or POSIX-style separators (see pyinstaller/pyinstaller-hooks-contrib#879). This is why we - # first resolve the file's location (which yields a `pathlib.Path` instance), and perform - # matching on resolved path. - dll_file = dist.locate_file(dist_file).resolve() - if not dll_file.match('**/Library/bin/*.dll'): - continue - mkl_binaries.append((str(dll_file), '.')) - - if mkl_binaries: - logger.info( - 'hook-torch: found MKL DLLs: %r', - sorted([os.path.basename(src_name) for src_name, dest_name in mkl_binaries]) - ) - else: - logger.info('hook-torch: no MKL DLLs found.') - - return mkl_binaries - - try: - mkl_binaries = _collect_mkl_dlls() - except Exception: - # Log the exception, but make it non-fatal - logger.warning("hook-torch: failed to collect MKL DLLs!", exc_info=True) - mkl_binaries = [] - binaries += mkl_binaries -else: - datas = [(get_package_paths("torch")[1], "torch")] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-torchao.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-torchao.py deleted file mode 100644 index 5d36ef1..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-torchao.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Collect source .py files for JIT/torchscript. -module_collection_mode = 'pyz+py' diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-torchaudio.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-torchaudio.py deleted file mode 100644 index 57e570e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-torchaudio.py +++ /dev/null @@ -1,21 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_dynamic_libs, collect_submodules - -# Collect dynamic extensions from torchaudio/lib - some of them are loaded dynamically, and are thus not automatically -# collected. -binaries = collect_dynamic_libs('torchaudio') -hiddenimports = collect_submodules('torchaudio.lib') - -# Collect source .py files for JIT/torchscript. Requires PyInstaller >= 5.3, no-op in older versions. -module_collection_mode = 'pyz+py' diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-torchtext.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-torchtext.py deleted file mode 100644 index 5ada443..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-torchtext.py +++ /dev/null @@ -1,21 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_dynamic_libs, collect_submodules - -# Collect dynamic extensions from torchtext/lib - some of them are loaded dynamically, and are thus not automatically -# collected. -binaries = collect_dynamic_libs('torchtext') -hiddenimports = collect_submodules('torchtext.lib') - -# Collect source .py files for JIT/torchscript. Requires PyInstaller >= 5.3, no-op in older versions. -module_collection_mode = 'pyz+py' diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-torchvision.io.image.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-torchvision.io.image.py deleted file mode 100644 index ba4a894..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-torchvision.io.image.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# torchivison.io.image attempts to dynamically load the torchvision.image extension. -hiddenimports = ['torchvision.image'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-torchvision.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-torchvision.py deleted file mode 100644 index f0ce8e4..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-torchvision.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Functions from torchvision.ops.* modules require torchvision._C extension module, which PyInstaller fails to pick up -# automatically due to indirect load. -hiddenimports = ['torchvision._C'] - -# Collect source .py files for JIT/torchscript. Requires PyInstaller >= 5.3, no-op in older versions. -module_collection_mode = 'pyz+py' diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame.py deleted file mode 100644 index 404221a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame.py +++ /dev/null @@ -1,13 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -hiddenimports = ["pkgutil"] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_client.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_client.py deleted file mode 100644 index c134034..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_client.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("trame_client", subdir="module") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_code.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_code.py deleted file mode 100644 index 333020b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_code.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = [*collect_data_files("trame_code", subdir="module")] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_components.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_components.py deleted file mode 100644 index d49cfb4..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_components.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("trame_components", subdir="module") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_datagrid.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_datagrid.py deleted file mode 100644 index 601481c..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_datagrid.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("trame_datagrid", subdir="module") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_deckgl.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_deckgl.py deleted file mode 100644 index 091566e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_deckgl.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("trame_deckgl", subdir="module") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_formkit.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_formkit.py deleted file mode 100644 index f677965..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_formkit.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = [*collect_data_files("trame_formkit", subdir="module")] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_grid.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_grid.py deleted file mode 100644 index 0373131..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_grid.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = [*collect_data_files("trame_grid", subdir="module")] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_iframe.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_iframe.py deleted file mode 100644 index 5ee77f7..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_iframe.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("trame_iframe", subdir="module") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_keycloak.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_keycloak.py deleted file mode 100644 index 89413a6..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_keycloak.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("trame_keycloak", subdir="module") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_leaflet.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_leaflet.py deleted file mode 100644 index 9e2f295..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_leaflet.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = [*collect_data_files("trame_leaflet", subdir="module")] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_markdown.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_markdown.py deleted file mode 100644 index 7107379..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_markdown.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = [*collect_data_files("trame_markdown", subdir="module")] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_matplotlib.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_matplotlib.py deleted file mode 100644 index 63e6e66..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_matplotlib.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = [*collect_data_files("trame_matplotlib", subdir="module")] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_mesh_streamer.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_mesh_streamer.py deleted file mode 100644 index b782f7a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_mesh_streamer.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -hiddenimports = ["vtk"] -datas = collect_data_files("trame_mesh_streamer", subdir="module") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_plotly.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_plotly.py deleted file mode 100644 index eaa2ecd..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_plotly.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("trame_plotly", subdir="module") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_pvui.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_pvui.py deleted file mode 100644 index 209cd63..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_pvui.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("trame_pvui", subdir="module") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_quasar.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_quasar.py deleted file mode 100644 index 3dc1c26..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_quasar.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = [*collect_data_files("trame_quasar", subdir="module")] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_rca.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_rca.py deleted file mode 100644 index b9e5da9..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_rca.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("trame_rca", subdir="module") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_router.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_router.py deleted file mode 100644 index a756569..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_router.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("trame_router", subdir="module") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_simput.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_simput.py deleted file mode 100644 index d80a7ec..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_simput.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("trame_simput", subdir="module") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_tauri.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_tauri.py deleted file mode 100644 index af47491..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_tauri.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("trame_tauri", subdir="module") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_tweakpane.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_tweakpane.py deleted file mode 100644 index 81c9190..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_tweakpane.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = [*collect_data_files("trame_tweakpane", subdir="module")] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_vega.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_vega.py deleted file mode 100644 index fe157d2..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_vega.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("trame_vega", subdir="module") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_vtk.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_vtk.py deleted file mode 100644 index 865cbd9..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_vtk.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = [ - *collect_data_files("trame_vtk", subdir="modules"), - *collect_data_files("trame_vtk", subdir="tools"), -] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_vtk3d.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_vtk3d.py deleted file mode 100644 index 1c85729..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_vtk3d.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("trame_vtk3d", subdir="module") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_vtklocal.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_vtklocal.py deleted file mode 100644 index 288e1e8..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_vtklocal.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -hiddenimports = ["vtk"] -datas = collect_data_files("trame_vtklocal", subdir="module") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_vuetify.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_vuetify.py deleted file mode 100644 index 4ea24fc..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_vuetify.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("trame_vuetify", subdir="module") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_xterm.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_xterm.py deleted file mode 100644 index 39c3a72..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_xterm.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("trame_xterm", subdir="module") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-transformers.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-transformers.py deleted file mode 100644 index 6fd7a35..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-transformers.py +++ /dev/null @@ -1,37 +0,0 @@ -from PyInstaller.utils.hooks import ( - copy_metadata, - get_module_attribute, - is_module_satisfies, - logger, -) - -datas = [] - -# At run-time, `transformers` queries the metadata of several packages to check for their presence. The list of required -# (core) packages is stored as `transformers.dependency_versions_check.pkgs_to_check_at_runtime`. However, there is more -# comprehensive list of dependencies and their versions available in `transformers.dependency_versions_table.deps`, -# which includes non-core dependencies. Unfortunately, we cannot foresee which of those the user will actually require, -# so we collect metadata for all listed dists that are available in the build environment, in order to make them visible -# to `transformers` at run-time. -try: - dependencies = get_module_attribute( - 'transformers.dependency_versions_table', - 'deps', - ) -except Exception: - logger.warning( - "hook-transformers: failed to query dependency table (transformers.dependency_versions_table.deps)!", - exc_info=True, - ) - dependencies = {} - -for dependency_name, dependency_req in dependencies.items(): - if not is_module_satisfies(dependency_req): - continue - try: - datas += copy_metadata(dependency_name) - except Exception: - pass - -# Collect source .py files for JIT/torchscript. Requires PyInstaller >= 5.3, no-op in older versions. -module_collection_mode = 'pyz+py' diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-travertino.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-travertino.py deleted file mode 100644 index 6afc577..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-travertino.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata - -# Prevent this package from pulling `setuptools_scm` into frozen application, as it makes no sense in that context. -excludedimports = ["setuptools_scm"] - -# Collect metadata to allow package to infer its version at run-time. -datas = copy_metadata("travertino") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trimesh.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trimesh.py deleted file mode 100644 index 90ebfda..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trimesh.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -# Collect the *.json resource file. -# This issue is reported in here: https://github.com/mikedh/trimesh/issues/412 -datas = collect_data_files('trimesh') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-triton.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-triton.py deleted file mode 100644 index a1e006c..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-triton.py +++ /dev/null @@ -1,47 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# --------------------------------------------------- - -from PyInstaller.utils.hooks import collect_data_files, collect_dynamic_libs, collect_submodules, is_module_satisfies - -hiddenimports = [] -datas = [] - -# Ensure that triton/_C/libtriton.so is collected -binaries = collect_dynamic_libs('triton') - -# triton has a JIT module that requires its source .py files. For some god-forsaken reason, this JIT module -# (`triton.runtime.jit` attempts to directly read the contents of file pointed to by its `__file__` attribute (assuming -# it is a source file). Therefore, `triton.runtime.jit` must not be collected into PYZ. Same goes for `compiler` and -# `language` sub-packages. -module_collection_mode = { - 'triton': 'pyz+py', - 'triton.runtime.jit': 'py', - 'triton.compiler': 'py', - 'triton.language': 'py', -} - -# triton 3.0.0 introduced `triton.backends` sub-package with backend-specific files. -if is_module_satisfies('triton >= 3.0.0'): - # Collect backend sub-modules/packages. - hiddenimports += collect_submodules('triton.backends') - - # At the time of writing (triton v3.1.0), `triton.backends.amd` is a namespace package, and is not captured by the - # above `collect_submodules` call. - hiddenimports += collect_submodules('triton.backends.amd') - - # Collect ptxas compiler files from `triton/backends/nvidia`, and the HIP/ROCm files from `triton/backends/amd`. - datas += collect_data_files('triton.backends') -else: - # Collect ptxas compiler files from triton/third_party/cuda directory. Strictly speaking, the ptxas executable from - # bin directory should be collected as a binary, but in this case, it makes no difference (plus, PyInstaller >= 6.0 - # has automatic binary-vs-data reclassification). - datas += collect_data_files('triton.third_party.cuda') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ttkthemes.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ttkthemes.py deleted file mode 100644 index 87c731b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ttkthemes.py +++ /dev/null @@ -1,56 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Hook for use with the ttkthemes package - -ttkthemes depends on a large set of image and Tcl-code files contained -within its package directory. These are not imported, and thus this hook -is required so they are copied. - -The file structure of the ttkthemes package folder is: -ttkthemes -├───advanced -| └───*.tcl -├───themes -| ├───theme1 -| | ├───theme1 -| | | └───*.gif -| | └───theme1.tcl -| ├───theme2 -| ├───... -| └───pkgIndex.tcl -├───png -└───gif - -The ``themes`` directory contains themes which only have a universal -image version (either base64 encoded in the theme files or GIF), while -``png`` and ``gif`` contain the PNG and GIF versions of the themes which -support both respectively. - -All of this must be copied, as the package expects all the data to be -present and only checks what themes to load at runtime. - -Tested hook on Linux (Ubuntu 18.04, Python 3.6 minimal venv) and on -Windows 7 (Python 3.7, minimal system-wide installation). - ->>> from tkinter import ttk ->>> from ttkthemes import ThemedTk ->>> ->>> ->>> if __name__ == '__main__': ->>> window = ThemedTk(theme="plastik") ->>> ttk.Button(window, text="Quit", command=window.destroy).pack() ->>> window.mainloop() -""" -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("ttkthemes") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ttkwidgets.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ttkwidgets.py deleted file mode 100644 index 94c65e3..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ttkwidgets.py +++ /dev/null @@ -1,38 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Hook for use with the ttkwidgets package - -ttkwidgets provides a set of cross-platform widgets for Tkinter/ttk, -some of which depend on image files in order to function properly. - -These images files are all provided in the `ttkwidgets/assets` folder, -which has to be copied by PyInstaller. - -This hook has been tested on Ubuntu 18.04 (Python 3.6.8 venv) and -Windows 7 (Python 3.5.4 system-wide). - ->>> import tkinter as tk ->>> from ttkwidgets import CheckboxTreeview ->>> ->>> window = tk.Tk() ->>> tree = CheckboxTreeview(window) ->>> tree.insert("", tk.END, "test", text="Hello World!") ->>> tree.insert("test", tk.END, "test2", text="Hello World again!") ->>> tree.insert("test", tk.END, "test3", text="Hello World again again!") ->>> tree.pack() ->>> window.mainloop() -""" - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files("ttkwidgets") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tzdata.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tzdata.py deleted file mode 100644 index 2f540db..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tzdata.py +++ /dev/null @@ -1,22 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files, collect_submodules - -# Collect timezone data files -datas = collect_data_files("tzdata") - -# Collect submodules; each data subdirectory is in fact a package -# (e.g., zoneinfo.Europe), so we need its __init__.py for data files -# (e.g., zoneinfo/Europe/Ljubljana) to be discoverable via -# importlib.resources -hiddenimports = collect_submodules("tzdata") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tzwhere.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tzwhere.py deleted file mode 100644 index 5c583af..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tzwhere.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('tzwhere') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-u1db.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-u1db.py deleted file mode 100644 index ddd32c9..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-u1db.py +++ /dev/null @@ -1,31 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Pyinstaller hook for u1db module - -This hook was tested with: -- u1db 0.1.4 : https://launchpad.net/u1db -- Python 2.7.10 -- Linux Debian GNU/Linux unstable (sid) - -Test script used for testing: - - import u1db - db = u1db.open("mydb1.u1db", create=True) - doc = db.create_doc({"key": "value"}, doc_id="testdoc") - print doc.content - print doc.doc_id -""" - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('u1db') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ultralytics.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ultralytics.py deleted file mode 100644 index c49eac3..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ultralytics.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -# Collect config .yaml files from ultralytics/cfg directory. -datas = collect_data_files('ultralytics') - -# Collect source .py files for JIT/torchscript. Requires PyInstaller >= 5.3, no-op in older versions. -module_collection_mode = 'pyz+py' diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-umap.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-umap.py deleted file mode 100644 index 5ae0d4d..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-umap.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata('umap-learn') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-unidecode.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-unidecode.py deleted file mode 100644 index a51d89d..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-unidecode.py +++ /dev/null @@ -1,20 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for the unidecode package: https://pypi.python.org/pypi/unidecode -# Tested with Unidecode 0.4.21 and Python 3.6.2, on Windows 10 x64. - -from PyInstaller.utils.hooks import collect_submodules - -# Unidecode dynamically imports modules with relevant character mappings. -# Non-ASCII characters are ignored if the mapping files are not found. -hiddenimports = collect_submodules('unidecode') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-uniseg.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-uniseg.py deleted file mode 100644 index af28f0f..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-uniseg.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for the uniseg module: https://pypi.python.org/pypi/uniseg - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('uniseg') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-urllib3.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-urllib3.py deleted file mode 100644 index cafd1b0..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-urllib3.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules, is_module_satisfies - -# If this is `urllib3` from `urllib3-future`, collect submodules in order to avoid missing modules due to indirect -# imports. With `urllib3` from "classic" `urllib3`, this does not seem to be necessary. -if is_module_satisfies("urllib3-future"): - hiddenimports = collect_submodules("urllib3") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-urllib3_future.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-urllib3_future.py deleted file mode 100644 index 0baa1d7..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-urllib3_future.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules - -# Collect submodules in order to avoid missing modules due to indirect imports. -hiddenimports = collect_submodules("urllib3_future") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-usb.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-usb.py deleted file mode 100644 index 5721eaa..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-usb.py +++ /dev/null @@ -1,91 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -import ctypes.util -import os - -from PyInstaller.depend.utils import _resolveCtypesImports -from PyInstaller.compat import is_cygwin, getenv -from PyInstaller.utils.hooks import logger - -# Include glob for library lookup in run-time hook. -hiddenimports = ['glob'] - -# https://github.com/walac/pyusb/blob/master/docs/faq.rst -# https://github.com/walac/pyusb/blob/master/docs/tutorial.rst - -binaries = [] - -# Running usb.core.find() in this script crashes Ubuntu 14.04LTS, -# let users circumvent pyusb discovery with an environment variable. -skip_pyusb_discovery = \ - bool(getenv('PYINSTALLER_USB_HOOK_SKIP_PYUSB_DISCOVERY')) - -# Try to use pyusb's library locator. -if not skip_pyusb_discovery: - import usb.core - import usb.backend - try: - # get the backend symbols before find - backend_contents_before_discovery = set(dir(usb.backend)) - # perform find, which will load a usb library if found - usb.core.find() - # get the backend symbols which have been added (loaded) - backends = set(dir(usb.backend)) - backend_contents_before_discovery - for usblib in [getattr(usb.backend, be)._lib for be in backends]: - if usblib is not None: - if os.path.isabs(usblib._name): - binaries.append((os.path.basename(usblib._name), usblib._name, "BINARY")) - else: - # OSX returns the full path, Linux only the filename. - # try to resolve the library names to absolute paths. - backend_lib_full_paths = _resolveCtypesImports([os.path.basename(usblib._name)]) - if backend_lib_full_paths: - binaries.append(backend_lib_full_paths[0]) - except (ValueError, usb.core.USBError) as exc: - logger.warning("%s", exc) - -# If pyusb didn't find a backend, manually search for usb libraries. -if not binaries: - # NOTE: Update these lists when adding further libs. - if is_cygwin: - libusb_candidates = ['cygusb-1.0-0.dll', 'cygusb0.dll'] - else: - libusb_candidates = [ - # libusb10 - 'usb-1.0', - 'usb', - 'libusb-1.0', - # libusb01 - 'usb-0.1', - 'libusb0', - # openusb - 'openusb', - ] - - backend_library_basenames = [] - for candidate in libusb_candidates: - libname = ctypes.util.find_library(candidate) - if libname is not None: - if os.path.isabs(libname): - binaries.append((os.path.basename(libname), libname, "BINARY")) - else: - backend_lib_full_paths = _resolveCtypesImports([os.path.basename(libname)]) - if backend_lib_full_paths: - binaries.append(backend_lib_full_paths[0]) - -# Validate and normalize the first found usb library. -if binaries: - # `_resolveCtypesImports` returns a 3-tuple, but `binaries` are only - # 2-tuples, so remove the last element: - assert len(binaries[0]) == 3 - binaries = [(binaries[0][1], '.')] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-uuid6.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-uuid6.py deleted file mode 100644 index 8a85018..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-uuid6.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import is_module_satisfies, copy_metadata - -# Starting with version 2025.0.1, uuid6 queries its metadata for version information. -if is_module_satisfies('uuid6 >= 2025.0.1'): - datas = copy_metadata('uuid6') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-uvicorn.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-uvicorn.py deleted file mode 100644 index 0acdd3c..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-uvicorn.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules('uvicorn') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-uvloop.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-uvloop.py deleted file mode 100644 index 4c4280c..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-uvloop.py +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -# -# Hook for the uvloop package: https://pypi.python.org/pypi/uvloop -# -# Tested with uvloop 0.8.1 and Python 3.6.2, on Ubuntu 16.04.1 64bit. - -from PyInstaller.utils.hooks import collect_submodules - -hiddenimports = collect_submodules('uvloop') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vaderSentiment.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vaderSentiment.py deleted file mode 100644 index 0879fff..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vaderSentiment.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('vaderSentiment') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkAcceleratorsVTKmCore.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkAcceleratorsVTKmCore.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkAcceleratorsVTKmCore.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkAcceleratorsVTKmDataModel.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkAcceleratorsVTKmDataModel.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkAcceleratorsVTKmDataModel.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkAcceleratorsVTKmFilters.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkAcceleratorsVTKmFilters.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkAcceleratorsVTKmFilters.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkChartsCore.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkChartsCore.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkChartsCore.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonColor.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonColor.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonColor.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonComputationalGeometry.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonComputationalGeometry.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonComputationalGeometry.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonDataModel.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonDataModel.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonDataModel.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonExecutionModel.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonExecutionModel.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonExecutionModel.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonMath.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonMath.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonMath.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonMisc.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonMisc.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonMisc.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonPython.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonPython.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonPython.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonSystem.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonSystem.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonSystem.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonTransforms.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonTransforms.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkCommonTransforms.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkDomainsChemistry.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkDomainsChemistry.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkDomainsChemistry.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkDomainsChemistryOpenGL2.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkDomainsChemistryOpenGL2.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkDomainsChemistryOpenGL2.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersAMR.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersAMR.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersAMR.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersCellGrid.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersCellGrid.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersCellGrid.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersCore.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersCore.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersCore.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersExtraction.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersExtraction.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersExtraction.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersFlowPaths.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersFlowPaths.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersFlowPaths.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersGeneral.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersGeneral.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersGeneral.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersGeneric.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersGeneric.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersGeneric.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersGeometry.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersGeometry.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersGeometry.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersGeometryPreview.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersGeometryPreview.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersGeometryPreview.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersHybrid.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersHybrid.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersHybrid.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersHyperTree.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersHyperTree.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersHyperTree.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersImaging.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersImaging.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersImaging.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersModeling.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersModeling.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersModeling.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersParallel.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersParallel.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersParallel.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersParallelDIY2.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersParallelDIY2.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersParallelDIY2.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersParallelImaging.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersParallelImaging.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersParallelImaging.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersParallelStatistics.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersParallelStatistics.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersParallelStatistics.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersPoints.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersPoints.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersPoints.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersProgrammable.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersProgrammable.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersProgrammable.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersPython.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersPython.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersPython.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersReduction.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersReduction.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersReduction.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersSMP.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersSMP.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersSMP.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersSelection.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersSelection.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersSelection.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersSources.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersSources.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersSources.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersStatistics.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersStatistics.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersStatistics.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersTemporal.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersTemporal.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersTemporal.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersTensor.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersTensor.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersTensor.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersTexture.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersTexture.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersTexture.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersTopology.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersTopology.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersTopology.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersVerdict.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersVerdict.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkFiltersVerdict.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkGeovisCore.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkGeovisCore.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkGeovisCore.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOAMR.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOAMR.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOAMR.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOAsynchronous.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOAsynchronous.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOAsynchronous.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOAvmesh.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOAvmesh.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOAvmesh.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOCGNSReader.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOCGNSReader.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOCGNSReader.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOCONVERGECFD.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOCONVERGECFD.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOCONVERGECFD.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOCellGrid.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOCellGrid.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOCellGrid.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOCesium3DTiles.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOCesium3DTiles.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOCesium3DTiles.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOChemistry.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOChemistry.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOChemistry.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOCityGML.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOCityGML.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOCityGML.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOCore.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOCore.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOCore.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOERF.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOERF.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOERF.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOEnSight.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOEnSight.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOEnSight.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOEngys.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOEngys.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOEngys.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOExodus.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOExodus.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOExodus.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOExport.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOExport.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOExport.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOExportGL2PS.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOExportGL2PS.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOExportGL2PS.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOExportPDF.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOExportPDF.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOExportPDF.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOFDS.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOFDS.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOFDS.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOFLUENTCFF.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOFLUENTCFF.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOFLUENTCFF.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOGeoJSON.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOGeoJSON.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOGeoJSON.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOGeometry.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOGeometry.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOGeometry.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOH5Rage.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOH5Rage.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOH5Rage.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOH5part.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOH5part.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOH5part.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOHDF.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOHDF.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOHDF.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOIOSS.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOIOSS.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOIOSS.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOImage.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOImage.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOImage.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOImport.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOImport.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOImport.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOInfovis.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOInfovis.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOInfovis.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOLANLX3D.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOLANLX3D.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOLANLX3D.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOLSDyna.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOLSDyna.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOLSDyna.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOLegacy.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOLegacy.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOLegacy.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOMINC.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOMINC.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOMINC.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOMotionFX.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOMotionFX.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOMotionFX.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOMovie.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOMovie.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOMovie.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIONetCDF.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIONetCDF.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIONetCDF.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOOMF.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOOMF.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOOMF.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOOggTheora.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOOggTheora.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOOggTheora.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOPIO.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOPIO.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOPIO.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOPLY.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOPLY.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOPLY.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOParallel.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOParallel.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOParallel.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOParallelExodus.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOParallelExodus.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOParallelExodus.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOParallelLSDyna.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOParallelLSDyna.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOParallelLSDyna.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOParallelXML.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOParallelXML.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOParallelXML.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOSQL.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOSQL.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOSQL.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOSegY.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOSegY.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOSegY.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOTRUCHAS.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOTRUCHAS.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOTRUCHAS.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOTecplotTable.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOTecplotTable.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOTecplotTable.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOVPIC.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOVPIC.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOVPIC.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOVeraOut.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOVeraOut.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOVeraOut.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOVideo.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOVideo.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOVideo.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOXML.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOXML.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOXML.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOXMLParser.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOXMLParser.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOXMLParser.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOXdmf2.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOXdmf2.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkIOXdmf2.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingColor.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingColor.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingColor.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingCore.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingCore.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingCore.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingFourier.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingFourier.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingFourier.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingGeneral.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingGeneral.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingGeneral.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingHybrid.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingHybrid.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingHybrid.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingMath.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingMath.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingMath.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingMorphological.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingMorphological.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingMorphological.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingOpenGL2.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingOpenGL2.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingOpenGL2.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingSources.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingSources.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingSources.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingStatistics.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingStatistics.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingStatistics.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingStencil.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingStencil.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkImagingStencil.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkInfovisCore.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkInfovisCore.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkInfovisCore.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkInfovisLayout.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkInfovisLayout.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkInfovisLayout.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkInteractionImage.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkInteractionImage.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkInteractionImage.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkInteractionStyle.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkInteractionStyle.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkInteractionStyle.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkInteractionWidgets.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkInteractionWidgets.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkInteractionWidgets.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkParallelCore.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkParallelCore.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkParallelCore.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkPythonContext2D.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkPythonContext2D.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkPythonContext2D.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingAnnotation.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingAnnotation.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingAnnotation.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingCellGrid.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingCellGrid.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingCellGrid.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingContext2D.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingContext2D.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingContext2D.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingContextOpenGL2.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingContextOpenGL2.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingContextOpenGL2.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingCore.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingCore.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingCore.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingExternal.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingExternal.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingExternal.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingFreeType.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingFreeType.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingFreeType.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingGL2PSOpenGL2.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingGL2PSOpenGL2.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingGL2PSOpenGL2.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingGridAxes.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingGridAxes.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingGridAxes.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingHyperTreeGrid.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingHyperTreeGrid.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingHyperTreeGrid.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingImage.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingImage.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingImage.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingLICOpenGL2.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingLICOpenGL2.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingLICOpenGL2.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingLOD.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingLOD.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingLOD.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingLabel.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingLabel.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingLabel.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingMatplotlib.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingMatplotlib.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingMatplotlib.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingOpenGL2.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingOpenGL2.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingOpenGL2.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingParallel.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingParallel.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingParallel.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingSceneGraph.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingSceneGraph.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingSceneGraph.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingUI.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingUI.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingUI.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingVR.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingVR.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingVR.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingVRModels.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingVRModels.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingVRModels.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingVolume.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingVolume.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingVolume.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingVolumeAMR.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingVolumeAMR.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingVolumeAMR.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingVolumeOpenGL2.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingVolumeOpenGL2.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingVolumeOpenGL2.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingVtkJS.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingVtkJS.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkRenderingVtkJS.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkSerializationManager.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkSerializationManager.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkSerializationManager.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkTestingRendering.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkTestingRendering.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkTestingRendering.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkTestingSerialization.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkTestingSerialization.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkTestingSerialization.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkViewsContext2D.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkViewsContext2D.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkViewsContext2D.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkViewsCore.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkViewsCore.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkViewsCore.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkViewsInfovis.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkViewsInfovis.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkViewsInfovis.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkWebCore.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkWebCore.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkWebCore.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkWebGLExporter.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkWebGLExporter.py deleted file mode 100644 index 960187b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkmodules.vtkWebGLExporter.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.utils.vtkmodules import add_vtkmodules_dependencies - -hiddenimports = add_vtkmodules_dependencies(__file__) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkpython.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkpython.py deleted file mode 100644 index 76c1e60..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkpython.py +++ /dev/null @@ -1,25 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -import os -if os.name == 'posix': - hiddenimports = [ - 'libvtkCommonPython', 'libvtkFilteringPython', 'libvtkIOPython', - 'libvtkImagingPython', 'libvtkGraphicsPython', 'libvtkRenderingPython', - 'libvtkHybridPython', 'libvtkParallelPython', 'libvtkPatentedPython' - ] -else: - hiddenimports = [ - 'vtkCommonPython', 'vtkFilteringPython', 'vtkIOPython', - 'vtkImagingPython', 'vtkGraphicsPython', 'vtkRenderingPython', - 'vtkHybridPython', 'vtkParallelPython', 'vtkPatentedPython' - ] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-wavefile.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-wavefile.py deleted file mode 100644 index 11dc973..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-wavefile.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -python-wavefile: https://github.com/vokimon/python-wavefile -""" - -from PyInstaller.utils.hooks import collect_dynamic_libs - -binaries = collect_dynamic_libs('wavefile') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-weasyprint.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-weasyprint.py deleted file mode 100644 index b848fcb..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-weasyprint.py +++ /dev/null @@ -1,93 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for weasyprint: https://pypi.python.org/pypi/WeasyPrint -# Tested on version weasyprint 54.0 using Windows 10 and python 3.8 -# Note that weasyprint < 54.0 does not work on python 3.8 due to https://github.com/Kozea/WeasyPrint/issues/1435 -# For weasyprint < 53.0 the required libs are -# libs = [ -# 'gobject-2.0', 'libgobject-2.0-0', 'libgobject-2.0.so.0', 'libgobject-2.0.dylib', -# 'pango-1.0', 'libpango-1.0-0', 'libpango-1.0.so.0', 'libpango-1.0.dylib', -# 'pangocairo-1.0', 'libpangocairo-1.0-0', 'libpangocairo-1.0.so.0', 'libpangocairo-1.0.dylib', -# 'fontconfig', 'libfontconfig', 'libfontconfig-1.dll', 'libfontconfig.so.1', 'libfontconfig-1.dylib', -# 'pangoft2-1.0', 'libpangoft2-1.0-0', 'libpangoft2-1.0.so.0', 'libpangoft2-1.0.dylib' -# ] - -import ctypes.util -import os -from pathlib import Path - -from PyInstaller.compat import is_win -from PyInstaller.depend.utils import _resolveCtypesImports -from PyInstaller.utils.hooks import collect_data_files, is_module_satisfies, logger - -datas = collect_data_files('weasyprint') -binaries = [] -fontconfig_config_dir_found = False - -# On Windows, a GTK3-installation provides fontconfig and the corresponding fontconfig conf files. We have to add these -# for weasyprint to correctly use fonts. -# NOTE: Update these lists if weasyprint requires more libraries -fontconfig_libs = [ - 'fontconfig-1', 'fontconfig', 'libfontconfig', 'libfontconfig-1.dll', 'libfontconfig.so.1', 'libfontconfig-1.dylib' -] -libs = [ - 'gobject-2.0-0', 'gobject-2.0', 'libgobject-2.0-0', 'libgobject-2.0.so.0', 'libgobject-2.0.dylib', - 'pango-1.0-0', 'pango-1.0', 'libpango-1.0-0', 'libpango-1.0.so.0', 'libpango-1.0.dylib', - 'harfbuzz', 'harfbuzz-0.0', 'libharfbuzz-0', 'libharfbuzz.so.0', 'libharfbuzz.so.0', 'libharfbuzz.0.dylib', - 'pangoft2-1.0-0', 'pangoft2-1.0', 'libpangoft2-1.0-0', 'libpangoft2-1.0.so.0', 'libpangoft2-1.0.dylib' -] - -# Starting with weasyprint v63.0, libharfbuzz-subset is also opportunistically loaded. Make sure to collect a copy, if -# available, to prevent a system copy from being loaded at run-time. -if is_module_satisfies("weasyprint >= 63.0"): - libs += [ - 'harfbuzz-subset', 'harfbuzz-subset-0.0', 'libharfbuzz-subset-0', 'libharfbuzz-subset.so.0', - 'libharfbuzz-subset.0.dylib', 'libharfbuzz-subset-0.dll', - ] - -try: - lib_basenames = [] - for lib in libs: - libname = ctypes.util.find_library(lib) - if libname is not None: - lib_basenames += [os.path.basename(libname)] - for lib in fontconfig_libs: - libname = ctypes.util.find_library(lib) - if libname is not None: - lib_basenames += [os.path.basename(libname)] - # Try to load fontconfig config files on Windows from a GTK-installation - if is_win: - fontconfig_config_dir = Path(libname).parent.parent / 'etc/fonts' - if fontconfig_config_dir.exists() and fontconfig_config_dir.is_dir(): - datas += [(str(fontconfig_config_dir), 'etc/fonts')] - fontconfig_config_dir_found = True - if lib_basenames: - resolved_libs = _resolveCtypesImports(lib_basenames) - for resolved_lib in resolved_libs: - binaries.append((resolved_lib[1], '.')) - # Try to load fontconfig config files on other OS - fontconfig_config_dir = Path('/etc/fonts') - if fontconfig_config_dir.exists() and fontconfig_config_dir.is_dir(): - datas += [(str(fontconfig_config_dir), 'etc/fonts')] - fontconfig_config_dir_found = True - -except Exception as e: - logger.warning('Error while trying to find system-installed depending libraries: %s', e) - -if not binaries: - logger.warning('Depending libraries not found - weasyprint will likely fail to work!') - -if not fontconfig_config_dir_found: - logger.warning( - 'Fontconfig configuration files not found - weasyprint will likely throw warnings and use default fonts!' - ) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-web3.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-web3.py deleted file mode 100644 index bc5c97e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-web3.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata("web3") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-webassets.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-webassets.py deleted file mode 100644 index 8a4b983..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-webassets.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('webassets', include_py_files=True) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-webrtcvad.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-webrtcvad.py deleted file mode 100644 index 853ead1..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-webrtcvad.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata('webrtcvad') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-websockets.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-websockets.py deleted file mode 100644 index 84e0ec2..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-websockets.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_submodules - -# Websockets lazily loads its submodules. -hiddenimports = collect_submodules("websockets") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-webview.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-webview.py deleted file mode 100644 index e465a66..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-webview.py +++ /dev/null @@ -1,20 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# hook for https://github.com/r0x0r/pywebview - -from PyInstaller.utils.hooks import collect_data_files, collect_dynamic_libs -from PyInstaller.compat import is_win - -if is_win: - datas = collect_data_files('webview', subdir='lib') - binaries = collect_dynamic_libs('webview') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-win32com.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-win32com.py deleted file mode 100644 index 346d133..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-win32com.py +++ /dev/null @@ -1,20 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -hiddenimports = [ - # win32com client and server util - # modules could be hidden imports - # of some modules using win32com. - # Included for completeness. - 'win32com.client.util', - 'win32com.server.util', -] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-wordcloud.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-wordcloud.py deleted file mode 100644 index 831a3f6..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-wordcloud.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('wordcloud') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-workflow.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-workflow.py deleted file mode 100644 index 43de8d7..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-workflow.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata('workflow') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-wx.lib.activex.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-wx.lib.activex.py deleted file mode 100644 index e3deb15..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-wx.lib.activex.py +++ /dev/null @@ -1,27 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller import isolated - - -# This is necessary because on first import, `wx.lib.activex` generates .tlb file for `comtypes`, unless running in a -# frozen application (in which case, the .tlb file is expected to exist already). So if we are building in a completely -# clean python environment (for example, in a CI/CD pipeline), we need to ensure that .tlb file is generated. -@isolated.decorate -def _ensure_tlb_file_exists(): - try: - import wx.lib.activex # noqa: F401 - except Exception: - pass - - -_ensure_tlb_file_exists() diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-wx.lib.pubsub.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-wx.lib.pubsub.py deleted file mode 100644 index c95f591..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-wx.lib.pubsub.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('wx.lib.pubsub', include_py_files=True, excludes=['*.txt', '**/__pycache__']) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-wx.xrc.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-wx.xrc.py deleted file mode 100644 index 10c86a3..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-wx.xrc.py +++ /dev/null @@ -1,13 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -hiddenimports = ['wx._xml', 'wx'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xarray.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xarray.py deleted file mode 100644 index 79a1da5..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xarray.py +++ /dev/null @@ -1,30 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata, collect_entry_point - -datas = [] -hiddenimports = [] - -# Collect additional backend plugins that are registered via `xarray.backends` entry-point. -ep_datas, ep_hiddenimports = collect_entry_point('xarray.backends') -datas += ep_datas -hiddenimports += ep_hiddenimports - -# Similarly, collect chunk manager entry-points. -ep_datas, ep_hiddenimports = collect_entry_point('xarray.chunkmanagers') -datas += ep_datas -hiddenimports += ep_hiddenimports - -# `xarray` requires `numpy` metadata due to several calls to its `xarray.core.utils.module_available` with specified -# `minversion` argument, which end up calling `importlib.metadata.version`. -datas += copy_metadata('numpy') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xml.dom.html.HTMLDocument.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xml.dom.html.HTMLDocument.py deleted file mode 100644 index 97c7f4d..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xml.dom.html.HTMLDocument.py +++ /dev/null @@ -1,67 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# xml.dom.html.HTMLDocument -hiddenimports = ['xml.dom.html.HTMLAnchorElement', - 'xml.dom.html.HTMLAppletElement', - 'xml.dom.html.HTMLAreaElement', - 'xml.dom.html.HTMLBaseElement', - 'xml.dom.html.HTMLBaseFontElement', - 'xml.dom.html.HTMLBodyElement', - 'xml.dom.html.HTMLBRElement', - 'xml.dom.html.HTMLButtonElement', - 'xml.dom.html.HTMLDirectoryElement', - 'xml.dom.html.HTMLDivElement', - 'xml.dom.html.HTMLDListElement', - 'xml.dom.html.HTMLElement', - 'xml.dom.html.HTMLFieldSetElement', - 'xml.dom.html.HTMLFontElement', - 'xml.dom.html.HTMLFormElement', - 'xml.dom.html.HTMLFrameElement', - 'xml.dom.html.HTMLFrameSetElement', - 'xml.dom.html.HTMLHeadElement', - 'xml.dom.html.HTMLHeadingElement', - 'xml.dom.html.HTMLHRElement', - 'xml.dom.html.HTMLHtmlElement', - 'xml.dom.html.HTMLIFrameElement', - 'xml.dom.html.HTMLImageElement', - 'xml.dom.html.HTMLInputElement', - 'xml.dom.html.HTMLIsIndexElement', - 'xml.dom.html.HTMLLabelElement', - 'xml.dom.html.HTMLLegendElement', - 'xml.dom.html.HTMLLIElement', - 'xml.dom.html.HTMLLinkElement', - 'xml.dom.html.HTMLMapElement', - 'xml.dom.html.HTMLMenuElement', - 'xml.dom.html.HTMLMetaElement', - 'xml.dom.html.HTMLModElement', - 'xml.dom.html.HTMLObjectElement', - 'xml.dom.html.HTMLOListElement', - 'xml.dom.html.HTMLOptGroupElement', - 'xml.dom.html.HTMLOptionElement', - 'xml.dom.html.HTMLParagraphElement', - 'xml.dom.html.HTMLParamElement', - 'xml.dom.html.HTMLPreElement', - 'xml.dom.html.HTMLQuoteElement', - 'xml.dom.html.HTMLScriptElement', - 'xml.dom.html.HTMLSelectElement', - 'xml.dom.html.HTMLStyleElement', - 'xml.dom.html.HTMLTableCaptionElement', - 'xml.dom.html.HTMLTableCellElement', - 'xml.dom.html.HTMLTableColElement', - 'xml.dom.html.HTMLTableElement', - 'xml.dom.html.HTMLTableRowElement', - 'xml.dom.html.HTMLTableSectionElement', - 'xml.dom.html.HTMLTextAreaElement', - 'xml.dom.html.HTMLTitleElement', - 'xml.dom.html.HTMLUListElement', - ] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xml.sax.saxexts.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xml.sax.saxexts.py deleted file mode 100644 index 5be293b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xml.sax.saxexts.py +++ /dev/null @@ -1,25 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# xml.sax.saxexts -hiddenimports = ["xml.sax.drivers2.drv_pyexpat", - "xml.sax.drivers.drv_xmltok", - 'xml.sax.drivers2.drv_xmlproc', - "xml.sax.drivers.drv_xmltoolkit", - "xml.sax.drivers.drv_xmllib", - "xml.sax.drivers.drv_xmldc", - 'xml.sax.drivers.drv_pyexpat', - 'xml.sax.drivers.drv_xmlproc_val', - 'xml.sax.drivers.drv_htmllib', - 'xml.sax.drivers.drv_sgmlop', - "xml.sax.drivers.drv_sgmllib", - ] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xmldiff.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xmldiff.py deleted file mode 100644 index eb2b966..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xmldiff.py +++ /dev/null @@ -1,16 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -# Hook for https://github.com/Shoobx/xmldiff - -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata('xmldiff') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xmlschema.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xmlschema.py deleted file mode 100644 index 05a777c..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xmlschema.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# hook for https://github.com/sissaschool/xmlschema -from PyInstaller.utils.hooks import collect_data_files - -# the library contains a bunch of XSD schemas which are loaded in run time -datas = collect_data_files("xmlschema") diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xsge_gui.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xsge_gui.py deleted file mode 100644 index 068781e..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xsge_gui.py +++ /dev/null @@ -1,17 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for the xsge_gui module: https://pypi.python.org/pypi/xsge_gui - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('xsge_gui') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xyzservices.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xyzservices.py deleted file mode 100644 index d7b0ecf..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xyzservices.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('xyzservices') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-yapf_third_party.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-yapf_third_party.py deleted file mode 100644 index d138c53..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-yapf_third_party.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2024 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -datas = collect_data_files('yapf_third_party') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-z3c.rml.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-z3c.rml.py deleted file mode 100644 index 658e44f..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-z3c.rml.py +++ /dev/null @@ -1,25 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import collect_data_files - -# `z3c.rml` uses Bitstream Vera TTF fonts from the `reportlab` package. As that package can be used without the bundled -# fonts and as some of the bundled fonts have restrictive license (e.g., DarkGarden), we collect the required subset -# of fonts here, instead of collecting them all in a hook for `reportlab`. -datas = collect_data_files( - "reportlab", - includes=[ - "fonts/00readme.txt", - "fonts/bitstream-vera-license.txt", - "fonts/Vera*.ttf", - ], -) diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-zarr.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-zarr.py deleted file mode 100644 index 0aefa8a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-zarr.py +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2025 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata('zarr') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-zeep.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-zeep.py deleted file mode 100644 index 002e106..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-zeep.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -# Hook for the zeep module: https://pypi.python.org/pypi/zeep -# Tested with zeep 0.13.0, Python 2.7, Windows - -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata('zeep') diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-zmq.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-zmq.py deleted file mode 100644 index 5a9f833..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-zmq.py +++ /dev/null @@ -1,63 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2020 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ -""" -Hook for PyZMQ. Cython based Python bindings for messaging library ZeroMQ. -http://www.zeromq.org/ -""" -import os -import glob -from PyInstaller.utils.hooks import collect_submodules -from PyInstaller.utils.hooks import is_module_satisfies, get_module_file_attribute -from PyInstaller.compat import is_win - -binaries = [] -datas = [] -hiddenimports = ['zmq.utils.garbage'] - -# PyZMQ comes with two backends, cython and cffi. Calling collect_submodules() -# on zmq.backend seems to trigger attempt at compilation of C extension -# module for cffi backend, which will fail if ZeroMQ development files -# are not installed on the system. On non-English locales, the resulting -# localized error messages may cause UnicodeDecodeError. Collecting each -# backend individually, however, does not seem to cause any problems. -hiddenimports += ['zmq.backend'] - -# cython backend -hiddenimports += collect_submodules('zmq.backend.cython') - -# cffi backend: contains extra data that needs to be collected -# (e.g., _cdefs.h) -# -# NOTE: the cffi backend requires compilation of C extension at runtime, -# which appears to be broken in frozen program. So avoid collecting -# it altogether... -if False: - from PyInstaller.utils.hooks import collect_data_files - - hiddenimports += collect_submodules('zmq.backend.cffi') - datas += collect_data_files('zmq.backend.cffi', excludes=['**/__pycache__', ]) - -# Starting with pyzmq 22.0.0, the DLLs in Windows wheel are located in -# site-packages/pyzmq.libs directory along with a .load_order file. This -# file is required on python 3.7 and earlier. On later versions of python, -# the pyzmq.libs is required to exist. -if is_win and is_module_satisfies('pyzmq >= 22.0.0'): - zmq_root = os.path.dirname(get_module_file_attribute('zmq')) - libs_dir = os.path.join(zmq_root, os.path.pardir, 'pyzmq.libs') - # .load_order file (22.0.3 replaced underscore with dash and added - # version suffix on this file, hence the glob) - load_order_file = glob.glob(os.path.join(libs_dir, '.load*')) - datas += [(filename, 'pyzmq.libs') for filename in load_order_file] - # We need to collect DLLs into _MEIPASS, to avoid duplication due to - # subsequent binary analysis - dll_files = glob.glob(os.path.join(libs_dir, "*.dll")) - binaries += [(dll_file, '.') for dll_file in dll_files] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-zoneinfo.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-zoneinfo.py deleted file mode 100644 index 03a5e41..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-zoneinfo.py +++ /dev/null @@ -1,18 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2021 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from PyInstaller.compat import is_win - -# On Windows, timezone data is provided by the tzdata package that is -# not directly loaded. -if is_win: - hiddenimports = ['tzdata'] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/utils/__init__.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/utils/__init__.py deleted file mode 100644 index 792d600..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/utils/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/utils/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/utils/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 9f855c7..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/utils/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/utils/__pycache__/mypy.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/utils/__pycache__/mypy.cpython-312.pyc deleted file mode 100644 index 18888e2..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/utils/__pycache__/mypy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/utils/__pycache__/nvidia_cuda.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/utils/__pycache__/nvidia_cuda.cpython-312.pyc deleted file mode 100644 index f9f4731..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/utils/__pycache__/nvidia_cuda.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/utils/__pycache__/vtkmodules.cpython-312.pyc b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/utils/__pycache__/vtkmodules.cpython-312.pyc deleted file mode 100644 index 5b82780..0000000 Binary files a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/utils/__pycache__/vtkmodules.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/utils/mypy.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/utils/mypy.py deleted file mode 100644 index b2da38b..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/utils/mypy.py +++ /dev/null @@ -1,25 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2026 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -from _pyinstaller_hooks_contrib.compat import importlib_metadata - - -# Given the distribution name, find the top-level `mypyc` extension module belonging to that distribution. The said -# top-level module is called something like `30fcd23745efe32ce681__mypyc`; the prefix changes across different versions -# of the same distribution (and, of course, across different distributions). Therefore, we need to obtain the name by -# looking at distribution's list of files. -def find_mypyc_module_for_dist(dist_name): - try: - dist = importlib_metadata.distribution(dist_name) - except importlib_metadata.PackageNotFoundError: - return [] - return [entry.name.split('.')[0] for entry in (dist.files or []) if '__mypyc' in entry.name] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/utils/nvidia_cuda.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/utils/nvidia_cuda.py deleted file mode 100644 index b93064a..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/utils/nvidia_cuda.py +++ /dev/null @@ -1,77 +0,0 @@ -# ------------------------------------------------------------------ -# Copyright (c) 2023 PyInstaller Development Team. -# -# This file is distributed under the terms of the GNU General Public -# License (version 2.0 or later). -# -# The full license is available in LICENSE, distributed with -# this software. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ------------------------------------------------------------------ - -import os -import re - -from PyInstaller import compat -from PyInstaller.utils.hooks import ( - logger, - is_module_satisfies, -) - - -# Helper for collecting shared libraries from NVIDIA CUDA packages on linux. -def collect_nvidia_cuda_binaries(hook_file): - # Find the module underlying this nvidia.something hook; i.e., change ``/path/to/hook-nvidia.something.py`` to - # ``nvidia.something``. - hook_name, hook_ext = os.path.splitext(os.path.basename(hook_file)) - assert hook_ext.startswith('.py') - assert hook_name.startswith('hook-') - module_name = hook_name[5:] - - # `search_patterns` was added to `collect_dynamic_libs` in PyInstaller 5.8, so that is the minimum required version. - binaries = [] - if is_module_satisfies('PyInstaller >= 5.8'): - from PyInstaller.utils.hooks import collect_dynamic_libs, PY_DYLIB_PATTERNS - binaries = collect_dynamic_libs( - module_name, - # Collect fully-versioned .so files (not included in default search patterns). - search_patterns=PY_DYLIB_PATTERNS + ["lib*.so.*"], - ) - else: - logger.warning("hook-%s: this hook requires PyInstaller >= 5.8!", module_name) - - return binaries - - -# Helper to turn list of requirements (e.g., ['nvidia-cublas-cu12', 'nvidia-nccl-cu12', 'nvidia-cudnn-cu12']) into -# list of corresponding nvidia.* module names (e.g., ['nvidia.cublas', 'nvidia.nccl', 'nvidia-cudnn']), while ignoring -# unrecognized requirements. Intended for use in hooks for frameworks, such as `torch` and `tensorflow`. -def infer_hiddenimports_from_requirements(requirements): - # All nvidia-* packages install to nvidia top-level package, so we cannot query top-level module via - # metadata. Instead, we manually translate them from dist name to package name. - _PATTERN = r'^nvidia-(?P.+)-cu[\d]+$' - nvidia_hiddenimports = [] - - for req in requirements: - m = re.match(_PATTERN, req) - if m is not None: - # Convert - package_name = "nvidia." + m.group('subpackage').replace('-', '_') - nvidia_hiddenimports.append(package_name) - - return nvidia_hiddenimports - - -def create_symlink_suppression_patterns(hook_file): - hook_name, hook_ext = os.path.splitext(os.path.basename(hook_file)) - assert hook_ext.startswith('.py') - assert hook_name.startswith('hook-') - module_name = hook_name[5:] - - # Applicable only to Linux - if not compat.is_linux: - return [] - - # Pattern: **/{module_dir}/lib/lib*.so* - return [os.path.join('**', *module_name.split('.'), 'lib', 'lib*.so*')] diff --git a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/utils/vtkmodules.py b/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/utils/vtkmodules.py deleted file mode 100644 index cd00c97..0000000 --- a/venv/lib/python3.12/site-packages/_pyinstaller_hooks_contrib/utils/vtkmodules.py +++ /dev/null @@ -1,622 +0,0 @@ -import os - -from _pyinstaller_hooks_contrib.compat import importlib_metadata -import packaging.version - -try: - vtk_version = packaging.version.Version(importlib_metadata.version('vtk')).release -except Exception: - vtk_version = None - - -# This list of dependencies was obtained via analysis based on code in `vtkmodules/generate_pyi.py` and augmented with -# missing entries until all tests from `test_vtkmodules` pass. Instead of a pre-computed list, we could dynamically -# analyze each module when the hook is executed; however, such approach would be slower, and would also not account -# for all dependencies that had to be added manually. -# -# NOTE: `vtkmodules.vtkCommonCore` is a dependency of every module, so do not list it here. Modules with no additional -# dependencies are also not listed. -_module_dependencies = { - 'vtkmodules.vtkAcceleratorsVTKmDataModel': [ - 'vtkmodules.vtkAcceleratorsVTKmCore', - 'vtkmodules.vtkCommonDataModel', - ], - 'vtkmodules.vtkAcceleratorsVTKmFilters': [ - 'vtkmodules.vtkAcceleratorsVTKmCore', - 'vtkmodules.vtkAcceleratorsVTKmDataModel', - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkFiltersCore', - 'vtkmodules.vtkFiltersGeneral', - 'vtkmodules.vtkFiltersGeometry', - 'vtkmodules.vtkImagingCore', - ], - 'vtkmodules.vtkChartsCore': [ - 'vtkmodules.vtkRenderingContext2D', - 'vtkmodules.vtkFiltersGeneral', - ], - 'vtkmodules.vtkCommonColor': [ - 'vtkmodules.vtkCommonDataModel', - ], - 'vtkmodules.vtkCommonComputationalGeometry': [ - 'vtkmodules.vtkCommonDataModel', - ], - 'vtkmodules.vtkCommonDataModel': [ - 'vtkmodules.vtkCommonMath', - 'vtkmodules.vtkCommonTransforms', - 'vtkmodules.util.data_model', - ], - 'vtkmodules.vtkCommonExecutionModel': [ - 'vtkmodules.vtkCommonDataModel', - 'vtkmodules.util.execution_model', - ], - 'vtkmodules.vtkCommonMisc': [ - 'vtkmodules.vtkCommonMath', - ], - 'vtkmodules.vtkCommonTransforms': [ - 'vtkmodules.vtkCommonMath', - ], - 'vtkmodules.vtkDomainsChemistry': [ - 'vtkmodules.vtkCommonDataModel', - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkIOLegacy', - 'vtkmodules.vtkIOXMLParser', - 'vtkmodules.vtkRenderingCore', - ], - 'vtkmodules.vtkDomainsChemistryOpenGL2': [ - 'vtkmodules.vtkDomainsChemistry', - 'vtkmodules.vtkRenderingOpenGL2', - ], - 'vtkmodules.vtkFiltersAMR': [ - 'vtkmodules.vtkCommonDataModel', - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkFiltersCellGrid': [ - 'vtkmodules.vtkCommonDataModel', - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkFiltersCore': [ - 'vtkmodules.vtkCommonDataModel', - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkCommonMisc', - ], - 'vtkmodules.vtkFiltersExtraction': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkFiltersGeneral', - ], - 'vtkmodules.vtkFiltersFlowPaths': [ - 'vtkmodules.vtkCommonComputationalGeometry', - 'vtkmodules.vtkCommonDataModel', - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkCommonMath', - ], - 'vtkmodules.vtkFiltersGeneral': [ - 'vtkmodules.vtkCommonDataModel', - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkFiltersCore', - ], - 'vtkmodules.vtkFiltersGeneric': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkFiltersGeometry': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkFiltersGeometryPreview': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkFiltersHybrid': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkCommonTransforms', - 'vtkmodules.vtkFiltersGeometry', - ], - 'vtkmodules.vtkFiltersHyperTree': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkFiltersCore', - 'vtkmodules.vtkFiltersGeneral', - ], - 'vtkmodules.vtkFiltersImaging': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkFiltersStatistics', - ], - 'vtkmodules.vtkFiltersModeling': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkFiltersGeneral', - ], - 'vtkmodules.vtkFiltersParallel': [ - 'vtkmodules.vtkCommonDataModel', - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkFiltersCore', - 'vtkmodules.vtkFiltersExtraction', - 'vtkmodules.vtkFiltersGeneral', - 'vtkmodules.vtkFiltersGeometry', - 'vtkmodules.vtkFiltersHybrid', - 'vtkmodules.vtkFiltersHyperTree', - 'vtkmodules.vtkFiltersModeling', - 'vtkmodules.vtkFiltersSources', - 'vtkmodules.vtkFiltersTexture', - ], - 'vtkmodules.vtkFiltersParallelDIY2': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkFiltersCore', - 'vtkmodules.vtkFiltersParallel', - ], - 'vtkmodules.vtkFiltersParallelImaging': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkFiltersImaging', - 'vtkmodules.vtkFiltersParallel', - 'vtkmodules.vtkImagingCore', - ], - 'vtkmodules.vtkFiltersParallelStatistics': [ - 'vtkmodules.vtkFiltersStatistics', - ], - 'vtkmodules.vtkFiltersPoints': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkFiltersModeling', - ], - 'vtkmodules.vtkFiltersProgrammable': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkFiltersPython': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkFiltersReduction': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkFiltersSMP': [ - 'vtkmodules.vtkCommonDataModel', - 'vtkmodules.vtkFiltersCore', - 'vtkmodules.vtkFiltersGeneral', - ], - 'vtkmodules.vtkFiltersSelection': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkFiltersSources': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkFiltersStatistics': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkFiltersTemporal': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkFiltersCore', - ], - 'vtkmodules.vtkFiltersTensor': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkFiltersTexture': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkFiltersTopology': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkFiltersVerdict': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkGeovisCore': [ - 'vtkmodules.vtkCommonTransforms', - ], - 'vtkmodules.vtkIOAMR': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkIOAsynchronous': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkIOCore', - 'vtkmodules.vtkIOImage', - 'vtkmodules.vtkIOXML', - ], - 'vtkmodules.vtkIOAvmesh': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkIOCore', - ], - 'vtkmodules.vtkIOCGNSReader': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkIOCONVERGECFD': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkIOCellGrid': [ - 'vtkmodules.vtkCommonDataModel', - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkFiltersCellGrid', - 'vtkmodules.vtkIOCore', - ], - 'vtkmodules.vtkIOCesium3DTiles': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkIOCore', - ], - 'vtkmodules.vtkIOChemistry': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkIOCore', - ], - 'vtkmodules.vtkIOCityGML': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkIOCore': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkIOERF': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkIOEnSight': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkIOEngys': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkIOExodus': [ - 'vtkmodules.vtkCommonDataModel', - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkIOCore', - 'vtkmodules.vtkIOXMLParser', - ], - 'vtkmodules.vtkIOExport': [ - 'vtkmodules.vtkIOCore', - 'vtkmodules.vtkIOImage', - 'vtkmodules.vtkIOXML', - 'vtkmodules.vtkRenderingContext2D', - 'vtkmodules.vtkRenderingCore', - 'vtkmodules.vtkRenderingFreeType', - 'vtkmodules.vtkRenderingVtkJS', - ], - 'vtkmodules.vtkIOExportGL2PS': [ - 'vtkmodules.vtkIOExport', - 'vtkmodules.vtkRenderingGL2PSOpenGL2', - ], - 'vtkmodules.vtkIOExportPDF': [ - 'vtkmodules.vtkIOExport', - 'vtkmodules.vtkRenderingContext2D', - ], - 'vtkmodules.vtkIOFDS': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkIOFLUENTCFF': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkIOGeoJSON': [ - 'vtkmodules.vtkCommonDataModel', - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkIOCore', - ], - 'vtkmodules.vtkIOGeometry': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkIOCore', - 'vtkmodules.vtkIOLegacy', - ], - 'vtkmodules.vtkIOH5Rage': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkIOH5part': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkIOHDF': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkIOCore', - ], - 'vtkmodules.vtkIOIOSS': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkFiltersCellGrid', - 'vtkmodules.vtkIOCore', - ], - 'vtkmodules.vtkIOImport': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkIOCore', - 'vtkmodules.vtkRenderingCore', - ], - 'vtkmodules.vtkIOImage': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkImagingCore', - ], - 'vtkmodules.vtkIOInfovis': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkIOLegacy', - 'vtkmodules.vtkIOXML', - ], - 'vtkmodules.vtkIOLANLX3D': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkIOLSDyna': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkIOXMLParser', - ], - 'vtkmodules.vtkIOLegacy': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkIOCellGrid', - 'vtkmodules.vtkIOCore', - ], - 'vtkmodules.vtkIOMINC': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkIOCore', - 'vtkmodules.vtkIOImage', - ], - 'vtkmodules.vtkIOMotionFX': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkIOMovie': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkIONetCDF': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkIOCore', - ], - 'vtkmodules.vtkIOOMF': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkIOOggTheora': [ - 'vtkmodules.vtkIOMovie', - ], - 'vtkmodules.vtkIOPIO': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkIOPLY': [ - 'vtkmodules.vtkIOCore', - ], - 'vtkmodules.vtkIOParallel': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkIOCore', - 'vtkmodules.vtkIOGeometry', - 'vtkmodules.vtkIOImage', - 'vtkmodules.vtkIOLegacy', - ], - 'vtkmodules.vtkIOParallelExodus': [ - 'vtkmodules.vtkIOExodus', - ], - 'vtkmodules.vtkIOParallelLSDyna': [ - 'vtkmodules.vtkIOLSDyna', - ], - 'vtkmodules.vtkIOParallelXML': [ - 'vtkmodules.vtkIOXML', - ], - 'vtkmodules.vtkIOSQL': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkIOCore', - ], - 'vtkmodules.vtkIOSegY': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkIOImage', - ], - 'vtkmodules.vtkIOTRUCHAS': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkIOTecplotTable': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkIOVPIC': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkIOVeraOut': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkIOVideo': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkIOXML': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkIOXMLParser', - ], - 'vtkmodules.vtkIOXMLParser': [ - 'vtkmodules.vtkCommonDataModel', - ], - 'vtkmodules.vtkIOXdmf2': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkIOLegacy', - ], - 'vtkmodules.vtkImagingColor': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkImagingCore', - ], - 'vtkmodules.vtkImagingCore': [ - 'vtkmodules.vtkCommonDataModel', - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkImagingFourier': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkImagingCore', - ], - 'vtkmodules.vtkImagingGeneral': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkImagingCore', - ], - 'vtkmodules.vtkImagingHybrid': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkImagingMath': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkImagingMorphological': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkImagingCore', - 'vtkmodules.vtkImagingGeneral', - ], - 'vtkmodules.vtkImagingOpenGL2': [ - 'vtkmodules.vtkImagingGeneral', - 'vtkmodules.vtkRenderingOpenGL2', - ], - 'vtkmodules.vtkImagingSources': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkImagingStatistics': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkImagingStencil': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkImagingCore', - ], - 'vtkmodules.vtkInfovisCore': [ - 'vtkmodules.vtkCommonColor', - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkImagingSources', - 'vtkmodules.vtkIOImage', - 'vtkmodules.vtkRenderingFreeType', - ], - 'vtkmodules.vtkInfovisLayout': [ - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkInteractionImage': [ - 'vtkmodules.vtkRenderingCore', - ], - 'vtkmodules.vtkInteractionStyle': [ - 'vtkmodules.vtkRenderingCore', - ], - 'vtkmodules.vtkInteractionWidgets': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkFiltersGeneral', - 'vtkmodules.vtkFiltersSources', - 'vtkmodules.vtkRenderingContext2D', - 'vtkmodules.vtkRenderingCore', - ], - 'vtkmodules.vtkPythonContext2D': [ - 'vtkmodules.vtkRenderingContext2D', - ], - 'vtkmodules.vtkRenderingAnnotation': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkRenderingCore', - ], - 'vtkmodules.vtkRenderingCellGrid': [ - 'vtkmodules.vtkFiltersCellGrid', - 'vtkmodules.vtkRenderingCore', - 'vtkmodules.vtkRenderingOpenGL2', - ], - 'vtkmodules.vtkRenderingContext2D': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkRenderingCore', - ], - 'vtkmodules.vtkRenderingContextOpenGL2': [ - 'vtkmodules.vtkRenderingContext2D', - 'vtkmodules.vtkRenderingFreeType', - 'vtkmodules.vtkRenderingOpenGL2', - ], - 'vtkmodules.vtkRenderingCore': [ - 'vtkmodules.vtkCommonDataModel', - 'vtkmodules.vtkCommonExecutionModel', - ], - 'vtkmodules.vtkRenderingExternal': [ - 'vtkmodules.vtkRenderingCore', - 'vtkmodules.vtkRenderingOpenGL2', - ], - 'vtkmodules.vtkRenderingFreeType': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkRenderingCore', - ], - 'vtkmodules.vtkRenderingGridAxes': [ - 'vtkmodules.vtkChartsCore', - 'vtkmodules.vtkRenderingCore', - ], - 'vtkmodules.vtkRenderingGL2PSOpenGL2': [ - 'vtkmodules.vtkRenderingOpenGL2', - ], - 'vtkmodules.vtkRenderingHyperTreeGrid': [ - 'vtkmodules.vtkRenderingCore', - ], - 'vtkmodules.vtkRenderingImage': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkRenderingCore', - ], - 'vtkmodules.vtkRenderingLICOpenGL2': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkRenderingCore', - 'vtkmodules.vtkRenderingOpenGL2', - ], - 'vtkmodules.vtkRenderingLOD': [ - 'vtkmodules.vtkRenderingCore', - ], - 'vtkmodules.vtkRenderingLabel': [ - 'vtkmodules.vtkCommonDataModel', - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkRenderingCore', - 'vtkmodules.vtkRenderingFreeType', - ], - 'vtkmodules.vtkRenderingMatplotlib': [ - 'vtkmodules.vtkRenderingFreeType', - ], - 'vtkmodules.vtkRenderingOpenGL2': [ - 'vtkmodules.vtkFiltersGeneral', - 'vtkmodules.vtkIOImage', - 'vtkmodules.vtkRenderingCore', - 'vtkmodules.vtkRenderingHyperTreeGrid', - 'vtkmodules.vtkRenderingUI', - ], - 'vtkmodules.vtkRenderingParallel': [ - 'vtkmodules.vtkRenderingCore', - 'vtkmodules.vtkRenderingOpenGL2', - ], - 'vtkmodules.vtkRenderingUI': [ - 'vtkmodules.vtkRenderingCore', - ], - 'vtkmodules.vtkRenderingVR': [ - 'vtkmodules.vtkInteractionStyle', - 'vtkmodules.vtkInteractionWidgets', - 'vtkmodules.vtkIOXMLParser', - 'vtkmodules.vtkRenderingCore', - 'vtkmodules.vtkRenderingOpenGL2', - 'vtkmodules.vtkRenderingVolumeOpenGL2', - 'vtkmodules.vtkRenderingVRModels', - ], - 'vtkmodules.vtkRenderingVRModels': [ - 'vtkmodules.vtkRenderingCore', - 'vtkmodules.vtkRenderingOpenGL2', - ], - 'vtkmodules.vtkRenderingVolume': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkRenderingCore', - ], - 'vtkmodules.vtkRenderingVolumeAMR': [ - 'vtkmodules.vtkImagingCore', - 'vtkmodules.vtkRenderingVolume', - 'vtkmodules.vtkRenderingVolumeOpenGL2', - ], - 'vtkmodules.vtkRenderingVolumeOpenGL2': [ - 'vtkmodules.vtkImagingCore', - 'vtkmodules.vtkImagingMath', - 'vtkmodules.vtkRenderingOpenGL2', - 'vtkmodules.vtkRenderingVolume', - ], - 'vtkmodules.vtkRenderingVtkJS': [ - 'vtkmodules.vtkRenderingSceneGraph', - ], - 'vtkmodules.vtkTestingRendering': [ - 'vtkmodules.vtkImagingColor', - 'vtkmodules.vtkIOXML', - 'vtkmodules.vtkRenderingCore', - ], - 'vtkmodules.vtkTestingSerialization': [ - 'vtkmodules.vtkCommonDataModel', - 'vtkmodules.vtkSerializationManager', - ], - 'vtkmodules.vtkViewsContext2D': [ - 'vtkmodules.vtkRenderingCore', - 'vtkmodules.vtkViewsCore', - ], - 'vtkmodules.vtkViewsCore': [ - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkInteractionWidgets', - ], - 'vtkmodules.vtkViewsInfovis': [ - 'vtkmodules.vtkCommonDataModel', - 'vtkmodules.vtkCommonExecutionModel', - 'vtkmodules.vtkInteractionStyle', - 'vtkmodules.vtkRenderingContext2D', - 'vtkmodules.vtkViewsCore', - ], - 'vtkmodules.vtkWebGLExporter': [ - 'vtkmodules.vtkIOExport', - ], -} - -# Additional hidden imports for vtk 9.6.0 -if vtk_version is not None and vtk_version >= (9, 6, 0): - # Additional - _module_dependencies['vtkmodules.vtkIOImage'] += ['vtkmodules.vtkIOCore'] - _module_dependencies['vtkmodules.vtkViewsInfovis'] += ['vtkmodules.vtkChartsCore'] - - # New - _module_dependencies['vtkmodules.vtkSerializationManager'] = ['vtkmodules.vtkCommonDataModel'] - - -def add_vtkmodules_dependencies(hook_file): - # Find the module underlying this vtkmodules hook: change `/path/to/hook-vtkmodules.blah.py` to `vtkmodules.blah`. - hook_name, hook_ext = os.path.splitext(os.path.basename(hook_file)) - assert hook_ext.startswith('.py') - assert hook_name.startswith('hook-') - module_name = hook_name[5:] - - # Look up the list of hidden imports. - return ["vtkmodules.vtkCommonCore", *_module_dependencies.get(module_name, [])] diff --git a/venv/lib/python3.12/site-packages/altgraph-0.17.5.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/altgraph-0.17.5.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/altgraph-0.17.5.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/altgraph-0.17.5.dist-info/LICENSE b/venv/lib/python3.12/site-packages/altgraph-0.17.5.dist-info/LICENSE deleted file mode 100644 index 6013a21..0000000 --- a/venv/lib/python3.12/site-packages/altgraph-0.17.5.dist-info/LICENSE +++ /dev/null @@ -1,18 +0,0 @@ -Copyright (c) 2004 Istvan Albert unless otherwise noted. -Copyright (c) 2006-2010 Bob Ippolito -Copyright (2) 2010-2020 Ronald Oussoren, et. al. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. diff --git a/venv/lib/python3.12/site-packages/altgraph-0.17.5.dist-info/METADATA b/venv/lib/python3.12/site-packages/altgraph-0.17.5.dist-info/METADATA deleted file mode 100644 index 4e53760..0000000 --- a/venv/lib/python3.12/site-packages/altgraph-0.17.5.dist-info/METADATA +++ /dev/null @@ -1,307 +0,0 @@ -Metadata-Version: 2.1 -Name: altgraph -Version: 0.17.5 -Summary: Python graph (network) package -Home-page: https://altgraph.readthedocs.io -Download-URL: http://pypi.python.org/pypi/altgraph -Author: Ronald Oussoren -Author-email: ronaldoussoren@mac.com -Maintainer: Ronald Oussoren -Maintainer-email: ronaldoussoren@mac.com -License: MIT -Keywords: graph -Platform: any -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: 3.14 -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Scientific/Engineering :: Mathematics -Classifier: Topic :: Scientific/Engineering :: Visualization -Description-Content-Type: text/x-rst; charset=UTF-8 -License-File: LICENSE -Project-URL: Documentation, https://altgraph.readthedocs.io/en/latest/ -Project-URL: Issue tracker, https://github.com/ronaldoussoren/altgraph/issues -Project-URL: Repository, https://github.com/ronaldoussoren/altgraph - -altgraph is a fork of graphlib: a graph (network) package for constructing -graphs, BFS and DFS traversals, topological sort, shortest paths, etc. with -graphviz output. - -altgraph includes some additional usage of Python 2.6+ features and -enhancements related to modulegraph and macholib. - -Project links -------------- - -* `Documentation `_ - -* `Issue Tracker `_ - -* `Repository `_ - - -Release history -=============== - -0.17.5 ------- - -* Update classifiers for Python 3.13 and 3.14 - -* Drop dependency on "pkg_resources" - -0.17.4 ------- - -* Update classifiers for Python 3.12 - -0.17.3 ------- - -* Update classifiers for Python 3.11 - -0.17.2 ------- - -* Change in setup.py to fix the sidebar links on PyPI - -0.17.1 ------- - -* Explicitly mark Python 3.10 as supported in wheel metadata. - -0.17 ----- - -* Explicitly mark Python 3.8 as supported in wheel metadata. - -* Migrate from Bitbucket to GitHub - -* Run black on the entire repository - -0.16.1 ------- - -* Explicitly mark Python 3.7 as supported in wheel metadata. - -0.16 ----- - -* Add LICENSE file - -0.15 ----- - -* ``ObjectGraph.get_edges``, ``ObjectGraph.getEdgeData`` and ``ObjectGraph.updateEdgeData`` - accept *None* as the node to get and treat this as an alias for *self* (as other - methods already did). - -0.14 ----- - -- Issue #7: Remove use of ``iteritems`` in altgraph.GraphAlgo code - -0.13 ----- - -- Issue #4: Graph._bfs_subgraph and back_bfs_subgraph return subgraphs with reversed edges - - Fix by "pombredanne" on bitbucket. - - -0.12 ----- - -- Added ``ObjectGraph.edgeData`` to retrieve the edge data - from a specific edge. - -- Added ``AltGraph.update_edge_data`` and ``ObjectGraph.updateEdgeData`` - to update the data associated with a graph edge. - -0.11 ----- - -- Stabilize the order of elements in dot file exports, - patch from bitbucket user 'pombredanne'. - -- Tweak setup.py file to remove dependency on distribute (but - keep the dependency on setuptools) - - -0.10.2 ------- - -- There where no classifiers in the package metadata due to a bug - in setup.py - -0.10.1 ------- - -This is a bugfix release - -Bug fixes: - -- Issue #3: The source archive contains a README.txt - while the setup file refers to ReadMe.txt. - - This is caused by a misfeature in distutils, as a - workaround I've renamed ReadMe.txt to README.txt - in the source tree and setup file. - - -0.10 ------ - -This is a minor feature release - -Features: - -- Do not use "2to3" to support Python 3. - - As a side effect of this altgraph now supports - Python 2.6 and later, and no longer supports - earlier releases of Python. - -- The order of attributes in the Dot output - is now always alphabetical. - - With this change the output will be consistent - between runs and Python versions. - -0.9 ---- - -This is a minor bugfix release - -Features: - -- Added ``altgraph.ObjectGraph.ObjectGraph.nodes``, a method - yielding all nodes in an object graph. - -Bugfixes: - -- The 0.8 release didn't work with py2app when using - python 3.x. - - -0.8 ------ - -This is a minor feature release. The major new feature -is a extensive set of unittests, which explains almost -all other changes in this release. - -Bugfixes: - -- Installing failed with Python 2.5 due to using a distutils - class that isn't available in that version of Python - (issue #1 on the issue tracker) - -- ``altgraph.GraphStat.degree_dist`` now actually works - -- ``altgraph.Graph.add_edge(a, b, create_nodes=False)`` will - no longer create the edge when one of the nodes doesn't - exist. - -- ``altgraph.Graph.forw_topo_sort`` failed for some sparse graphs. - -- ``altgraph.Graph.back_topo_sort`` was completely broken in - previous releases. - -- ``altgraph.Graph.forw_bfs_subgraph`` now actually works. - -- ``altgraph.Graph.back_bfs_subgraph`` now actually works. - -- ``altgraph.Graph.iterdfs`` now returns the correct result - when the ``forward`` argument is ``False``. - -- ``altgraph.Graph.iterdata`` now returns the correct result - when the ``forward`` argument is ``False``. - - -Features: - -- The ``altgraph.Graph`` constructor now accepts an argument - that contains 2- and 3-tuples instead of requireing that - all items have the same size. The (optional) argument can now - also be any iterator. - -- ``altgraph.Graph.Graph.add_node`` has no effect when you - add a hidden node. - -- The private method ``altgraph.Graph._bfs`` is no longer - present. - -- The private method ``altgraph.Graph._dfs`` is no longer - present. - -- ``altgraph.ObjectGraph`` now has a ``__contains__`` methods, - which means you can use the ``in`` operator to check if a - node is part of a graph. - -- ``altgraph.GraphUtil.generate_random_graph`` will raise - ``GraphError`` instead of looping forever when it is - impossible to create the requested graph. - -- ``altgraph.Dot.edge_style`` raises ``GraphError`` when - one of the nodes is not present in the graph. The method - silently added the tail in the past, but without ensuring - a consistent graph state. - -- ``altgraph.Dot.save_img`` now works when the mode is - ``"neato"``. - -0.7.2 ------ - -This is a minor bugfix release - -Bugfixes: - -- distutils didn't include the documentation subtree - -0.7.1 ------ - -This is a minor feature release - -Features: - -- Documentation is now generated using `sphinx `_ - and can be viewed at . - -- The repository has moved to bitbucket - -- ``altgraph.GraphStat.avg_hops`` is no longer present, the function had no - implementation and no specified behaviour. - -- the module ``altgraph.compat`` is gone, which means altgraph will no - longer work with Python 2.3. - - -0.7.0 ------ - -This is a minor feature release. - -Features: - -- Support for Python 3 - -- It is now possible to run tests using 'python setup.py test' - - (The actual testsuite is still very minimal though) diff --git a/venv/lib/python3.12/site-packages/altgraph-0.17.5.dist-info/RECORD b/venv/lib/python3.12/site-packages/altgraph-0.17.5.dist-info/RECORD deleted file mode 100644 index 32d7ddf..0000000 --- a/venv/lib/python3.12/site-packages/altgraph-0.17.5.dist-info/RECORD +++ /dev/null @@ -1,21 +0,0 @@ -altgraph-0.17.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -altgraph-0.17.5.dist-info/LICENSE,sha256=bBlNbbDGTUVTXRDJUUK5sM2nt9zH8d3uMCs9U289vkY,1002 -altgraph-0.17.5.dist-info/METADATA,sha256=3GBkHboimjrvCfdk9WLDjZCLkwySYVry5iavMdb_GbU,7519 -altgraph-0.17.5.dist-info/RECORD,, -altgraph-0.17.5.dist-info/WHEEL,sha256=iYlv5fX357PQyRT2o6tw1bN-YcKFFHKqB_LwHO5wP-g,110 -altgraph-0.17.5.dist-info/top_level.txt,sha256=HEBeRWf5ItVPc7Y9hW7hGlrLXZjPoL4by6CAhBV_BwA,9 -altgraph-0.17.5.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 -altgraph/Dot.py,sha256=gKEp6Su_CoOWQYt5HIVs_7MBYK1BEOhKX0RLAAA-vQs,9929 -altgraph/Graph.py,sha256=6b6fSHLA5QSqMDnSHIO7_WJnBYIdq3K5Bt8VipRODwg,20788 -altgraph/GraphAlgo.py,sha256=Uu9aTjSKWi38iQ_e9ZrwCnzQaI1WWFDhJ6kfmu0jxAA,5645 -altgraph/GraphStat.py,sha256=LKya4BKXJ5GZi5-sNYU17aOBTLxqn_tVgbiw4sWGYIU,1888 -altgraph/GraphUtil.py,sha256=1T4DJc2bJn6EIU_Ct4m0oiKlXWkXvqcXE8CGL2K9en8,3990 -altgraph/ObjectGraph.py,sha256=o7fPJtyBEgJSXAkUjzvj35B-FOY4uKzfLGqSvTitx8c,6490 -altgraph/__init__.py,sha256=Glu2oEC9U0oZLDEIJeudig16inwTvSiDKw8Av17_aNE,4957 -altgraph/__pycache__/Dot.cpython-312.pyc,, -altgraph/__pycache__/Graph.cpython-312.pyc,, -altgraph/__pycache__/GraphAlgo.cpython-312.pyc,, -altgraph/__pycache__/GraphStat.cpython-312.pyc,, -altgraph/__pycache__/GraphUtil.cpython-312.pyc,, -altgraph/__pycache__/ObjectGraph.cpython-312.pyc,, -altgraph/__pycache__/__init__.cpython-312.pyc,, diff --git a/venv/lib/python3.12/site-packages/altgraph-0.17.5.dist-info/WHEEL b/venv/lib/python3.12/site-packages/altgraph-0.17.5.dist-info/WHEEL deleted file mode 100644 index c34f116..0000000 --- a/venv/lib/python3.12/site-packages/altgraph-0.17.5.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.41.2) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/venv/lib/python3.12/site-packages/altgraph-0.17.5.dist-info/top_level.txt b/venv/lib/python3.12/site-packages/altgraph-0.17.5.dist-info/top_level.txt deleted file mode 100644 index 5ad6b8a..0000000 --- a/venv/lib/python3.12/site-packages/altgraph-0.17.5.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -altgraph diff --git a/venv/lib/python3.12/site-packages/altgraph-0.17.5.dist-info/zip-safe b/venv/lib/python3.12/site-packages/altgraph-0.17.5.dist-info/zip-safe deleted file mode 100644 index 8b13789..0000000 --- a/venv/lib/python3.12/site-packages/altgraph-0.17.5.dist-info/zip-safe +++ /dev/null @@ -1 +0,0 @@ - diff --git a/venv/lib/python3.12/site-packages/altgraph/Dot.py b/venv/lib/python3.12/site-packages/altgraph/Dot.py deleted file mode 100644 index 1d19cb1..0000000 --- a/venv/lib/python3.12/site-packages/altgraph/Dot.py +++ /dev/null @@ -1,321 +0,0 @@ -""" -altgraph.Dot - Interface to the dot language -============================================ - -The :py:mod:`~altgraph.Dot` module provides a simple interface to the -file format used in the -`graphviz `_ -program. The module is intended to offload the most tedious part of the process -(the **dot** file generation) while transparently exposing most of its -features. - -To display the graphs or to generate image files the -`graphviz `_ -package needs to be installed on the system, moreover the :command:`dot` and -:command:`dotty` programs must be accesible in the program path so that they -can be ran from processes spawned within the module. - -Example usage -------------- - -Here is a typical usage:: - - from altgraph import Graph, Dot - - # create a graph - edges = [ (1,2), (1,3), (3,4), (3,5), (4,5), (5,4) ] - graph = Graph.Graph(edges) - - # create a dot representation of the graph - dot = Dot.Dot(graph) - - # display the graph - dot.display() - - # save the dot representation into the mydot.dot file - dot.save_dot(file_name='mydot.dot') - - # save dot file as gif image into the graph.gif file - dot.save_img(file_name='graph', file_type='gif') - -Directed graph and non-directed graph -------------------------------------- - -Dot class can use for both directed graph and non-directed graph -by passing ``graphtype`` parameter. - -Example:: - - # create directed graph(default) - dot = Dot.Dot(graph, graphtype="digraph") - - # create non-directed graph - dot = Dot.Dot(graph, graphtype="graph") - -Customizing the output ----------------------- - -The graph drawing process may be customized by passing -valid :command:`dot` parameters for the nodes and edges. For a list of all -parameters see the `graphviz `_ -documentation. - -Example:: - - # customizing the way the overall graph is drawn - dot.style(size='10,10', rankdir='RL', page='5, 5' , ranksep=0.75) - - # customizing node drawing - dot.node_style(1, label='BASE_NODE',shape='box', color='blue' ) - dot.node_style(2, style='filled', fillcolor='red') - - # customizing edge drawing - dot.edge_style(1, 2, style='dotted') - dot.edge_style(3, 5, arrowhead='dot', label='binds', labelangle='90') - dot.edge_style(4, 5, arrowsize=2, style='bold') - - -.. note:: - - dotty (invoked via :py:func:`~altgraph.Dot.display`) may not be able to - display all graphics styles. To verify the output save it to an image file - and look at it that way. - -Valid attributes ----------------- - - - dot styles, passed via the :py:meth:`Dot.style` method:: - - rankdir = 'LR' (draws the graph horizontally, left to right) - ranksep = number (rank separation in inches) - - - node attributes, passed via the :py:meth:`Dot.node_style` method:: - - style = 'filled' | 'invisible' | 'diagonals' | 'rounded' - shape = 'box' | 'ellipse' | 'circle' | 'point' | 'triangle' - - - edge attributes, passed via the :py:meth:`Dot.edge_style` method:: - - style = 'dashed' | 'dotted' | 'solid' | 'invis' | 'bold' - arrowhead = 'box' | 'crow' | 'diamond' | 'dot' | 'inv' | 'none' - | 'tee' | 'vee' - weight = number (the larger the number the closer the nodes will be) - - - valid `graphviz colors - `_ - - - for more details on how to control the graph drawing process see the - `graphviz reference - `_. -""" -import os -import warnings - -from altgraph import GraphError - - -class Dot(object): - """ - A class providing a **graphviz** (dot language) representation - allowing a fine grained control over how the graph is being - displayed. - - If the :command:`dot` and :command:`dotty` programs are not in the current - system path their location needs to be specified in the contructor. - """ - - def __init__( - self, - graph=None, - nodes=None, - edgefn=None, - nodevisitor=None, - edgevisitor=None, - name="G", - dot="dot", - dotty="dotty", - neato="neato", - graphtype="digraph", - ): - """ - Initialization. - """ - self.name, self.attr = name, {} - - assert graphtype in ["graph", "digraph"] - self.type = graphtype - - self.temp_dot = "tmp_dot.dot" - self.temp_neo = "tmp_neo.dot" - - self.dot, self.dotty, self.neato = dot, dotty, neato - - # self.nodes: node styles - # self.edges: edge styles - self.nodes, self.edges = {}, {} - - if graph is not None and nodes is None: - nodes = graph - if graph is not None and edgefn is None: - - def edgefn(node, graph=graph): - return graph.out_nbrs(node) - - if nodes is None: - nodes = () - - seen = set() - for node in nodes: - if nodevisitor is None: - style = {} - else: - style = nodevisitor(node) - if style is not None: - self.nodes[node] = {} - self.node_style(node, **style) - seen.add(node) - if edgefn is not None: - for head in seen: - for tail in (n for n in edgefn(head) if n in seen): - if edgevisitor is None: - edgestyle = {} - else: - edgestyle = edgevisitor(head, tail) - if edgestyle is not None: - if head not in self.edges: - self.edges[head] = {} - self.edges[head][tail] = {} - self.edge_style(head, tail, **edgestyle) - - def style(self, **attr): - """ - Changes the overall style - """ - self.attr = attr - - def display(self, mode="dot"): - """ - Displays the current graph via dotty - """ - - if mode == "neato": - self.save_dot(self.temp_neo) - neato_cmd = "%s -o %s %s" % (self.neato, self.temp_dot, self.temp_neo) - os.system(neato_cmd) - else: - self.save_dot(self.temp_dot) - - plot_cmd = "%s %s" % (self.dotty, self.temp_dot) - os.system(plot_cmd) - - def node_style(self, node, **kwargs): - """ - Modifies a node style to the dot representation. - """ - if node not in self.edges: - self.edges[node] = {} - self.nodes[node] = kwargs - - def all_node_style(self, **kwargs): - """ - Modifies all node styles - """ - for node in self.nodes: - self.node_style(node, **kwargs) - - def edge_style(self, head, tail, **kwargs): - """ - Modifies an edge style to the dot representation. - """ - if tail not in self.nodes: - raise GraphError("invalid node %s" % (tail,)) - - try: - if tail not in self.edges[head]: - self.edges[head][tail] = {} - self.edges[head][tail] = kwargs - except KeyError: - raise GraphError("invalid edge %s -> %s " % (head, tail)) - - def iterdot(self): - # write graph title - if self.type == "digraph": - yield "digraph %s {\n" % (self.name,) - elif self.type == "graph": - yield "graph %s {\n" % (self.name,) - - else: - raise GraphError("unsupported graphtype %s" % (self.type,)) - - # write overall graph attributes - for attr_name, attr_value in sorted(self.attr.items()): - yield '%s="%s";' % (attr_name, attr_value) - yield "\n" - - # some reusable patterns - cpatt = '%s="%s",' # to separate attributes - epatt = "];\n" # to end attributes - - # write node attributes - for node_name, node_attr in sorted(self.nodes.items()): - yield '\t"%s" [' % (node_name,) - for attr_name, attr_value in sorted(node_attr.items()): - yield cpatt % (attr_name, attr_value) - yield epatt - - # write edge attributes - for head in sorted(self.edges): - for tail in sorted(self.edges[head]): - if self.type == "digraph": - yield '\t"%s" -> "%s" [' % (head, tail) - else: - yield '\t"%s" -- "%s" [' % (head, tail) - for attr_name, attr_value in sorted(self.edges[head][tail].items()): - yield cpatt % (attr_name, attr_value) - yield epatt - - # finish file - yield "}\n" - - def __iter__(self): - return self.iterdot() - - def save_dot(self, file_name=None): - """ - Saves the current graph representation into a file - """ - - if not file_name: - warnings.warn(DeprecationWarning, "always pass a file_name", stacklevel=2) - file_name = self.temp_dot - - with open(file_name, "w") as fp: - for chunk in self.iterdot(): - fp.write(chunk) - - def save_img(self, file_name=None, file_type="gif", mode="dot"): - """ - Saves the dot file as an image file - """ - - if not file_name: - warnings.warn(DeprecationWarning, "always pass a file_name", stacklevel=2) - file_name = "out" - - if mode == "neato": - self.save_dot(self.temp_neo) - neato_cmd = "%s -o %s %s" % (self.neato, self.temp_dot, self.temp_neo) - os.system(neato_cmd) - plot_cmd = self.dot - else: - self.save_dot(self.temp_dot) - plot_cmd = self.dot - - file_name = "%s.%s" % (file_name, file_type) - create_cmd = "%s -T%s %s -o %s" % ( - plot_cmd, - file_type, - self.temp_dot, - file_name, - ) - os.system(create_cmd) diff --git a/venv/lib/python3.12/site-packages/altgraph/Graph.py b/venv/lib/python3.12/site-packages/altgraph/Graph.py deleted file mode 100644 index 8088007..0000000 --- a/venv/lib/python3.12/site-packages/altgraph/Graph.py +++ /dev/null @@ -1,682 +0,0 @@ -""" -altgraph.Graph - Base Graph class -================================= - -.. - #--Version 2.1 - #--Bob Ippolito October, 2004 - - #--Version 2.0 - #--Istvan Albert June, 2004 - - #--Version 1.0 - #--Nathan Denny, May 27, 1999 -""" - -from collections import deque - -from altgraph import GraphError - - -class Graph(object): - """ - The Graph class represents a directed graph with *N* nodes and *E* edges. - - Naming conventions: - - - the prefixes such as *out*, *inc* and *all* will refer to methods - that operate on the outgoing, incoming or all edges of that node. - - For example: :py:meth:`inc_degree` will refer to the degree of the node - computed over the incoming edges (the number of neighbours linking to - the node). - - - the prefixes such as *forw* and *back* will refer to the - orientation of the edges used in the method with respect to the node. - - For example: :py:meth:`forw_bfs` will start at the node then use the - outgoing edges to traverse the graph (goes forward). - """ - - def __init__(self, edges=None): - """ - Initialization - """ - - self.next_edge = 0 - self.nodes, self.edges = {}, {} - self.hidden_edges, self.hidden_nodes = {}, {} - - if edges is not None: - for item in edges: - if len(item) == 2: - head, tail = item - self.add_edge(head, tail) - elif len(item) == 3: - head, tail, data = item - self.add_edge(head, tail, data) - else: - raise GraphError("Cannot create edge from %s" % (item,)) - - def __repr__(self): - return "" % ( - self.number_of_nodes(), - self.number_of_edges(), - ) - - def add_node(self, node, node_data=None): - """ - Adds a new node to the graph. Arbitrary data can be attached to the - node via the node_data parameter. Adding the same node twice will be - silently ignored. - - The node must be a hashable value. - """ - # - # the nodes will contain tuples that will store incoming edges, - # outgoing edges and data - # - # index 0 -> incoming edges - # index 1 -> outgoing edges - - if node in self.hidden_nodes: - # Node is present, but hidden - return - - if node not in self.nodes: - self.nodes[node] = ([], [], node_data) - - def add_edge(self, head_id, tail_id, edge_data=1, create_nodes=True): - """ - Adds a directed edge going from head_id to tail_id. - Arbitrary data can be attached to the edge via edge_data. - It may create the nodes if adding edges between nonexisting ones. - - :param head_id: head node - :param tail_id: tail node - :param edge_data: (optional) data attached to the edge - :param create_nodes: (optional) creates the head_id or tail_id - node in case they did not exist - """ - # shorcut - edge = self.next_edge - - # add nodes if on automatic node creation - if create_nodes: - self.add_node(head_id) - self.add_node(tail_id) - - # update the corresponding incoming and outgoing lists in the nodes - # index 0 -> incoming edges - # index 1 -> outgoing edges - - try: - self.nodes[tail_id][0].append(edge) - self.nodes[head_id][1].append(edge) - except KeyError: - raise GraphError("Invalid nodes %s -> %s" % (head_id, tail_id)) - - # store edge information - self.edges[edge] = (head_id, tail_id, edge_data) - - self.next_edge += 1 - - def hide_edge(self, edge): - """ - Hides an edge from the graph. The edge may be unhidden at some later - time. - """ - try: - head_id, tail_id, edge_data = self.hidden_edges[edge] = self.edges[edge] - self.nodes[tail_id][0].remove(edge) - self.nodes[head_id][1].remove(edge) - del self.edges[edge] - except KeyError: - raise GraphError("Invalid edge %s" % edge) - - def hide_node(self, node): - """ - Hides a node from the graph. The incoming and outgoing edges of the - node will also be hidden. The node may be unhidden at some later time. - """ - try: - all_edges = self.all_edges(node) - self.hidden_nodes[node] = (self.nodes[node], all_edges) - for edge in all_edges: - self.hide_edge(edge) - del self.nodes[node] - except KeyError: - raise GraphError("Invalid node %s" % node) - - def restore_node(self, node): - """ - Restores a previously hidden node back into the graph and restores - all of its incoming and outgoing edges. - """ - try: - self.nodes[node], all_edges = self.hidden_nodes[node] - for edge in all_edges: - self.restore_edge(edge) - del self.hidden_nodes[node] - except KeyError: - raise GraphError("Invalid node %s" % node) - - def restore_edge(self, edge): - """ - Restores a previously hidden edge back into the graph. - """ - try: - head_id, tail_id, data = self.hidden_edges[edge] - self.nodes[tail_id][0].append(edge) - self.nodes[head_id][1].append(edge) - self.edges[edge] = head_id, tail_id, data - del self.hidden_edges[edge] - except KeyError: - raise GraphError("Invalid edge %s" % edge) - - def restore_all_edges(self): - """ - Restores all hidden edges. - """ - for edge in list(self.hidden_edges.keys()): - try: - self.restore_edge(edge) - except GraphError: - pass - - def restore_all_nodes(self): - """ - Restores all hidden nodes. - """ - for node in list(self.hidden_nodes.keys()): - self.restore_node(node) - - def __contains__(self, node): - """ - Test whether a node is in the graph - """ - return node in self.nodes - - def edge_by_id(self, edge): - """ - Returns the edge that connects the head_id and tail_id nodes - """ - try: - head, tail, data = self.edges[edge] - except KeyError: - head, tail = None, None - raise GraphError("Invalid edge %s" % edge) - - return (head, tail) - - def edge_by_node(self, head, tail): - """ - Returns the edge that connects the head_id and tail_id nodes - """ - for edge in self.out_edges(head): - if self.tail(edge) == tail: - return edge - return None - - def number_of_nodes(self): - """ - Returns the number of nodes - """ - return len(self.nodes) - - def number_of_edges(self): - """ - Returns the number of edges - """ - return len(self.edges) - - def __iter__(self): - """ - Iterates over all nodes in the graph - """ - return iter(self.nodes) - - def node_list(self): - """ - Return a list of the node ids for all visible nodes in the graph. - """ - return list(self.nodes.keys()) - - def edge_list(self): - """ - Returns an iterator for all visible nodes in the graph. - """ - return list(self.edges.keys()) - - def number_of_hidden_edges(self): - """ - Returns the number of hidden edges - """ - return len(self.hidden_edges) - - def number_of_hidden_nodes(self): - """ - Returns the number of hidden nodes - """ - return len(self.hidden_nodes) - - def hidden_node_list(self): - """ - Returns the list with the hidden nodes - """ - return list(self.hidden_nodes.keys()) - - def hidden_edge_list(self): - """ - Returns a list with the hidden edges - """ - return list(self.hidden_edges.keys()) - - def describe_node(self, node): - """ - return node, node data, outgoing edges, incoming edges for node - """ - incoming, outgoing, data = self.nodes[node] - return node, data, outgoing, incoming - - def describe_edge(self, edge): - """ - return edge, edge data, head, tail for edge - """ - head, tail, data = self.edges[edge] - return edge, data, head, tail - - def node_data(self, node): - """ - Returns the data associated with a node - """ - return self.nodes[node][2] - - def edge_data(self, edge): - """ - Returns the data associated with an edge - """ - return self.edges[edge][2] - - def update_edge_data(self, edge, edge_data): - """ - Replace the edge data for a specific edge - """ - self.edges[edge] = self.edges[edge][0:2] + (edge_data,) - - def head(self, edge): - """ - Returns the node of the head of the edge. - """ - return self.edges[edge][0] - - def tail(self, edge): - """ - Returns node of the tail of the edge. - """ - return self.edges[edge][1] - - def out_nbrs(self, node): - """ - List of nodes connected by outgoing edges - """ - return [self.tail(n) for n in self.out_edges(node)] - - def inc_nbrs(self, node): - """ - List of nodes connected by incoming edges - """ - return [self.head(n) for n in self.inc_edges(node)] - - def all_nbrs(self, node): - """ - List of nodes connected by incoming and outgoing edges - """ - return list(dict.fromkeys(self.inc_nbrs(node) + self.out_nbrs(node))) - - def out_edges(self, node): - """ - Returns a list of the outgoing edges - """ - try: - return list(self.nodes[node][1]) - except KeyError: - raise GraphError("Invalid node %s" % node) - - def inc_edges(self, node): - """ - Returns a list of the incoming edges - """ - try: - return list(self.nodes[node][0]) - except KeyError: - raise GraphError("Invalid node %s" % node) - - def all_edges(self, node): - """ - Returns a list of incoming and outging edges. - """ - return set(self.inc_edges(node) + self.out_edges(node)) - - def out_degree(self, node): - """ - Returns the number of outgoing edges - """ - return len(self.out_edges(node)) - - def inc_degree(self, node): - """ - Returns the number of incoming edges - """ - return len(self.inc_edges(node)) - - def all_degree(self, node): - """ - The total degree of a node - """ - return self.inc_degree(node) + self.out_degree(node) - - def _topo_sort(self, forward=True): - """ - Topological sort. - - Returns a list of nodes where the successors (based on outgoing and - incoming edges selected by the forward parameter) of any given node - appear in the sequence after that node. - """ - topo_list = [] - queue = deque() - indeg = {} - - # select the operation that will be performed - if forward: - get_edges = self.out_edges - get_degree = self.inc_degree - get_next = self.tail - else: - get_edges = self.inc_edges - get_degree = self.out_degree - get_next = self.head - - for node in self.node_list(): - degree = get_degree(node) - if degree: - indeg[node] = degree - else: - queue.append(node) - - while queue: - curr_node = queue.popleft() - topo_list.append(curr_node) - for edge in get_edges(curr_node): - tail_id = get_next(edge) - if tail_id in indeg: - indeg[tail_id] -= 1 - if indeg[tail_id] == 0: - queue.append(tail_id) - - if len(topo_list) == len(self.node_list()): - valid = True - else: - # the graph has cycles, invalid topological sort - valid = False - - return (valid, topo_list) - - def forw_topo_sort(self): - """ - Topological sort. - - Returns a list of nodes where the successors (based on outgoing edges) - of any given node appear in the sequence after that node. - """ - return self._topo_sort(forward=True) - - def back_topo_sort(self): - """ - Reverse topological sort. - - Returns a list of nodes where the successors (based on incoming edges) - of any given node appear in the sequence after that node. - """ - return self._topo_sort(forward=False) - - def _bfs_subgraph(self, start_id, forward=True): - """ - Private method creates a subgraph in a bfs order. - - The forward parameter specifies whether it is a forward or backward - traversal. - """ - if forward: - get_bfs = self.forw_bfs - get_nbrs = self.out_nbrs - else: - get_bfs = self.back_bfs - get_nbrs = self.inc_nbrs - - g = Graph() - bfs_list = get_bfs(start_id) - for node in bfs_list: - g.add_node(node) - - for node in bfs_list: - for nbr_id in get_nbrs(node): - if forward: - g.add_edge(node, nbr_id) - else: - g.add_edge(nbr_id, node) - - return g - - def forw_bfs_subgraph(self, start_id): - """ - Creates and returns a subgraph consisting of the breadth first - reachable nodes based on their outgoing edges. - """ - return self._bfs_subgraph(start_id, forward=True) - - def back_bfs_subgraph(self, start_id): - """ - Creates and returns a subgraph consisting of the breadth first - reachable nodes based on the incoming edges. - """ - return self._bfs_subgraph(start_id, forward=False) - - def iterdfs(self, start, end=None, forward=True): - """ - Collecting nodes in some depth first traversal. - - The forward parameter specifies whether it is a forward or backward - traversal. - """ - visited, stack = {start}, deque([start]) - - if forward: - get_edges = self.out_edges - get_next = self.tail - else: - get_edges = self.inc_edges - get_next = self.head - - while stack: - curr_node = stack.pop() - yield curr_node - if curr_node == end: - break - for edge in sorted(get_edges(curr_node)): - tail = get_next(edge) - if tail not in visited: - visited.add(tail) - stack.append(tail) - - def iterdata(self, start, end=None, forward=True, condition=None): - """ - Perform a depth-first walk of the graph (as ``iterdfs``) - and yield the item data of every node where condition matches. The - condition callback is only called when node_data is not None. - """ - - visited, stack = {start}, deque([start]) - - if forward: - get_edges = self.out_edges - get_next = self.tail - else: - get_edges = self.inc_edges - get_next = self.head - - get_data = self.node_data - - while stack: - curr_node = stack.pop() - curr_data = get_data(curr_node) - if curr_data is not None: - if condition is not None and not condition(curr_data): - continue - yield curr_data - if curr_node == end: - break - for edge in get_edges(curr_node): - tail = get_next(edge) - if tail not in visited: - visited.add(tail) - stack.append(tail) - - def _iterbfs(self, start, end=None, forward=True): - """ - The forward parameter specifies whether it is a forward or backward - traversal. Returns a list of tuples where the first value is the hop - value the second value is the node id. - """ - queue, visited = deque([(start, 0)]), {start} - - # the direction of the bfs depends on the edges that are sampled - if forward: - get_edges = self.out_edges - get_next = self.tail - else: - get_edges = self.inc_edges - get_next = self.head - - while queue: - curr_node, curr_step = queue.popleft() - yield (curr_node, curr_step) - if curr_node == end: - break - for edge in get_edges(curr_node): - tail = get_next(edge) - if tail not in visited: - visited.add(tail) - queue.append((tail, curr_step + 1)) - - def forw_bfs(self, start, end=None): - """ - Returns a list of nodes in some forward BFS order. - - Starting from the start node the breadth first search proceeds along - outgoing edges. - """ - return [node for node, step in self._iterbfs(start, end, forward=True)] - - def back_bfs(self, start, end=None): - """ - Returns a list of nodes in some backward BFS order. - - Starting from the start node the breadth first search proceeds along - incoming edges. - """ - return [node for node, _ in self._iterbfs(start, end, forward=False)] - - def forw_dfs(self, start, end=None): - """ - Returns a list of nodes in some forward DFS order. - - Starting with the start node the depth first search proceeds along - outgoing edges. - """ - return list(self.iterdfs(start, end, forward=True)) - - def back_dfs(self, start, end=None): - """ - Returns a list of nodes in some backward DFS order. - - Starting from the start node the depth first search proceeds along - incoming edges. - """ - return list(self.iterdfs(start, end, forward=False)) - - def connected(self): - """ - Returns :py:data:`True` if the graph's every node can be reached from - every other node. - """ - node_list = self.node_list() - for node in node_list: - bfs_list = self.forw_bfs(node) - if len(bfs_list) != len(node_list): - return False - return True - - def clust_coef(self, node): - """ - Computes and returns the local clustering coefficient of node. - - The local cluster coefficient is proportion of the actual number of - edges between neighbours of node and the maximum number of edges - between those neighbours. - - See "Local Clustering Coefficient" on - - for a formal definition. - """ - num = 0 - nbr_set = set(self.out_nbrs(node)) - - if node in nbr_set: - nbr_set.remove(node) # loop defense - - for nbr in nbr_set: - sec_set = set(self.out_nbrs(nbr)) - if nbr in sec_set: - sec_set.remove(nbr) # loop defense - num += len(nbr_set & sec_set) - - nbr_num = len(nbr_set) - if nbr_num: - clust_coef = float(num) / (nbr_num * (nbr_num - 1)) - else: - clust_coef = 0.0 - return clust_coef - - def get_hops(self, start, end=None, forward=True): - """ - Computes the hop distance to all nodes centered around a node. - - First order neighbours are at hop 1, their neigbours are at hop 2 etc. - Uses :py:meth:`forw_bfs` or :py:meth:`back_bfs` depending on the value - of the forward parameter. If the distance between all neighbouring - nodes is 1 the hop number corresponds to the shortest distance between - the nodes. - - :param start: the starting node - :param end: ending node (optional). When not specified will search the - whole graph. - :param forward: directionality parameter (optional). - If C{True} (default) it uses L{forw_bfs} otherwise L{back_bfs}. - :return: returns a list of tuples where each tuple contains the - node and the hop. - - Typical usage:: - - >>> print (graph.get_hops(1, 8)) - >>> [(1, 0), (2, 1), (3, 1), (4, 2), (5, 3), (7, 4), (8, 5)] - # node 1 is at 0 hops - # node 2 is at 1 hop - # ... - # node 8 is at 5 hops - """ - if forward: - return list(self._iterbfs(start=start, end=end, forward=True)) - else: - return list(self._iterbfs(start=start, end=end, forward=False)) diff --git a/venv/lib/python3.12/site-packages/altgraph/GraphAlgo.py b/venv/lib/python3.12/site-packages/altgraph/GraphAlgo.py deleted file mode 100644 index f93e73d..0000000 --- a/venv/lib/python3.12/site-packages/altgraph/GraphAlgo.py +++ /dev/null @@ -1,171 +0,0 @@ -""" -altgraph.GraphAlgo - Graph algorithms -===================================== -""" -from altgraph import GraphError - - -def dijkstra(graph, start, end=None): - """ - Dijkstra's algorithm for shortest paths - - `David Eppstein, UC Irvine, 4 April 2002 - `_ - - `Python Cookbook Recipe - `_ - - Find shortest paths from the start node to all nodes nearer than or - equal to the end node. - - Dijkstra's algorithm is only guaranteed to work correctly when all edge - lengths are positive. This code does not verify this property for all - edges (only the edges examined until the end vertex is reached), but will - correctly compute shortest paths even for some graphs with negative edges, - and will raise an exception if it discovers that a negative edge has - caused it to make a mistake. - - Adapted to altgraph by Istvan Albert, Pennsylvania State University - - June, 9 2004 - """ - D = {} # dictionary of final distances - P = {} # dictionary of predecessors - Q = _priorityDictionary() # estimated distances of non-final vertices - Q[start] = 0 - - for v in Q: - D[v] = Q[v] - if v == end: - break - - for w in graph.out_nbrs(v): - edge_id = graph.edge_by_node(v, w) - vwLength = D[v] + graph.edge_data(edge_id) - if w in D: - if vwLength < D[w]: - raise GraphError( - "Dijkstra: found better path to already-final vertex" - ) - elif w not in Q or vwLength < Q[w]: - Q[w] = vwLength - P[w] = v - - return (D, P) - - -def shortest_path(graph, start, end): - """ - Find a single shortest path from the *start* node to the *end* node. - The input has the same conventions as dijkstra(). The output is a list of - the nodes in order along the shortest path. - - **Note that the distances must be stored in the edge data as numeric data** - """ - - D, P = dijkstra(graph, start, end) - Path = [] - while 1: - Path.append(end) - if end == start: - break - end = P[end] - Path.reverse() - return Path - - -# -# Utility classes and functions -# -class _priorityDictionary(dict): - """ - Priority dictionary using binary heaps (internal use only) - - David Eppstein, UC Irvine, 8 Mar 2002 - - Implements a data structure that acts almost like a dictionary, with - two modifications: - - 1. D.smallest() returns the value x minimizing D[x]. For this to - work correctly, all values D[x] stored in the dictionary must be - comparable. - - 2. iterating "for x in D" finds and removes the items from D in sorted - order. Each item is not removed until the next item is requested, - so D[x] will still return a useful value until the next iteration - of the for-loop. Each operation takes logarithmic amortized time. - """ - - def __init__(self): - """ - Initialize priorityDictionary by creating binary heap of pairs - (value,key). Note that changing or removing a dict entry will not - remove the old pair from the heap until it is found by smallest() - or until the heap is rebuilt. - """ - self.__heap = [] - dict.__init__(self) - - def smallest(self): - """ - Find smallest item after removing deleted items from front of heap. - """ - if len(self) == 0: - raise IndexError("smallest of empty priorityDictionary") - heap = self.__heap - while heap[0][1] not in self or self[heap[0][1]] != heap[0][0]: - lastItem = heap.pop() - insertionPoint = 0 - while 1: - smallChild = 2 * insertionPoint + 1 - if ( - smallChild + 1 < len(heap) - and heap[smallChild] > heap[smallChild + 1] - ): - smallChild += 1 - if smallChild >= len(heap) or lastItem <= heap[smallChild]: - heap[insertionPoint] = lastItem - break - heap[insertionPoint] = heap[smallChild] - insertionPoint = smallChild - return heap[0][1] - - def __iter__(self): - """ - Create destructive sorted iterator of priorityDictionary. - """ - - def iterfn(): - while len(self) > 0: - x = self.smallest() - yield x - del self[x] - - return iterfn() - - def __setitem__(self, key, val): - """ - Change value stored in dictionary and add corresponding pair to heap. - Rebuilds the heap if the number of deleted items gets large, to avoid - memory leakage. - """ - dict.__setitem__(self, key, val) - heap = self.__heap - if len(heap) > 2 * len(self): - self.__heap = [(v, k) for k, v in self.items()] - self.__heap.sort() - else: - newPair = (val, key) - insertionPoint = len(heap) - heap.append(None) - while insertionPoint > 0 and newPair < heap[(insertionPoint - 1) // 2]: - heap[insertionPoint] = heap[(insertionPoint - 1) // 2] - insertionPoint = (insertionPoint - 1) // 2 - heap[insertionPoint] = newPair - - def setdefault(self, key, val): - """ - Reimplement setdefault to pass through our customized __setitem__. - """ - if key not in self: - self[key] = val - return self[key] diff --git a/venv/lib/python3.12/site-packages/altgraph/GraphStat.py b/venv/lib/python3.12/site-packages/altgraph/GraphStat.py deleted file mode 100644 index cccc66d..0000000 --- a/venv/lib/python3.12/site-packages/altgraph/GraphStat.py +++ /dev/null @@ -1,73 +0,0 @@ -""" -altgraph.GraphStat - Functions providing various graph statistics -================================================================= -""" - - -def degree_dist(graph, limits=(0, 0), bin_num=10, mode="out"): - """ - Computes the degree distribution for a graph. - - Returns a list of tuples where the first element of the tuple is the - center of the bin representing a range of degrees and the second element - of the tuple are the number of nodes with the degree falling in the range. - - Example:: - - .... - """ - - deg = [] - if mode == "inc": - get_deg = graph.inc_degree - else: - get_deg = graph.out_degree - - for node in graph: - deg.append(get_deg(node)) - - if not deg: - return [] - - results = _binning(values=deg, limits=limits, bin_num=bin_num) - - return results - - -_EPS = 1.0 / (2.0**32) - - -def _binning(values, limits=(0, 0), bin_num=10): - """ - Bins data that falls between certain limits, if the limits are (0, 0) the - minimum and maximum values are used. - - Returns a list of tuples where the first element of the tuple is the - center of the bin and the second element of the tuple are the counts. - """ - if limits == (0, 0): - min_val, max_val = min(values) - _EPS, max(values) + _EPS - else: - min_val, max_val = limits - - # get bin size - bin_size = (max_val - min_val) / float(bin_num) - bins = [0] * (bin_num) - - # will ignore these outliers for now - for value in values: - try: - if (value - min_val) >= 0: - index = int((value - min_val) / float(bin_size)) - bins[index] += 1 - except IndexError: - pass - - # make it ready for an x,y plot - result = [] - center = (bin_size / 2) + min_val - for i, y in enumerate(bins): - x = center + bin_size * i - result.append((x, y)) - - return result diff --git a/venv/lib/python3.12/site-packages/altgraph/GraphUtil.py b/venv/lib/python3.12/site-packages/altgraph/GraphUtil.py deleted file mode 100644 index cfd6a34..0000000 --- a/venv/lib/python3.12/site-packages/altgraph/GraphUtil.py +++ /dev/null @@ -1,139 +0,0 @@ -""" -altgraph.GraphUtil - Utility classes and functions -================================================== -""" - -import random -from collections import deque - -from altgraph import Graph, GraphError - - -def generate_random_graph(node_num, edge_num, self_loops=False, multi_edges=False): - """ - Generates and returns a :py:class:`~altgraph.Graph.Graph` instance with - *node_num* nodes randomly connected by *edge_num* edges. - """ - g = Graph.Graph() - - if not multi_edges: - if self_loops: - max_edges = node_num * node_num - else: - max_edges = node_num * (node_num - 1) - - if edge_num > max_edges: - raise GraphError("inconsistent arguments to 'generate_random_graph'") - - nodes = range(node_num) - - for node in nodes: - g.add_node(node) - - while 1: - head = random.choice(nodes) - tail = random.choice(nodes) - - # loop defense - if head == tail and not self_loops: - continue - - # multiple edge defense - if g.edge_by_node(head, tail) is not None and not multi_edges: - continue - - # add the edge - g.add_edge(head, tail) - if g.number_of_edges() >= edge_num: - break - - return g - - -def generate_scale_free_graph(steps, growth_num, self_loops=False, multi_edges=False): - """ - Generates and returns a :py:class:`~altgraph.Graph.Graph` instance that - will have *steps* \\* *growth_num* nodes and a scale free (powerlaw) - connectivity. Starting with a fully connected graph with *growth_num* - nodes at every step *growth_num* nodes are added to the graph and are - connected to existing nodes with a probability proportional to the degree - of these existing nodes. - """ - # The code doesn't seem to do what the documentation claims. - graph = Graph.Graph() - - # initialize the graph - store = [] - for i in range(growth_num): - for j in range(i + 1, growth_num): - store.append(i) - store.append(j) - graph.add_edge(i, j) - - # generate - for node in range(growth_num, steps * growth_num): - graph.add_node(node) - while graph.out_degree(node) < growth_num: - nbr = random.choice(store) - - # loop defense - if node == nbr and not self_loops: - continue - - # multi edge defense - if graph.edge_by_node(node, nbr) and not multi_edges: - continue - - graph.add_edge(node, nbr) - - for nbr in graph.out_nbrs(node): - store.append(node) - store.append(nbr) - - return graph - - -def filter_stack(graph, head, filters): - """ - Perform a walk in a depth-first order starting - at *head*. - - Returns (visited, removes, orphans). - - * visited: the set of visited nodes - * removes: the list of nodes where the node - data does not all *filters* - * orphans: tuples of (last_good, node), - where node is not in removes, is directly - reachable from a node in *removes* and - *last_good* is the closest upstream node that is not - in *removes*. - """ - - visited, removes, orphans = {head}, set(), set() - stack = deque([(head, head)]) - get_data = graph.node_data - get_edges = graph.out_edges - get_tail = graph.tail - - while stack: - last_good, node = stack.pop() - data = get_data(node) - if data is not None: - for filtfunc in filters: - if not filtfunc(data): - removes.add(node) - break - else: - last_good = node - for edge in get_edges(node): - tail = get_tail(edge) - if last_good is not node: - orphans.add((last_good, tail)) - if tail not in visited: - visited.add(tail) - stack.append((last_good, tail)) - - orphans = [(lg, tl) for (lg, tl) in orphans if tl not in removes] - - return visited, removes, orphans diff --git a/venv/lib/python3.12/site-packages/altgraph/ObjectGraph.py b/venv/lib/python3.12/site-packages/altgraph/ObjectGraph.py deleted file mode 100644 index 379b05b..0000000 --- a/venv/lib/python3.12/site-packages/altgraph/ObjectGraph.py +++ /dev/null @@ -1,212 +0,0 @@ -""" -altgraph.ObjectGraph - Graph of objects with an identifier -========================================================== - -A graph of objects that have a "graphident" attribute. -graphident is the key for the object in the graph -""" - -from altgraph import GraphError -from altgraph.Graph import Graph -from altgraph.GraphUtil import filter_stack - - -class ObjectGraph(object): - """ - A graph of objects that have a "graphident" attribute. - graphident is the key for the object in the graph - """ - - def __init__(self, graph=None, debug=0): - if graph is None: - graph = Graph() - self.graphident = self - self.graph = graph - self.debug = debug - self.indent = 0 - graph.add_node(self, None) - - def __repr__(self): - return "<%s>" % (type(self).__name__,) - - def flatten(self, condition=None, start=None): - """ - Iterate over the subgraph that is entirely reachable by condition - starting from the given start node or the ObjectGraph root - """ - if start is None: - start = self - start = self.getRawIdent(start) - return self.graph.iterdata(start=start, condition=condition) - - def nodes(self): - for ident in self.graph: - node = self.graph.node_data(ident) - if node is not None: - yield self.graph.node_data(ident) - - def get_edges(self, node): - if node is None: - node = self - start = self.getRawIdent(node) - _, _, outraw, incraw = self.graph.describe_node(start) - - def iter_edges(lst, n): - seen = set() - for tpl in (self.graph.describe_edge(e) for e in lst): - ident = tpl[n] - if ident not in seen: - yield self.findNode(ident) - seen.add(ident) - - return iter_edges(outraw, 3), iter_edges(incraw, 2) - - def edgeData(self, fromNode, toNode): - if fromNode is None: - fromNode = self - start = self.getRawIdent(fromNode) - stop = self.getRawIdent(toNode) - edge = self.graph.edge_by_node(start, stop) - return self.graph.edge_data(edge) - - def updateEdgeData(self, fromNode, toNode, edgeData): - if fromNode is None: - fromNode = self - start = self.getRawIdent(fromNode) - stop = self.getRawIdent(toNode) - edge = self.graph.edge_by_node(start, stop) - self.graph.update_edge_data(edge, edgeData) - - def filterStack(self, filters): - """ - Filter the ObjectGraph in-place by removing all edges to nodes that - do not match every filter in the given filter list - - Returns a tuple containing the number of: - (nodes_visited, nodes_removed, nodes_orphaned) - """ - visited, removes, orphans = filter_stack(self.graph, self, filters) - - for last_good, tail in orphans: - self.graph.add_edge(last_good, tail, edge_data="orphan") - - for node in removes: - self.graph.hide_node(node) - - return len(visited) - 1, len(removes), len(orphans) - - def removeNode(self, node): - """ - Remove the given node from the graph if it exists - """ - ident = self.getIdent(node) - if ident is not None: - self.graph.hide_node(ident) - - def removeReference(self, fromnode, tonode): - """ - Remove all edges from fromnode to tonode - """ - if fromnode is None: - fromnode = self - fromident = self.getIdent(fromnode) - toident = self.getIdent(tonode) - if fromident is not None and toident is not None: - while True: - edge = self.graph.edge_by_node(fromident, toident) - if edge is None: - break - self.graph.hide_edge(edge) - - def getIdent(self, node): - """ - Get the graph identifier for a node - """ - ident = self.getRawIdent(node) - if ident is not None: - return ident - node = self.findNode(node) - if node is None: - return None - return node.graphident - - def getRawIdent(self, node): - """ - Get the identifier for a node object - """ - if node is self: - return node - ident = getattr(node, "graphident", None) - return ident - - def __contains__(self, node): - return self.findNode(node) is not None - - def findNode(self, node): - """ - Find the node on the graph - """ - ident = self.getRawIdent(node) - if ident is None: - ident = node - try: - return self.graph.node_data(ident) - except KeyError: - return None - - def addNode(self, node): - """ - Add a node to the graph referenced by the root - """ - self.msg(4, "addNode", node) - - try: - self.graph.restore_node(node.graphident) - except GraphError: - self.graph.add_node(node.graphident, node) - - def createReference(self, fromnode, tonode, edge_data=None): - """ - Create a reference from fromnode to tonode - """ - if fromnode is None: - fromnode = self - fromident, toident = self.getIdent(fromnode), self.getIdent(tonode) - if fromident is None or toident is None: - return - self.msg(4, "createReference", fromnode, tonode, edge_data) - self.graph.add_edge(fromident, toident, edge_data=edge_data) - - def createNode(self, cls, name, *args, **kw): - """ - Add a node of type cls to the graph if it does not already exist - by the given name - """ - m = self.findNode(name) - if m is None: - m = cls(name, *args, **kw) - self.addNode(m) - return m - - def msg(self, level, s, *args): - """ - Print a debug message with the given level - """ - if s and level <= self.debug: - print("%s%s %s" % (" " * self.indent, s, " ".join(map(repr, args)))) - - def msgin(self, level, s, *args): - """ - Print a debug message and indent - """ - if level <= self.debug: - self.msg(level, s, *args) - self.indent = self.indent + 1 - - def msgout(self, level, s, *args): - """ - Dedent and print a debug message - """ - if level <= self.debug: - self.indent = self.indent - 1 - self.msg(level, s, *args) diff --git a/venv/lib/python3.12/site-packages/altgraph/__init__.py b/venv/lib/python3.12/site-packages/altgraph/__init__.py deleted file mode 100644 index 3624968..0000000 --- a/venv/lib/python3.12/site-packages/altgraph/__init__.py +++ /dev/null @@ -1,146 +0,0 @@ -""" -altgraph - a python graph library -================================= - -altgraph is a fork of `graphlib `_ tailored -to use newer Python 2.3+ features, including additional support used by the -py2app suite (modulegraph and macholib, specifically). - -altgraph is a python based graph (network) representation and manipulation -package. It has started out as an extension to the -`graph_lib module -`_ -written by Nathan Denny it has been significantly optimized and expanded. - -The :class:`altgraph.Graph.Graph` class is loosely modeled after the -`LEDA `_ -(Library of Efficient Datatypes) representation. The library -includes methods for constructing graphs, BFS and DFS traversals, -topological sort, finding connected components, shortest paths as well as a -number graph statistics functions. The library can also visualize graphs -via `graphviz `_. - -The package contains the following modules: - - - the :py:mod:`altgraph.Graph` module contains the - :class:`~altgraph.Graph.Graph` class that stores the graph data - - - the :py:mod:`altgraph.GraphAlgo` module implements graph algorithms - operating on graphs (:py:class:`~altgraph.Graph.Graph`} instances) - - - the :py:mod:`altgraph.GraphStat` module contains functions for - computing statistical measures on graphs - - - the :py:mod:`altgraph.GraphUtil` module contains functions for - generating, reading and saving graphs - - - the :py:mod:`altgraph.Dot` module contains functions for displaying - graphs via `graphviz `_ - - - the :py:mod:`altgraph.ObjectGraph` module implements a graph of - objects with a unique identifier - -Installation ------------- - -Download and unpack the archive then type:: - - python setup.py install - -This will install the library in the default location. For instructions on -how to customize the install procedure read the output of:: - - python setup.py --help install - -To verify that the code works run the test suite:: - - python setup.py test - -Example usage -------------- - -Lets assume that we want to analyze the graph below (links to the full picture) -GRAPH_IMG. Our script then might look the following way:: - - from altgraph import Graph, GraphAlgo, Dot - - # these are the edges - edges = [ (1,2), (2,4), (1,3), (2,4), (3,4), (4,5), (6,5), - (6,14), (14,15), (6, 15), (5,7), (7, 8), (7,13), (12,8), - (8,13), (11,12), (11,9), (13,11), (9,13), (13,10) ] - - # creates the graph - graph = Graph.Graph() - for head, tail in edges: - graph.add_edge(head, tail) - - # do a forward bfs from 1 at most to 20 - print(graph.forw_bfs(1)) - -This will print the nodes in some breadth first order:: - - [1, 2, 3, 4, 5, 7, 8, 13, 11, 10, 12, 9] - -If we wanted to get the hop-distance from node 1 to node 8 -we coud write:: - - print(graph.get_hops(1, 8)) - -This will print the following:: - - [(1, 0), (2, 1), (3, 1), (4, 2), (5, 3), (7, 4), (8, 5)] - -Node 1 is at 0 hops since it is the starting node, nodes 2,3 are 1 hop away ... -node 8 is 5 hops away. To find the shortest distance between two nodes you -can use:: - - print(GraphAlgo.shortest_path(graph, 1, 12)) - -It will print the nodes on one (if there are more) the shortest paths:: - - [1, 2, 4, 5, 7, 13, 11, 12] - -To display the graph we can use the GraphViz backend:: - - dot = Dot.Dot(graph) - - # display the graph on the monitor - dot.display() - - # save it in an image file - dot.save_img(file_name='graph', file_type='gif') - - - -.. - @author: U{Istvan Albert} - - @license: MIT License - - Copyright (c) 2004 Istvan Albert unless otherwise noted. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to - deal in the Software without restriction, including without limitation the - rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - IN THE SOFTWARE. - @requires: Python 2.3 or higher - - @newfield contributor: Contributors: - @contributor: U{Reka Albert } - -""" -__version__ = "0.17.5" - - -class GraphError(ValueError): - pass diff --git a/venv/lib/python3.12/site-packages/altgraph/__pycache__/Dot.cpython-312.pyc b/venv/lib/python3.12/site-packages/altgraph/__pycache__/Dot.cpython-312.pyc deleted file mode 100644 index 38036ca..0000000 Binary files a/venv/lib/python3.12/site-packages/altgraph/__pycache__/Dot.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/altgraph/__pycache__/Graph.cpython-312.pyc b/venv/lib/python3.12/site-packages/altgraph/__pycache__/Graph.cpython-312.pyc deleted file mode 100644 index 42d7068..0000000 Binary files a/venv/lib/python3.12/site-packages/altgraph/__pycache__/Graph.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/altgraph/__pycache__/GraphAlgo.cpython-312.pyc b/venv/lib/python3.12/site-packages/altgraph/__pycache__/GraphAlgo.cpython-312.pyc deleted file mode 100644 index c1949ab..0000000 Binary files a/venv/lib/python3.12/site-packages/altgraph/__pycache__/GraphAlgo.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/altgraph/__pycache__/GraphStat.cpython-312.pyc b/venv/lib/python3.12/site-packages/altgraph/__pycache__/GraphStat.cpython-312.pyc deleted file mode 100644 index f0ae1b0..0000000 Binary files a/venv/lib/python3.12/site-packages/altgraph/__pycache__/GraphStat.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/altgraph/__pycache__/GraphUtil.cpython-312.pyc b/venv/lib/python3.12/site-packages/altgraph/__pycache__/GraphUtil.cpython-312.pyc deleted file mode 100644 index 2e4fdd2..0000000 Binary files a/venv/lib/python3.12/site-packages/altgraph/__pycache__/GraphUtil.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/altgraph/__pycache__/ObjectGraph.cpython-312.pyc b/venv/lib/python3.12/site-packages/altgraph/__pycache__/ObjectGraph.cpython-312.pyc deleted file mode 100644 index bd85279..0000000 Binary files a/venv/lib/python3.12/site-packages/altgraph/__pycache__/ObjectGraph.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/altgraph/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/altgraph/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index e6ae1de..0000000 Binary files a/venv/lib/python3.12/site-packages/altgraph/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid-4.0.4.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/astroid-4.0.4.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/astroid-4.0.4.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/astroid-4.0.4.dist-info/METADATA b/venv/lib/python3.12/site-packages/astroid-4.0.4.dist-info/METADATA deleted file mode 100644 index 1f921d4..0000000 --- a/venv/lib/python3.12/site-packages/astroid-4.0.4.dist-info/METADATA +++ /dev/null @@ -1,122 +0,0 @@ -Metadata-Version: 2.4 -Name: astroid -Version: 4.0.4 -Summary: An abstract syntax tree for Python with inference support. -License-Expression: LGPL-2.1-or-later -Project-URL: Bug tracker, https://github.com/pylint-dev/astroid/issues -Project-URL: Discord server, https://discord.gg/Egy6P8AMB5 -Project-URL: Docs, https://pylint.readthedocs.io/projects/astroid/en/latest/ -Project-URL: Source Code, https://github.com/pylint-dev/astroid -Keywords: abstract syntax tree,python,static code analysis -Classifier: Development Status :: 6 - Mature -Classifier: Environment :: Console -Classifier: Intended Audience :: Developers -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: 3.14 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Software Development :: Quality Assurance -Classifier: Topic :: Software Development :: Testing -Requires-Python: >=3.10.0 -Description-Content-Type: text/x-rst -License-File: LICENSE -License-File: CONTRIBUTORS.txt -Requires-Dist: typing-extensions>=4; python_version < "3.11" -Dynamic: license-file - -Astroid -======= - -.. image:: https://codecov.io/gh/pylint-dev/astroid/branch/main/graph/badge.svg?token=Buxy4WptLb - :target: https://codecov.io/gh/pylint-dev/astroid - :alt: Coverage badge from codecov - -.. image:: https://readthedocs.org/projects/astroid/badge/?version=latest - :target: http://astroid.readthedocs.io/en/latest/?badge=latest - :alt: Documentation Status - -.. image:: https://img.shields.io/badge/code%20style-black-000000.svg - :target: https://github.com/ambv/black - -.. image:: https://results.pre-commit.ci/badge/github/pylint-dev/astroid/main.svg - :target: https://results.pre-commit.ci/latest/github/pylint-dev/astroid/main - :alt: pre-commit.ci status - -.. |tidelift_logo| image:: https://raw.githubusercontent.com/pylint-dev/astroid/main/doc/media/Tidelift_Logos_RGB_Tidelift_Shorthand_On-White.png - :width: 200 - :alt: Tidelift - -.. list-table:: - :widths: 10 100 - - * - |tidelift_logo| - - Professional support for astroid is available as part of the - `Tidelift Subscription`_. Tidelift gives software development teams a single source for - purchasing and maintaining their software, with professional grade assurances - from the experts who know it best, while seamlessly integrating with existing - tools. - -.. _Tidelift Subscription: https://tidelift.com/subscription/pkg/pypi-astroid?utm_source=pypi-astroid&utm_medium=referral&utm_campaign=readme - - - -What's this? ------------- - -The aim of this module is to provide a common base representation of -python source code. It is currently the library powering pylint's capabilities. - -It provides a compatible representation which comes from the `_ast` -module. It rebuilds the tree generated by the builtin _ast module by -recursively walking down the AST and building an extended ast. The new -node classes have additional methods and attributes for different -usages. They include some support for static inference and local name -scopes. Furthermore, astroid can also build partial trees by inspecting living -objects. - - -Installation ------------- - -Extract the tarball, jump into the created directory and run:: - - pip install . - - -If you want to do an editable installation, you can run:: - - pip install -e . - - -If you have any questions, please mail the code-quality@python.org -mailing list for support. See -http://mail.python.org/mailman/listinfo/code-quality for subscription -information and archives. - -Documentation -------------- -http://astroid.readthedocs.io/en/latest/ - - -Python Versions ---------------- - -astroid 2.0 is currently available for Python 3 only. If you want Python 2 -support, use an older version of astroid (though note that these versions -are no longer supported). - -Test ----- - -Tests are in the 'test' subdirectory. To launch the whole tests suite, you can use -either `tox` or `pytest`:: - - tox - pytest diff --git a/venv/lib/python3.12/site-packages/astroid-4.0.4.dist-info/RECORD b/venv/lib/python3.12/site-packages/astroid-4.0.4.dist-info/RECORD deleted file mode 100644 index 78574a8..0000000 --- a/venv/lib/python3.12/site-packages/astroid-4.0.4.dist-info/RECORD +++ /dev/null @@ -1,197 +0,0 @@ -astroid-4.0.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -astroid-4.0.4.dist-info/METADATA,sha256=F4NXQbxupKPDc6WClbn9_5IhVEwRXv77J-uOjPycdqs,4382 -astroid-4.0.4.dist-info/RECORD,, -astroid-4.0.4.dist-info/WHEEL,sha256=YLJXdYXQ2FQ0Uqn2J-6iEIC-3iOey8lH3xCtvFLkd8Q,91 -astroid-4.0.4.dist-info/licenses/CONTRIBUTORS.txt,sha256=c0v8W544hmspwqUGRfzPIcVh6vzof-I35MHcoIl0JEs,9339 -astroid-4.0.4.dist-info/licenses/LICENSE,sha256=_qFr2p5zTeoNnI2fW5CYeO9BcWJjVDKWCf_889tCyyQ,26516 -astroid-4.0.4.dist-info/top_level.txt,sha256=HsdW4O2x7ZXRj6k-agi3RaQybGLobI3VSE-jt4vQUXM,8 -astroid/__init__.py,sha256=FA-4lFE-nkNgJ9nLhh6BDYb2_rIgpFxaS0UX_LFUqC4,7718 -astroid/__pkginfo__.py,sha256=ulHsiua50sozjW75HY68sm1CRUX-YAjfidcD8hZGbBI,283 -astroid/__pycache__/__init__.cpython-312.pyc,, -astroid/__pycache__/__pkginfo__.cpython-312.pyc,, -astroid/__pycache__/_ast.cpython-312.pyc,, -astroid/__pycache__/arguments.cpython-312.pyc,, -astroid/__pycache__/astroid_manager.cpython-312.pyc,, -astroid/__pycache__/bases.cpython-312.pyc,, -astroid/__pycache__/builder.cpython-312.pyc,, -astroid/__pycache__/const.cpython-312.pyc,, -astroid/__pycache__/constraint.cpython-312.pyc,, -astroid/__pycache__/context.cpython-312.pyc,, -astroid/__pycache__/decorators.cpython-312.pyc,, -astroid/__pycache__/exceptions.cpython-312.pyc,, -astroid/__pycache__/filter_statements.cpython-312.pyc,, -astroid/__pycache__/helpers.cpython-312.pyc,, -astroid/__pycache__/inference_tip.cpython-312.pyc,, -astroid/__pycache__/manager.cpython-312.pyc,, -astroid/__pycache__/modutils.cpython-312.pyc,, -astroid/__pycache__/objects.cpython-312.pyc,, -astroid/__pycache__/protocols.cpython-312.pyc,, -astroid/__pycache__/raw_building.cpython-312.pyc,, -astroid/__pycache__/rebuilder.cpython-312.pyc,, -astroid/__pycache__/test_utils.cpython-312.pyc,, -astroid/__pycache__/transforms.cpython-312.pyc,, -astroid/__pycache__/typing.cpython-312.pyc,, -astroid/__pycache__/util.cpython-312.pyc,, -astroid/_ast.py,sha256=LLKPdNWj6Qk4u3yj9wid9zIOsKf_YV4Yfr8L4EA285U,3003 -astroid/arguments.py,sha256=UwoLKjjgYrmtTHWRTEXuqz4g4elodx_DJIR5vBkCfzo,13094 -astroid/astroid_manager.py,sha256=uGIFUKDTjCdy757OF60r3apRqVybugBZh1rudtOSGMA,729 -astroid/bases.py,sha256=IJyVeO6ssO3QmBZ_2C4_yJO2YvxhtolJPlNisqM2k6A,28007 -astroid/brain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -astroid/brain/__pycache__/__init__.cpython-312.pyc,, -astroid/brain/__pycache__/brain_argparse.cpython-312.pyc,, -astroid/brain/__pycache__/brain_attrs.cpython-312.pyc,, -astroid/brain/__pycache__/brain_boto3.cpython-312.pyc,, -astroid/brain/__pycache__/brain_builtin_inference.cpython-312.pyc,, -astroid/brain/__pycache__/brain_collections.cpython-312.pyc,, -astroid/brain/__pycache__/brain_crypt.cpython-312.pyc,, -astroid/brain/__pycache__/brain_ctypes.cpython-312.pyc,, -astroid/brain/__pycache__/brain_curses.cpython-312.pyc,, -astroid/brain/__pycache__/brain_dataclasses.cpython-312.pyc,, -astroid/brain/__pycache__/brain_datetime.cpython-312.pyc,, -astroid/brain/__pycache__/brain_dateutil.cpython-312.pyc,, -astroid/brain/__pycache__/brain_functools.cpython-312.pyc,, -astroid/brain/__pycache__/brain_gi.cpython-312.pyc,, -astroid/brain/__pycache__/brain_hashlib.cpython-312.pyc,, -astroid/brain/__pycache__/brain_http.cpython-312.pyc,, -astroid/brain/__pycache__/brain_hypothesis.cpython-312.pyc,, -astroid/brain/__pycache__/brain_io.cpython-312.pyc,, -astroid/brain/__pycache__/brain_mechanize.cpython-312.pyc,, -astroid/brain/__pycache__/brain_multiprocessing.cpython-312.pyc,, -astroid/brain/__pycache__/brain_namedtuple_enum.cpython-312.pyc,, -astroid/brain/__pycache__/brain_numpy_core_einsumfunc.cpython-312.pyc,, -astroid/brain/__pycache__/brain_numpy_core_fromnumeric.cpython-312.pyc,, -astroid/brain/__pycache__/brain_numpy_core_function_base.cpython-312.pyc,, -astroid/brain/__pycache__/brain_numpy_core_multiarray.cpython-312.pyc,, -astroid/brain/__pycache__/brain_numpy_core_numeric.cpython-312.pyc,, -astroid/brain/__pycache__/brain_numpy_core_numerictypes.cpython-312.pyc,, -astroid/brain/__pycache__/brain_numpy_core_umath.cpython-312.pyc,, -astroid/brain/__pycache__/brain_numpy_ma.cpython-312.pyc,, -astroid/brain/__pycache__/brain_numpy_ndarray.cpython-312.pyc,, -astroid/brain/__pycache__/brain_numpy_random_mtrand.cpython-312.pyc,, -astroid/brain/__pycache__/brain_numpy_utils.cpython-312.pyc,, -astroid/brain/__pycache__/brain_pathlib.cpython-312.pyc,, -astroid/brain/__pycache__/brain_pkg_resources.cpython-312.pyc,, -astroid/brain/__pycache__/brain_pytest.cpython-312.pyc,, -astroid/brain/__pycache__/brain_qt.cpython-312.pyc,, -astroid/brain/__pycache__/brain_random.cpython-312.pyc,, -astroid/brain/__pycache__/brain_re.cpython-312.pyc,, -astroid/brain/__pycache__/brain_regex.cpython-312.pyc,, -astroid/brain/__pycache__/brain_responses.cpython-312.pyc,, -astroid/brain/__pycache__/brain_scipy_signal.cpython-312.pyc,, -astroid/brain/__pycache__/brain_signal.cpython-312.pyc,, -astroid/brain/__pycache__/brain_six.cpython-312.pyc,, -astroid/brain/__pycache__/brain_sqlalchemy.cpython-312.pyc,, -astroid/brain/__pycache__/brain_ssl.cpython-312.pyc,, -astroid/brain/__pycache__/brain_statistics.cpython-312.pyc,, -astroid/brain/__pycache__/brain_subprocess.cpython-312.pyc,, -astroid/brain/__pycache__/brain_threading.cpython-312.pyc,, -astroid/brain/__pycache__/brain_type.cpython-312.pyc,, -astroid/brain/__pycache__/brain_typing.cpython-312.pyc,, -astroid/brain/__pycache__/brain_unittest.cpython-312.pyc,, -astroid/brain/__pycache__/brain_uuid.cpython-312.pyc,, -astroid/brain/__pycache__/helpers.cpython-312.pyc,, -astroid/brain/brain_argparse.py,sha256=SxYW42PcxTv0YM4VGAS_K8iYnYDxZ5LQZeptooyIMo0,1725 -astroid/brain/brain_attrs.py,sha256=y6xnsBRIhXiJucZPjtBsGM-hNVMMOttBnxIHNE65YRU,3567 -astroid/brain/brain_boto3.py,sha256=efZTk72fPOe6wnEVCH9bIBFWxcQDlS5xrzuNakpR06Y,1112 -astroid/brain/brain_builtin_inference.py,sha256=WApCZIQF5FkFOO83PRdGt2I3vNCMEg8h5gGPwC3E6-U,37758 -astroid/brain/brain_collections.py,sha256=VetyHBQO9nWQmaDeujEOfZ92JANUpgIAWLH5-jT6uZ4,4787 -astroid/brain/brain_crypt.py,sha256=UKa9GpbK7b_N2fAx4-KNqr4Pvsg3EI1Mu1T3uuV3CcE,957 -astroid/brain/brain_ctypes.py,sha256=ZlOQHSIyvslgdYC_a0hOop3_I5uBh3afbQ8ZuaZxke0,2762 -astroid/brain/brain_curses.py,sha256=Ne_30je70tZpUyobl3b0Y5ATZhxolYCxfP-oLB4eciM,3571 -astroid/brain/brain_dataclasses.py,sha256=1UOUunF8EwJGLXHhXSLzxWwrBnZJ-Ezb7Z-W20wvYQI,22157 -astroid/brain/brain_datetime.py,sha256=q9kjCi-Fz5S-u4Hyv88mJvCgXYvk2X8eEUTaw637lK4,813 -astroid/brain/brain_dateutil.py,sha256=y_GyQYVf_UR6zTOcgmVm3uQhkxVCVVzRD0Ow4Gg1jFI,861 -astroid/brain/brain_functools.py,sha256=I8nxIKGTcQKq5ZeGAiFbm3ErlZfLnpdUYy31pLXxwxc,6401 -astroid/brain/brain_gi.py,sha256=krGyADdWRjm7w-ZVTHbx77hylNgs8ziwZ1--RU6QhxM,7662 -astroid/brain/brain_hashlib.py,sha256=c76QAbD-LYkKMVrdAe6nRboJdG3l1LkK0UAZOlxfSFM,2799 -astroid/brain/brain_http.py,sha256=Vj7mN4uU8qROy-p9BjLOhF9_HTZ0wFbiNuDgi2uXKY4,11668 -astroid/brain/brain_hypothesis.py,sha256=8fwM59eqVgKEL3Dkz2Uva62v0-AZhBPyFxXyOs65E0g,1885 -astroid/brain/brain_io.py,sha256=YV_hxg1EGjV3Wprvp5M_YF8pWoC2MK1oyyH3io6hZpk,1589 -astroid/brain/brain_mechanize.py,sha256=-80L1FfddRUM-qENpAZ5sro9P9Kgz2uchwjjM5ErJJk,2740 -astroid/brain/brain_multiprocessing.py,sha256=ATm2DwP-SXt4LH6hhwN-7ova5Bt483efnuKzKkulmfQ,3260 -astroid/brain/brain_namedtuple_enum.py,sha256=KDWuKv3mAHE1IYXu7CMCb9bMM7vmQnxY8ON96jgUuVk,24278 -astroid/brain/brain_numpy_core_einsumfunc.py,sha256=YfPheziU5UKb80hXS0VZcWVHmw_lQ1t0-Q-w13dwQyM,885 -astroid/brain/brain_numpy_core_fromnumeric.py,sha256=Aum9F0w1An28elWtvBcTHzohV0YCkIOqg8nIqkm179c,834 -astroid/brain/brain_numpy_core_function_base.py,sha256=qSusSR1lilumpc6T8mrELunZS3zgUuuouh-qzNBiBcc,1356 -astroid/brain/brain_numpy_core_multiarray.py,sha256=s9adpaJ8SAk3WTgSEuNgCUwx8HOGt_vyZdXl3QJ1OmE,4408 -astroid/brain/brain_numpy_core_numeric.py,sha256=B95vP691ynDRXFqhg_VI1TKyWkxGbdCZji3M8qsyTmc,1692 -astroid/brain/brain_numpy_core_numerictypes.py,sha256=Bgc4_qguu3ypTIr74STkeUu79OhtLwrD0jVUFSBZ1wA,8648 -astroid/brain/brain_numpy_core_umath.py,sha256=M2_oE2HGcD5DEcU3W2_CvENjxjuOxfLPvnSgFjtmpU4,4981 -astroid/brain/brain_numpy_ma.py,sha256=3UnzHTkN8H6yxI8km6bBZoWyV80U3vLIzfFyD8gEOLo,990 -astroid/brain/brain_numpy_ndarray.py,sha256=qoNm2LSOkaerQus6wOj9Lxbjgh7SAg4bEbfPQbZKO6c,9034 -astroid/brain/brain_numpy_random_mtrand.py,sha256=d3g_v9X1e4Wr8I9EE8g7E0d-hqGQk_gYvByj4-1HC5w,3538 -astroid/brain/brain_numpy_utils.py,sha256=03ztDMdAFnQLFmTOiEeABcSBv_gL46Mpi9rO2rbw0M0,2893 -astroid/brain/brain_pathlib.py,sha256=jX_TTTpf4wp1lePKTSGFFjbQVSa13fXafAfdIqow9JM,1728 -astroid/brain/brain_pkg_resources.py,sha256=rfjLwAejZVqM_s721UdAPbuEMyM0fx3sb1yYkPDeDqE,2302 -astroid/brain/brain_pytest.py,sha256=tqisdV1Cw2vdYdjTNnF_jBMO2jO7lw86Fjh6XpZoJ1g,2312 -astroid/brain/brain_qt.py,sha256=yNle65lxFYmRJksiaqksF_FINvae732yvcOl6PVdIvM,2874 -astroid/brain/brain_random.py,sha256=VMVXkVHEhdQ8S5VaW-tHS3hQYmQj4XI66Y9tV1qDjTE,3110 -astroid/brain/brain_re.py,sha256=-Dh05FNgXrWxOS-mrajf7LFUgozA7qFQzfjs8SwNoxU,2999 -astroid/brain/brain_regex.py,sha256=GI-TCq6gGAE9OYwyl2Bi9auJINJn0uF8ADBYekyKZyU,3466 -astroid/brain/brain_responses.py,sha256=vC9JUtdjtN2W5ux8_6G7QG_nhbZOBV3lMpy1fG56nzc,1962 -astroid/brain/brain_scipy_signal.py,sha256=HPGStodLs9L9APFnc77RZBf-PIlaKm-COdyTSk2KVnM,2370 -astroid/brain/brain_signal.py,sha256=Qt8cFsEwYmwaI_PU5aBBfYV4TLkF0lBPdME-oeGWMYk,3932 -astroid/brain/brain_six.py,sha256=ps49tRfn6NRtTpjmcBOfrF8shznz0T1SB7Pn1teWTIs,7772 -astroid/brain/brain_sqlalchemy.py,sha256=8JlRq_TCEheDtbc2BIupibHRtEZ4WasqLEPkkZ5sziY,1103 -astroid/brain/brain_ssl.py,sha256=MOU0L1wh-ysKzACAKVTnpCca6awwwsF09OcJi5-NKfk,6712 -astroid/brain/brain_statistics.py,sha256=howkDIgRSFh6Zy20ZS2OCN4HQxfEStiIwsICMOZ5bi4,2786 -astroid/brain/brain_subprocess.py,sha256=dj-Y3S_QbWaIsDA6j8a74xEwPd5Fe5J1uj1YDFDrcrQ,2962 -astroid/brain/brain_threading.py,sha256=3XS9DNglTezqvBUlWTKbhjWLgkjXmQR9w-p5sNPJLO4,964 -astroid/brain/brain_type.py,sha256=sThdsmoQwUxIe04m5Wb6WnouGk1ZmZWtBo6AfXqWLsA,2497 -astroid/brain/brain_typing.py,sha256=b5Lvle7K9vhxzvFqH3BOwB8aYLPjiex-6FQCdupDvZk,17237 -astroid/brain/brain_unittest.py,sha256=ejWKg85j26dfKWHwycKztGs4_RSPTtqs9mTF3XKfsyA,1178 -astroid/brain/brain_uuid.py,sha256=K1so-CZChY4lqI-qWQbdrrJu_z0gJPPG4h4J3Iz9FoU,678 -astroid/brain/helpers.py,sha256=VIf9Yy6SVaXBQ0Lh1oLEa0szhJRXuyTR4qANXhAeJBs,4743 -astroid/builder.py,sha256=pk_U8QDLwQmwZMnDRK7Z8EnJjeCLHV_7msGIf1AgVGE,19169 -astroid/const.py,sha256=dcdtuOYk6xd_5K9kLZcijEp93kXYzpb_GrmHBGccs4Q,694 -astroid/constraint.py,sha256=BzI-DMG1Vp3eapvmVjahYEL9VYSRoluGkTscokNUipc,6483 -astroid/context.py,sha256=xseGQ6wscT5eOPiLl7nd6nS7Mfwi3KrQGSScPlBU6h4,6293 -astroid/decorators.py,sha256=aUEm2t4UM31X8vpGi5BJb3jOcK44LtZQRUl9H1Dlqh4,8531 -astroid/exceptions.py,sha256=9OrH8LliIRyv85CQEmm0br0R0XWuRJ74tmIDAv2QR_s,12935 -astroid/filter_statements.py,sha256=CJRqKTLsspIfHlLjHQsEpfLjscjPoOtLWdLuVhb7OoM,9451 -astroid/helpers.py,sha256=7r3xj2r2DriL9J8IbuIlmim-T7aC1Jog7GbJ8R6TM7U,11819 -astroid/inference_tip.py,sha256=5Dsfn-9qie1Wuzc2XaWzhlPQQxD3fGt64RR3nyptvHc,4586 -astroid/interpreter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -astroid/interpreter/__pycache__/__init__.cpython-312.pyc,, -astroid/interpreter/__pycache__/dunder_lookup.cpython-312.pyc,, -astroid/interpreter/__pycache__/objectmodel.cpython-312.pyc,, -astroid/interpreter/_import/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -astroid/interpreter/_import/__pycache__/__init__.cpython-312.pyc,, -astroid/interpreter/_import/__pycache__/spec.cpython-312.pyc,, -astroid/interpreter/_import/__pycache__/util.cpython-312.pyc,, -astroid/interpreter/_import/spec.py,sha256=uVQdyJ7OTJzTM50EVmyXmN2bMUR_D-EXI36CC-NTPBU,17613 -astroid/interpreter/_import/util.py,sha256=Nz-w2jJZ-XPo2R_K8De6lhDO3aIB1A4LMFiUyDZCQnQ,4738 -astroid/interpreter/dunder_lookup.py,sha256=miAYo7UTVOhfMYpo44qdV3WJEk1P__JVTGWGPtT1wnk,2487 -astroid/interpreter/objectmodel.py,sha256=gP8LsWsw3uzXWh4QhecNom27Q8N7MKN4ipGMg_abSuo,34180 -astroid/manager.py,sha256=adI6Dc8b0HqScUoGet-FzV90CHguHpJ-s2Ne-fwgdOM,18331 -astroid/modutils.py,sha256=KAyhpORelvLrHnAVoiX5HDhDnMCuAHhoqaox2E6rSdw,23458 -astroid/nodes/__init__.py,sha256=X6V4GWkgUL8AuqfzK_Ns7jpCM_RK14UMyY8KMhEqZ8o,4862 -astroid/nodes/__pycache__/__init__.cpython-312.pyc,, -astroid/nodes/__pycache__/_base_nodes.cpython-312.pyc,, -astroid/nodes/__pycache__/as_string.cpython-312.pyc,, -astroid/nodes/__pycache__/const.cpython-312.pyc,, -astroid/nodes/__pycache__/node_classes.cpython-312.pyc,, -astroid/nodes/__pycache__/node_ng.cpython-312.pyc,, -astroid/nodes/__pycache__/utils.cpython-312.pyc,, -astroid/nodes/_base_nodes.py,sha256=IY3vZ4vEvsAepGTvrPf7zm11BPTlRQUndzyT9CmEsZ8,23927 -astroid/nodes/as_string.py,sha256=ap_dHTQTE9xyxb6GndRrd4TS4xdfhDadCW0NcGmktqQ,29106 -astroid/nodes/const.py,sha256=aD7rKF5kPM2UFJAR5pzZDAM-Zm7p9LG57E-9FjB1gTc,807 -astroid/nodes/node_classes.py,sha256=yvq9Bv6QEVXKOMJbso8gZpSlgFpN_7whoXuiBUPMrCI,177555 -astroid/nodes/node_ng.py,sha256=SzcLmkZiuv2Pk4q6iPSfokPRdGaM9VqPLQqrJCaCKOE,26435 -astroid/nodes/scoped_nodes/__init__.py,sha256=YXf0Sc8m3HlzbG9IGtX2aHTSGbG4nHfxl9_kY_QLs1g,1271 -astroid/nodes/scoped_nodes/__pycache__/__init__.cpython-312.pyc,, -astroid/nodes/scoped_nodes/__pycache__/mixin.cpython-312.pyc,, -astroid/nodes/scoped_nodes/__pycache__/scoped_nodes.cpython-312.pyc,, -astroid/nodes/scoped_nodes/__pycache__/utils.cpython-312.pyc,, -astroid/nodes/scoped_nodes/mixin.py,sha256=DlmZuUZFDM7NTsxhns7AMr8wGV5NhDpbAo4eEFx8oKk,7236 -astroid/nodes/scoped_nodes/scoped_nodes.py,sha256=Zvk6rT8Di1_xAESuCQYxOBjG8SIgYx9ZNGMQvHRNLmA,100784 -astroid/nodes/scoped_nodes/utils.py,sha256=rBKL_c6byvOWq7yzRSMNWsZQIe5smST8Dnpz40Nni7Q,1181 -astroid/nodes/utils.py,sha256=5strAqVk0zh9cOD4nH8EZiIsaDn5-gLIT2U1hAoY9wU,433 -astroid/objects.py,sha256=laugKuXgvZlyU8ZGg80VfbCwVKO1piPIIq2fk3Ywf5o,12762 -astroid/protocols.py,sha256=tMR8XAboNiDOqlbdfoxjU66TNl0AD3OJ0Yll2zqCnsg,32562 -astroid/raw_building.py,sha256=hohV5ukMBC2xYJ9ehc6_QV3sop3i0YRkUY-hb6ckumg,25307 -astroid/rebuilder.py,sha256=Jv3xq3M2jdrJS1Y9n0wvYJbHB2ly9-UbXE2pelBbQsw,71520 -astroid/test_utils.py,sha256=gyLSvyMM7QfsfqZhmVW6nM1whn1ArMWTsiHi8_Jy060,2474 -astroid/transforms.py,sha256=AARfSAiYVQ6Ale33UOEkn0n-QjAgJ9xI3HZenReFisA,5946 -astroid/typing.py,sha256=fYk-NAnlC7_prv9jvfnXcL32278yJ65x-qimK32tW_o,2807 -astroid/util.py,sha256=H0hAr2TTxsK97137v9gp59-JmuCMWABmmI_0UOOM9N0,4846 diff --git a/venv/lib/python3.12/site-packages/astroid-4.0.4.dist-info/WHEEL b/venv/lib/python3.12/site-packages/astroid-4.0.4.dist-info/WHEEL deleted file mode 100644 index c0f0388..0000000 --- a/venv/lib/python3.12/site-packages/astroid-4.0.4.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (81.0.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv/lib/python3.12/site-packages/astroid-4.0.4.dist-info/licenses/CONTRIBUTORS.txt b/venv/lib/python3.12/site-packages/astroid-4.0.4.dist-info/licenses/CONTRIBUTORS.txt deleted file mode 100644 index 67068c0..0000000 --- a/venv/lib/python3.12/site-packages/astroid-4.0.4.dist-info/licenses/CONTRIBUTORS.txt +++ /dev/null @@ -1,226 +0,0 @@ -# This file is autocompleted by 'contributors-txt', -# using the configuration in 'script/.contributors_aliases.json'. -# Do not add new persons manually and only add information without -# using '-' as the line first character. -# Please verify that your change are stable if you modify manually. - -Ex-maintainers --------------- -- Claudiu Popa -- Sylvain Thénault -- Torsten Marek - - -Maintainers ------------ -- Pierre Sassoulas -- Daniël van Noord <13665637+DanielNoord@users.noreply.github.com> -- Jacob Walls -- Marc Mueller <30130371+cdce8p@users.noreply.github.com> -- Hippo91 -- Bryce Guinta -- Ceridwen -- Mark Byrne <31762852+mbyrnepr2@users.noreply.github.com> -- Łukasz Rogalski -- Florian Bruhin -- Ashley Whetter -- Dimitri Prybysh -- Areveny - - -Contributors ------------- -- Emile Anclin -- Nick Drozd -- correctmost <134317971+correctmost@users.noreply.github.com> -- Andrew Haigh -- Julien Cristau -- Artem Yurchenko <44875844+temyurchenko@users.noreply.github.com> -- David Liu -- Alexandre Fayolle -- Eevee (Alex Munroe) -- David Gilman -- Tushar Sadhwani -- Matus Valo -- Julien Jehannet -- Hugo van Kemenade -- Calen Pennington -- Antonio -- Akhil Kamat -- Zen Lee <53538590+zenlyj@users.noreply.github.com> -- Tim Martin -- Phil Schaf -- Alex Hall -- Raphael Gaschignard -- Radosław Ganczarek -- Paligot Gérard -- Ioana Tagirta -- Eric Vergnaud -- Derek Gustafson -- David Shea -- Daniel Harding -- Christian Clauss -- Ville Skyttä -- Synrom <30272537+Synrom@users.noreply.github.com> -- Rene Zhang -- Philip Lorenz -- Nicolas Chauvat -- Michael K -- Mario Corchero -- Marien Zwart -- Laura Médioni -- James Addison <55152140+jayaddison@users.noreply.github.com> -- FELD Boris -- Enji Cooper -- Dani Alcala <112832187+clavedeluna@users.noreply.github.com> -- Adrien Di Mascio -- tristanlatr <19967168+tristanlatr@users.noreply.github.com> -- grayjk -- emile@crater.logilab.fr -- doranid -- brendanator -- Tomas Gavenciak -- Tim Paine -- Thomas Hisch -- Stefan Scherfke -- Sergei Lebedev <185856+superbobry@users.noreply.github.com> -- Saugat Pachhai (सौगात) -- Robert Hofer <1058012+hofrob@users.noreply.github.com> -- Ram Rachum -- Pierre-Yves David -- Peter Pentchev -- Peter Kolbus -- Omer Katz -- Moises Lopez -- Mitch Harding -- Michal Vasilek -- Keichi Takahashi -- Kavins Singh -- Karthikeyan Singaravelan -- Joshua Cannon -- John Vandenberg -- Jacob Bogdanov -- Google, Inc. -- Emmanuel Ferdman -- David Euresti -- David Douard -- David Cain -- Anthony Truchet -- Anthony Sottile -- Alexander Shadchin -- wgehalo -- tejaschauhan36912 <59693377+tejaschauhan36912@users.noreply.github.com> -- rr- -- raylu -- plucury -- pavan-msys <149513767+pavan-msys@users.noreply.github.com> -- ostr00000 -- noah-weingarden <33741795+noah-weingarden@users.noreply.github.com> -- nathannaveen <42319948+nathannaveen@users.noreply.github.com> -- mathieui -- markmcclain -- ioanatia -- alm -- adam-grant-hendry <59346180+adam-grant-hendry@users.noreply.github.com> -- aatle <168398276+aatle@users.noreply.github.com> -- Zbigniew Jędrzejewski-Szmek -- Zac Hatfield-Dodds -- Vilnis Termanis -- Valentin Valls -- Uilian Ries -- Tomas Novak -- Thirumal Venkat -- SupImDos <62866982+SupImDos@users.noreply.github.com> -- Stéphane Brunner -- Stanislav Levin -- Simon Hewitt -- Serhiy Storchaka -- Roy Wright -- Robin Jarry -- René Fritze <47802+renefritze@users.noreply.github.com> -- Redoubts -- Philipp Hörist -- Peter de Blanc -- Peter Talley -- Ovidiu Sabou -- Oleh Prypin -- Nicolas Noirbent -- Neil Girdhar -- Miro Hrončok -- Michał Masłowski -- Mateusz Bysiek -- Matej Aleksandrov -- Marcelo Trylesinski -- Leandro T. C. Melo -- Konrad Weihmann -- Kian Meng, Ang -- Kai Mueller <15907922+kasium@users.noreply.github.com> -- Jörg Thalheim -- Jérome Perrin -- JulianJvn <128477611+JulianJvn@users.noreply.github.com> -- Josef Kemetmüller -- Jonathan Striebel -- John Belmonte -- Jeff Widman -- Jeff Quast -- Jarrad Hope -- Jared Garst -- Jamie Scott -- Jakub Wilk -- Iva Miholic -- Ionel Maries Cristian -- HoverHell -- Hashem Nasarat -- HQupgradeHQ <18361586+HQupgradeHQ@users.noreply.github.com> -- Gwyn Ciesla -- Grygorii Iermolenko -- Gregory P. Smith -- Giuseppe Scrivano -- Frédéric Chapoton -- Francis Charette Migneault -- Felix Mölder -- Federico Bond -- DudeNr33 <3929834+DudeNr33@users.noreply.github.com> -- Dmitry Shachnev -- Denis Laxalde -- Deepyaman Datta -- David Poirier -- Dave Hirschfeld -- Dave Baum -- Daniel Martin -- Daniel Colascione -- Damien Baty -- Craig Franklin -- Colin Kennedy -- Cole Robinson -- Christoph Reiter -- Chris Philip -- Charlie Ringström <34444482+Chasarr@users.noreply.github.com> -- BioGeek -- Bianca Power <30207144+biancapower@users.noreply.github.com> -- Benjamin Elven <25181435+S3ntinelX@users.noreply.github.com> -- Ben Elliston -- Becker Awqatty -- Batuhan Taskaya -- BasPH -- Azeem Bande-Ali -- Avram Lubkin -- Aru Sahni -- Artsiom Kaval -- Anubhav <35621759+anubh-v@users.noreply.github.com> -- Antoine Boellinger -- Alphadelta14 -- Alexander Scheel -- Alexander Presnyakov -- Ahmed Azzaoui - -Co-Author ---------- -The following persons were credited manually but did not commit themselves -under this name, or we did not manage to find their commits in the history. - -- François Mockers -- platings -- carl -- alain lefroy -- Mark Gius diff --git a/venv/lib/python3.12/site-packages/astroid-4.0.4.dist-info/licenses/LICENSE b/venv/lib/python3.12/site-packages/astroid-4.0.4.dist-info/licenses/LICENSE deleted file mode 100644 index 182e0fb..0000000 --- a/venv/lib/python3.12/site-packages/astroid-4.0.4.dist-info/licenses/LICENSE +++ /dev/null @@ -1,508 +0,0 @@ - - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations -below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it -becomes a de-facto standard. To achieve this, non-free programs must -be allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control -compilation and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at least - three years, to give the same user the materials specified in - Subsection 6a, above, for a charge no more than the cost of - performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply, and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License -may add an explicit geographical distribution limitation excluding those -countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms -of the ordinary General Public License). - - To apply these terms, attach the following notices to the library. -It is safest to attach them to the start of each source file to most -effectively convey the exclusion of warranty; and each file should -have at least the "copyright" line and a pointer to where the full -notice is found. - - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or -your school, if any, to sign a "copyright disclaimer" for the library, -if necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James - Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! diff --git a/venv/lib/python3.12/site-packages/astroid-4.0.4.dist-info/top_level.txt b/venv/lib/python3.12/site-packages/astroid-4.0.4.dist-info/top_level.txt deleted file mode 100644 index 450d4fe..0000000 --- a/venv/lib/python3.12/site-packages/astroid-4.0.4.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -astroid diff --git a/venv/lib/python3.12/site-packages/astroid/__init__.py b/venv/lib/python3.12/site-packages/astroid/__init__.py deleted file mode 100644 index abb45cf..0000000 --- a/venv/lib/python3.12/site-packages/astroid/__init__.py +++ /dev/null @@ -1,242 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Python Abstract Syntax Tree New Generation. - -The aim of this module is to provide a common base representation of -python source code for projects such as pychecker, pyreverse, -pylint... Well, actually the development of this library is essentially -governed by pylint's needs. - -It mimics the class defined in the python's _ast module with some -additional methods and attributes. New nodes instances are not fully -compatible with python's _ast. - -Instance attributes are added by a -builder object, which can either generate extended ast (let's call -them astroid ;) by visiting an existent ast tree or by inspecting living -object. - -Main modules are: - -* nodes and scoped_nodes for more information about methods and - attributes added to different node classes - -* the manager contains a high level object to get astroid trees from - source files and living objects. It maintains a cache of previously - constructed tree for quick access - -* builder contains the class responsible to build astroid trees -""" - -# isort: off -# We have an isort: off on 'astroid.nodes' because of a circular import. -from astroid.nodes import node_classes, scoped_nodes - -# isort: on - -from astroid import raw_building -from astroid.__pkginfo__ import __version__, version -from astroid.bases import BaseInstance, BoundMethod, Instance, UnboundMethod -from astroid.brain.helpers import register_module_extender -from astroid.builder import extract_node, parse -from astroid.const import Context -from astroid.exceptions import ( - AstroidBuildingError, - AstroidError, - AstroidImportError, - AstroidIndexError, - AstroidSyntaxError, - AstroidTypeError, - AstroidValueError, - AttributeInferenceError, - DuplicateBasesError, - InconsistentMroError, - InferenceError, - InferenceOverwriteError, - MroError, - NameInferenceError, - NoDefault, - NotFoundError, - ParentMissingError, - ResolveError, - StatementMissing, - SuperArgumentTypeError, - SuperError, - TooManyLevelsError, - UnresolvableName, - UseInferenceDefault, -) -from astroid.inference_tip import _inference_tip_cached, inference_tip -from astroid.objects import ExceptionInstance - -# isort: off -# It's impossible to import from astroid.nodes with a wildcard, because -# there is a cyclic import that prevent creating an __all__ in astroid/nodes -# and we need astroid/scoped_nodes and astroid/node_classes to work. So -# importing with a wildcard would clash with astroid/nodes/scoped_nodes -# and astroid/nodes/node_classes. -from astroid.astroid_manager import MANAGER -from astroid.nodes import ( - CONST_CLS, - AnnAssign as _DEPRECATED_AnnAssign, - Arguments as _DEPRECATED_Arguments, - Assert as _DEPRECATED_Assert, - Assign as _DEPRECATED_Assign, - AssignAttr as _DEPRECATED_AssignAttr, - AssignName as _DEPRECATED_AssignName, - AsyncFor as _DEPRECATED_AsyncFor, - AsyncFunctionDef as _DEPRECATED_AsyncFunctionDef, - AsyncWith as _DEPRECATED_AsyncWith, - Attribute as _DEPRECATED_Attribute, - AugAssign as _DEPRECATED_AugAssign, - Await as _DEPRECATED_Await, - BinOp as _DEPRECATED_BinOp, - BoolOp as _DEPRECATED_BoolOp, - Break as _DEPRECATED_Break, - Call as _DEPRECATED_Call, - ClassDef as _DEPRECATED_ClassDef, - Compare as _DEPRECATED_Compare, - Comprehension as _DEPRECATED_Comprehension, - ComprehensionScope as _DEPRECATED_ComprehensionScope, - Const as _DEPRECATED_Const, - Continue as _DEPRECATED_Continue, - Decorators as _DEPRECATED_Decorators, - DelAttr as _DEPRECATED_DelAttr, - Delete as _DEPRECATED_Delete, - DelName as _DEPRECATED_DelName, - Dict as _DEPRECATED_Dict, - DictComp as _DEPRECATED_DictComp, - DictUnpack as _DEPRECATED_DictUnpack, - EmptyNode as _DEPRECATED_EmptyNode, - EvaluatedObject as _DEPRECATED_EvaluatedObject, - ExceptHandler as _DEPRECATED_ExceptHandler, - Expr as _DEPRECATED_Expr, - For as _DEPRECATED_For, - FormattedValue as _DEPRECATED_FormattedValue, - FunctionDef as _DEPRECATED_FunctionDef, - GeneratorExp as _DEPRECATED_GeneratorExp, - Global as _DEPRECATED_Global, - If as _DEPRECATED_If, - IfExp as _DEPRECATED_IfExp, - Import as _DEPRECATED_Import, - ImportFrom as _DEPRECATED_ImportFrom, - Interpolation as _DEPRECATED_Interpolation, - JoinedStr as _DEPRECATED_JoinedStr, - Keyword as _DEPRECATED_Keyword, - Lambda as _DEPRECATED_Lambda, - List as _DEPRECATED_List, - ListComp as _DEPRECATED_ListComp, - Match as _DEPRECATED_Match, - MatchAs as _DEPRECATED_MatchAs, - MatchCase as _DEPRECATED_MatchCase, - MatchClass as _DEPRECATED_MatchClass, - MatchMapping as _DEPRECATED_MatchMapping, - MatchOr as _DEPRECATED_MatchOr, - MatchSequence as _DEPRECATED_MatchSequence, - MatchSingleton as _DEPRECATED_MatchSingleton, - MatchStar as _DEPRECATED_MatchStar, - MatchValue as _DEPRECATED_MatchValue, - Module as _DEPRECATED_Module, - Name as _DEPRECATED_Name, - NamedExpr as _DEPRECATED_NamedExpr, - NodeNG as _DEPRECATED_NodeNG, - Nonlocal as _DEPRECATED_Nonlocal, - ParamSpec as _DEPRECATED_ParamSpec, - Pass as _DEPRECATED_Pass, - Raise as _DEPRECATED_Raise, - Return as _DEPRECATED_Return, - Set as _DEPRECATED_Set, - SetComp as _DEPRECATED_SetComp, - Slice as _DEPRECATED_Slice, - Starred as _DEPRECATED_Starred, - Subscript as _DEPRECATED_Subscript, - TemplateStr as _DEPRECATED_TemplateStr, - Try as _DEPRECATED_Try, - TryStar as _DEPRECATED_TryStar, - Tuple as _DEPRECATED_Tuple, - TypeAlias as _DEPRECATED_TypeAlias, - TypeVar as _DEPRECATED_TypeVar, - TypeVarTuple as _DEPRECATED_TypeVarTuple, - UnaryOp as _DEPRECATED_UnaryOp, - Unknown as _DEPRECATED_Unknown, - While as _DEPRECATED_While, - With as _DEPRECATED_With, - Yield as _DEPRECATED_Yield, - YieldFrom as _DEPRECATED_YieldFrom, - are_exclusive, - builtin_lookup, - unpack_infer, - function_to_method, -) - -# isort: on - -from astroid.util import Uninferable - -__all__ = [ - "CONST_CLS", - "MANAGER", - "AstroidBuildingError", - "AstroidError", - "AstroidImportError", - "AstroidIndexError", - "AstroidSyntaxError", - "AstroidTypeError", - "AstroidValueError", - "AttributeInferenceError", - "BaseInstance", - "BoundMethod", - "Context", - "DuplicateBasesError", - "ExceptionInstance", - "InconsistentMroError", - "InferenceError", - "InferenceOverwriteError", - "Instance", - "MroError", - "NameInferenceError", - "NoDefault", - "NotFoundError", - "ParentMissingError", - "ResolveError", - "StatementMissing", - "SuperArgumentTypeError", - "SuperError", - "TooManyLevelsError", - "UnboundMethod", - "Uninferable", - "UnresolvableName", - "UseInferenceDefault", - "__version__", - "_inference_tip_cached", - "are_exclusive", - "builtin_lookup", - "extract_node", - "function_to_method", - "inference_tip", - "node_classes", - "parse", - "raw_building", - "register_module_extender", - "scoped_nodes", - "unpack_infer", - "version", -] - - -def __getattr__(name: str): - if (val := globals().get(f"_DEPRECATED_{name}")) is None: - msg = f"module '{__name__}' has no attribute '{name}" - raise AttributeError(msg) - - # pylint: disable-next=import-outside-toplevel - import warnings - - msg = ( - f"importing '{name}' from 'astroid' is deprecated and will be removed in v5, " - "import it from 'astroid.nodes' instead" - ) - warnings.warn(msg, DeprecationWarning, stacklevel=2) - return val diff --git a/venv/lib/python3.12/site-packages/astroid/__pkginfo__.py b/venv/lib/python3.12/site-packages/astroid/__pkginfo__.py deleted file mode 100644 index 6af6f33..0000000 --- a/venv/lib/python3.12/site-packages/astroid/__pkginfo__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -__version__ = "4.0.4" -version = __version__ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 838e9b6..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/__pkginfo__.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/__pkginfo__.cpython-312.pyc deleted file mode 100644 index a40b938..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/__pkginfo__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/_ast.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/_ast.cpython-312.pyc deleted file mode 100644 index 3edb0d5..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/_ast.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/arguments.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/arguments.cpython-312.pyc deleted file mode 100644 index ff668e1..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/arguments.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/astroid_manager.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/astroid_manager.cpython-312.pyc deleted file mode 100644 index 0e45856..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/astroid_manager.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/bases.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/bases.cpython-312.pyc deleted file mode 100644 index 16ecdde..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/bases.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/builder.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/builder.cpython-312.pyc deleted file mode 100644 index 7fb1047..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/builder.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/const.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/const.cpython-312.pyc deleted file mode 100644 index 0d532ad..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/const.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/constraint.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/constraint.cpython-312.pyc deleted file mode 100644 index c4a01b1..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/constraint.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/context.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/context.cpython-312.pyc deleted file mode 100644 index 62cd6a9..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/context.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/decorators.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/decorators.cpython-312.pyc deleted file mode 100644 index 92561cd..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/decorators.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/exceptions.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index 11629a8..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/exceptions.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/filter_statements.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/filter_statements.cpython-312.pyc deleted file mode 100644 index 68ade3a..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/filter_statements.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/helpers.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/helpers.cpython-312.pyc deleted file mode 100644 index 72e749a..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/helpers.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/inference_tip.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/inference_tip.cpython-312.pyc deleted file mode 100644 index c85ef5d..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/inference_tip.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/manager.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/manager.cpython-312.pyc deleted file mode 100644 index cd68bd0..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/manager.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/modutils.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/modutils.cpython-312.pyc deleted file mode 100644 index 86e8835..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/modutils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/objects.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/objects.cpython-312.pyc deleted file mode 100644 index 9898c66..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/objects.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/protocols.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/protocols.cpython-312.pyc deleted file mode 100644 index a2ab680..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/protocols.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/raw_building.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/raw_building.cpython-312.pyc deleted file mode 100644 index 6e17e44..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/raw_building.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/rebuilder.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/rebuilder.cpython-312.pyc deleted file mode 100644 index 197fe79..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/rebuilder.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/test_utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/test_utils.cpython-312.pyc deleted file mode 100644 index b68f1bd..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/test_utils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/transforms.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/transforms.cpython-312.pyc deleted file mode 100644 index 9fab8e4..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/transforms.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/typing.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/typing.cpython-312.pyc deleted file mode 100644 index c11bf9f..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/typing.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/__pycache__/util.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/__pycache__/util.cpython-312.pyc deleted file mode 100644 index 102a99e..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/__pycache__/util.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/_ast.py b/venv/lib/python3.12/site-packages/astroid/_ast.py deleted file mode 100644 index e3ad97d..0000000 --- a/venv/lib/python3.12/site-packages/astroid/_ast.py +++ /dev/null @@ -1,102 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from __future__ import annotations - -import ast -from typing import NamedTuple - -from astroid.const import Context - - -class FunctionType(NamedTuple): - argtypes: list[ast.expr] - returns: ast.expr - - -class ParserModule(NamedTuple): - unary_op_classes: dict[type[ast.unaryop], str] - cmp_op_classes: dict[type[ast.cmpop], str] - bool_op_classes: dict[type[ast.boolop], str] - bin_op_classes: dict[type[ast.operator], str] - context_classes: dict[type[ast.expr_context], Context] - - def parse( - self, string: str, type_comments: bool = True, filename: str | None = None - ) -> ast.Module: - if filename: - return ast.parse(string, filename=filename, type_comments=type_comments) - return ast.parse(string, type_comments=type_comments) - - -def parse_function_type_comment(type_comment: str) -> FunctionType | None: - """Given a correct type comment, obtain a FunctionType object.""" - func_type = ast.parse(type_comment, "", "func_type") - return FunctionType(argtypes=func_type.argtypes, returns=func_type.returns) - - -def get_parser_module(type_comments: bool = True) -> ParserModule: - unary_op_classes = _unary_operators_from_module() - cmp_op_classes = _compare_operators_from_module() - bool_op_classes = _bool_operators_from_module() - bin_op_classes = _binary_operators_from_module() - context_classes = _contexts_from_module() - - return ParserModule( - unary_op_classes, - cmp_op_classes, - bool_op_classes, - bin_op_classes, - context_classes, - ) - - -def _unary_operators_from_module() -> dict[type[ast.unaryop], str]: - return {ast.UAdd: "+", ast.USub: "-", ast.Not: "not", ast.Invert: "~"} - - -def _binary_operators_from_module() -> dict[type[ast.operator], str]: - return { - ast.Add: "+", - ast.BitAnd: "&", - ast.BitOr: "|", - ast.BitXor: "^", - ast.Div: "/", - ast.FloorDiv: "//", - ast.MatMult: "@", - ast.Mod: "%", - ast.Mult: "*", - ast.Pow: "**", - ast.Sub: "-", - ast.LShift: "<<", - ast.RShift: ">>", - } - - -def _bool_operators_from_module() -> dict[type[ast.boolop], str]: - return {ast.And: "and", ast.Or: "or"} - - -def _compare_operators_from_module() -> dict[type[ast.cmpop], str]: - return { - ast.Eq: "==", - ast.Gt: ">", - ast.GtE: ">=", - ast.In: "in", - ast.Is: "is", - ast.IsNot: "is not", - ast.Lt: "<", - ast.LtE: "<=", - ast.NotEq: "!=", - ast.NotIn: "not in", - } - - -def _contexts_from_module() -> dict[type[ast.expr_context], Context]: - return { - ast.Load: Context.Load, - ast.Store: Context.Store, - ast.Del: Context.Del, - ast.Param: Context.Store, - } diff --git a/venv/lib/python3.12/site-packages/astroid/arguments.py b/venv/lib/python3.12/site-packages/astroid/arguments.py deleted file mode 100644 index 3781889..0000000 --- a/venv/lib/python3.12/site-packages/astroid/arguments.py +++ /dev/null @@ -1,309 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from __future__ import annotations - -from astroid import nodes -from astroid.bases import Instance -from astroid.context import CallContext, InferenceContext -from astroid.exceptions import InferenceError, NoDefault -from astroid.typing import InferenceResult -from astroid.util import Uninferable, UninferableBase, safe_infer - - -class CallSite: - """Class for understanding arguments passed into a call site. - - It needs a call context, which contains the arguments and the - keyword arguments that were passed into a given call site. - In order to infer what an argument represents, call :meth:`infer_argument` - with the corresponding function node and the argument name. - - :param callcontext: - An instance of :class:`astroid.context.CallContext`, that holds - the arguments for the call site. - :param argument_context_map: - Additional contexts per node, passed in from :attr:`astroid.context.Context.extra_context` - :param context: - An instance of :class:`astroid.context.Context`. - """ - - def __init__( - self, - callcontext: CallContext, - argument_context_map=None, - context: InferenceContext | None = None, - ): - if argument_context_map is None: - argument_context_map = {} - self.argument_context_map = argument_context_map - args = callcontext.args - keywords = callcontext.keywords - self.duplicated_keywords: set[str] = set() - self._unpacked_args = self._unpack_args(args, context=context) - self._unpacked_kwargs = self._unpack_keywords(keywords, context=context) - - self.positional_arguments = [ - arg for arg in self._unpacked_args if not isinstance(arg, UninferableBase) - ] - self.keyword_arguments = { - key: value - for key, value in self._unpacked_kwargs.items() - if not isinstance(value, UninferableBase) - } - - @classmethod - def from_call(cls, call_node: nodes.Call, context: InferenceContext | None = None): - """Get a CallSite object from the given Call node. - - context will be used to force a single inference path. - """ - - # Determine the callcontext from the given `context` object if any. - context = context or InferenceContext() - callcontext = CallContext(call_node.args, call_node.keywords) - return cls(callcontext, context=context) - - def has_invalid_arguments(self) -> bool: - """Check if in the current CallSite were passed *invalid* arguments. - - This can mean multiple things. For instance, if an unpacking - of an invalid object was passed, then this method will return True. - Other cases can be when the arguments can't be inferred by astroid, - for example, by passing objects which aren't known statically. - """ - return len(self.positional_arguments) != len(self._unpacked_args) - - def has_invalid_keywords(self) -> bool: - """Check if in the current CallSite were passed *invalid* keyword arguments. - - For instance, unpacking a dictionary with integer keys is invalid - (**{1:2}), because the keys must be strings, which will make this - method to return True. Other cases where this might return True if - objects which can't be inferred were passed. - """ - return len(self.keyword_arguments) != len(self._unpacked_kwargs) - - def _unpack_keywords( - self, - keywords: list[tuple[str | None, nodes.NodeNG]], - context: InferenceContext | None = None, - ) -> dict[str | None, InferenceResult]: - values: dict[str | None, InferenceResult] = {} - context = context or InferenceContext() - context.extra_context = self.argument_context_map - for name, value in keywords: - if name is None: - # Then it's an unpacking operation (**) - inferred = safe_infer(value, context=context) - if not isinstance(inferred, nodes.Dict): - # Not something we can work with. - values[name] = Uninferable - continue - - for dict_key, dict_value in inferred.items: - dict_key = safe_infer(dict_key, context=context) - if not isinstance(dict_key, nodes.Const): - values[name] = Uninferable - continue - if not isinstance(dict_key.value, str): - values[name] = Uninferable - continue - if dict_key.value in values: - # The name is already in the dictionary - values[dict_key.value] = Uninferable - self.duplicated_keywords.add(dict_key.value) - continue - values[dict_key.value] = dict_value - else: - values[name] = value - return values - - def _unpack_args(self, args, context: InferenceContext | None = None): - values = [] - context = context or InferenceContext() - context.extra_context = self.argument_context_map - for arg in args: - if isinstance(arg, nodes.Starred): - inferred = safe_infer(arg.value, context=context) - if isinstance(inferred, UninferableBase): - values.append(Uninferable) - continue - if not hasattr(inferred, "elts"): - values.append(Uninferable) - continue - values.extend(inferred.elts) - else: - values.append(arg) - return values - - def infer_argument( - self, funcnode: InferenceResult, name: str, context: InferenceContext - ): # noqa: C901 - """Infer a function argument value according to the call context.""" - # pylint: disable = too-many-branches - - if not isinstance(funcnode, (nodes.FunctionDef, nodes.Lambda)): - raise InferenceError( - f"Can not infer function argument value for non-function node {funcnode!r}.", - call_site=self, - func=funcnode, - arg=name, - context=context, - ) - - if name in self.duplicated_keywords: - raise InferenceError( - "The arguments passed to {func!r} have duplicate keywords.", - call_site=self, - func=funcnode, - arg=name, - context=context, - ) - - # Look into the keywords first, maybe it's already there. - try: - return self.keyword_arguments[name].infer(context) - except KeyError: - pass - - # Too many arguments given and no variable arguments. - if len(self.positional_arguments) > len(funcnode.args.args): - if not funcnode.args.vararg and not funcnode.args.posonlyargs: - raise InferenceError( - "Too many positional arguments " - "passed to {func!r} that does " - "not have *args.", - call_site=self, - func=funcnode, - arg=name, - context=context, - ) - - positional = self.positional_arguments[: len(funcnode.args.args)] - vararg = self.positional_arguments[len(funcnode.args.args) :] - - # preserving previous behavior, when vararg and kwarg were not included in find_argname results - if name in [funcnode.args.vararg, funcnode.args.kwarg]: - argindex = None - else: - argindex = funcnode.args.find_argname(name)[0] - - kwonlyargs = {arg.name for arg in funcnode.args.kwonlyargs} - kwargs = { - key: value - for key, value in self.keyword_arguments.items() - if key not in kwonlyargs - } - # If there are too few positionals compared to - # what the function expects to receive, check to see - # if the missing positional arguments were passed - # as keyword arguments and if so, place them into the - # positional args list. - if len(positional) < len(funcnode.args.args): - for func_arg in funcnode.args.args: - if func_arg.name in kwargs: - arg = kwargs.pop(func_arg.name) - positional.append(arg) - - if argindex is not None: - boundnode = context.boundnode - # 2. first argument of instance/class method - if argindex == 0 and funcnode.type in {"method", "classmethod"}: - # context.boundnode is None when an instance method is called with - # the class, e.g. MyClass.method(obj, ...). In this case, self - # is the first argument. - if boundnode is None and funcnode.type == "method" and positional: - return positional[0].infer(context=context) - if boundnode is None: - # XXX can do better ? - boundnode = funcnode.parent.frame() - - if isinstance(boundnode, nodes.ClassDef): - # Verify that we're accessing a method - # of the metaclass through a class, as in - # `cls.metaclass_method`. In this case, the - # first argument is always the class. - method_scope = funcnode.parent.scope() - if method_scope is boundnode.metaclass(context=context): - return iter((boundnode,)) - - if funcnode.type == "method": - if not isinstance(boundnode, Instance): - boundnode = boundnode.instantiate_class() - return iter((boundnode,)) - if funcnode.type == "classmethod": - return iter((boundnode,)) - # if we have a method, extract one position - # from the index, so we'll take in account - # the extra parameter represented by `self` or `cls` - if funcnode.type in {"method", "classmethod"} and boundnode: - argindex -= 1 - # 2. search arg index - try: - return self.positional_arguments[argindex].infer(context) - except IndexError: - pass - - if funcnode.args.kwarg == name: - # It wants all the keywords that were passed into - # the call site. - if self.has_invalid_keywords(): - raise InferenceError( - "Inference failed to find values for all keyword arguments " - "to {func!r}: {unpacked_kwargs!r} doesn't correspond to " - "{keyword_arguments!r}.", - keyword_arguments=self.keyword_arguments, - unpacked_kwargs=self._unpacked_kwargs, - call_site=self, - func=funcnode, - arg=name, - context=context, - ) - kwarg = nodes.Dict( - lineno=funcnode.args.lineno, - col_offset=funcnode.args.col_offset, - parent=funcnode.args, - end_lineno=funcnode.args.end_lineno, - end_col_offset=funcnode.args.end_col_offset, - ) - kwarg.postinit( - [(nodes.const_factory(key), value) for key, value in kwargs.items()] - ) - return iter((kwarg,)) - if funcnode.args.vararg == name: - # It wants all the args that were passed into - # the call site. - if self.has_invalid_arguments(): - raise InferenceError( - "Inference failed to find values for all positional " - "arguments to {func!r}: {unpacked_args!r} doesn't " - "correspond to {positional_arguments!r}.", - positional_arguments=self.positional_arguments, - unpacked_args=self._unpacked_args, - call_site=self, - func=funcnode, - arg=name, - context=context, - ) - args = nodes.Tuple( - lineno=funcnode.args.lineno, - col_offset=funcnode.args.col_offset, - parent=funcnode.args, - ) - args.postinit(vararg) - return iter((args,)) - - # Check if it's a default parameter. - try: - return funcnode.args.default_value(name).infer(context) - except NoDefault: - pass - raise InferenceError( - "No value found for argument {arg} to {func!r}", - call_site=self, - func=funcnode, - arg=name, - context=context, - ) diff --git a/venv/lib/python3.12/site-packages/astroid/astroid_manager.py b/venv/lib/python3.12/site-packages/astroid/astroid_manager.py deleted file mode 100644 index 3031057..0000000 --- a/venv/lib/python3.12/site-packages/astroid/astroid_manager.py +++ /dev/null @@ -1,20 +0,0 @@ -""" -This file contain the global astroid MANAGER. - -It prevents a circular import that happened -when the only possibility to import it was from astroid.__init__.py. - -This AstroidManager is a singleton/borg so it's possible to instantiate an -AstroidManager() directly. -""" - -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from astroid.brain.helpers import register_all_brains -from astroid.manager import AstroidManager - -MANAGER = AstroidManager() -# Register all brains after instantiating the singleton Manager -register_all_brains(MANAGER) diff --git a/venv/lib/python3.12/site-packages/astroid/bases.py b/venv/lib/python3.12/site-packages/astroid/bases.py deleted file mode 100644 index a029da6..0000000 --- a/venv/lib/python3.12/site-packages/astroid/bases.py +++ /dev/null @@ -1,778 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""This module contains base classes and functions for the nodes and some -inference utils. -""" -from __future__ import annotations - -import collections -import collections.abc -from collections.abc import Iterable, Iterator -from typing import TYPE_CHECKING, Any, Literal - -from astroid import decorators, nodes -from astroid.const import PY311_PLUS -from astroid.context import ( - CallContext, - InferenceContext, - bind_context_to_node, - copy_context, -) -from astroid.exceptions import ( - AstroidTypeError, - AttributeInferenceError, - InferenceError, - NameInferenceError, -) -from astroid.interpreter import objectmodel -from astroid.typing import ( - InferenceErrorInfo, - InferenceResult, - SuccessfulInferenceResult, -) -from astroid.util import Uninferable, UninferableBase, safe_infer - -if TYPE_CHECKING: - from astroid.constraint import Constraint - - -PROPERTIES = {"builtins.property", "abc.abstractproperty", "functools.cached_property"} -# enum.property was added in Python 3.11 -if PY311_PLUS: - PROPERTIES.add("enum.property") - -# List of possible property names. We use this list in order -# to see if a method is a property or not. This should be -# pretty reliable and fast, the alternative being to check each -# decorator to see if its a real property-like descriptor, which -# can be too complicated. -# Also, these aren't qualified, because each project can -# define them, we shouldn't expect to know every possible -# property-like decorator! -POSSIBLE_PROPERTIES = { - "cached_property", - "cachedproperty", - "lazyproperty", - "lazy_property", - "reify", - "lazyattribute", - "lazy_attribute", - "LazyProperty", - "lazy", - "cache_readonly", - "DynamicClassAttribute", -} - - -def _is_property( - meth: nodes.FunctionDef | UnboundMethod, context: InferenceContext | None = None -) -> bool: - decoratornames = meth.decoratornames(context=context) - if PROPERTIES.intersection(decoratornames): - return True - stripped = { - name.split(".")[-1] - for name in decoratornames - if not isinstance(name, UninferableBase) - } - if any(name in stripped for name in POSSIBLE_PROPERTIES): - return True - - if not meth.decorators: - return False - # Lookup for subclasses of *property* - for decorator in meth.decorators.nodes or (): - inferred = safe_infer(decorator, context=context) - if inferred is None or isinstance(inferred, UninferableBase): - continue - if isinstance(inferred, nodes.ClassDef): - # Check for a class which inherits from a standard property type - if any(inferred.is_subtype_of(pclass) for pclass in PROPERTIES): - return True - for base_class in inferred.bases: - # Check for a class which inherits from functools.cached_property - # and includes a subscripted type annotation - if isinstance(base_class, nodes.Subscript): - value = safe_infer(base_class.value, context=context) - if not isinstance(value, nodes.ClassDef): - continue - if value.name != "cached_property": - continue - module, _ = value.lookup(value.name) - if isinstance(module, nodes.Module) and module.name == "functools": - return True - continue - - return False - - -class Proxy: - """A simple proxy object. - - Note: - - Subclasses of this object will need a custom __getattr__ - if new instance attributes are created. See the Const class - """ - - _proxied: nodes.ClassDef | nodes.FunctionDef | nodes.Lambda | UnboundMethod - - def __init__( - self, - proxied: ( - nodes.ClassDef | nodes.FunctionDef | nodes.Lambda | UnboundMethod | None - ) = None, - ) -> None: - if proxied is None: - # This is a hack to allow calling this __init__ during bootstrapping of - # builtin classes and their docstrings. - # For Const, Generator, and UnionType nodes the _proxied attribute - # is set during bootstrapping - # as we first need to build the ClassDef that they can proxy. - # Thus, if proxied is None self should be a Const or Generator - # as that is the only way _proxied will be correctly set as a ClassDef. - assert isinstance(self, (nodes.Const, Generator, UnionType)) - else: - self._proxied = proxied - - def __getattr__(self, name: str) -> Any: - if name == "_proxied": - return self.__class__._proxied - if name in self.__dict__: - return self.__dict__[name] - return getattr(self._proxied, name) - - def infer( # type: ignore[return] - self, context: InferenceContext | None = None, **kwargs: Any - ) -> collections.abc.Generator[InferenceResult, None, InferenceErrorInfo | None]: - yield self - - -def _infer_stmts( - stmts: Iterable[InferenceResult], - context: InferenceContext | None, - frame: nodes.NodeNG | BaseInstance | None = None, -) -> collections.abc.Generator[InferenceResult]: - """Return an iterator on statements inferred by each statement in *stmts*.""" - inferred = False - constraint_failed = False - if context is not None: - name = context.lookupname - context = context.clone() - if name is not None: - constraints = context.constraints.get(name, {}) - else: - constraints = {} - else: - name = None - constraints = {} - context = InferenceContext() - - for stmt in stmts: - if isinstance(stmt, UninferableBase): - yield stmt - inferred = True - continue - context.lookupname = stmt._infer_name(frame, name) - try: - stmt_constraints: set[Constraint] = set() - for constraint_stmt, potential_constraints in constraints.items(): - if not constraint_stmt.parent_of(stmt): - stmt_constraints.update(potential_constraints) - for inf in stmt.infer(context=context): - if all(constraint.satisfied_by(inf) for constraint in stmt_constraints): - yield inf - inferred = True - else: - constraint_failed = True - except NameInferenceError: - continue - except InferenceError: - yield Uninferable - inferred = True - - if not inferred and constraint_failed: - yield Uninferable - elif not inferred: - raise InferenceError( - "Inference failed for all members of {stmts!r}.", - stmts=stmts, - frame=frame, - context=context, - ) - - -def _infer_method_result_truth( - instance: Instance, method_name: str, context: InferenceContext -) -> bool | UninferableBase: - # Get the method from the instance and try to infer - # its return's truth value. - meth = next(instance.igetattr(method_name, context=context), None) - if meth and hasattr(meth, "infer_call_result"): - if not meth.callable(): - return Uninferable - try: - context.callcontext = CallContext(args=[], callee=meth) - for value in meth.infer_call_result(instance, context=context): - if isinstance(value, UninferableBase): - return value - try: - inferred = next(value.infer(context=context)) - except StopIteration as e: - raise InferenceError(context=context) from e - return inferred.bool_value() - except InferenceError: - pass - return Uninferable - - -class BaseInstance(Proxy): - """An instance base class, which provides lookup methods for potential - instances. - """ - - _proxied: nodes.ClassDef - - special_attributes: objectmodel.ObjectModel - - def display_type(self) -> str: - return "Instance of" - - def getattr( - self, - name: str, - context: InferenceContext | None = None, - lookupclass: bool = True, - ) -> list[InferenceResult]: - try: - values = self._proxied.instance_attr(name, context) - except AttributeInferenceError as exc: - if self.special_attributes and name in self.special_attributes: - return [self.special_attributes.lookup(name)] - - if lookupclass: - # Class attributes not available through the instance - # unless they are explicitly defined. - return self._proxied.getattr(name, context, class_context=False) - - raise AttributeInferenceError( - target=self, attribute=name, context=context - ) from exc - # since we've no context information, return matching class members as - # well - if lookupclass: - try: - return values + self._proxied.getattr( - name, context, class_context=False - ) - except AttributeInferenceError: - pass - return values - - def igetattr( - self, name: str, context: InferenceContext | None = None - ) -> Iterator[InferenceResult]: - """Inferred getattr.""" - if not context: - context = InferenceContext() - try: - context.lookupname = name - # XXX frame should be self._proxied, or not ? - get_attr = self.getattr(name, context, lookupclass=False) - yield from _infer_stmts( - self._wrap_attr(get_attr, context), context, frame=self - ) - except AttributeInferenceError: - try: - # fallback to class.igetattr since it has some logic to handle - # descriptors - # But only if the _proxied is the Class. - if self._proxied.__class__.__name__ != "ClassDef": - raise - attrs = self._proxied.igetattr(name, context, class_context=False) - yield from self._wrap_attr(attrs, context) - except AttributeInferenceError as error: - raise InferenceError(**vars(error)) from error - - def _wrap_attr( - self, attrs: Iterable[InferenceResult], context: InferenceContext | None = None - ) -> Iterator[InferenceResult]: - """Wrap bound methods of attrs in a InstanceMethod proxies.""" - for attr in attrs: - if isinstance(attr, UnboundMethod): - if _is_property(attr): - yield from attr.infer_call_result(self, context) - else: - yield BoundMethod(attr, self) - elif isinstance(attr, nodes.Lambda): - if attr.args.arguments and attr.args.arguments[0].name == "self": - yield BoundMethod(attr, self) - continue - yield attr - else: - yield attr - - def infer_call_result( - self, - caller: SuccessfulInferenceResult | None, - context: InferenceContext | None = None, - ) -> Iterator[InferenceResult]: - """Infer what a class instance is returning when called.""" - context = bind_context_to_node(context, self) - inferred = False - - # If the call is an attribute on the instance, we infer the attribute itself - if isinstance(caller, nodes.Call) and isinstance(caller.func, nodes.Attribute): - for res in self.igetattr(caller.func.attrname, context): - inferred = True - yield res - - # Otherwise we infer the call to the __call__ dunder normally - for node in self._proxied.igetattr("__call__", context): - if isinstance(node, UninferableBase) or not node.callable(): - continue - if isinstance(node, BaseInstance) and node._proxied is self._proxied: - inferred = True - yield node - # Prevent recursion. - continue - for res in node.infer_call_result(caller, context): - inferred = True - yield res - if not inferred: - raise InferenceError(node=self, caller=caller, context=context) - - -class Instance(BaseInstance): - """A special node representing a class instance.""" - - special_attributes = objectmodel.InstanceModel() - - def __init__(self, proxied: nodes.ClassDef | None) -> None: - super().__init__(proxied) - - @decorators.yes_if_nothing_inferred - def infer_binary_op( - self, - opnode: nodes.AugAssign | nodes.BinOp, - operator: str, - other: InferenceResult, - context: InferenceContext, - method: SuccessfulInferenceResult, - ) -> Generator[InferenceResult]: - return method.infer_call_result(self, context) - - def __repr__(self) -> str: - return "".format( - self._proxied.root().name, self._proxied.name, id(self) - ) - - def __str__(self) -> str: - return f"Instance of {self._proxied.root().name}.{self._proxied.name}" - - def callable(self) -> bool: - try: - self._proxied.getattr("__call__", class_context=False) - return True - except AttributeInferenceError: - return False - - def pytype(self) -> str: - return self._proxied.qname() - - def display_type(self) -> str: - return "Instance of" - - def bool_value( - self, context: InferenceContext | None = None - ) -> bool | UninferableBase: - """Infer the truth value for an Instance. - - The truth value of an instance is determined by these conditions: - - * if it implements __bool__ on Python 3 or __nonzero__ - on Python 2, then its bool value will be determined by - calling this special method and checking its result. - * when this method is not defined, __len__() is called, if it - is defined, and the object is considered true if its result is - nonzero. If a class defines neither __len__() nor __bool__(), - all its instances are considered true. - """ - context = context or InferenceContext() - context.boundnode = self - - try: - result = _infer_method_result_truth(self, "__bool__", context) - except (InferenceError, AttributeInferenceError): - # Fallback to __len__. - try: - result = _infer_method_result_truth(self, "__len__", context) - except (AttributeInferenceError, InferenceError): - return True - return result - - def getitem( - self, index: nodes.Const, context: InferenceContext | None = None - ) -> InferenceResult | None: - new_context = bind_context_to_node(context, self) - if not context: - context = new_context - method = next(self.igetattr("__getitem__", context=context), None) - # Create a new CallContext for providing index as an argument. - new_context.callcontext = CallContext(args=[index], callee=method) - if not isinstance(method, BoundMethod): - raise InferenceError( - "Could not find __getitem__ for {node!r}.", node=self, context=context - ) - if len(method.args.arguments) != 2: # (self, index) - raise AstroidTypeError( - "__getitem__ for {node!r} does not have correct signature", - node=self, - context=context, - ) - return next(method.infer_call_result(self, new_context), None) - - -class UnboundMethod(Proxy): - """A special node representing a method not bound to an instance.""" - - _proxied: nodes.FunctionDef | UnboundMethod - - special_attributes: ( - objectmodel.BoundMethodModel | objectmodel.UnboundMethodModel - ) = objectmodel.UnboundMethodModel() - - def __repr__(self) -> str: - assert self._proxied.parent, "Expected a parent node" - frame = self._proxied.parent.frame() - return "<{} {} of {} at 0x{}".format( - self.__class__.__name__, self._proxied.name, frame.qname(), id(self) - ) - - def implicit_parameters(self) -> Literal[0, 1]: - return 0 - - def is_bound(self) -> bool: - return False - - def getattr(self, name: str, context: InferenceContext | None = None): - if name in self.special_attributes: - return [self.special_attributes.lookup(name)] - return self._proxied.getattr(name, context) - - def igetattr( - self, name: str, context: InferenceContext | None = None - ) -> Iterator[InferenceResult]: - if name in self.special_attributes: - return iter((self.special_attributes.lookup(name),)) - return self._proxied.igetattr(name, context) - - def infer_call_result( - self, - caller: SuccessfulInferenceResult | None, - context: InferenceContext | None = None, - ) -> Iterator[InferenceResult]: - """ - The boundnode of the regular context with a function called - on ``object.__new__`` will be of type ``object``, - which is incorrect for the argument in general. - If no context is given the ``object.__new__`` call argument will - be correctly inferred except when inside a call that requires - the additional context (such as a classmethod) of the boundnode - to determine which class the method was called from - """ - - # If we're unbound method __new__ of a builtin, the result is an - # instance of the class given as first argument. - if self._proxied.name == "__new__": - assert self._proxied.parent, "Expected a parent node" - qname = self._proxied.parent.frame().qname() - # Avoid checking builtins.type: _infer_type_new_call() does more validation - if qname.startswith("builtins.") and qname != "builtins.type": - return self._infer_builtin_new(caller, context or InferenceContext()) - return self._proxied.infer_call_result(caller, context) - - def _infer_builtin_new( - self, - caller: SuccessfulInferenceResult | None, - context: InferenceContext, - ) -> collections.abc.Generator[nodes.Const | Instance | UninferableBase]: - if not isinstance(caller, nodes.Call): - return - if not caller.args: - return - # Attempt to create a constant - if len(caller.args) > 1: - value = None - if isinstance(caller.args[1], nodes.Const): - value = caller.args[1].value - else: - inferred_arg = next(caller.args[1].infer(), None) - if isinstance(inferred_arg, nodes.Const): - value = inferred_arg.value - if value is not None: - const = nodes.const_factory(value) - assert not isinstance(const, nodes.EmptyNode) - yield const - return - - node_context = context.extra_context.get(caller.args[0]) - for inferred in caller.args[0].infer(context=node_context): - if isinstance(inferred, UninferableBase): - yield inferred - if isinstance(inferred, nodes.ClassDef): - yield Instance(inferred) - raise InferenceError - - def bool_value(self, context: InferenceContext | None = None) -> Literal[True]: - return True - - -class BoundMethod(UnboundMethod): - """A special node representing a method bound to an instance.""" - - special_attributes = objectmodel.BoundMethodModel() - - def __init__( - self, - proxy: nodes.FunctionDef | nodes.Lambda | UnboundMethod, - bound: SuccessfulInferenceResult, - ) -> None: - super().__init__(proxy) - self.bound = bound - - def implicit_parameters(self) -> Literal[0, 1]: - if self.name == "__new__": - # __new__ acts as a classmethod but the class argument is not implicit. - return 0 - return 1 - - def is_bound(self) -> Literal[True]: - return True - - def _infer_type_new_call( - self, caller: nodes.Call, context: InferenceContext - ) -> nodes.ClassDef | None: # noqa: C901 - """Try to infer what type.__new__(mcs, name, bases, attrs) returns. - - In order for such call to be valid, the metaclass needs to be - a subtype of ``type``, the name needs to be a string, the bases - needs to be a tuple of classes - """ - # pylint: disable=import-outside-toplevel; circular import - from astroid.nodes import Pass - - # Verify the metaclass - try: - mcs = next(caller.args[0].infer(context=context)) - except StopIteration as e: - raise InferenceError(context=context) from e - if not isinstance(mcs, nodes.ClassDef): - # Not a valid first argument. - return None - if not mcs.is_subtype_of("builtins.type"): - # Not a valid metaclass. - return None - - # Verify the name - try: - name = next(caller.args[1].infer(context=context)) - except StopIteration as e: - raise InferenceError(context=context) from e - if not isinstance(name, nodes.Const): - # Not a valid name, needs to be a const. - return None - if not isinstance(name.value, str): - # Needs to be a string. - return None - - # Verify the bases - try: - bases = next(caller.args[2].infer(context=context)) - except StopIteration as e: - raise InferenceError(context=context) from e - if not isinstance(bases, nodes.Tuple): - # Needs to be a tuple. - return None - try: - inferred_bases = [next(elt.infer(context=context)) for elt in bases.elts] - except StopIteration as e: - raise InferenceError(context=context) from e - if any(not isinstance(base, nodes.ClassDef) for base in inferred_bases): - # All the bases needs to be Classes - return None - - # Verify the attributes. - try: - attrs = next(caller.args[3].infer(context=context)) - except StopIteration as e: - raise InferenceError(context=context) from e - if not isinstance(attrs, nodes.Dict): - # Needs to be a dictionary. - return None - cls_locals: dict[str, list[InferenceResult]] = collections.defaultdict(list) - for key, value in attrs.items: - try: - key = next(key.infer(context=context)) - except StopIteration as e: - raise InferenceError(context=context) from e - try: - value = next(value.infer(context=context)) - except StopIteration as e: - raise InferenceError(context=context) from e - # Ignore non string keys - if isinstance(key, nodes.Const) and isinstance(key.value, str): - cls_locals[key.value].append(value) - - # Build the class from now. - cls = mcs.__class__( - name=name.value, - lineno=caller.lineno or 0, - col_offset=caller.col_offset or 0, - parent=caller, - end_lineno=caller.end_lineno, - end_col_offset=caller.end_col_offset, - ) - empty = Pass( - parent=cls, - lineno=caller.lineno, - col_offset=caller.col_offset, - end_lineno=caller.end_lineno, - end_col_offset=caller.end_col_offset, - ) - cls.postinit( - bases=bases.elts, - body=[empty], - decorators=None, - newstyle=True, - metaclass=mcs, - keywords=[], - ) - cls.locals = cls_locals - return cls - - def infer_call_result( - self, - caller: SuccessfulInferenceResult | None, - context: InferenceContext | None = None, - ) -> Iterator[InferenceResult]: - context = bind_context_to_node(context, self.bound) - if ( - isinstance(self.bound, nodes.ClassDef) - and self.bound.name == "type" - and self.name == "__new__" - and isinstance(caller, nodes.Call) - and len(caller.args) == 4 - ): - # Check if we have a ``type.__new__(mcs, name, bases, attrs)`` call. - new_cls = self._infer_type_new_call(caller, context) - if new_cls: - return iter((new_cls,)) - - return super().infer_call_result(caller, context) - - def bool_value(self, context: InferenceContext | None = None) -> Literal[True]: - return True - - -class Generator(BaseInstance): - """A special node representing a generator. - - Proxied class is set once for all in raw_building. - """ - - # We defer initialization of special_attributes to the __init__ method since the constructor - # of GeneratorModel requires the raw_building to be complete - # TODO: This should probably be refactored. - special_attributes: objectmodel.GeneratorBaseModel - - def __init__( - self, - parent: nodes.FunctionDef, - generator_initial_context: InferenceContext | None = None, - ) -> None: - super().__init__() - self.parent = parent - self._call_context = copy_context(generator_initial_context) - - # See comment above: this is a deferred initialization. - Generator.special_attributes = objectmodel.GeneratorModel() - - def infer_yield_types(self) -> Iterator[InferenceResult]: - yield from self.parent.infer_yield_result(self._call_context) - - def callable(self) -> Literal[False]: - return False - - def pytype(self) -> str: - return "builtins.generator" - - def display_type(self) -> str: - return "Generator" - - def bool_value(self, context: InferenceContext | None = None) -> Literal[True]: - return True - - def __repr__(self) -> str: - return f"" - - def __str__(self) -> str: - return f"Generator({self._proxied.name})" - - -class AsyncGenerator(Generator): - """Special node representing an async generator.""" - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - AsyncGenerator.special_attributes = objectmodel.AsyncGeneratorModel() - - def pytype(self) -> Literal["builtins.async_generator"]: - return "builtins.async_generator" - - def display_type(self) -> str: - return "AsyncGenerator" - - def __repr__(self) -> str: - return f"" - - def __str__(self) -> str: - return f"AsyncGenerator({self._proxied.name})" - - -class UnionType(BaseInstance): - """Special node representing new style typing unions. - - Proxied class is set once for all in raw_building. - """ - - def __init__( - self, - left: UnionType | nodes.ClassDef | nodes.Const, - right: UnionType | nodes.ClassDef | nodes.Const, - parent: nodes.NodeNG | None = None, - ) -> None: - super().__init__() - self.parent = parent - self.left = left - self.right = right - - def callable(self) -> Literal[False]: - return False - - def bool_value(self, context: InferenceContext | None = None) -> Literal[True]: - return True - - def pytype(self) -> Literal["types.UnionType"]: - return "types.UnionType" - - def display_type(self) -> str: - return "UnionType" - - def __repr__(self) -> str: - return f"" - - def __str__(self) -> str: - return f"UnionType({self._proxied.name})" diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__init__.py b/venv/lib/python3.12/site-packages/astroid/brain/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index ed5ed8b..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_argparse.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_argparse.cpython-312.pyc deleted file mode 100644 index 60f5b49..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_argparse.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_attrs.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_attrs.cpython-312.pyc deleted file mode 100644 index d4cfa3a..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_attrs.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_boto3.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_boto3.cpython-312.pyc deleted file mode 100644 index 7a42150..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_boto3.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_builtin_inference.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_builtin_inference.cpython-312.pyc deleted file mode 100644 index b6b7746..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_builtin_inference.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_collections.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_collections.cpython-312.pyc deleted file mode 100644 index ec83cce..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_collections.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_crypt.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_crypt.cpython-312.pyc deleted file mode 100644 index ce8505c..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_crypt.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_ctypes.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_ctypes.cpython-312.pyc deleted file mode 100644 index 9d19996..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_ctypes.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_curses.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_curses.cpython-312.pyc deleted file mode 100644 index 5d03470..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_curses.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_dataclasses.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_dataclasses.cpython-312.pyc deleted file mode 100644 index 026f4bc..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_dataclasses.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_datetime.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_datetime.cpython-312.pyc deleted file mode 100644 index a280225..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_datetime.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_dateutil.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_dateutil.cpython-312.pyc deleted file mode 100644 index a3f2b57..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_dateutil.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_functools.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_functools.cpython-312.pyc deleted file mode 100644 index 9df166c..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_functools.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_gi.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_gi.cpython-312.pyc deleted file mode 100644 index 98e8503..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_gi.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_hashlib.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_hashlib.cpython-312.pyc deleted file mode 100644 index c714c96..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_hashlib.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_http.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_http.cpython-312.pyc deleted file mode 100644 index 9e8c0ae..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_http.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_hypothesis.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_hypothesis.cpython-312.pyc deleted file mode 100644 index 74bd475..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_hypothesis.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_io.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_io.cpython-312.pyc deleted file mode 100644 index 10d8154..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_io.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_mechanize.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_mechanize.cpython-312.pyc deleted file mode 100644 index 89a50da..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_mechanize.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_multiprocessing.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_multiprocessing.cpython-312.pyc deleted file mode 100644 index 0b25ff5..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_multiprocessing.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_namedtuple_enum.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_namedtuple_enum.cpython-312.pyc deleted file mode 100644 index de7a392..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_namedtuple_enum.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_core_einsumfunc.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_core_einsumfunc.cpython-312.pyc deleted file mode 100644 index d5424e9..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_core_einsumfunc.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_core_fromnumeric.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_core_fromnumeric.cpython-312.pyc deleted file mode 100644 index d76a384..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_core_fromnumeric.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_core_function_base.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_core_function_base.cpython-312.pyc deleted file mode 100644 index 421c675..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_core_function_base.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_core_multiarray.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_core_multiarray.cpython-312.pyc deleted file mode 100644 index 254a363..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_core_multiarray.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_core_numeric.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_core_numeric.cpython-312.pyc deleted file mode 100644 index 17e7e2a..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_core_numeric.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_core_numerictypes.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_core_numerictypes.cpython-312.pyc deleted file mode 100644 index aef99a4..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_core_numerictypes.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_core_umath.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_core_umath.cpython-312.pyc deleted file mode 100644 index a28d118..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_core_umath.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_ma.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_ma.cpython-312.pyc deleted file mode 100644 index 45f4288..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_ma.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_ndarray.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_ndarray.cpython-312.pyc deleted file mode 100644 index da1af2e..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_ndarray.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_random_mtrand.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_random_mtrand.cpython-312.pyc deleted file mode 100644 index 1bcb76a..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_random_mtrand.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_utils.cpython-312.pyc deleted file mode 100644 index 0f07f1b..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_numpy_utils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_pathlib.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_pathlib.cpython-312.pyc deleted file mode 100644 index 751b6ca..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_pathlib.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_pkg_resources.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_pkg_resources.cpython-312.pyc deleted file mode 100644 index ca6ffff..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_pkg_resources.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_pytest.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_pytest.cpython-312.pyc deleted file mode 100644 index dc13506..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_pytest.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_qt.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_qt.cpython-312.pyc deleted file mode 100644 index f175c11..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_qt.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_random.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_random.cpython-312.pyc deleted file mode 100644 index abebacf..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_random.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_re.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_re.cpython-312.pyc deleted file mode 100644 index b00c470..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_re.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_regex.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_regex.cpython-312.pyc deleted file mode 100644 index 7ad5c00..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_regex.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_responses.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_responses.cpython-312.pyc deleted file mode 100644 index 084991a..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_responses.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_scipy_signal.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_scipy_signal.cpython-312.pyc deleted file mode 100644 index d9d38b2..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_scipy_signal.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_signal.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_signal.cpython-312.pyc deleted file mode 100644 index d63458e..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_signal.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_six.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_six.cpython-312.pyc deleted file mode 100644 index 1786358..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_six.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_sqlalchemy.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_sqlalchemy.cpython-312.pyc deleted file mode 100644 index 2bbe34c..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_sqlalchemy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_ssl.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_ssl.cpython-312.pyc deleted file mode 100644 index f015f47..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_ssl.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_statistics.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_statistics.cpython-312.pyc deleted file mode 100644 index eea02dc..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_statistics.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_subprocess.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_subprocess.cpython-312.pyc deleted file mode 100644 index 9d68ca8..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_subprocess.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_threading.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_threading.cpython-312.pyc deleted file mode 100644 index b7cee55..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_threading.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_type.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_type.cpython-312.pyc deleted file mode 100644 index 231b19a..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_type.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_typing.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_typing.cpython-312.pyc deleted file mode 100644 index 3ef611d..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_typing.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_unittest.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_unittest.cpython-312.pyc deleted file mode 100644 index 8abe1a4..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_unittest.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_uuid.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_uuid.cpython-312.pyc deleted file mode 100644 index f9caf7d..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/brain_uuid.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/helpers.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/helpers.cpython-312.pyc deleted file mode 100644 index 6036e4e..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/brain/__pycache__/helpers.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_argparse.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_argparse.py deleted file mode 100644 index 6bde22f..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_argparse.py +++ /dev/null @@ -1,50 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from __future__ import annotations - -from astroid import arguments, nodes -from astroid.context import InferenceContext -from astroid.exceptions import UseInferenceDefault -from astroid.inference_tip import inference_tip -from astroid.manager import AstroidManager - - -def infer_namespace(node, context: InferenceContext | None = None): - callsite = arguments.CallSite.from_call(node, context=context) - if not callsite.keyword_arguments: - # Cannot make sense of it. - raise UseInferenceDefault() - - class_node = nodes.ClassDef( - "Namespace", - lineno=node.lineno, - col_offset=node.col_offset, - parent=nodes.SYNTHETIC_ROOT, # this class is not real - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - ) - for attr in set(callsite.keyword_arguments): - fake_node = nodes.EmptyNode() - fake_node.parent = class_node - fake_node.attrname = attr - class_node.instance_attrs[attr] = [fake_node] - return iter((class_node.instantiate_class(),)) - - -def _looks_like_namespace(node) -> bool: - func = node.func - if isinstance(func, nodes.Attribute): - return ( - func.attrname == "Namespace" - and isinstance(func.expr, nodes.Name) - and func.expr.name == "argparse" - ) - return False - - -def register(manager: AstroidManager) -> None: - manager.register_transform( - nodes.Call, inference_tip(infer_namespace), _looks_like_namespace - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_attrs.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_attrs.py deleted file mode 100644 index b619bb3..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_attrs.py +++ /dev/null @@ -1,110 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -""" -Astroid hook for the attrs library - -Without this hook pylint reports unsupported-assignment-operation -for attrs classes -""" -from astroid import nodes -from astroid.brain.helpers import is_class_var -from astroid.manager import AstroidManager -from astroid.util import safe_infer - -ATTRIB_NAMES = frozenset( - ( - "attr.Factory", - "attr.ib", - "attrib", - "attr.attrib", - "attr.field", - "attrs.field", - "field", - ) -) -NEW_ATTRS_NAMES = frozenset( - ( - "attrs.define", - "attrs.mutable", - "attrs.frozen", - ) -) -ATTRS_NAMES = frozenset( - ( - "attr.s", - "attrs", - "attr.attrs", - "attr.attributes", - "attr.define", - "attr.mutable", - "attr.frozen", - *NEW_ATTRS_NAMES, - ) -) - - -def is_decorated_with_attrs(node, decorator_names=ATTRS_NAMES) -> bool: - """Return whether a decorated node has an attr decorator applied.""" - if not node.decorators: - return False - for decorator_attribute in node.decorators.nodes: - if isinstance(decorator_attribute, nodes.Call): # decorator with arguments - decorator_attribute = decorator_attribute.func - if decorator_attribute.as_string() in decorator_names: - return True - - inferred = safe_infer(decorator_attribute) - if inferred and inferred.root().name == "attr._next_gen": - return True - return False - - -def attr_attributes_transform(node: nodes.ClassDef) -> None: - """Given that the ClassNode has an attr decorator, - rewrite class attributes as instance attributes - """ - # Astroid can't infer this attribute properly - # Prevents https://github.com/pylint-dev/pylint/issues/1884 - node.locals["__attrs_attrs__"] = [nodes.Unknown(parent=node)] - - use_bare_annotations = is_decorated_with_attrs(node, NEW_ATTRS_NAMES) - for cdef_body_node in node.body: - if not isinstance(cdef_body_node, (nodes.Assign, nodes.AnnAssign)): - continue - if isinstance(cdef_body_node.value, nodes.Call): - if cdef_body_node.value.func.as_string() not in ATTRIB_NAMES: - continue - elif not use_bare_annotations: - continue - - # Skip attributes that are explicitly annotated as class variables - if isinstance(cdef_body_node, nodes.AnnAssign) and is_class_var( - cdef_body_node.annotation - ): - continue - - targets = ( - cdef_body_node.targets - if hasattr(cdef_body_node, "targets") - else [cdef_body_node.target] - ) - for target in targets: - rhs_node = nodes.Unknown( - lineno=cdef_body_node.lineno, - col_offset=cdef_body_node.col_offset, - parent=cdef_body_node, - ) - if isinstance(target, nodes.AssignName): - # Could be a subscript if the code analysed is - # i = Optional[str] = "" - # See https://github.com/pylint-dev/pylint/issues/4439 - node.locals[target.name] = [rhs_node] - node.instance_attrs[target.name] = [rhs_node] - - -def register(manager: AstroidManager) -> None: - manager.register_transform( - nodes.ClassDef, attr_attributes_transform, is_decorated_with_attrs - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_boto3.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_boto3.py deleted file mode 100644 index 3a95feb..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_boto3.py +++ /dev/null @@ -1,32 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Astroid hooks for understanding ``boto3.ServiceRequest()``.""" - -from astroid.builder import extract_node -from astroid.manager import AstroidManager -from astroid.nodes.scoped_nodes import ClassDef - -BOTO_SERVICE_FACTORY_QUALIFIED_NAME = "boto3.resources.base.ServiceResource" - - -def service_request_transform(node: ClassDef) -> ClassDef: - """Transform ServiceResource to look like dynamic classes.""" - code = """ - def __getattr__(self, attr): - return 0 - """ - func_getattr = extract_node(code) - node.locals["__getattr__"] = [func_getattr] - return node - - -def _looks_like_boto3_service_request(node: ClassDef) -> bool: - return node.qname() == BOTO_SERVICE_FACTORY_QUALIFIED_NAME - - -def register(manager: AstroidManager) -> None: - manager.register_transform( - ClassDef, service_request_transform, _looks_like_boto3_service_request - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_builtin_inference.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_builtin_inference.py deleted file mode 100644 index e21d361..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_builtin_inference.py +++ /dev/null @@ -1,1106 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Astroid hooks for various builtins.""" - -from __future__ import annotations - -import itertools -from collections.abc import Callable, Iterable, Iterator -from functools import partial -from typing import TYPE_CHECKING, Any, NoReturn, cast - -from astroid import arguments, helpers, nodes, objects, util -from astroid.builder import AstroidBuilder -from astroid.context import InferenceContext -from astroid.exceptions import ( - AstroidTypeError, - AttributeInferenceError, - InferenceError, - MroError, - UseInferenceDefault, -) -from astroid.inference_tip import inference_tip -from astroid.manager import AstroidManager -from astroid.nodes import scoped_nodes -from astroid.typing import ( - ConstFactoryResult, - InferenceResult, - SuccessfulInferenceResult, -) - -if TYPE_CHECKING: - from astroid.bases import Instance - -ContainerObjects = ( - objects.FrozenSet | objects.DictItems | objects.DictKeys | objects.DictValues -) - -BuiltContainers = type[tuple] | type[list] | type[set] | type[frozenset] - -CopyResult = nodes.Dict | nodes.List | nodes.Set | objects.FrozenSet - -OBJECT_DUNDER_NEW = "object.__new__" - -STR_CLASS = """ -class whatever(object): - def join(self, iterable): - return {rvalue} - def replace(self, old, new, count=None): - return {rvalue} - def format(self, *args, **kwargs): - return {rvalue} - def encode(self, encoding='ascii', errors=None): - return b'' - def decode(self, encoding='ascii', errors=None): - return u'' - def capitalize(self): - return {rvalue} - def title(self): - return {rvalue} - def lower(self): - return {rvalue} - def upper(self): - return {rvalue} - def swapcase(self): - return {rvalue} - def index(self, sub, start=None, end=None): - return 0 - def find(self, sub, start=None, end=None): - return 0 - def count(self, sub, start=None, end=None): - return 0 - def strip(self, chars=None): - return {rvalue} - def lstrip(self, chars=None): - return {rvalue} - def rstrip(self, chars=None): - return {rvalue} - def rjust(self, width, fillchar=None): - return {rvalue} - def center(self, width, fillchar=None): - return {rvalue} - def ljust(self, width, fillchar=None): - return {rvalue} -""" - - -BYTES_CLASS = """ -class whatever(object): - def join(self, iterable): - return {rvalue} - def replace(self, old, new, count=None): - return {rvalue} - def decode(self, encoding='ascii', errors=None): - return u'' - def capitalize(self): - return {rvalue} - def title(self): - return {rvalue} - def lower(self): - return {rvalue} - def upper(self): - return {rvalue} - def swapcase(self): - return {rvalue} - def index(self, sub, start=None, end=None): - return 0 - def find(self, sub, start=None, end=None): - return 0 - def count(self, sub, start=None, end=None): - return 0 - def strip(self, chars=None): - return {rvalue} - def lstrip(self, chars=None): - return {rvalue} - def rstrip(self, chars=None): - return {rvalue} - def rjust(self, width, fillchar=None): - return {rvalue} - def center(self, width, fillchar=None): - return {rvalue} - def ljust(self, width, fillchar=None): - return {rvalue} -""" - - -def _use_default() -> NoReturn: # pragma: no cover - raise UseInferenceDefault() - - -def _extend_string_class(class_node, code, rvalue): - """Function to extend builtin str/unicode class.""" - code = code.format(rvalue=rvalue) - fake = AstroidBuilder(AstroidManager()).string_build(code)["whatever"] - for method in fake.mymethods(): - method.parent = class_node - method.lineno = None - method.col_offset = None - if "__class__" in method.locals: - method.locals["__class__"] = [class_node] - class_node.locals[method.name] = [method] - method.parent = class_node - - -def _extend_builtins(class_transforms): - builtin_ast = AstroidManager().builtins_module - for class_name, transform in class_transforms.items(): - transform(builtin_ast[class_name]) - - -def on_bootstrap(): - """Called by astroid_bootstrapping().""" - _extend_builtins( - { - "bytes": partial(_extend_string_class, code=BYTES_CLASS, rvalue="b''"), - "str": partial(_extend_string_class, code=STR_CLASS, rvalue="''"), - } - ) - - -def _builtin_filter_predicate(node, builtin_name) -> bool: - # pylint: disable = too-many-boolean-expressions - if ( - builtin_name == "type" - and node.root().name == "re" - and isinstance(node.func, nodes.Name) - and node.func.name == "type" - and isinstance(node.parent, nodes.Assign) - and len(node.parent.targets) == 1 - and isinstance(node.parent.targets[0], nodes.AssignName) - and node.parent.targets[0].name in {"Pattern", "Match"} - ): - # Handle re.Pattern and re.Match in brain_re - # Match these patterns from stdlib/re.py - # ```py - # Pattern = type(...) - # Match = type(...) - # ``` - return False - if isinstance(node.func, nodes.Name): - return node.func.name == builtin_name - if isinstance(node.func, nodes.Attribute): - return ( - node.func.attrname == "fromkeys" - and isinstance(node.func.expr, nodes.Name) - and node.func.expr.name == "dict" - ) - return False - - -def register_builtin_transform( - manager: AstroidManager, transform, builtin_name -) -> None: - """Register a new transform function for the given *builtin_name*. - - The transform function must accept two parameters, a node and - an optional context. - """ - - def _transform_wrapper( - node: nodes.Call, context: InferenceContext | None = None, **kwargs: Any - ) -> Iterator: - result = transform(node, context=context) - if result: - if not result.parent: - # Let the transformation function determine - # the parent for its result. Otherwise, - # we set it to be the node we transformed from. - result.parent = node - - if result.lineno is None: - result.lineno = node.lineno - # Can be a 'Module' see https://github.com/pylint-dev/pylint/issues/4671 - # We don't have a regression test on this one: tread carefully - if hasattr(result, "col_offset") and result.col_offset is None: - result.col_offset = node.col_offset - return iter([result]) - - manager.register_transform( - nodes.Call, - inference_tip(_transform_wrapper), - partial(_builtin_filter_predicate, builtin_name=builtin_name), - ) - - -def _container_generic_inference( - node: nodes.Call, - context: InferenceContext | None, - node_type: type[nodes.BaseContainer], - transform: Callable[[SuccessfulInferenceResult], nodes.BaseContainer | None], -) -> nodes.BaseContainer: - args = node.args - if not args: - return node_type( - lineno=node.lineno, - col_offset=node.col_offset, - parent=node.parent, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - ) - if len(node.args) > 1: - raise UseInferenceDefault() - - (arg,) = args - transformed = transform(arg) - if not transformed: - try: - inferred = next(arg.infer(context=context)) - except (InferenceError, StopIteration) as exc: - raise UseInferenceDefault from exc - if isinstance(inferred, util.UninferableBase): - raise UseInferenceDefault - transformed = transform(inferred) - if not transformed or isinstance(transformed, util.UninferableBase): - raise UseInferenceDefault - return transformed - - -def _container_generic_transform( - arg: SuccessfulInferenceResult, - context: InferenceContext | None, - klass: type[nodes.BaseContainer], - iterables: tuple[type[nodes.BaseContainer] | type[ContainerObjects], ...], - build_elts: BuiltContainers, -) -> nodes.BaseContainer | None: - elts: Iterable | str | bytes - - if isinstance(arg, klass): - return arg - if isinstance(arg, iterables): - arg = cast((nodes.BaseContainer | ContainerObjects), arg) - if all(isinstance(elt, nodes.Const) for elt in arg.elts): - elts = [cast(nodes.Const, elt).value for elt in arg.elts] - else: - # TODO: Does not handle deduplication for sets. - elts = [] - for element in arg.elts: - if not element: - continue - inferred = util.safe_infer(element, context=context) - if inferred: - evaluated_object = nodes.EvaluatedObject( - original=element, value=inferred - ) - elts.append(evaluated_object) - elif isinstance(arg, nodes.Dict): - # Dicts need to have consts as strings already. - elts = [ - item[0].value if isinstance(item[0], nodes.Const) else _use_default() - for item in arg.items - ] - elif isinstance(arg, nodes.Const) and isinstance(arg.value, (str, bytes)): - elts = arg.value - else: - return None - return klass.from_elements(elts=build_elts(elts)) - - -def _infer_builtin_container( - node: nodes.Call, - context: InferenceContext | None, - klass: type[nodes.BaseContainer], - iterables: tuple[type[nodes.NodeNG] | type[ContainerObjects], ...], - build_elts: BuiltContainers, -) -> nodes.BaseContainer: - transform_func = partial( - _container_generic_transform, - context=context, - klass=klass, - iterables=iterables, - build_elts=build_elts, - ) - - return _container_generic_inference(node, context, klass, transform_func) - - -# pylint: disable=invalid-name -infer_tuple = partial( - _infer_builtin_container, - klass=nodes.Tuple, - iterables=( - nodes.List, - nodes.Set, - objects.FrozenSet, - objects.DictItems, - objects.DictKeys, - objects.DictValues, - ), - build_elts=tuple, -) - -infer_list = partial( - _infer_builtin_container, - klass=nodes.List, - iterables=( - nodes.Tuple, - nodes.Set, - objects.FrozenSet, - objects.DictItems, - objects.DictKeys, - objects.DictValues, - ), - build_elts=list, -) - -infer_set = partial( - _infer_builtin_container, - klass=nodes.Set, - iterables=(nodes.List, nodes.Tuple, objects.FrozenSet, objects.DictKeys), - build_elts=set, -) - -infer_frozenset = partial( - _infer_builtin_container, - klass=objects.FrozenSet, - iterables=(nodes.List, nodes.Tuple, nodes.Set, objects.FrozenSet, objects.DictKeys), - build_elts=frozenset, -) - - -def _get_elts(arg, context): - def is_iterable(n) -> bool: - return isinstance(n, (nodes.List, nodes.Tuple, nodes.Set)) - - try: - inferred = next(arg.infer(context)) - except (InferenceError, StopIteration) as exc: - raise UseInferenceDefault from exc - if isinstance(inferred, nodes.Dict): - items = inferred.items - elif is_iterable(inferred): - items = [] - for elt in inferred.elts: - # If an item is not a pair of two items, - # then fallback to the default inference. - # Also, take in consideration only hashable items, - # tuples and consts. We are choosing Names as well. - if not is_iterable(elt): - raise UseInferenceDefault() - if len(elt.elts) != 2: - raise UseInferenceDefault() - if not isinstance(elt.elts[0], (nodes.Tuple, nodes.Const, nodes.Name)): - raise UseInferenceDefault() - items.append(tuple(elt.elts)) - else: - raise UseInferenceDefault() - return items - - -def infer_dict(node: nodes.Call, context: InferenceContext | None = None) -> nodes.Dict: - """Try to infer a dict call to a Dict node. - - The function treats the following cases: - - * dict() - * dict(mapping) - * dict(iterable) - * dict(iterable, **kwargs) - * dict(mapping, **kwargs) - * dict(**kwargs) - - If a case can't be inferred, we'll fallback to default inference. - """ - call = arguments.CallSite.from_call(node, context=context) - if call.has_invalid_arguments() or call.has_invalid_keywords(): - raise UseInferenceDefault - - args = call.positional_arguments - kwargs = list(call.keyword_arguments.items()) - - items: list[tuple[InferenceResult, InferenceResult]] - if not args and not kwargs: - # dict() - return nodes.Dict( - lineno=node.lineno, - col_offset=node.col_offset, - parent=node.parent, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - ) - if kwargs and not args: - # dict(a=1, b=2, c=4) - items = [(nodes.Const(key), value) for key, value in kwargs] - elif len(args) == 1 and kwargs: - # dict(some_iterable, b=2, c=4) - elts = _get_elts(args[0], context) - keys = [(nodes.Const(key), value) for key, value in kwargs] - items = elts + keys - elif len(args) == 1: - items = _get_elts(args[0], context) - else: - raise UseInferenceDefault() - value = nodes.Dict( - col_offset=node.col_offset, - lineno=node.lineno, - parent=node.parent, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - ) - value.postinit(items) - return value - - -def infer_super( - node: nodes.Call, context: InferenceContext | None = None -) -> objects.Super: - """Understand super calls. - - There are some restrictions for what can be understood: - - * unbounded super (one argument form) is not understood. - - * if the super call is not inside a function (classmethod or method), - then the default inference will be used. - - * if the super arguments can't be inferred, the default inference - will be used. - """ - if len(node.args) == 1: - # Ignore unbounded super. - raise UseInferenceDefault - - scope = node.scope() - if not isinstance(scope, nodes.FunctionDef): - # Ignore non-method uses of super. - raise UseInferenceDefault - if scope.type not in ("classmethod", "method"): - # Not interested in staticmethods. - raise UseInferenceDefault - - cls = scoped_nodes.get_wrapping_class(scope) - assert cls is not None - if not node.args: - mro_pointer = cls - # In we are in a classmethod, the interpreter will fill - # automatically the class as the second argument, not an instance. - if scope.type == "classmethod": - mro_type = cls - else: - mro_type = cls.instantiate_class() - else: - try: - mro_pointer = next(node.args[0].infer(context=context)) - except (InferenceError, StopIteration) as exc: - raise UseInferenceDefault from exc - try: - mro_type = next(node.args[1].infer(context=context)) - except (InferenceError, StopIteration) as exc: - raise UseInferenceDefault from exc - - if isinstance(mro_pointer, util.UninferableBase) or isinstance( - mro_type, util.UninferableBase - ): - # No way we could understand this. - raise UseInferenceDefault - - super_obj = objects.Super( - mro_pointer=mro_pointer, - mro_type=mro_type, - self_class=cls, - scope=scope, - call=node, - ) - super_obj.parent = node - return super_obj - - -def _infer_getattr_args(node, context): - if len(node.args) not in (2, 3): - # Not a valid getattr call. - raise UseInferenceDefault - - try: - obj = next(node.args[0].infer(context=context)) - attr = next(node.args[1].infer(context=context)) - except (InferenceError, StopIteration) as exc: - raise UseInferenceDefault from exc - - if isinstance(obj, util.UninferableBase) or isinstance(attr, util.UninferableBase): - # If one of the arguments is something we can't infer, - # then also make the result of the getattr call something - # which is unknown. - return util.Uninferable, util.Uninferable - - is_string = isinstance(attr, nodes.Const) and isinstance(attr.value, str) - if not is_string: - raise UseInferenceDefault - - return obj, attr.value - - -def infer_getattr(node, context: InferenceContext | None = None): - """Understand getattr calls. - - If one of the arguments is an Uninferable object, then the - result will be an Uninferable object. Otherwise, the normal attribute - lookup will be done. - """ - obj, attr = _infer_getattr_args(node, context) - if ( - isinstance(obj, util.UninferableBase) - or isinstance(attr, util.UninferableBase) - or not hasattr(obj, "igetattr") - ): - return util.Uninferable - - try: - return next(obj.igetattr(attr, context=context)) - except (StopIteration, InferenceError, AttributeInferenceError): - if len(node.args) == 3: - # Try to infer the default and return it instead. - try: - return next(node.args[2].infer(context=context)) - except (StopIteration, InferenceError) as exc: - raise UseInferenceDefault from exc - - raise UseInferenceDefault - - -def infer_hasattr(node, context: InferenceContext | None = None): - """Understand hasattr calls. - - This always guarantees three possible outcomes for calling - hasattr: Const(False) when we are sure that the object - doesn't have the intended attribute, Const(True) when - we know that the object has the attribute and Uninferable - when we are unsure of the outcome of the function call. - """ - try: - obj, attr = _infer_getattr_args(node, context) - if ( - isinstance(obj, util.UninferableBase) - or isinstance(attr, util.UninferableBase) - or not hasattr(obj, "getattr") - ): - return util.Uninferable - obj.getattr(attr, context=context) - except UseInferenceDefault: - # Can't infer something from this function call. - return util.Uninferable - except AttributeInferenceError: - # Doesn't have it. - return nodes.Const(False) - return nodes.Const(True) - - -def infer_callable(node, context: InferenceContext | None = None): - """Understand callable calls. - - This follows Python's semantics, where an object - is callable if it provides an attribute __call__, - even though that attribute is something which can't be - called. - """ - if len(node.args) != 1: - # Invalid callable call. - raise UseInferenceDefault - - argument = node.args[0] - try: - inferred = next(argument.infer(context=context)) - except (InferenceError, StopIteration): - return util.Uninferable - if isinstance(inferred, util.UninferableBase): - return util.Uninferable - return nodes.Const(inferred.callable()) - - -def infer_property( - node: nodes.Call, context: InferenceContext | None = None -) -> objects.Property: - """Understand `property` class. - - This only infers the output of `property` - call, not the arguments themselves. - """ - if len(node.args) < 1: - # Invalid property call. - raise UseInferenceDefault - - getter = node.args[0] - try: - inferred = next(getter.infer(context=context)) - except (InferenceError, StopIteration) as exc: - raise UseInferenceDefault from exc - - if not isinstance(inferred, (nodes.FunctionDef, nodes.Lambda)): - raise UseInferenceDefault - - prop_func = objects.Property( - function=inferred, - name="", - lineno=node.lineno, - col_offset=node.col_offset, - # ↓ semantically, the definition of the class of property isn't within - # node.frame. It's somewhere in the builtins module, but we are special - # casing it for each "property()" call, so we are making up the - # definition on the spot, ad-hoc. - parent=scoped_nodes.SYNTHETIC_ROOT, - ) - prop_func.postinit( - body=[], - args=inferred.args, - doc_node=getattr(inferred, "doc_node", None), - ) - return prop_func - - -def infer_bool(node, context: InferenceContext | None = None): - """Understand bool calls.""" - if len(node.args) > 1: - # Invalid bool call. - raise UseInferenceDefault - - if not node.args: - return nodes.Const(False) - - argument = node.args[0] - try: - inferred = next(argument.infer(context=context)) - except (InferenceError, StopIteration): - return util.Uninferable - if isinstance(inferred, util.UninferableBase): - return util.Uninferable - - bool_value = inferred.bool_value(context=context) - if isinstance(bool_value, util.UninferableBase): - return util.Uninferable - return nodes.Const(bool_value) - - -def infer_type(node, context: InferenceContext | None = None): - """Understand the one-argument form of *type*.""" - if len(node.args) != 1: - raise UseInferenceDefault - - return helpers.object_type(node.args[0], context) - - -def infer_slice(node, context: InferenceContext | None = None): - """Understand `slice` calls.""" - args = node.args - if not 0 < len(args) <= 3: - raise UseInferenceDefault - - infer_func = partial(util.safe_infer, context=context) - args = [infer_func(arg) for arg in args] - for arg in args: - if not arg or isinstance(arg, util.UninferableBase): - raise UseInferenceDefault - if not isinstance(arg, nodes.Const): - raise UseInferenceDefault - if not isinstance(arg.value, (type(None), int)): - raise UseInferenceDefault - - if len(args) < 3: - # Make sure we have 3 arguments. - args.extend([None] * (3 - len(args))) - - slice_node = nodes.Slice( - lineno=node.lineno, - col_offset=node.col_offset, - parent=node.parent, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - ) - slice_node.postinit(*args) - return slice_node - - -def _infer_object__new__decorator( - node: nodes.ClassDef, context: InferenceContext | None = None, **kwargs: Any -) -> Iterator[Instance]: - # Instantiate class immediately - # since that's what @object.__new__ does - return iter((node.instantiate_class(),)) - - -def _infer_object__new__decorator_check(node) -> bool: - """Predicate before inference_tip. - - Check if the given ClassDef has an @object.__new__ decorator - """ - if not node.decorators: - return False - - for decorator in node.decorators.nodes: - if isinstance(decorator, nodes.Attribute): - if decorator.as_string() == OBJECT_DUNDER_NEW: - return True - return False - - -def infer_issubclass(callnode, context: InferenceContext | None = None): - """Infer issubclass() calls. - - :param nodes.Call callnode: an `issubclass` call - :param InferenceContext context: the context for the inference - :rtype nodes.Const: Boolean Const value of the `issubclass` call - :raises UseInferenceDefault: If the node cannot be inferred - """ - call = arguments.CallSite.from_call(callnode, context=context) - if call.keyword_arguments: - # issubclass doesn't support keyword arguments - raise UseInferenceDefault("TypeError: issubclass() takes no keyword arguments") - if len(call.positional_arguments) != 2: - raise UseInferenceDefault( - f"Expected two arguments, got {len(call.positional_arguments)}" - ) - # The left hand argument is the obj to be checked - obj_node, class_or_tuple_node = call.positional_arguments - - try: - obj_type = next(obj_node.infer(context=context)) - except (InferenceError, StopIteration) as exc: - raise UseInferenceDefault from exc - if not isinstance(obj_type, nodes.ClassDef): - raise UseInferenceDefault( - f"TypeError: arg 1 must be class, not {type(obj_type)!r}" - ) - - # The right hand argument is the class(es) that the given - # object is to be checked against. - try: - class_container = _class_or_tuple_to_container( - class_or_tuple_node, context=context - ) - except InferenceError as exc: - raise UseInferenceDefault from exc - try: - issubclass_bool = helpers.object_issubclass(obj_type, class_container, context) - except AstroidTypeError as exc: - raise UseInferenceDefault("TypeError: " + str(exc)) from exc - except MroError as exc: - raise UseInferenceDefault from exc - return nodes.Const(issubclass_bool) - - -def infer_isinstance( - callnode: nodes.Call, context: InferenceContext | None = None -) -> nodes.Const: - """Infer isinstance calls. - - :param nodes.Call callnode: an isinstance call - :raises UseInferenceDefault: If the node cannot be inferred - """ - call = arguments.CallSite.from_call(callnode, context=context) - if call.keyword_arguments: - # isinstance doesn't support keyword arguments - raise UseInferenceDefault("TypeError: isinstance() takes no keyword arguments") - if len(call.positional_arguments) != 2: - raise UseInferenceDefault( - f"Expected two arguments, got {len(call.positional_arguments)}" - ) - # The left hand argument is the obj to be checked - obj_node, class_or_tuple_node = call.positional_arguments - # The right hand argument is the class(es) that the given - # obj is to be check is an instance of - try: - class_container = _class_or_tuple_to_container( - class_or_tuple_node, context=context - ) - except InferenceError as exc: - raise UseInferenceDefault from exc - try: - isinstance_bool = helpers.object_isinstance(obj_node, class_container, context) - except AstroidTypeError as exc: - raise UseInferenceDefault("TypeError: " + str(exc)) from exc - except MroError as exc: - raise UseInferenceDefault from exc - if isinstance(isinstance_bool, util.UninferableBase): - raise UseInferenceDefault - return nodes.Const(isinstance_bool) - - -def _class_or_tuple_to_container( - node: InferenceResult, context: InferenceContext | None = None -) -> list[InferenceResult]: - # Move inferences results into container - # to simplify later logic - # raises InferenceError if any of the inferences fall through - try: - node_infer = next(node.infer(context=context)) - except StopIteration as e: - raise InferenceError(node=node, context=context) from e - # arg2 MUST be a type or a TUPLE of types - # for isinstance - if isinstance(node_infer, nodes.Tuple): - try: - class_container = [ - next(node.infer(context=context)) for node in node_infer.elts - ] - except StopIteration as e: - raise InferenceError(node=node, context=context) from e - else: - class_container = [node_infer] - return class_container - - -def infer_len(node, context: InferenceContext | None = None) -> nodes.Const: - """Infer length calls. - - :param nodes.Call node: len call to infer - :param context.InferenceContext: node context - :rtype nodes.Const: a Const node with the inferred length, if possible - """ - call = arguments.CallSite.from_call(node, context=context) - if call.keyword_arguments: - raise UseInferenceDefault("TypeError: len() must take no keyword arguments") - if len(call.positional_arguments) != 1: - raise UseInferenceDefault( - "TypeError: len() must take exactly one argument " - "({len}) given".format(len=len(call.positional_arguments)) - ) - [argument_node] = call.positional_arguments - - try: - return nodes.Const(helpers.object_len(argument_node, context=context)) - except (AstroidTypeError, InferenceError) as exc: - raise UseInferenceDefault(str(exc)) from exc - - -def infer_str(node, context: InferenceContext | None = None) -> nodes.Const: - """Infer str() calls. - - :param nodes.Call node: str() call to infer - :param context.InferenceContext: node context - :rtype nodes.Const: a Const containing an empty string - """ - call = arguments.CallSite.from_call(node, context=context) - if call.keyword_arguments: - raise UseInferenceDefault("TypeError: str() must take no keyword arguments") - try: - return nodes.Const("") - except (AstroidTypeError, InferenceError) as exc: - raise UseInferenceDefault(str(exc)) from exc - - -def infer_int(node, context: InferenceContext | None = None): - """Infer int() calls. - - :param nodes.Call node: int() call to infer - :param context.InferenceContext: node context - :rtype nodes.Const: a Const containing the integer value of the int() call - """ - call = arguments.CallSite.from_call(node, context=context) - if call.keyword_arguments: - raise UseInferenceDefault("TypeError: int() must take no keyword arguments") - - if call.positional_arguments: - try: - first_value = next(call.positional_arguments[0].infer(context=context)) - except (InferenceError, StopIteration) as exc: - raise UseInferenceDefault(str(exc)) from exc - - if isinstance(first_value, util.UninferableBase): - raise UseInferenceDefault - - if isinstance(first_value, nodes.Const) and isinstance( - first_value.value, (int, str) - ): - try: - actual_value = int(first_value.value) - except ValueError: - return nodes.Const(0) - return nodes.Const(actual_value) - - return nodes.Const(0) - - -def infer_dict_fromkeys(node, context: InferenceContext | None = None): - """Infer dict.fromkeys. - - :param nodes.Call node: dict.fromkeys() call to infer - :param context.InferenceContext context: node context - :rtype nodes.Dict: - a Dictionary containing the values that astroid was able to infer. - In case the inference failed for any reason, an empty dictionary - will be inferred instead. - """ - - def _build_dict_with_elements(elements: list) -> nodes.Dict: - new_node = nodes.Dict( - col_offset=node.col_offset, - lineno=node.lineno, - parent=node.parent, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - ) - new_node.postinit(elements) - return new_node - - call = arguments.CallSite.from_call(node, context=context) - if call.keyword_arguments: - raise UseInferenceDefault("TypeError: int() must take no keyword arguments") - if len(call.positional_arguments) not in {1, 2}: - raise UseInferenceDefault( - "TypeError: Needs between 1 and 2 positional arguments" - ) - - default = nodes.Const(None) - values = call.positional_arguments[0] - try: - inferred_values = next(values.infer(context=context)) - except (InferenceError, StopIteration): - return _build_dict_with_elements([]) - if inferred_values is util.Uninferable: - return _build_dict_with_elements([]) - - # Limit to a couple of potential values, as this can become pretty complicated - accepted_iterable_elements = (nodes.Const,) - if isinstance(inferred_values, (nodes.List, nodes.Set, nodes.Tuple)): - elements = inferred_values.elts - for element in elements: - if not isinstance(element, accepted_iterable_elements): - # Fallback to an empty dict - return _build_dict_with_elements([]) - - elements_with_value = [(element, default) for element in elements] - return _build_dict_with_elements(elements_with_value) - if isinstance(inferred_values, nodes.Const) and isinstance( - inferred_values.value, (str, bytes) - ): - elements_with_value = [ - (nodes.Const(element), default) for element in inferred_values.value - ] - return _build_dict_with_elements(elements_with_value) - if isinstance(inferred_values, nodes.Dict): - keys = inferred_values.itered() - for key in keys: - if not isinstance(key, accepted_iterable_elements): - # Fallback to an empty dict - return _build_dict_with_elements([]) - - elements_with_value = [(element, default) for element in keys] - return _build_dict_with_elements(elements_with_value) - - # Fallback to an empty dictionary - return _build_dict_with_elements([]) - - -def _infer_copy_method( - node: nodes.Call, context: InferenceContext | None = None, **kwargs: Any -) -> Iterator[CopyResult]: - assert isinstance(node.func, nodes.Attribute) - inferred_orig, inferred_copy = itertools.tee(node.func.expr.infer(context=context)) - if all( - isinstance( - inferred_node, (nodes.Dict, nodes.List, nodes.Set, objects.FrozenSet) - ) - for inferred_node in inferred_orig - ): - return cast(Iterator[CopyResult], inferred_copy) - - raise UseInferenceDefault - - -def _is_str_format_call(node: nodes.Call) -> bool: - """Catch calls to str.format().""" - if not (isinstance(node.func, nodes.Attribute) and node.func.attrname == "format"): - return False - - if isinstance(node.func.expr, nodes.Name): - value = util.safe_infer(node.func.expr) - else: - value = node.func.expr - - return isinstance(value, nodes.Const) and isinstance(value.value, str) - - -def _infer_str_format_call( - node: nodes.Call, context: InferenceContext | None = None, **kwargs: Any -) -> Iterator[ConstFactoryResult | util.UninferableBase]: - """Return a Const node based on the template and passed arguments.""" - call = arguments.CallSite.from_call(node, context=context) - assert isinstance(node.func, (nodes.Attribute, nodes.AssignAttr, nodes.DelAttr)) - - value: nodes.Const - if isinstance(node.func.expr, nodes.Name): - if not ( - (inferred := util.safe_infer(node.func.expr)) - and isinstance(inferred, nodes.Const) - ): - return iter([util.Uninferable]) - value = inferred - elif isinstance(node.func.expr, nodes.Const): - value = node.func.expr - else: # pragma: no cover - return iter([util.Uninferable]) - - format_template = value.value - - # Get the positional arguments passed - inferred_positional: list[nodes.Const] = [] - for i in call.positional_arguments: - one_inferred = util.safe_infer(i, context) - if not isinstance(one_inferred, nodes.Const): - return iter([util.Uninferable]) - inferred_positional.append(one_inferred) - - pos_values: list[str] = [i.value for i in inferred_positional] - - # Get the keyword arguments passed - inferred_keyword: dict[str, nodes.Const] = {} - for k, v in call.keyword_arguments.items(): - one_inferred = util.safe_infer(v, context) - if not isinstance(one_inferred, nodes.Const): - return iter([util.Uninferable]) - inferred_keyword[k] = one_inferred - - keyword_values: dict[str, str] = {k: v.value for k, v in inferred_keyword.items()} - - try: - formatted_string = format_template.format(*pos_values, **keyword_values) - except (AttributeError, IndexError, KeyError, TypeError, ValueError): - # AttributeError: named field in format string was not found in the arguments - # IndexError: there are too few arguments to interpolate - # TypeError: Unsupported format string - # ValueError: Unknown format code - return iter([util.Uninferable]) - - return iter([nodes.const_factory(formatted_string)]) - - -def register(manager: AstroidManager) -> None: - # Builtins inference - register_builtin_transform(manager, infer_bool, "bool") - register_builtin_transform(manager, infer_super, "super") - register_builtin_transform(manager, infer_callable, "callable") - register_builtin_transform(manager, infer_property, "property") - register_builtin_transform(manager, infer_getattr, "getattr") - register_builtin_transform(manager, infer_hasattr, "hasattr") - register_builtin_transform(manager, infer_tuple, "tuple") - register_builtin_transform(manager, infer_set, "set") - register_builtin_transform(manager, infer_list, "list") - register_builtin_transform(manager, infer_dict, "dict") - register_builtin_transform(manager, infer_frozenset, "frozenset") - register_builtin_transform(manager, infer_type, "type") - register_builtin_transform(manager, infer_slice, "slice") - register_builtin_transform(manager, infer_isinstance, "isinstance") - register_builtin_transform(manager, infer_issubclass, "issubclass") - register_builtin_transform(manager, infer_len, "len") - register_builtin_transform(manager, infer_str, "str") - register_builtin_transform(manager, infer_int, "int") - register_builtin_transform(manager, infer_dict_fromkeys, "dict.fromkeys") - - # Infer object.__new__ calls - manager.register_transform( - nodes.ClassDef, - inference_tip(_infer_object__new__decorator), - _infer_object__new__decorator_check, - ) - - manager.register_transform( - nodes.Call, - inference_tip(_infer_copy_method), - lambda node: isinstance(node.func, nodes.Attribute) - and node.func.attrname == "copy", - ) - - manager.register_transform( - nodes.Call, - inference_tip(_infer_str_format_call), - _is_str_format_call, - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_collections.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_collections.py deleted file mode 100644 index 94944e6..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_collections.py +++ /dev/null @@ -1,138 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from __future__ import annotations - -from typing import TYPE_CHECKING - -from astroid.brain.helpers import register_module_extender -from astroid.builder import AstroidBuilder, extract_node, parse -from astroid.const import PY313_PLUS -from astroid.context import InferenceContext -from astroid.exceptions import AttributeInferenceError -from astroid.manager import AstroidManager -from astroid.nodes.scoped_nodes import ClassDef - -if TYPE_CHECKING: - from astroid import nodes - - -def _collections_transform(): - return parse( - """ - class defaultdict(dict): - default_factory = None - def __missing__(self, key): pass - def __getitem__(self, key): return default_factory - - """ - + _deque_mock() - + _ordered_dict_mock() - ) - - -def _collections_abc_313_transform() -> nodes.Module: - """See https://github.com/python/cpython/pull/124735""" - return AstroidBuilder(AstroidManager()).string_build( - "from _collections_abc import *" - ) - - -def _deque_mock(): - base_deque_class = """ - class deque(object): - maxlen = 0 - def __init__(self, iterable=None, maxlen=None): - self.iterable = iterable or [] - def append(self, x): pass - def appendleft(self, x): pass - def clear(self): pass - def count(self, x): return 0 - def extend(self, iterable): pass - def extendleft(self, iterable): pass - def pop(self): return self.iterable[0] - def popleft(self): return self.iterable[0] - def remove(self, value): pass - def reverse(self): return reversed(self.iterable) - def rotate(self, n=1): return self - def __iter__(self): return self - def __reversed__(self): return self.iterable[::-1] - def __getitem__(self, index): return self.iterable[index] - def __setitem__(self, index, value): pass - def __delitem__(self, index): pass - def __bool__(self): return bool(self.iterable) - def __nonzero__(self): return bool(self.iterable) - def __contains__(self, o): return o in self.iterable - def __len__(self): return len(self.iterable) - def __copy__(self): return deque(self.iterable) - def copy(self): return deque(self.iterable) - def index(self, x, start=0, end=0): return 0 - def insert(self, i, x): pass - def __add__(self, other): pass - def __iadd__(self, other): pass - def __mul__(self, other): pass - def __imul__(self, other): pass - def __rmul__(self, other): pass - @classmethod - def __class_getitem__(self, item): return cls""" - return base_deque_class - - -def _ordered_dict_mock(): - base_ordered_dict_class = """ - class OrderedDict(dict): - def __reversed__(self): return self[::-1] - def move_to_end(self, key, last=False): pass - @classmethod - def __class_getitem__(cls, item): return cls""" - return base_ordered_dict_class - - -def _looks_like_subscriptable(node: ClassDef) -> bool: - """ - Returns True if the node corresponds to a ClassDef of the Collections.abc module - that supports subscripting. - - :param node: ClassDef node - """ - if node.qname().startswith("_collections") or node.qname().startswith( - "collections" - ): - try: - node.getattr("__class_getitem__") - return True - except AttributeInferenceError: - pass - return False - - -CLASS_GET_ITEM_TEMPLATE = """ -@classmethod -def __class_getitem__(cls, item): - return cls -""" - - -def easy_class_getitem_inference(node, context: InferenceContext | None = None): - # Here __class_getitem__ exists but is quite a mess to infer thus - # put an easy inference tip - func_to_add = extract_node(CLASS_GET_ITEM_TEMPLATE) - node.locals["__class_getitem__"] = [func_to_add] - - -def register(manager: AstroidManager) -> None: - register_module_extender(manager, "collections", _collections_transform) - - # Starting with Python39 some objects of the collection module are subscriptable - # thanks to the __class_getitem__ method but the way it is implemented in - # _collection_abc makes it difficult to infer. (We would have to handle AssignName inference in the - # getitem method of the ClassDef class) Instead we put here a mock of the __class_getitem__ method - manager.register_transform( - ClassDef, easy_class_getitem_inference, _looks_like_subscriptable - ) - - if PY313_PLUS: - register_module_extender( - manager, "collections.abc", _collections_abc_313_transform - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_crypt.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_crypt.py deleted file mode 100644 index 71f9dfc..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_crypt.py +++ /dev/null @@ -1,27 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from astroid import nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import parse -from astroid.manager import AstroidManager - - -def _re_transform() -> nodes.Module: - return parse( - """ - from collections import namedtuple - _Method = namedtuple('_Method', 'name ident salt_chars total_size') - - METHOD_SHA512 = _Method('SHA512', '6', 16, 106) - METHOD_SHA256 = _Method('SHA256', '5', 16, 63) - METHOD_BLOWFISH = _Method('BLOWFISH', 2, 'b', 22) - METHOD_MD5 = _Method('MD5', '1', 8, 34) - METHOD_CRYPT = _Method('CRYPT', None, 2, 13) - """ - ) - - -def register(manager: AstroidManager) -> None: - register_module_extender(manager, "crypt", _re_transform) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_ctypes.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_ctypes.py deleted file mode 100644 index 8ae10bc..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_ctypes.py +++ /dev/null @@ -1,86 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -""" -Astroid hooks for ctypes module. - -Inside the ctypes module, the value class is defined inside -the C coded module _ctypes. -Thus astroid doesn't know that the value member is a builtin type -among float, int, bytes or str. -""" -import sys - -from astroid import nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import parse -from astroid.manager import AstroidManager - - -def enrich_ctypes_redefined_types() -> nodes.Module: - """ - For each ctypes redefined types, overload 'value' and '_type_' members - definition. - - Overloading 'value' is mandatory otherwise astroid cannot infer the correct type for it. - Overloading '_type_' is necessary because the class definition made here replaces the original - one, in which '_type_' member is defined. Luckily those original class definitions are very short - and contain only the '_type_' member definition. - """ - c_class_to_type = ( - ("c_byte", "int", "b"), - ("c_char", "bytes", "c"), - ("c_double", "float", "d"), - ("c_float", "float", "f"), - ("c_int", "int", "i"), - ("c_int16", "int", "h"), - ("c_int32", "int", "i"), - ("c_int64", "int", "l"), - ("c_int8", "int", "b"), - ("c_long", "int", "l"), - ("c_longdouble", "float", "g"), - ("c_longlong", "int", "l"), - ("c_short", "int", "h"), - ("c_size_t", "int", "L"), - ("c_ssize_t", "int", "l"), - ("c_ubyte", "int", "B"), - ("c_uint", "int", "I"), - ("c_uint16", "int", "H"), - ("c_uint32", "int", "I"), - ("c_uint64", "int", "L"), - ("c_uint8", "int", "B"), - ("c_ulong", "int", "L"), - ("c_ulonglong", "int", "L"), - ("c_ushort", "int", "H"), - ("c_wchar", "str", "u"), - ) - - src = [ - """ -from _ctypes import _SimpleCData - -class c_bool(_SimpleCData): - def __init__(self, value): - self.value = True - self._type_ = '?' - """ - ] - - for c_type, builtin_type, type_code in c_class_to_type: - src.append( - f""" -class {c_type}(_SimpleCData): - def __init__(self, value): - self.value = {builtin_type}(value) - self._type_ = '{type_code}' - """ - ) - - return parse("\n".join(src)) - - -def register(manager: AstroidManager) -> None: - if not hasattr(sys, "pypy_version_info"): - # No need of this module in pypy where everything is written in python - register_module_extender(manager, "ctypes", enrich_ctypes_redefined_types) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_curses.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_curses.py deleted file mode 100644 index 5824fd7..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_curses.py +++ /dev/null @@ -1,185 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from astroid import nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import parse -from astroid.manager import AstroidManager - - -def _curses_transform() -> nodes.Module: - return parse( - """ - A_ALTCHARSET = 1 - A_BLINK = 1 - A_BOLD = 1 - A_DIM = 1 - A_INVIS = 1 - A_ITALIC = 1 - A_NORMAL = 1 - A_PROTECT = 1 - A_REVERSE = 1 - A_STANDOUT = 1 - A_UNDERLINE = 1 - A_HORIZONTAL = 1 - A_LEFT = 1 - A_LOW = 1 - A_RIGHT = 1 - A_TOP = 1 - A_VERTICAL = 1 - A_CHARTEXT = 1 - A_ATTRIBUTES = 1 - A_CHARTEXT = 1 - A_COLOR = 1 - KEY_MIN = 1 - KEY_BREAK = 1 - KEY_DOWN = 1 - KEY_UP = 1 - KEY_LEFT = 1 - KEY_RIGHT = 1 - KEY_HOME = 1 - KEY_BACKSPACE = 1 - KEY_F0 = 1 - KEY_Fn = 1 - KEY_DL = 1 - KEY_IL = 1 - KEY_DC = 1 - KEY_IC = 1 - KEY_EIC = 1 - KEY_CLEAR = 1 - KEY_EOS = 1 - KEY_EOL = 1 - KEY_SF = 1 - KEY_SR = 1 - KEY_NPAGE = 1 - KEY_PPAGE = 1 - KEY_STAB = 1 - KEY_CTAB = 1 - KEY_CATAB = 1 - KEY_ENTER = 1 - KEY_SRESET = 1 - KEY_RESET = 1 - KEY_PRINT = 1 - KEY_LL = 1 - KEY_A1 = 1 - KEY_A3 = 1 - KEY_B2 = 1 - KEY_C1 = 1 - KEY_C3 = 1 - KEY_BTAB = 1 - KEY_BEG = 1 - KEY_CANCEL = 1 - KEY_CLOSE = 1 - KEY_COMMAND = 1 - KEY_COPY = 1 - KEY_CREATE = 1 - KEY_END = 1 - KEY_EXIT = 1 - KEY_FIND = 1 - KEY_HELP = 1 - KEY_MARK = 1 - KEY_MESSAGE = 1 - KEY_MOVE = 1 - KEY_NEXT = 1 - KEY_OPEN = 1 - KEY_OPTIONS = 1 - KEY_PREVIOUS = 1 - KEY_REDO = 1 - KEY_REFERENCE = 1 - KEY_REFRESH = 1 - KEY_REPLACE = 1 - KEY_RESTART = 1 - KEY_RESUME = 1 - KEY_SAVE = 1 - KEY_SBEG = 1 - KEY_SCANCEL = 1 - KEY_SCOMMAND = 1 - KEY_SCOPY = 1 - KEY_SCREATE = 1 - KEY_SDC = 1 - KEY_SDL = 1 - KEY_SELECT = 1 - KEY_SEND = 1 - KEY_SEOL = 1 - KEY_SEXIT = 1 - KEY_SFIND = 1 - KEY_SHELP = 1 - KEY_SHOME = 1 - KEY_SIC = 1 - KEY_SLEFT = 1 - KEY_SMESSAGE = 1 - KEY_SMOVE = 1 - KEY_SNEXT = 1 - KEY_SOPTIONS = 1 - KEY_SPREVIOUS = 1 - KEY_SPRINT = 1 - KEY_SREDO = 1 - KEY_SREPLACE = 1 - KEY_SRIGHT = 1 - KEY_SRSUME = 1 - KEY_SSAVE = 1 - KEY_SSUSPEND = 1 - KEY_SUNDO = 1 - KEY_SUSPEND = 1 - KEY_UNDO = 1 - KEY_MOUSE = 1 - KEY_RESIZE = 1 - KEY_MAX = 1 - ACS_BBSS = 1 - ACS_BLOCK = 1 - ACS_BOARD = 1 - ACS_BSBS = 1 - ACS_BSSB = 1 - ACS_BSSS = 1 - ACS_BTEE = 1 - ACS_BULLET = 1 - ACS_CKBOARD = 1 - ACS_DARROW = 1 - ACS_DEGREE = 1 - ACS_DIAMOND = 1 - ACS_GEQUAL = 1 - ACS_HLINE = 1 - ACS_LANTERN = 1 - ACS_LARROW = 1 - ACS_LEQUAL = 1 - ACS_LLCORNER = 1 - ACS_LRCORNER = 1 - ACS_LTEE = 1 - ACS_NEQUAL = 1 - ACS_PI = 1 - ACS_PLMINUS = 1 - ACS_PLUS = 1 - ACS_RARROW = 1 - ACS_RTEE = 1 - ACS_S1 = 1 - ACS_S3 = 1 - ACS_S7 = 1 - ACS_S9 = 1 - ACS_SBBS = 1 - ACS_SBSB = 1 - ACS_SBSS = 1 - ACS_SSBB = 1 - ACS_SSBS = 1 - ACS_SSSB = 1 - ACS_SSSS = 1 - ACS_STERLING = 1 - ACS_TTEE = 1 - ACS_UARROW = 1 - ACS_ULCORNER = 1 - ACS_URCORNER = 1 - ACS_VLINE = 1 - COLOR_BLACK = 1 - COLOR_BLUE = 1 - COLOR_CYAN = 1 - COLOR_GREEN = 1 - COLOR_MAGENTA = 1 - COLOR_RED = 1 - COLOR_WHITE = 1 - COLOR_YELLOW = 1 - """ - ) - - -def register(manager: AstroidManager) -> None: - register_module_extender(manager, "curses", _curses_transform) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_dataclasses.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_dataclasses.py deleted file mode 100644 index 244665e..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_dataclasses.py +++ /dev/null @@ -1,636 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -""" -Astroid hook for the dataclasses library. - -Support built-in dataclasses, pydantic.dataclasses, and marshmallow_dataclass-annotated -dataclasses. References: -- https://docs.python.org/3/library/dataclasses.html -- https://pydantic-docs.helpmanual.io/usage/dataclasses/ -- https://lovasoa.github.io/marshmallow_dataclass/ -""" - -from __future__ import annotations - -from collections.abc import Iterator -from typing import Literal - -from astroid import bases, context, nodes -from astroid.brain.helpers import is_class_var -from astroid.builder import parse -from astroid.const import PY313_PLUS -from astroid.exceptions import AstroidSyntaxError, InferenceError, UseInferenceDefault -from astroid.inference_tip import inference_tip -from astroid.manager import AstroidManager -from astroid.typing import InferenceResult -from astroid.util import Uninferable, UninferableBase, safe_infer - -_FieldDefaultReturn = ( - None - | tuple[Literal["default"], nodes.NodeNG] - | tuple[Literal["default_factory"], nodes.Call] -) - -DATACLASSES_DECORATORS = frozenset(("dataclass",)) -FIELD_NAME = "field" -DATACLASS_MODULES = frozenset( - ("dataclasses", "marshmallow_dataclass", "pydantic.dataclasses") -) -DEFAULT_FACTORY = "_HAS_DEFAULT_FACTORY" # based on typing.py - - -def is_decorated_with_dataclass( - node: nodes.ClassDef, decorator_names: frozenset[str] = DATACLASSES_DECORATORS -) -> bool: - """Return True if a decorated node has a `dataclass` decorator applied.""" - if not (isinstance(node, nodes.ClassDef) and node.decorators): - return False - - return any( - _looks_like_dataclass_decorator(decorator_attribute, decorator_names) - for decorator_attribute in node.decorators.nodes - ) - - -def dataclass_transform(node: nodes.ClassDef) -> nodes.ClassDef | None: - """Rewrite a dataclass to be easily understood by pylint.""" - node.is_dataclass = True - - for assign_node in _get_dataclass_attributes(node): - name = assign_node.target.name - - rhs_node = nodes.Unknown( - lineno=assign_node.lineno, - col_offset=assign_node.col_offset, - parent=assign_node, - ) - rhs_node = AstroidManager().visit_transforms(rhs_node) - node.instance_attrs[name] = [rhs_node] - - if not _check_generate_dataclass_init(node): - return None - - kw_only_decorated = False - if node.decorators.nodes: - for decorator in node.decorators.nodes: - if not isinstance(decorator, nodes.Call): - kw_only_decorated = False - break - for keyword in decorator.keywords: - if keyword.arg == "kw_only": - kw_only_decorated = keyword.value.bool_value() is True - - init_str = _generate_dataclass_init( - node, - list(_get_dataclass_attributes(node, init=True)), - kw_only_decorated, - ) - - try: - init_node = parse(init_str)["__init__"] - except AstroidSyntaxError: - pass - else: - init_node.parent = node - init_node.lineno, init_node.col_offset = None, None - node.locals["__init__"] = [init_node] - - root = node.root() - if DEFAULT_FACTORY not in root.locals: - new_assign = parse(f"{DEFAULT_FACTORY} = object()").body[0] - new_assign.parent = root - root.locals[DEFAULT_FACTORY] = [new_assign.targets[0]] - return node - - -def _get_dataclass_attributes( - node: nodes.ClassDef, init: bool = False -) -> Iterator[nodes.AnnAssign]: - """Yield the AnnAssign nodes of dataclass attributes for the node. - - If init is True, also include InitVars. - """ - for assign_node in node.body: - if not ( - isinstance(assign_node, nodes.AnnAssign) - and isinstance(assign_node.target, nodes.AssignName) - ): - continue - - # Annotation is never None - if is_class_var(assign_node.annotation): # type: ignore[arg-type] - continue - - if _is_keyword_only_sentinel(assign_node.annotation): - continue - - # Annotation is never None - if not init and _is_init_var(assign_node.annotation): # type: ignore[arg-type] - continue - - yield assign_node - - -def _check_generate_dataclass_init(node: nodes.ClassDef) -> bool: - """Return True if we should generate an __init__ method for node. - - This is True when: - - node doesn't define its own __init__ method - - the dataclass decorator was called *without* the keyword argument init=False - """ - if "__init__" in node.locals: - return False - - found = None - - for decorator_attribute in node.decorators.nodes: - if not isinstance(decorator_attribute, nodes.Call): - continue - - if _looks_like_dataclass_decorator(decorator_attribute): - found = decorator_attribute - - if found is None: - return True - - # Check for keyword arguments of the form init=False - return not any( - keyword.arg == "init" - and keyword.value.bool_value() is False # type: ignore[union-attr] # value is never None - for keyword in found.keywords - ) - - -def _find_arguments_from_base_classes( - node: nodes.ClassDef, -) -> tuple[ - dict[str, tuple[str | None, str | None]], dict[str, tuple[str | None, str | None]] -]: - """Iterate through all bases and get their typing and defaults.""" - pos_only_store: dict[str, tuple[str | None, str | None]] = {} - kw_only_store: dict[str, tuple[str | None, str | None]] = {} - # See TODO down below - # all_have_defaults = True - - for base in reversed(node.mro()): - if not base.is_dataclass: - continue - try: - base_init: nodes.FunctionDef = base.locals["__init__"][0] - except KeyError: - continue - - pos_only, kw_only = base_init.args._get_arguments_data() - for posarg, data in pos_only.items(): - # if data[1] is None: - # if all_have_defaults and pos_only_store: - # # TODO: This should return an Uninferable as this would raise - # # a TypeError at runtime. However, transforms can't return - # # Uninferables currently. - # pass - # all_have_defaults = False - pos_only_store[posarg] = data - - for kwarg, data in kw_only.items(): - kw_only_store[kwarg] = data - return pos_only_store, kw_only_store - - -def _parse_arguments_into_strings( - pos_only_store: dict[str, tuple[str | None, str | None]], - kw_only_store: dict[str, tuple[str | None, str | None]], -) -> tuple[str, str]: - """Parse positional and keyword arguments into strings for an __init__ method.""" - pos_only, kw_only = "", "" - for pos_arg, data in pos_only_store.items(): - pos_only += pos_arg - if data[0]: - pos_only += ": " + data[0] - if data[1]: - pos_only += " = " + data[1] - pos_only += ", " - for kw_arg, data in kw_only_store.items(): - kw_only += kw_arg - if data[0]: - kw_only += ": " + data[0] - if data[1]: - kw_only += " = " + data[1] - kw_only += ", " - - return pos_only, kw_only - - -def _get_previous_field_default(node: nodes.ClassDef, name: str) -> nodes.NodeNG | None: - """Get the default value of a previously defined field.""" - for base in reversed(node.mro()): - if not base.is_dataclass: - continue - if name in base.locals: - for assign in base.locals[name]: - if ( - isinstance(assign.parent, nodes.AnnAssign) - and assign.parent.value - and isinstance(assign.parent.value, nodes.Call) - and _looks_like_dataclass_field_call(assign.parent.value) - ): - default = _get_field_default(assign.parent.value) - if default: - return default[1] - return None - - -def _generate_dataclass_init( - node: nodes.ClassDef, assigns: list[nodes.AnnAssign], kw_only_decorated: bool -) -> str: - """Return an init method for a dataclass given the targets.""" - # pylint: disable = too-many-locals, too-many-branches, too-many-statements - - params: list[str] = [] - kw_only_params: list[str] = [] - assignments: list[str] = [] - - prev_pos_only_store, prev_kw_only_store = _find_arguments_from_base_classes(node) - - for assign in assigns: - name, annotation, value = assign.target.name, assign.annotation, assign.value - - # Check whether this assign is overriden by a property assignment - property_node: nodes.FunctionDef | None = None - for additional_assign in node.locals[name]: - if not isinstance(additional_assign, nodes.FunctionDef): - continue - if not additional_assign.decorators: - continue - if "builtins.property" in additional_assign.decoratornames(): - property_node = additional_assign - break - - is_field = isinstance(value, nodes.Call) and _looks_like_dataclass_field_call( - value, check_scope=False - ) - - if is_field: - # Skip any fields that have `init=False` - if any( - keyword.arg == "init" and (keyword.value.bool_value() is False) - for keyword in value.keywords # type: ignore[union-attr] # value is never None - ): - # Also remove the name from the previous arguments to be inserted later - prev_pos_only_store.pop(name, None) - prev_kw_only_store.pop(name, None) - continue - - if _is_init_var(annotation): # type: ignore[arg-type] # annotation is never None - init_var = True - if isinstance(annotation, nodes.Subscript): - annotation = annotation.slice - else: - # Cannot determine type annotation for parameter from InitVar - annotation = None - assignment_str = "" - else: - init_var = False - assignment_str = f"self.{name} = {name}" - - ann_str, default_str = None, None - if annotation is not None: - ann_str = annotation.as_string() - - if value: - if is_field: - result = _get_field_default(value) # type: ignore[arg-type] - if result: - default_type, default_node = result - if default_type == "default": - default_str = default_node.as_string() - elif default_type == "default_factory": - default_str = DEFAULT_FACTORY - assignment_str = ( - f"self.{name} = {default_node.as_string()} " - f"if {name} is {DEFAULT_FACTORY} else {name}" - ) - else: - default_str = value.as_string() - elif property_node: - # We set the result of the property call as default - # This hides the fact that this would normally be a 'property object' - # But we can't represent those as string - try: - # Call str to make sure also Uninferable gets stringified - default_str = str( - next(property_node.infer_call_result(None)).as_string() - ) - except (InferenceError, StopIteration): - pass - else: - # Even with `init=False` the default value still can be propogated to - # later assignments. Creating weird signatures like: - # (self, a: str = 1) -> None - previous_default = _get_previous_field_default(node, name) - if previous_default: - default_str = previous_default.as_string() - - # Construct the param string to add to the init if necessary - param_str = name - if ann_str is not None: - param_str += f": {ann_str}" - if default_str is not None: - param_str += f" = {default_str}" - - # If the field is a kw_only field, we need to add it to the kw_only_params - # This overwrites whether or not the class is kw_only decorated - if is_field: - kw_only = [k for k in value.keywords if k.arg == "kw_only"] # type: ignore[union-attr] - if kw_only: - if kw_only[0].value.bool_value() is True: - kw_only_params.append(param_str) - else: - params.append(param_str) - continue - # If kw_only decorated, we need to add all parameters to the kw_only_params - if kw_only_decorated: - if name in prev_kw_only_store: - prev_kw_only_store[name] = (ann_str, default_str) - else: - kw_only_params.append(param_str) - else: - # If the name was previously seen, overwrite that data - # pylint: disable-next=else-if-used - if name in prev_pos_only_store: - prev_pos_only_store[name] = (ann_str, default_str) - elif name in prev_kw_only_store: - params = [name, *params] - prev_kw_only_store.pop(name) - else: - params.append(param_str) - - if not init_var: - assignments.append(assignment_str) - - prev_pos_only, prev_kw_only = _parse_arguments_into_strings( - prev_pos_only_store, prev_kw_only_store - ) - - # Construct the new init method paramter string - # First we do the positional only parameters, making sure to add the - # the self parameter and the comma to allow adding keyword only parameters - params_string = "" if "self" in prev_pos_only else "self, " - params_string += prev_pos_only + ", ".join(params) - if not params_string.endswith(", "): - params_string += ", " - - # Then we add the keyword only parameters - if prev_kw_only or kw_only_params: - params_string += "*, " - params_string += f"{prev_kw_only}{', '.join(kw_only_params)}" - - assignments_string = "\n ".join(assignments) if assignments else "pass" - return f"def __init__({params_string}) -> None:\n {assignments_string}" - - -def infer_dataclass_attribute( - node: nodes.Unknown, ctx: context.InferenceContext | None = None -) -> Iterator[InferenceResult]: - """Inference tip for an Unknown node that was dynamically generated to - represent a dataclass attribute. - - In the case that a default value is provided, that is inferred first. - Then, an Instance of the annotated class is yielded. - """ - assign = node.parent - if not isinstance(assign, nodes.AnnAssign): - yield Uninferable - return - - annotation, value = assign.annotation, assign.value - if value is not None: - yield from value.infer(context=ctx) - if annotation is not None: - yield from _infer_instance_from_annotation(annotation, ctx=ctx) - else: - yield Uninferable - - -def infer_dataclass_field_call( - node: nodes.Call, ctx: context.InferenceContext | None = None -) -> Iterator[InferenceResult]: - """Inference tip for dataclass field calls.""" - if not isinstance(node.parent, (nodes.AnnAssign, nodes.Assign)): - raise UseInferenceDefault - result = _get_field_default(node) - if not result: - yield Uninferable - else: - default_type, default = result - if default_type == "default": - yield from default.infer(context=ctx) - else: - new_call = parse(default.as_string()).body[0].value - new_call.parent = node.parent - yield from new_call.infer(context=ctx) - - -def _looks_like_dataclass_decorator( - node: nodes.NodeNG, decorator_names: frozenset[str] = DATACLASSES_DECORATORS -) -> bool: - """Return True if node looks like a dataclass decorator. - - Uses inference to lookup the value of the node, and if that fails, - matches against specific names. - """ - if isinstance(node, nodes.Call): # decorator with arguments - node = node.func - try: - inferred = next(node.infer()) - except (InferenceError, StopIteration): - inferred = Uninferable - - if isinstance(inferred, UninferableBase): - if isinstance(node, nodes.Name): - return node.name in decorator_names - if isinstance(node, nodes.Attribute): - return node.attrname in decorator_names - - return False - - return ( - isinstance(inferred, nodes.FunctionDef) - and inferred.name in decorator_names - and inferred.root().name in DATACLASS_MODULES - ) - - -def _looks_like_dataclass_attribute(node: nodes.Unknown) -> bool: - """Return True if node was dynamically generated as the child of an AnnAssign - statement. - """ - parent = node.parent - if not parent: - return False - - scope = parent.scope() - return ( - isinstance(parent, nodes.AnnAssign) - and isinstance(scope, nodes.ClassDef) - and is_decorated_with_dataclass(scope) - ) - - -def _looks_like_dataclass_field_call( - node: nodes.Call, check_scope: bool = True -) -> bool: - """Return True if node is calling dataclasses field or Field - from an AnnAssign statement directly in the body of a ClassDef. - - If check_scope is False, skips checking the statement and body. - """ - if check_scope: - stmt = node.statement() - scope = stmt.scope() - if not ( - isinstance(stmt, nodes.AnnAssign) - and stmt.value is not None - and isinstance(scope, nodes.ClassDef) - and is_decorated_with_dataclass(scope) - ): - return False - - try: - inferred = next(node.func.infer()) - except (InferenceError, StopIteration): - return False - - if not isinstance(inferred, nodes.FunctionDef): - return False - - return inferred.name == FIELD_NAME and inferred.root().name in DATACLASS_MODULES - - -def _looks_like_dataclasses(node: nodes.Module) -> bool: - return node.qname() == "dataclasses" - - -def _resolve_private_replace_to_public(node: nodes.Module) -> None: - """In python/cpython@6f3c138, a _replace() method was extracted from - replace(), and this indirection made replace() uninferable.""" - if "_replace" in node.locals: - node.locals["replace"] = node.locals["_replace"] - - -def _get_field_default(field_call: nodes.Call) -> _FieldDefaultReturn: - """Return a the default value of a field call, and the corresponding keyword - argument name. - - field(default=...) results in the ... node - field(default_factory=...) results in a Call node with func ... and no arguments - - If neither or both arguments are present, return ("", None) instead, - indicating that there is not a valid default value. - """ - default, default_factory = None, None - for keyword in field_call.keywords: - if keyword.arg == "default": - default = keyword.value - elif keyword.arg == "default_factory": - default_factory = keyword.value - - if default is not None and default_factory is None: - return "default", default - - if default is None and default_factory is not None: - new_call = nodes.Call( - lineno=field_call.lineno, - col_offset=field_call.col_offset, - parent=field_call.parent, - end_lineno=field_call.end_lineno, - end_col_offset=field_call.end_col_offset, - ) - new_call.postinit(func=default_factory, args=[], keywords=[]) - return "default_factory", new_call - - return None - - -def _is_keyword_only_sentinel(node: nodes.NodeNG) -> bool: - """Return True if node is the KW_ONLY sentinel.""" - inferred = safe_infer(node) - return ( - isinstance(inferred, bases.Instance) - and inferred.qname() == "dataclasses._KW_ONLY_TYPE" - ) - - -def _is_init_var(node: nodes.NodeNG) -> bool: - """Return True if node is an InitVar, with or without subscripting.""" - try: - inferred = next(node.infer()) - except (InferenceError, StopIteration): - return False - - return getattr(inferred, "name", "") == "InitVar" - - -# Allowed typing classes for which we support inferring instances -_INFERABLE_TYPING_TYPES = frozenset( - ( - "Dict", - "FrozenSet", - "List", - "Set", - "Tuple", - ) -) - - -def _infer_instance_from_annotation( - node: nodes.NodeNG, ctx: context.InferenceContext | None = None -) -> Iterator[UninferableBase | bases.Instance]: - """Infer an instance corresponding to the type annotation represented by node. - - Currently has limited support for the typing module. - """ - klass = None - try: - klass = next(node.infer(context=ctx)) - except (InferenceError, StopIteration): - yield Uninferable - if not isinstance(klass, nodes.ClassDef): - yield Uninferable - elif klass.root().name in { - "typing", - "_collections_abc", - "", - }: # "" because of synthetic nodes in brain_typing.py - if klass.name in _INFERABLE_TYPING_TYPES: - yield klass.instantiate_class() - else: - yield Uninferable - else: - yield klass.instantiate_class() - - -def register(manager: AstroidManager) -> None: - if PY313_PLUS: - manager.register_transform( - nodes.Module, - _resolve_private_replace_to_public, - _looks_like_dataclasses, - ) - - manager.register_transform( - nodes.ClassDef, dataclass_transform, is_decorated_with_dataclass - ) - - manager.register_transform( - nodes.Call, - inference_tip(infer_dataclass_field_call, raise_on_overwrite=True), - _looks_like_dataclass_field_call, - ) - - manager.register_transform( - nodes.Unknown, - inference_tip(infer_dataclass_attribute, raise_on_overwrite=True), - _looks_like_dataclass_attribute, - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_datetime.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_datetime.py deleted file mode 100644 index f4cb667..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_datetime.py +++ /dev/null @@ -1,20 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from astroid import nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import AstroidBuilder -from astroid.const import PY312_PLUS -from astroid.manager import AstroidManager - - -def datetime_transform() -> nodes.Module: - """The datetime module was C-accelerated in Python 3.12, so use the - Python source.""" - return AstroidBuilder(AstroidManager()).string_build("from _pydatetime import *") - - -def register(manager: AstroidManager) -> None: - if PY312_PLUS: - register_module_extender(manager, "datetime", datetime_transform) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_dateutil.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_dateutil.py deleted file mode 100644 index c27343f..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_dateutil.py +++ /dev/null @@ -1,28 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Astroid hooks for dateutil.""" - -import textwrap - -from astroid import nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import AstroidBuilder -from astroid.manager import AstroidManager - - -def dateutil_transform() -> nodes.Module: - return AstroidBuilder(AstroidManager()).string_build( - textwrap.dedent( - """ - import datetime - def parse(timestr, parserinfo=None, **kwargs): - return datetime.datetime() - """ - ) - ) - - -def register(manager: AstroidManager) -> None: - register_module_extender(manager, "dateutil.parser", dateutil_transform) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_functools.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_functools.py deleted file mode 100644 index 1cb8442..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_functools.py +++ /dev/null @@ -1,174 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Astroid hooks for understanding functools library module.""" - -from __future__ import annotations - -from collections.abc import Iterator -from functools import partial -from itertools import chain - -from astroid import BoundMethod, arguments, nodes, objects -from astroid.builder import extract_node -from astroid.context import InferenceContext -from astroid.exceptions import InferenceError, UseInferenceDefault -from astroid.inference_tip import inference_tip -from astroid.interpreter import objectmodel -from astroid.manager import AstroidManager -from astroid.typing import InferenceResult, SuccessfulInferenceResult -from astroid.util import UninferableBase, safe_infer - -LRU_CACHE = "functools.lru_cache" - - -class LruWrappedModel(objectmodel.FunctionModel): - """Special attribute model for functions decorated with functools.lru_cache. - - The said decorators patches at decoration time some functions onto - the decorated function. - """ - - @property - def attr___wrapped__(self): - return self._instance - - @property - def attr_cache_info(self): - cache_info = extract_node( - """ - from functools import _CacheInfo - _CacheInfo(0, 0, 0, 0) - """ - ) - - class CacheInfoBoundMethod(BoundMethod): - def infer_call_result( - self, - caller: SuccessfulInferenceResult | None, - context: InferenceContext | None = None, - ) -> Iterator[InferenceResult]: - res = safe_infer(cache_info) - assert res is not None - yield res - - return CacheInfoBoundMethod(proxy=self._instance, bound=self._instance) - - @property - def attr_cache_clear(self): - node = extract_node("""def cache_clear(self): pass""") - return BoundMethod(proxy=node, bound=self._instance.parent.scope()) - - -def _transform_lru_cache(node, context: InferenceContext | None = None) -> None: - # TODO: this is not ideal, since the node should be immutable, - # but due to https://github.com/pylint-dev/astroid/issues/354, - # there's not much we can do now. - # Replacing the node would work partially, because, - # in pylint, the old node would still be available, leading - # to spurious false positives. - node.special_attributes = LruWrappedModel()(node) - - -def _functools_partial_inference( - node: nodes.Call, context: InferenceContext | None = None -) -> Iterator[objects.PartialFunction]: - call = arguments.CallSite.from_call(node, context=context) - number_of_positional = len(call.positional_arguments) - if number_of_positional < 1: - raise UseInferenceDefault("functools.partial takes at least one argument") - if number_of_positional == 1 and not call.keyword_arguments: - raise UseInferenceDefault( - "functools.partial needs at least to have some filled arguments" - ) - - partial_function = call.positional_arguments[0] - try: - inferred_wrapped_function = next(partial_function.infer(context=context)) - except (InferenceError, StopIteration) as exc: - raise UseInferenceDefault from exc - if isinstance(inferred_wrapped_function, UninferableBase): - raise UseInferenceDefault("Cannot infer the wrapped function") - if not isinstance(inferred_wrapped_function, nodes.FunctionDef): - raise UseInferenceDefault("The wrapped function is not a function") - - # Determine if the passed keywords into the callsite are supported - # by the wrapped function. - if not inferred_wrapped_function.args: - function_parameters = [] - else: - function_parameters = chain( - inferred_wrapped_function.args.args or (), - inferred_wrapped_function.args.posonlyargs or (), - inferred_wrapped_function.args.kwonlyargs or (), - ) - parameter_names = { - param.name - for param in function_parameters - if isinstance(param, nodes.AssignName) - } - if set(call.keyword_arguments) - parameter_names: - raise UseInferenceDefault("wrapped function received unknown parameters") - - partial_function = objects.PartialFunction( - call, - name=inferred_wrapped_function.name, - lineno=inferred_wrapped_function.lineno, - col_offset=inferred_wrapped_function.col_offset, - parent=node.parent, - ) - partial_function.postinit( - args=inferred_wrapped_function.args, - body=inferred_wrapped_function.body, - decorators=inferred_wrapped_function.decorators, - returns=inferred_wrapped_function.returns, - type_comment_returns=inferred_wrapped_function.type_comment_returns, - type_comment_args=inferred_wrapped_function.type_comment_args, - doc_node=inferred_wrapped_function.doc_node, - ) - return iter((partial_function,)) - - -def _looks_like_lru_cache(node) -> bool: - """Check if the given function node is decorated with lru_cache.""" - if not node.decorators: - return False - for decorator in node.decorators.nodes: - if not isinstance(decorator, (nodes.Attribute, nodes.Call)): - continue - if _looks_like_functools_member(decorator, "lru_cache"): - return True - return False - - -def _looks_like_functools_member( - node: nodes.Attribute | nodes.Call, member: str -) -> bool: - """Check if the given Call node is the wanted member of functools.""" - if isinstance(node, nodes.Attribute): - return node.attrname == member - if isinstance(node.func, nodes.Name): - return node.func.name == member - if isinstance(node.func, nodes.Attribute): - return ( - node.func.attrname == member - and isinstance(node.func.expr, nodes.Name) - and node.func.expr.name == "functools" - ) - return False - - -_looks_like_partial = partial(_looks_like_functools_member, member="partial") - - -def register(manager: AstroidManager) -> None: - manager.register_transform( - nodes.FunctionDef, _transform_lru_cache, _looks_like_lru_cache - ) - - manager.register_transform( - nodes.Call, - inference_tip(_functools_partial_inference), - _looks_like_partial, - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_gi.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_gi.py deleted file mode 100644 index fa60077..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_gi.py +++ /dev/null @@ -1,252 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Astroid hooks for the Python 2 GObject introspection bindings. - -Helps with understanding everything imported from 'gi.repository' -""" - -# pylint:disable=import-error,import-outside-toplevel - -import inspect -import itertools -import re -import sys -import warnings - -from astroid import nodes -from astroid.builder import AstroidBuilder -from astroid.exceptions import AstroidBuildingError -from astroid.manager import AstroidManager - -_inspected_modules = {} - -_identifier_re = r"^[A-Za-z_]\w*$" - -_special_methods = frozenset( - { - "__lt__", - "__le__", - "__eq__", - "__ne__", - "__ge__", - "__gt__", - "__iter__", - "__getitem__", - "__setitem__", - "__delitem__", - "__len__", - "__bool__", - "__nonzero__", - "__next__", - "__str__", - "__contains__", - "__enter__", - "__exit__", - "__repr__", - "__getattr__", - "__setattr__", - "__delattr__", - "__del__", - "__hash__", - } -) - - -def _gi_build_stub(parent): # noqa: C901 - """ - Inspect the passed module recursively and build stubs for functions, - classes, etc. - """ - # pylint: disable = too-many-branches, too-many-statements - - classes = {} - functions = {} - constants = {} - methods = {} - for name in dir(parent): - if name.startswith("__") and name not in _special_methods: - continue - - # Check if this is a valid name in python - if not re.match(_identifier_re, name): - continue - - try: - obj = getattr(parent, name) - except Exception: # pylint: disable=broad-except - # gi.module.IntrospectionModule.__getattr__() can raise all kinds of things - # like ValueError, TypeError, NotImplementedError, RepositoryError, etc - continue - - if inspect.isclass(obj): - classes[name] = obj - elif inspect.isfunction(obj) or inspect.isbuiltin(obj): - functions[name] = obj - elif inspect.ismethod(obj) or inspect.ismethoddescriptor(obj): - methods[name] = obj - elif ( - str(obj).startswith(" bool: - # Return whether this looks like a call to gi.require_version(, ) - # Only accept function calls with two constant arguments - if len(node.args) != 2: - return False - - if not all(isinstance(arg, nodes.Const) for arg in node.args): - return False - - func = node.func - if isinstance(func, nodes.Attribute): - if func.attrname != "require_version": - return False - if isinstance(func.expr, nodes.Name) and func.expr.name == "gi": - return True - - return False - - if isinstance(func, nodes.Name): - return func.name == "require_version" - - return False - - -def _register_require_version(node): - # Load the gi.require_version locally - try: - import gi - - gi.require_version(node.args[0].value, node.args[1].value) - except Exception: # pylint:disable=broad-except - pass - - return node - - -def register(manager: AstroidManager) -> None: - manager.register_failed_import_hook(_import_gi_module) - manager.register_transform( - nodes.Call, _register_require_version, _looks_like_require_version - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_hashlib.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_hashlib.py deleted file mode 100644 index a17645a..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_hashlib.py +++ /dev/null @@ -1,96 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from astroid import nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import parse -from astroid.manager import AstroidManager - - -def _hashlib_transform() -> nodes.Module: - init_signature = "value='', usedforsecurity=True" - digest_signature = "self" - shake_digest_signature = "self, length" - - template = """ - class %(name)s: - def __init__(self, %(init_signature)s): pass - def digest(%(digest_signature)s): - return %(digest)s - def copy(self): - return self - def update(self, value): pass - def hexdigest(%(digest_signature)s): - return '' - @property - def name(self): - return %(name)r - @property - def block_size(self): - return 1 - @property - def digest_size(self): - return 1 - """ - - algorithms_with_signature = dict.fromkeys( - [ - "md5", - "sha1", - "sha224", - "sha256", - "sha384", - "sha512", - "sha3_224", - "sha3_256", - "sha3_384", - "sha3_512", - ], - (init_signature, digest_signature), - ) - - blake2b_signature = ( - "data=b'', *, digest_size=64, key=b'', salt=b'', " - "person=b'', fanout=1, depth=1, leaf_size=0, node_offset=0, " - "node_depth=0, inner_size=0, last_node=False, usedforsecurity=True" - ) - - blake2s_signature = ( - "data=b'', *, digest_size=32, key=b'', salt=b'', " - "person=b'', fanout=1, depth=1, leaf_size=0, node_offset=0, " - "node_depth=0, inner_size=0, last_node=False, usedforsecurity=True" - ) - - shake_algorithms = dict.fromkeys( - ["shake_128", "shake_256"], - (init_signature, shake_digest_signature), - ) - algorithms_with_signature.update(shake_algorithms) - - algorithms_with_signature.update( - { - "blake2b": (blake2b_signature, digest_signature), - "blake2s": (blake2s_signature, digest_signature), - } - ) - - classes = "".join( - template - % { - "name": hashfunc, - "digest": 'b""', - "init_signature": init_signature, - "digest_signature": digest_signature, - } - for hashfunc, ( - init_signature, - digest_signature, - ) in algorithms_with_signature.items() - ) - - return parse(classes) - - -def register(manager: AstroidManager) -> None: - register_module_extender(manager, "hashlib", _hashlib_transform) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_http.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_http.py deleted file mode 100644 index 9802c0f..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_http.py +++ /dev/null @@ -1,238 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Astroid brain hints for some of the `http` module.""" -import textwrap - -from astroid import nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import AstroidBuilder -from astroid.manager import AstroidManager - - -def _http_transform() -> nodes.Module: - code = textwrap.dedent( - """ - from enum import IntEnum, StrEnum - from collections import namedtuple - _HTTPStatus = namedtuple('_HTTPStatus', 'value phrase description') - - class HTTPMethod(StrEnum): - GET = "GET" - POST = "POST" - PUT = "PUT" - DELETE = "DELETE" - HEAD = "HEAD" - OPTIONS = "OPTIONS" - PATCH = "PATCH" - TRACE = "TRACE" - CONNECT = "CONNECT" - - class HTTPStatus(IntEnum): - - @property - def phrase(self): - return "" - @property - def value(self): - return 0 - @property - def description(self): - return "" - - # informational - CONTINUE = _HTTPStatus(100, 'Continue', 'Request received, please continue') - SWITCHING_PROTOCOLS = _HTTPStatus(101, 'Switching Protocols', - 'Switching to new protocol; obey Upgrade header') - PROCESSING = _HTTPStatus(102, 'Processing', '') - EARLY_HINTS = _HTTPStatus(103, 'Early Hints') - OK = _HTTPStatus(200, 'OK', 'Request fulfilled, document follows') - CREATED = _HTTPStatus(201, 'Created', 'Document created, URL follows') - ACCEPTED = _HTTPStatus(202, 'Accepted', - 'Request accepted, processing continues off-line') - NON_AUTHORITATIVE_INFORMATION = _HTTPStatus(203, - 'Non-Authoritative Information', 'Request fulfilled from cache') - NO_CONTENT = _HTTPStatus(204, 'No Content', 'Request fulfilled, nothing follows') - RESET_CONTENT =_HTTPStatus(205, 'Reset Content', 'Clear input form for further input') - PARTIAL_CONTENT = _HTTPStatus(206, 'Partial Content', 'Partial content follows') - MULTI_STATUS = _HTTPStatus(207, 'Multi-Status', '') - ALREADY_REPORTED = _HTTPStatus(208, 'Already Reported', '') - IM_USED = _HTTPStatus(226, 'IM Used', '') - MULTIPLE_CHOICES = _HTTPStatus(300, 'Multiple Choices', - 'Object has several resources -- see URI list') - MOVED_PERMANENTLY = _HTTPStatus(301, 'Moved Permanently', - 'Object moved permanently -- see URI list') - FOUND = _HTTPStatus(302, 'Found', 'Object moved temporarily -- see URI list') - SEE_OTHER = _HTTPStatus(303, 'See Other', 'Object moved -- see Method and URL list') - NOT_MODIFIED = _HTTPStatus(304, 'Not Modified', - 'Document has not changed since given time') - USE_PROXY = _HTTPStatus(305, 'Use Proxy', - 'You must use proxy specified in Location to access this resource') - TEMPORARY_REDIRECT = _HTTPStatus(307, 'Temporary Redirect', - 'Object moved temporarily -- see URI list') - PERMANENT_REDIRECT = _HTTPStatus(308, 'Permanent Redirect', - 'Object moved permanently -- see URI list') - BAD_REQUEST = _HTTPStatus(400, 'Bad Request', - 'Bad request syntax or unsupported method') - UNAUTHORIZED = _HTTPStatus(401, 'Unauthorized', - 'No permission -- see authorization schemes') - PAYMENT_REQUIRED = _HTTPStatus(402, 'Payment Required', - 'No payment -- see charging schemes') - FORBIDDEN = _HTTPStatus(403, 'Forbidden', - 'Request forbidden -- authorization will not help') - NOT_FOUND = _HTTPStatus(404, 'Not Found', - 'Nothing matches the given URI') - METHOD_NOT_ALLOWED = _HTTPStatus(405, 'Method Not Allowed', - 'Specified method is invalid for this resource') - NOT_ACCEPTABLE = _HTTPStatus(406, 'Not Acceptable', - 'URI not available in preferred format') - PROXY_AUTHENTICATION_REQUIRED = _HTTPStatus(407, - 'Proxy Authentication Required', - 'You must authenticate with this proxy before proceeding') - REQUEST_TIMEOUT = _HTTPStatus(408, 'Request Timeout', - 'Request timed out; try again later') - CONFLICT = _HTTPStatus(409, 'Conflict', 'Request conflict') - GONE = _HTTPStatus(410, 'Gone', - 'URI no longer exists and has been permanently removed') - LENGTH_REQUIRED = _HTTPStatus(411, 'Length Required', - 'Client must specify Content-Length') - PRECONDITION_FAILED = _HTTPStatus(412, 'Precondition Failed', - 'Precondition in headers is false') - CONTENT_TOO_LARGE = _HTTPStatus(413, 'Content Too Large', - 'Content is too large') - REQUEST_ENTITY_TOO_LARGE = CONTENT_TOO_LARGE - URI_TOO_LONG = _HTTPStatus(414, 'URI Too Long', 'URI is too long') - REQUEST_URI_TOO_LONG = URI_TOO_LONG - UNSUPPORTED_MEDIA_TYPE = _HTTPStatus(415, 'Unsupported Media Type', - 'Entity body in unsupported format') - RANGE_NOT_SATISFIABLE = (416, 'Range Not Satisfiable', - 'Cannot satisfy request range') - REQUESTED_RANGE_NOT_SATISFIABLE = RANGE_NOT_SATISFIABLE - EXPECTATION_FAILED = _HTTPStatus(417, 'Expectation Failed', - 'Expect condition could not be satisfied') - IM_A_TEAPOT = _HTTPStatus(418, 'I\\\'m a Teapot', - 'Server refuses to brew coffee because it is a teapot.') - MISDIRECTED_REQUEST = _HTTPStatus(421, 'Misdirected Request', - 'Server is not able to produce a response') - UNPROCESSABLE_CONTENT = _HTTPStatus(422, 'Unprocessable Content') - UNPROCESSABLE_ENTITY = UNPROCESSABLE_CONTENT - LOCKED = _HTTPStatus(423, 'Locked') - FAILED_DEPENDENCY = _HTTPStatus(424, 'Failed Dependency') - TOO_EARLY = _HTTPStatus(425, 'Too Early') - UPGRADE_REQUIRED = _HTTPStatus(426, 'Upgrade Required') - PRECONDITION_REQUIRED = _HTTPStatus(428, 'Precondition Required', - 'The origin server requires the request to be conditional') - TOO_MANY_REQUESTS = _HTTPStatus(429, 'Too Many Requests', - 'The user has sent too many requests in ' - 'a given amount of time ("rate limiting")') - REQUEST_HEADER_FIELDS_TOO_LARGE = _HTTPStatus(431, - 'Request Header Fields Too Large', - 'The server is unwilling to process the request because its header ' - 'fields are too large') - UNAVAILABLE_FOR_LEGAL_REASONS = _HTTPStatus(451, - 'Unavailable For Legal Reasons', - 'The server is denying access to the ' - 'resource as a consequence of a legal demand') - INTERNAL_SERVER_ERROR = _HTTPStatus(500, 'Internal Server Error', - 'Server got itself in trouble') - NOT_IMPLEMENTED = _HTTPStatus(501, 'Not Implemented', - 'Server does not support this operation') - BAD_GATEWAY = _HTTPStatus(502, 'Bad Gateway', - 'Invalid responses from another server/proxy') - SERVICE_UNAVAILABLE = _HTTPStatus(503, 'Service Unavailable', - 'The server cannot process the request due to a high load') - GATEWAY_TIMEOUT = _HTTPStatus(504, 'Gateway Timeout', - 'The gateway server did not receive a timely response') - HTTP_VERSION_NOT_SUPPORTED = _HTTPStatus(505, 'HTTP Version Not Supported', - 'Cannot fulfill request') - VARIANT_ALSO_NEGOTIATES = _HTTPStatus(506, 'Variant Also Negotiates') - INSUFFICIENT_STORAGE = _HTTPStatus(507, 'Insufficient Storage') - LOOP_DETECTED = _HTTPStatus(508, 'Loop Detected') - NOT_EXTENDED = _HTTPStatus(510, 'Not Extended') - NETWORK_AUTHENTICATION_REQUIRED = _HTTPStatus(511, - 'Network Authentication Required', - 'The client needs to authenticate to gain network access') - """ - ) - return AstroidBuilder(AstroidManager()).string_build(code) - - -def _http_client_transform() -> nodes.Module: - return AstroidBuilder(AstroidManager()).string_build( - textwrap.dedent( - """ - from http import HTTPStatus - - CONTINUE = HTTPStatus.CONTINUE - SWITCHING_PROTOCOLS = HTTPStatus.SWITCHING_PROTOCOLS - PROCESSING = HTTPStatus.PROCESSING - EARLY_HINTS = HTTPStatus.EARLY_HINTS - OK = HTTPStatus.OK - CREATED = HTTPStatus.CREATED - ACCEPTED = HTTPStatus.ACCEPTED - NON_AUTHORITATIVE_INFORMATION = HTTPStatus.NON_AUTHORITATIVE_INFORMATION - NO_CONTENT = HTTPStatus.NO_CONTENT - RESET_CONTENT = HTTPStatus.RESET_CONTENT - PARTIAL_CONTENT = HTTPStatus.PARTIAL_CONTENT - MULTI_STATUS = HTTPStatus.MULTI_STATUS - ALREADY_REPORTED = HTTPStatus.ALREADY_REPORTED - IM_USED = HTTPStatus.IM_USED - MULTIPLE_CHOICES = HTTPStatus.MULTIPLE_CHOICES - MOVED_PERMANENTLY = HTTPStatus.MOVED_PERMANENTLY - FOUND = HTTPStatus.FOUND - SEE_OTHER = HTTPStatus.SEE_OTHER - NOT_MODIFIED = HTTPStatus.NOT_MODIFIED - USE_PROXY = HTTPStatus.USE_PROXY - TEMPORARY_REDIRECT = HTTPStatus.TEMPORARY_REDIRECT - PERMANENT_REDIRECT = HTTPStatus.PERMANENT_REDIRECT - BAD_REQUEST = HTTPStatus.BAD_REQUEST - UNAUTHORIZED = HTTPStatus.UNAUTHORIZED - PAYMENT_REQUIRED = HTTPStatus.PAYMENT_REQUIRED - FORBIDDEN = HTTPStatus.FORBIDDEN - NOT_FOUND = HTTPStatus.NOT_FOUND - METHOD_NOT_ALLOWED = HTTPStatus.METHOD_NOT_ALLOWED - NOT_ACCEPTABLE = HTTPStatus.NOT_ACCEPTABLE - PROXY_AUTHENTICATION_REQUIRED = HTTPStatus.PROXY_AUTHENTICATION_REQUIRED - REQUEST_TIMEOUT = HTTPStatus.REQUEST_TIMEOUT - CONFLICT = HTTPStatus.CONFLICT - GONE = HTTPStatus.GONE - LENGTH_REQUIRED = HTTPStatus.LENGTH_REQUIRED - PRECONDITION_FAILED = HTTPStatus.PRECONDITION_FAILED - CONTENT_TOO_LARGE = HTTPStatus.CONTENT_TOO_LARGE - REQUEST_ENTITY_TOO_LARGE = HTTPStatus.CONTENT_TOO_LARGE - URI_TOO_LONG = HTTPStatus.URI_TOO_LONG - REQUEST_URI_TOO_LONG = HTTPStatus.URI_TOO_LONG - UNSUPPORTED_MEDIA_TYPE = HTTPStatus.UNSUPPORTED_MEDIA_TYPE - RANGE_NOT_SATISFIABLE = HTTPStatus.RANGE_NOT_SATISFIABLE - REQUESTED_RANGE_NOT_SATISFIABLE = HTTPStatus.RANGE_NOT_SATISFIABLE - EXPECTATION_FAILED = HTTPStatus.EXPECTATION_FAILED - IM_A_TEAPOT = HTTPStatus.IM_A_TEAPOT - UNPROCESSABLE_CONTENT = HTTPStatus.UNPROCESSABLE_CONTENT - UNPROCESSABLE_ENTITY = HTTPStatus.UNPROCESSABLE_CONTENT - LOCKED = HTTPStatus.LOCKED - FAILED_DEPENDENCY = HTTPStatus.FAILED_DEPENDENCY - TOO_EARLY = HTTPStatus.TOO_EARLY - UPGRADE_REQUIRED = HTTPStatus.UPGRADE_REQUIRED - PRECONDITION_REQUIRED = HTTPStatus.PRECONDITION_REQUIRED - TOO_MANY_REQUESTS = HTTPStatus.TOO_MANY_REQUESTS - REQUEST_HEADER_FIELDS_TOO_LARGE = HTTPStatus.REQUEST_HEADER_FIELDS_TOO_LARGE - INTERNAL_SERVER_ERROR = HTTPStatus.INTERNAL_SERVER_ERROR - NOT_IMPLEMENTED = HTTPStatus.NOT_IMPLEMENTED - BAD_GATEWAY = HTTPStatus.BAD_GATEWAY - SERVICE_UNAVAILABLE = HTTPStatus.SERVICE_UNAVAILABLE - GATEWAY_TIMEOUT = HTTPStatus.GATEWAY_TIMEOUT - HTTP_VERSION_NOT_SUPPORTED = HTTPStatus.HTTP_VERSION_NOT_SUPPORTED - VARIANT_ALSO_NEGOTIATES = HTTPStatus.VARIANT_ALSO_NEGOTIATES - INSUFFICIENT_STORAGE = HTTPStatus.INSUFFICIENT_STORAGE - LOOP_DETECTED = HTTPStatus.LOOP_DETECTED - NOT_EXTENDED = HTTPStatus.NOT_EXTENDED - NETWORK_AUTHENTICATION_REQUIRED = HTTPStatus.NETWORK_AUTHENTICATION_REQUIRED - """ - ) - ) - - -def register(manager: AstroidManager) -> None: - register_module_extender(manager, "http", _http_transform) - register_module_extender(manager, "http.client", _http_client_transform) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_hypothesis.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_hypothesis.py deleted file mode 100644 index ba20f06..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_hypothesis.py +++ /dev/null @@ -1,56 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -""" -Astroid hook for the Hypothesis library. - -Without this hook pylint reports no-value-for-parameter for use of strategies -defined using the `@hypothesis.strategies.composite` decorator. For example: - - from hypothesis import strategies as st - - @st.composite - def a_strategy(draw): - return draw(st.integers()) - - a_strategy() -""" -from astroid.manager import AstroidManager -from astroid.nodes.scoped_nodes import FunctionDef - -COMPOSITE_NAMES = ( - "composite", - "st.composite", - "strategies.composite", - "hypothesis.strategies.composite", -) - - -def is_decorated_with_st_composite(node: FunctionDef) -> bool: - """Return whether a decorated node has @st.composite applied.""" - if node.decorators and node.args.args and node.args.args[0].name == "draw": - for decorator_attribute in node.decorators.nodes: - if decorator_attribute.as_string() in COMPOSITE_NAMES: - return True - return False - - -def remove_draw_parameter_from_composite_strategy(node: FunctionDef) -> FunctionDef: - """Given that the FunctionDef is decorated with @st.composite, remove the - first argument (`draw`) - it's always supplied by Hypothesis so we don't - need to emit the no-value-for-parameter lint. - """ - assert isinstance(node.args.args, list) - del node.args.args[0] - del node.args.annotations[0] - del node.args.type_comment_args[0] - return node - - -def register(manager: AstroidManager) -> None: - manager.register_transform( - node_class=FunctionDef, - transform=remove_draw_parameter_from_composite_strategy, - predicate=is_decorated_with_st_composite, - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_io.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_io.py deleted file mode 100644 index ab6e607..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_io.py +++ /dev/null @@ -1,44 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Astroid brain hints for some of the _io C objects.""" -from astroid.manager import AstroidManager -from astroid.nodes import ClassDef - -BUFFERED = {"BufferedWriter", "BufferedReader"} -TextIOWrapper = "TextIOWrapper" -FileIO = "FileIO" -BufferedWriter = "BufferedWriter" - - -def _generic_io_transform(node, name, cls): - """Transform the given name, by adding the given *class* as a member of the - node. - """ - - io_module = AstroidManager().ast_from_module_name("_io") - attribute_object = io_module[cls] - instance = attribute_object.instantiate_class() - node.locals[name] = [instance] - - -def _transform_text_io_wrapper(node): - # This is not always correct, since it can vary with the type of the descriptor, - # being stdout, stderr or stdin. But we cannot get access to the name of the - # stream, which is why we are using the BufferedWriter class as a default - # value - return _generic_io_transform(node, name="buffer", cls=BufferedWriter) - - -def _transform_buffered(node): - return _generic_io_transform(node, name="raw", cls=FileIO) - - -def register(manager: AstroidManager) -> None: - manager.register_transform( - ClassDef, _transform_buffered, lambda node: node.name in BUFFERED - ) - manager.register_transform( - ClassDef, _transform_text_io_wrapper, lambda node: node.name == TextIOWrapper - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_mechanize.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_mechanize.py deleted file mode 100644 index 62cc2d0..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_mechanize.py +++ /dev/null @@ -1,125 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from astroid import nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import AstroidBuilder -from astroid.manager import AstroidManager - - -def mechanize_transform() -> nodes.Module: - return AstroidBuilder(AstroidManager()).string_build( - """class Browser(object): - def __getattr__(self, name): - return None - - def __getitem__(self, name): - return None - - def __setitem__(self, name, val): - return None - - def back(self, n=1): - return None - - def clear_history(self): - return None - - def click(self, *args, **kwds): - return None - - def click_link(self, link=None, **kwds): - return None - - def close(self): - return None - - def encoding(self): - return None - - def find_link( - self, - text=None, - text_regex=None, - name=None, - name_regex=None, - url=None, - url_regex=None, - tag=None, - predicate=None, - nr=0, - ): - return None - - def follow_link(self, link=None, **kwds): - return None - - def forms(self): - return None - - def geturl(self): - return None - - def global_form(self): - return None - - def links(self, **kwds): - return None - - def open_local_file(self, filename): - return None - - def open(self, url, data=None, timeout=None): - return None - - def open_novisit(self, url, data=None, timeout=None): - return None - - def open_local_file(self, filename): - return None - - def reload(self): - return None - - def response(self): - return None - - def select_form(self, name=None, predicate=None, nr=None, **attrs): - return None - - def set_cookie(self, cookie_string): - return None - - def set_handle_referer(self, handle): - return None - - def set_header(self, header, value=None): - return None - - def set_html(self, html, url="http://example.com/"): - return None - - def set_response(self, response): - return None - - def set_simple_cookie(self, name, value, domain, path="/"): - return None - - def submit(self, *args, **kwds): - return None - - def title(self): - return None - - def viewing_html(self): - return None - - def visit_response(self, response, request=None): - return None -""" - ) - - -def register(manager: AstroidManager) -> None: - register_module_extender(manager, "mechanize", mechanize_transform) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_multiprocessing.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_multiprocessing.py deleted file mode 100644 index e6413b0..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_multiprocessing.py +++ /dev/null @@ -1,106 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from astroid.bases import BoundMethod -from astroid.brain.helpers import register_module_extender -from astroid.builder import parse -from astroid.exceptions import InferenceError -from astroid.manager import AstroidManager -from astroid.nodes.scoped_nodes import FunctionDef - - -def _multiprocessing_transform(): - module = parse( - """ - from multiprocessing.managers import SyncManager - def Manager(): - return SyncManager() - """ - ) - # Multiprocessing uses a getattr lookup inside contexts, - # in order to get the attributes they need. Since it's extremely - # dynamic, we use this approach to fake it. - node = parse( - """ - from multiprocessing.context import DefaultContext, BaseContext - default = DefaultContext() - base = BaseContext() - """ - ) - try: - context = next(node["default"].infer()) - base = next(node["base"].infer()) - except (InferenceError, StopIteration): - return module - - for node in (context, base): - for key, value in node.locals.items(): - if key.startswith("_"): - continue - - value = value[0] - if isinstance(value, FunctionDef): - # We need to rebound this, since otherwise - # it will have an extra argument (self). - value = BoundMethod(value, node) - module[key] = value - return module - - -def _multiprocessing_managers_transform(): - return parse( - """ - import array - import threading - import multiprocessing.pool as pool - import queue - - class Namespace(object): - pass - - class Value(object): - def __init__(self, typecode, value, lock=True): - self._typecode = typecode - self._value = value - def get(self): - return self._value - def set(self, value): - self._value = value - def __repr__(self): - return '%s(%r, %r)'%(type(self).__name__, self._typecode, self._value) - value = property(get, set) - - def Array(typecode, sequence, lock=True): - return array.array(typecode, sequence) - - class SyncManager(object): - Queue = JoinableQueue = queue.Queue - Event = threading.Event - RLock = threading.RLock - Lock = threading.Lock - BoundedSemaphore = threading.BoundedSemaphore - Condition = threading.Condition - Barrier = threading.Barrier - Pool = pool.Pool - list = list - dict = dict - Value = Value - Array = Array - Namespace = Namespace - __enter__ = lambda self: self - __exit__ = lambda *args: args - - def start(self, initializer=None, initargs=None): - pass - def shutdown(self): - pass - """ - ) - - -def register(manager: AstroidManager) -> None: - register_module_extender( - manager, "multiprocessing.managers", _multiprocessing_managers_transform - ) - register_module_extender(manager, "multiprocessing", _multiprocessing_transform) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_namedtuple_enum.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_namedtuple_enum.py deleted file mode 100644 index ff5b715..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_namedtuple_enum.py +++ /dev/null @@ -1,681 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Astroid hooks for the Python standard library.""" - -from __future__ import annotations - -import functools -import keyword -from collections.abc import Iterator -from textwrap import dedent -from typing import Final - -from astroid import arguments, bases, nodes, util -from astroid.builder import AstroidBuilder, _extract_single_node, extract_node -from astroid.context import InferenceContext -from astroid.exceptions import ( - AstroidTypeError, - AstroidValueError, - InferenceError, - UseInferenceDefault, -) -from astroid.inference_tip import inference_tip -from astroid.manager import AstroidManager -from astroid.nodes.scoped_nodes.scoped_nodes import SYNTHETIC_ROOT - -ENUM_QNAME: Final[str] = "enum.Enum" -TYPING_NAMEDTUPLE_QUALIFIED: Final = { - "typing.NamedTuple", - "typing_extensions.NamedTuple", -} -TYPING_NAMEDTUPLE_BASENAMES: Final = { - "NamedTuple", - "typing.NamedTuple", - "typing_extensions.NamedTuple", -} - - -def _infer_first(node, context): - if isinstance(node, util.UninferableBase): - raise UseInferenceDefault - try: - value = next(node.infer(context=context)) - except StopIteration as exc: - raise InferenceError from exc - if isinstance(value, util.UninferableBase): - raise UseInferenceDefault() - return value - - -def _find_func_form_arguments(node, context): - def _extract_namedtuple_arg_or_keyword( # pylint: disable=inconsistent-return-statements - position, key_name=None - ): - if len(args) > position: - return _infer_first(args[position], context) - if key_name and key_name in found_keywords: - return _infer_first(found_keywords[key_name], context) - - args = node.args - keywords = node.keywords - found_keywords = ( - {keyword.arg: keyword.value for keyword in keywords} if keywords else {} - ) - - name = _extract_namedtuple_arg_or_keyword(position=0, key_name="typename") - names = _extract_namedtuple_arg_or_keyword(position=1, key_name="field_names") - if name and names: - return name.value, names - - raise UseInferenceDefault() - - -def infer_func_form( - node: nodes.Call, - base_type: nodes.NodeNG, - *, - parent: nodes.NodeNG, - context: InferenceContext | None = None, - enum: bool = False, -) -> tuple[nodes.ClassDef, str, list[str]]: - """Specific inference function for namedtuple or Python 3 enum.""" - # node is a Call node, class name as first argument and generated class - # attributes as second argument - - # namedtuple or enums list of attributes can be a list of strings or a - # whitespace-separate string - try: - name, names = _find_func_form_arguments(node, context) - try: - attributes: list[str] = names.value.replace(",", " ").split() - except AttributeError as exc: - # Handle attributes of NamedTuples - if not enum: - attributes = [] - fields = _get_namedtuple_fields(node) - if fields: - fields_node = extract_node(fields) - attributes = [ - _infer_first(const, context).value for const in fields_node.elts - ] - - # Handle attributes of Enums - else: - # Enums supports either iterator of (name, value) pairs - # or mappings. - if hasattr(names, "items") and isinstance(names.items, list): - attributes = [ - _infer_first(const[0], context).value - for const in names.items - if isinstance(const[0], nodes.Const) - ] - elif hasattr(names, "elts"): - # Enums can support either ["a", "b", "c"] - # or [("a", 1), ("b", 2), ...], but they can't - # be mixed. - if all(isinstance(const, nodes.Tuple) for const in names.elts): - attributes = [ - _infer_first(const.elts[0], context).value - for const in names.elts - if isinstance(const, nodes.Tuple) - ] - else: - attributes = [ - _infer_first(const, context).value for const in names.elts - ] - else: - raise AttributeError from exc - if not attributes: - raise AttributeError from exc - except (AttributeError, InferenceError) as exc: - raise UseInferenceDefault from exc - - if not enum: - # namedtuple maps sys.intern(str()) over over field_names - attributes = [str(attr) for attr in attributes] - # XXX this should succeed *unless* __str__/__repr__ is incorrect or throws - # in which case we should not have inferred these values and raised earlier - attributes = [attr for attr in attributes if " " not in attr] - - # If we can't infer the name of the class, don't crash, up to this point - # we know it is a namedtuple anyway. - name = name or "Uninferable" - # we want to return a Class node instance with proper attributes set - class_node = nodes.ClassDef( - name, - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - class_node.postinit( - bases=[base_type], - body=[], - decorators=None, - ) - # XXX add __init__(*attributes) method - for attr in attributes: - fake_node = nodes.EmptyNode() - fake_node.parent = class_node - fake_node.attrname = attr - class_node.instance_attrs[attr] = [fake_node] - return class_node, name, attributes - - -def _has_namedtuple_base(node): - """Predicate for class inference tip. - - :type node: ClassDef - :rtype: bool - """ - return set(node.basenames) & TYPING_NAMEDTUPLE_BASENAMES - - -def _looks_like(node, name) -> bool: - func = node.func - if isinstance(func, nodes.Attribute): - return func.attrname == name - if isinstance(func, nodes.Name): - return func.name == name - return False - - -_looks_like_namedtuple = functools.partial(_looks_like, name="namedtuple") -_looks_like_enum = functools.partial(_looks_like, name="Enum") -_looks_like_typing_namedtuple = functools.partial(_looks_like, name="NamedTuple") - - -def infer_named_tuple( - node: nodes.Call, context: InferenceContext | None = None -) -> Iterator[nodes.ClassDef]: - """Specific inference function for namedtuple Call node.""" - tuple_base: nodes.Name = _extract_single_node("tuple") - class_node, name, attributes = infer_func_form( - node, tuple_base, parent=SYNTHETIC_ROOT, context=context - ) - - call_site = arguments.CallSite.from_call(node, context=context) - func = util.safe_infer( - _extract_single_node("import collections; collections.namedtuple") - ) - assert isinstance(func, nodes.NodeNG) - try: - rename_arg_bool_value = next( - call_site.infer_argument(func, "rename", context or InferenceContext()) - ).bool_value() - rename = rename_arg_bool_value is True - except (InferenceError, StopIteration): - rename = False - - try: - attributes = _check_namedtuple_attributes(name, attributes, rename) - except AstroidTypeError as exc: - raise UseInferenceDefault("TypeError: " + str(exc)) from exc - except AstroidValueError as exc: - raise UseInferenceDefault("ValueError: " + str(exc)) from exc - - replace_args = ", ".join(f"{arg}=None" for arg in attributes) - field_def = ( - " {name} = property(lambda self: self[{index:d}], " - "doc='Alias for field number {index:d}')" - ) - field_defs = "\n".join( - field_def.format(name=name, index=index) - for index, name in enumerate(attributes) - ) - fake = AstroidBuilder(AstroidManager()).string_build( - f""" -class {name}(tuple): - __slots__ = () - _fields = {attributes!r} - def _asdict(self): - return self.__dict__ - @classmethod - def _make(cls, iterable, new=tuple.__new__, len=len): - return new(cls, iterable) - def _replace(self, {replace_args}): - return self - def __getnewargs__(self): - return tuple(self) -{field_defs} - """ - ) - class_node.locals["_asdict"] = fake.body[0].locals["_asdict"] - class_node.locals["_make"] = fake.body[0].locals["_make"] - class_node.locals["_replace"] = fake.body[0].locals["_replace"] - class_node.locals["_fields"] = fake.body[0].locals["_fields"] - for attr in attributes: - class_node.locals[attr] = fake.body[0].locals[attr] - # we use UseInferenceDefault, we can't be a generator so return an iterator - return iter([class_node]) - - -def _get_renamed_namedtuple_attributes(field_names): - names = list(field_names) - seen = set() - for i, name in enumerate(field_names): - # pylint: disable = too-many-boolean-expressions - if ( - not all(c.isalnum() or c == "_" for c in name) - or keyword.iskeyword(name) - or not name - or name[0].isdigit() - or name.startswith("_") - or name in seen - ): - names[i] = "_%d" % i - seen.add(name) - return tuple(names) - - -def _check_namedtuple_attributes(typename, attributes, rename=False): - attributes = tuple(attributes) - if rename: - attributes = _get_renamed_namedtuple_attributes(attributes) - - # The following snippet is derived from the CPython Lib/collections/__init__.py sources - # - for name in (typename, *attributes): - if not isinstance(name, str): - raise AstroidTypeError( - f"Type names and field names must be strings, not {type(name)!r}" - ) - if not name.isidentifier(): - raise AstroidValueError( - "Type names and field names must be valid" + f"identifiers: {name!r}" - ) - if keyword.iskeyword(name): - raise AstroidValueError( - f"Type names and field names cannot be a keyword: {name!r}" - ) - - seen = set() - for name in attributes: - if name.startswith("_") and not rename: - raise AstroidValueError( - f"Field names cannot start with an underscore: {name!r}" - ) - if name in seen: - raise AstroidValueError(f"Encountered duplicate field name: {name!r}") - seen.add(name) - # - - return attributes - - -def infer_enum( - node: nodes.Call, context: InferenceContext | None = None -) -> Iterator[bases.Instance]: - """Specific inference function for enum Call node.""" - # Raise `UseInferenceDefault` if `node` is a call to a a user-defined Enum. - try: - inferred = node.func.infer(context) - except (InferenceError, StopIteration) as exc: - raise UseInferenceDefault from exc - - if not any( - isinstance(item, nodes.ClassDef) and item.qname() == ENUM_QNAME - for item in inferred - ): - raise UseInferenceDefault - - enum_meta = _extract_single_node( - """ - class EnumMeta(object): - 'docstring' - def __call__(self, node): - class EnumAttribute(object): - name = '' - value = 0 - return EnumAttribute() - def __iter__(self): - class EnumAttribute(object): - name = '' - value = 0 - return [EnumAttribute()] - def __reversed__(self): - class EnumAttribute(object): - name = '' - value = 0 - return (EnumAttribute, ) - def __next__(self): - return next(iter(self)) - def __getitem__(self, attr): - class Value(object): - @property - def name(self): - return '' - @property - def value(self): - return attr - - return Value() - __members__ = [''] - """ - ) - - # FIXME arguably, the base here shouldn't be the EnumMeta class definition - # itself, but a reference (Name) to it. Otherwise, the invariant that all - # children of a node have that node as their parent is broken. - class_node = infer_func_form( - node, - enum_meta, - parent=SYNTHETIC_ROOT, - context=context, - enum=True, - )[0] - return iter([class_node.instantiate_class()]) - - -INT_FLAG_ADDITION_METHODS = """ - def __or__(self, other): - return {name}(self.value | other.value) - def __and__(self, other): - return {name}(self.value & other.value) - def __xor__(self, other): - return {name}(self.value ^ other.value) - def __add__(self, other): - return {name}(self.value + other.value) - def __div__(self, other): - return {name}(self.value / other.value) - def __invert__(self): - return {name}(~self.value) - def __mul__(self, other): - return {name}(self.value * other.value) -""" - - -def infer_enum_class(node: nodes.ClassDef) -> nodes.ClassDef: - """Specific inference for enums.""" - for basename in (b for cls in node.mro() for b in cls.basenames): - if node.root().name == "enum": - # Skip if the class is directly from enum module. - break - dunder_members = {} - target_names = set() - for local, values in node.locals.items(): - if ( - any(not isinstance(value, nodes.AssignName) for value in values) - or local == "_ignore_" - ): - continue - - stmt = values[0].statement() - if isinstance(stmt, nodes.Assign): - if isinstance(stmt.targets[0], nodes.Tuple): - targets = stmt.targets[0].itered() - else: - targets = stmt.targets - elif isinstance(stmt, nodes.AnnAssign): - targets = [stmt.target] - else: - continue - - inferred_return_value = None - if stmt.value is not None: - if isinstance(stmt.value, nodes.Const): - if isinstance(stmt.value.value, str): - inferred_return_value = repr(stmt.value.value) - else: - inferred_return_value = stmt.value.value - else: - inferred_return_value = stmt.value.as_string() - - new_targets = [] - for target in targets: - if isinstance(target, nodes.Starred): - continue - target_names.add(target.name) - # Replace all the assignments with our mocked class. - classdef = dedent( - """ - class {name}({types}): - @property - def value(self): - return {return_value} - @property - def _value_(self): - return {return_value} - @property - def name(self): - return "{name}" - @property - def _name_(self): - return "{name}" - """.format( - name=target.name, - types=", ".join(node.basenames), - return_value=inferred_return_value, - ) - ) - if "IntFlag" in basename: - # Alright, we need to add some additional methods. - # Unfortunately we still can't infer the resulting objects as - # Enum members, but once we'll be able to do that, the following - # should result in some nice symbolic execution - classdef += INT_FLAG_ADDITION_METHODS.format(name=target.name) - - fake = AstroidBuilder( - AstroidManager(), apply_transforms=False - ).string_build(classdef)[target.name] - fake.parent = target.parent - for method in node.mymethods(): - fake.locals[method.name] = [method] - new_targets.append(fake.instantiate_class()) - if stmt.value is None: - continue - dunder_members[local] = fake - node.locals[local] = new_targets - - # The undocumented `_value2member_map_` member: - node.locals["_value2member_map_"] = [ - nodes.Dict( - parent=node, - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - ) - ] - - members = nodes.Dict( - parent=node, - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - ) - members.postinit( - [ - ( - nodes.Const(k, parent=members), - nodes.Name( - v.name, - parent=members, - lineno=v.lineno, - col_offset=v.col_offset, - end_lineno=v.end_lineno, - end_col_offset=v.end_col_offset, - ), - ) - for k, v in dunder_members.items() - ] - ) - node.locals["__members__"] = [members] - # The enum.Enum class itself defines two @DynamicClassAttribute data-descriptors - # "name" and "value" (which we override in the mocked class for each enum member - # above). When dealing with inference of an arbitrary instance of the enum - # class, e.g. in a method defined in the class body like: - # class SomeEnum(enum.Enum): - # def method(self): - # self.name # <- here - # In the absence of an enum member called "name" or "value", these attributes - # should resolve to the descriptor on that particular instance, i.e. enum member. - # For "value", we have no idea what that should be, but for "name", we at least - # know that it should be a string, so infer that as a guess. - if "name" not in target_names: - code = dedent( - ''' - @property - def name(self): - """The name of the Enum member. - - This is a reconstruction by astroid: enums are too dynamic to understand, but we at least - know 'name' should be a string, so this is astroid's best guess. - """ - return '' - ''' - ) - name_dynamicclassattr = AstroidBuilder(AstroidManager()).string_build(code)[ - "name" - ] - node.locals["name"] = [name_dynamicclassattr] - break - return node - - -def infer_typing_namedtuple_class(class_node, context: InferenceContext | None = None): - """Infer a subclass of typing.NamedTuple.""" - # Check if it has the corresponding bases - annassigns_fields = [ - annassign.target.name - for annassign in class_node.body - if isinstance(annassign, nodes.AnnAssign) - ] - code = dedent( - """ - from collections import namedtuple - namedtuple({typename!r}, {fields!r}) - """ - ).format(typename=class_node.name, fields=",".join(annassigns_fields)) - node = extract_node(code) - try: - generated_class_node = next(infer_named_tuple(node, context)) - except StopIteration as e: - raise InferenceError(node=node, context=context) from e - for method in class_node.mymethods(): - generated_class_node.locals[method.name] = [method] - - for body_node in class_node.body: - if isinstance(body_node, nodes.Assign): - for target in body_node.targets: - attr = target.name - generated_class_node.locals[attr] = class_node.locals[attr] - elif isinstance(body_node, nodes.ClassDef): - generated_class_node.locals[body_node.name] = [body_node] - - return iter((generated_class_node,)) - - -def infer_typing_namedtuple_function(node, context: InferenceContext | None = None): - """ - Starting with python3.9, NamedTuple is a function of the typing module. - The class NamedTuple is build dynamically through a call to `type` during - initialization of the `_NamedTuple` variable. - """ - klass = extract_node( - """ - from typing import _NamedTuple - _NamedTuple - """ - ) - return klass.infer(context) - - -def infer_typing_namedtuple( - node: nodes.Call, context: InferenceContext | None = None -) -> Iterator[nodes.ClassDef]: - """Infer a typing.NamedTuple(...) call.""" - # This is essentially a namedtuple with different arguments - # so we extract the args and infer a named tuple. - try: - func = next(node.func.infer()) - except (InferenceError, StopIteration) as exc: - raise UseInferenceDefault from exc - - if func.qname() not in TYPING_NAMEDTUPLE_QUALIFIED: - raise UseInferenceDefault - - if len(node.args) != 2: - raise UseInferenceDefault - - if not isinstance(node.args[1], (nodes.List, nodes.Tuple)): - raise UseInferenceDefault - - return infer_named_tuple(node, context) - - -def _get_namedtuple_fields(node: nodes.Call) -> str: - """Get and return fields of a NamedTuple in code-as-a-string. - - Because the fields are represented in their code form we can - extract a node from them later on. - """ - names = [] - container = None - try: - container = next(node.args[1].infer()) - except (InferenceError, StopIteration) as exc: - raise UseInferenceDefault from exc - # We pass on IndexError as we'll try to infer 'field_names' from the keywords - except IndexError: - pass - if not container: - for keyword_node in node.keywords: - if keyword_node.arg == "field_names": - try: - container = next(keyword_node.value.infer()) - except (InferenceError, StopIteration) as exc: - raise UseInferenceDefault from exc - break - if not isinstance(container, nodes.BaseContainer): - raise UseInferenceDefault - for elt in container.elts: - if isinstance(elt, nodes.Const): - names.append(elt.as_string()) - continue - if not isinstance(elt, (nodes.List, nodes.Tuple)): - raise UseInferenceDefault - if len(elt.elts) != 2: - raise UseInferenceDefault - names.append(elt.elts[0].as_string()) - - if names: - field_names = f"({','.join(names)},)" - else: - field_names = "" - return field_names - - -def _is_enum_subclass(cls: nodes.ClassDef) -> bool: - """Return whether cls is a subclass of an Enum.""" - return cls.is_subtype_of("enum.Enum") - - -def register(manager: AstroidManager) -> None: - manager.register_transform( - nodes.Call, inference_tip(infer_named_tuple), _looks_like_namedtuple - ) - manager.register_transform(nodes.Call, inference_tip(infer_enum), _looks_like_enum) - manager.register_transform( - nodes.ClassDef, infer_enum_class, predicate=_is_enum_subclass - ) - manager.register_transform( - nodes.ClassDef, - inference_tip(infer_typing_namedtuple_class), - _has_namedtuple_base, - ) - manager.register_transform( - nodes.FunctionDef, - inference_tip(infer_typing_namedtuple_function), - lambda node: node.name == "NamedTuple" - and getattr(node.root(), "name", None) == "typing", - ) - manager.register_transform( - nodes.Call, - inference_tip(infer_typing_namedtuple), - _looks_like_typing_namedtuple, - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_core_einsumfunc.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_core_einsumfunc.py deleted file mode 100644 index b72369c..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_core_einsumfunc.py +++ /dev/null @@ -1,28 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -""" -Astroid hooks for numpy.core.einsumfunc module: -https://github.com/numpy/numpy/blob/main/numpy/core/einsumfunc.py. -""" - -from astroid import nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import parse -from astroid.manager import AstroidManager - - -def numpy_core_einsumfunc_transform() -> nodes.Module: - return parse( - """ - def einsum(*operands, out=None, optimize=False, **kwargs): - return numpy.ndarray([0, 0]) - """ - ) - - -def register(manager: AstroidManager) -> None: - register_module_extender( - manager, "numpy.core.einsumfunc", numpy_core_einsumfunc_transform - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_core_fromnumeric.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_core_fromnumeric.py deleted file mode 100644 index ce4173c..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_core_fromnumeric.py +++ /dev/null @@ -1,24 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Astroid hooks for numpy.core.fromnumeric module.""" -from astroid import nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import parse -from astroid.manager import AstroidManager - - -def numpy_core_fromnumeric_transform() -> nodes.Module: - return parse( - """ - def sum(a, axis=None, dtype=None, out=None, keepdims=None, initial=None): - return numpy.ndarray([0, 0]) - """ - ) - - -def register(manager: AstroidManager) -> None: - register_module_extender( - manager, "numpy.core.fromnumeric", numpy_core_fromnumeric_transform - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_core_function_base.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_core_function_base.py deleted file mode 100644 index b66ba5f..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_core_function_base.py +++ /dev/null @@ -1,35 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Astroid hooks for numpy.core.function_base module.""" - -import functools - -from astroid import nodes -from astroid.brain.brain_numpy_utils import ( - attribute_name_looks_like_numpy_member, - infer_numpy_attribute, -) -from astroid.inference_tip import inference_tip -from astroid.manager import AstroidManager - -METHODS_TO_BE_INFERRED = { - "linspace": """def linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0): - return numpy.ndarray([0, 0])""", - "logspace": """def logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None, axis=0): - return numpy.ndarray([0, 0])""", - "geomspace": """def geomspace(start, stop, num=50, endpoint=True, dtype=None, axis=0): - return numpy.ndarray([0, 0])""", -} - - -def register(manager: AstroidManager) -> None: - manager.register_transform( - nodes.Attribute, - inference_tip(functools.partial(infer_numpy_attribute, METHODS_TO_BE_INFERRED)), - functools.partial( - attribute_name_looks_like_numpy_member, - frozenset(METHODS_TO_BE_INFERRED.keys()), - ), - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_core_multiarray.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_core_multiarray.py deleted file mode 100644 index 19850d3..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_core_multiarray.py +++ /dev/null @@ -1,106 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Astroid hooks for numpy.core.multiarray module.""" - -import functools - -from astroid import nodes -from astroid.brain.brain_numpy_utils import ( - attribute_name_looks_like_numpy_member, - infer_numpy_attribute, - infer_numpy_name, - member_name_looks_like_numpy_member, -) -from astroid.brain.helpers import register_module_extender -from astroid.builder import parse -from astroid.inference_tip import inference_tip -from astroid.manager import AstroidManager - - -def numpy_core_multiarray_transform() -> nodes.Module: - return parse( - """ - # different functions defined in multiarray.py - def inner(a, b): - return numpy.ndarray([0, 0]) - - def vdot(a, b): - return numpy.ndarray([0, 0]) - """ - ) - - -METHODS_TO_BE_INFERRED = { - "array": """def array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0): - return numpy.ndarray([0, 0])""", - "dot": """def dot(a, b, out=None): - return numpy.ndarray([0, 0])""", - "empty_like": """def empty_like(a, dtype=None, order='K', subok=True): - return numpy.ndarray((0, 0))""", - "concatenate": """def concatenate(arrays, axis=None, out=None): - return numpy.ndarray((0, 0))""", - "where": """def where(condition, x=None, y=None): - return numpy.ndarray([0, 0])""", - "empty": """def empty(shape, dtype=float, order='C'): - return numpy.ndarray([0, 0])""", - "bincount": """def bincount(x, weights=None, minlength=0): - return numpy.ndarray([0, 0])""", - "busday_count": """def busday_count( - begindates, enddates, weekmask='1111100', holidays=[], busdaycal=None, out=None - ): - return numpy.ndarray([0, 0])""", - "busday_offset": """def busday_offset( - dates, offsets, roll='raise', weekmask='1111100', holidays=None, - busdaycal=None, out=None - ): - return numpy.ndarray([0, 0])""", - "can_cast": """def can_cast(from_, to, casting='safe'): - return True""", - "copyto": """def copyto(dst, src, casting='same_kind', where=True): - return None""", - "datetime_as_string": """def datetime_as_string(arr, unit=None, timezone='naive', casting='same_kind'): - return numpy.ndarray([0, 0])""", - "is_busday": """def is_busday(dates, weekmask='1111100', holidays=None, busdaycal=None, out=None): - return numpy.ndarray([0, 0])""", - "lexsort": """def lexsort(keys, axis=-1): - return numpy.ndarray([0, 0])""", - "may_share_memory": """def may_share_memory(a, b, max_work=None): - return True""", - # Not yet available because dtype is not yet present in those brains - # "min_scalar_type": """def min_scalar_type(a): - # return numpy.dtype('int16')""", - "packbits": """def packbits(a, axis=None, bitorder='big'): - return numpy.ndarray([0, 0])""", - # Not yet available because dtype is not yet present in those brains - # "result_type": """def result_type(*arrays_and_dtypes): - # return numpy.dtype('int16')""", - "shares_memory": """def shares_memory(a, b, max_work=None): - return True""", - "unpackbits": """def unpackbits(a, axis=None, count=None, bitorder='big'): - return numpy.ndarray([0, 0])""", - "unravel_index": """def unravel_index(indices, shape, order='C'): - return (numpy.ndarray([0, 0]),)""", - "zeros": """def zeros(shape, dtype=float, order='C'): - return numpy.ndarray([0, 0])""", -} - - -def register(manager: AstroidManager) -> None: - register_module_extender( - manager, "numpy.core.multiarray", numpy_core_multiarray_transform - ) - - method_names = frozenset(METHODS_TO_BE_INFERRED.keys()) - - manager.register_transform( - nodes.Attribute, - inference_tip(functools.partial(infer_numpy_attribute, METHODS_TO_BE_INFERRED)), - functools.partial(attribute_name_looks_like_numpy_member, method_names), - ) - manager.register_transform( - nodes.Name, - inference_tip(functools.partial(infer_numpy_name, METHODS_TO_BE_INFERRED)), - functools.partial(member_name_looks_like_numpy_member, method_names), - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_core_numeric.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_core_numeric.py deleted file mode 100644 index ee08e02..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_core_numeric.py +++ /dev/null @@ -1,50 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Astroid hooks for numpy.core.numeric module.""" - -import functools - -from astroid import nodes -from astroid.brain.brain_numpy_utils import ( - attribute_name_looks_like_numpy_member, - infer_numpy_attribute, -) -from astroid.brain.helpers import register_module_extender -from astroid.builder import parse -from astroid.inference_tip import inference_tip -from astroid.manager import AstroidManager - - -def numpy_core_numeric_transform() -> nodes.Module: - return parse( - """ - # different functions defined in numeric.py - import numpy - def zeros_like(a, dtype=None, order='K', subok=True, shape=None): return numpy.ndarray((0, 0)) - def ones_like(a, dtype=None, order='K', subok=True, shape=None): return numpy.ndarray((0, 0)) - def full_like(a, fill_value, dtype=None, order='K', subok=True, shape=None): return numpy.ndarray((0, 0)) - """ - ) - - -METHODS_TO_BE_INFERRED = { - "ones": """def ones(shape, dtype=None, order='C'): - return numpy.ndarray([0, 0])""" -} - - -def register(manager: AstroidManager) -> None: - register_module_extender( - manager, "numpy.core.numeric", numpy_core_numeric_transform - ) - - manager.register_transform( - nodes.Attribute, - inference_tip(functools.partial(infer_numpy_attribute, METHODS_TO_BE_INFERRED)), - functools.partial( - attribute_name_looks_like_numpy_member, - frozenset(METHODS_TO_BE_INFERRED.keys()), - ), - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_core_numerictypes.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_core_numerictypes.py deleted file mode 100644 index 7111c83..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_core_numerictypes.py +++ /dev/null @@ -1,265 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -# TODO(hippo91) : correct the methods signature. - -"""Astroid hooks for numpy.core.numerictypes module.""" -from astroid import nodes -from astroid.brain.brain_numpy_utils import numpy_supports_type_hints -from astroid.brain.helpers import register_module_extender -from astroid.builder import parse -from astroid.manager import AstroidManager - - -def numpy_core_numerictypes_transform() -> nodes.Module: - # TODO: Uniformize the generic API with the ndarray one. - # According to numpy doc the generic object should expose - # the same API than ndarray. This has been done here partially - # through the astype method. - generic_src = """ - class generic(object): - def __init__(self, value): - self.T = np.ndarray([0, 0]) - self.base = None - self.data = None - self.dtype = None - self.flags = None - # Should be a numpy.flatiter instance but not available for now - # Putting an array instead so that iteration and indexing are authorized - self.flat = np.ndarray([0, 0]) - self.imag = None - self.itemsize = None - self.nbytes = None - self.ndim = None - self.real = None - self.size = None - self.strides = None - - def all(self): return uninferable - def any(self): return uninferable - def argmax(self): return uninferable - def argmin(self): return uninferable - def argsort(self): return uninferable - def astype(self, dtype, order='K', casting='unsafe', subok=True, copy=True): return np.ndarray([0, 0]) - def base(self): return uninferable - def byteswap(self): return uninferable - def choose(self): return uninferable - def clip(self): return uninferable - def compress(self): return uninferable - def conj(self): return uninferable - def conjugate(self): return uninferable - def copy(self): return uninferable - def cumprod(self): return uninferable - def cumsum(self): return uninferable - def data(self): return uninferable - def diagonal(self): return uninferable - def dtype(self): return uninferable - def dump(self): return uninferable - def dumps(self): return uninferable - def fill(self): return uninferable - def flags(self): return uninferable - def flat(self): return uninferable - def flatten(self): return uninferable - def getfield(self): return uninferable - def imag(self): return uninferable - def item(self): return uninferable - def itemset(self): return uninferable - def itemsize(self): return uninferable - def max(self): return uninferable - def mean(self): return uninferable - def min(self): return uninferable - def nbytes(self): return uninferable - def ndim(self): return uninferable - def newbyteorder(self): return uninferable - def nonzero(self): return uninferable - def prod(self): return uninferable - def ptp(self): return uninferable - def put(self): return uninferable - def ravel(self): return uninferable - def real(self): return uninferable - def repeat(self): return uninferable - def reshape(self): return uninferable - def resize(self): return uninferable - def round(self): return uninferable - def searchsorted(self): return uninferable - def setfield(self): return uninferable - def setflags(self): return uninferable - def shape(self): return uninferable - def size(self): return uninferable - def sort(self): return uninferable - def squeeze(self): return uninferable - def std(self): return uninferable - def strides(self): return uninferable - def sum(self): return uninferable - def swapaxes(self): return uninferable - def take(self): return uninferable - def tobytes(self): return uninferable - def tofile(self): return uninferable - def tolist(self): return uninferable - def tostring(self): return uninferable - def trace(self): return uninferable - def transpose(self): return uninferable - def var(self): return uninferable - def view(self): return uninferable - """ - if numpy_supports_type_hints(): - generic_src += """ - @classmethod - def __class_getitem__(cls, value): - return cls - """ - return parse( - generic_src - + """ - class dtype(object): - def __init__(self, obj, align=False, copy=False): - self.alignment = None - self.base = None - self.byteorder = None - self.char = None - self.descr = None - self.fields = None - self.flags = None - self.hasobject = None - self.isalignedstruct = None - self.isbuiltin = None - self.isnative = None - self.itemsize = None - self.kind = None - self.metadata = None - self.name = None - self.names = None - self.num = None - self.shape = None - self.str = None - self.subdtype = None - self.type = None - - def newbyteorder(self, new_order='S'): return uninferable - def __neg__(self): return uninferable - - class busdaycalendar(object): - def __init__(self, weekmask='1111100', holidays=None): - self.holidays = None - self.weekmask = None - - class flexible(generic): pass - class bool_(generic): pass - class number(generic): - def __neg__(self): return uninferable - class datetime64(generic): - def __init__(self, nb, unit=None): pass - - - class void(flexible): - def __init__(self, *args, **kwargs): - self.base = None - self.dtype = None - self.flags = None - def getfield(self): return uninferable - def setfield(self): return uninferable - - - class character(flexible): pass - - - class integer(number): - def __init__(self, value): - self.denominator = None - self.numerator = None - - - class inexact(number): pass - - - class str_(str, character): - def maketrans(self, x, y=None, z=None): return uninferable - - - class bytes_(bytes, character): - def fromhex(self, string): return uninferable - def maketrans(self, frm, to): return uninferable - - - class signedinteger(integer): pass - - - class unsignedinteger(integer): pass - - - class complexfloating(inexact): pass - - - class floating(inexact): pass - - - class float64(floating, float): - def fromhex(self, string): return uninferable - - - class uint64(unsignedinteger): pass - class complex64(complexfloating): pass - class int16(signedinteger): pass - class float96(floating): pass - class int8(signedinteger): pass - class uint32(unsignedinteger): pass - class uint8(unsignedinteger): pass - class _typedict(dict): pass - class complex192(complexfloating): pass - class timedelta64(signedinteger): - def __init__(self, nb, unit=None): pass - class int32(signedinteger): pass - class uint16(unsignedinteger): pass - class float32(floating): pass - class complex128(complexfloating, complex): pass - class float16(floating): pass - class int64(signedinteger): pass - - buffer_type = memoryview - bool8 = bool_ - byte = int8 - bytes0 = bytes_ - cdouble = complex128 - cfloat = complex128 - clongdouble = complex192 - clongfloat = complex192 - complex_ = complex128 - csingle = complex64 - double = float64 - float_ = float64 - half = float16 - int0 = int32 - int_ = int32 - intc = int32 - intp = int32 - long = int32 - longcomplex = complex192 - longdouble = float96 - longfloat = float96 - longlong = int64 - object0 = object_ - object_ = object_ - short = int16 - single = float32 - singlecomplex = complex64 - str0 = str_ - string_ = bytes_ - ubyte = uint8 - uint = uint32 - uint0 = uint32 - uintc = uint32 - uintp = uint32 - ulonglong = uint64 - unicode = str_ - unicode_ = str_ - ushort = uint16 - void0 = void - """ - ) - - -def register(manager: AstroidManager) -> None: - register_module_extender( - manager, "numpy.core.numerictypes", numpy_core_numerictypes_transform - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_core_umath.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_core_umath.py deleted file mode 100644 index a048a1c..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_core_umath.py +++ /dev/null @@ -1,154 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -# Note: starting with version 1.18 numpy module has `__getattr__` method which prevent -# `pylint` to emit `no-member` message for all numpy's attributes. (see pylint's module -# typecheck in `_emit_no_member` function) - -"""Astroid hooks for numpy.core.umath module.""" -from astroid import nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import parse -from astroid.manager import AstroidManager - - -def numpy_core_umath_transform() -> nodes.Module: - ufunc_optional_keyword_arguments = ( - """out=None, where=True, casting='same_kind', order='K', """ - """dtype=None, subok=True""" - ) - return parse( - """ - class FakeUfunc: - def __init__(self): - self.__doc__ = str() - self.__name__ = str() - self.nin = 0 - self.nout = 0 - self.nargs = 0 - self.ntypes = 0 - self.types = None - self.identity = None - self.signature = None - - @classmethod - def reduce(cls, a, axis=None, dtype=None, out=None): - return numpy.ndarray([0, 0]) - - @classmethod - def accumulate(cls, array, axis=None, dtype=None, out=None): - return numpy.ndarray([0, 0]) - - @classmethod - def reduceat(cls, a, indices, axis=None, dtype=None, out=None): - return numpy.ndarray([0, 0]) - - @classmethod - def outer(cls, A, B, **kwargs): - return numpy.ndarray([0, 0]) - - @classmethod - def at(cls, a, indices, b=None): - return numpy.ndarray([0, 0]) - - class FakeUfuncOneArg(FakeUfunc): - def __call__(self, x, {opt_args:s}): - return numpy.ndarray([0, 0]) - - class FakeUfuncOneArgBis(FakeUfunc): - def __call__(self, x, {opt_args:s}): - return numpy.ndarray([0, 0]), numpy.ndarray([0, 0]) - - class FakeUfuncTwoArgs(FakeUfunc): - def __call__(self, x1, x2, {opt_args:s}): - return numpy.ndarray([0, 0]) - - # Constants - e = 2.718281828459045 - euler_gamma = 0.5772156649015329 - - # One arg functions with optional kwargs - arccos = FakeUfuncOneArg() - arccosh = FakeUfuncOneArg() - arcsin = FakeUfuncOneArg() - arcsinh = FakeUfuncOneArg() - arctan = FakeUfuncOneArg() - arctanh = FakeUfuncOneArg() - cbrt = FakeUfuncOneArg() - conj = FakeUfuncOneArg() - conjugate = FakeUfuncOneArg() - cosh = FakeUfuncOneArg() - deg2rad = FakeUfuncOneArg() - degrees = FakeUfuncOneArg() - exp2 = FakeUfuncOneArg() - expm1 = FakeUfuncOneArg() - fabs = FakeUfuncOneArg() - frexp = FakeUfuncOneArgBis() - isfinite = FakeUfuncOneArg() - isinf = FakeUfuncOneArg() - log = FakeUfuncOneArg() - log1p = FakeUfuncOneArg() - log2 = FakeUfuncOneArg() - logical_not = FakeUfuncOneArg() - modf = FakeUfuncOneArgBis() - negative = FakeUfuncOneArg() - positive = FakeUfuncOneArg() - rad2deg = FakeUfuncOneArg() - radians = FakeUfuncOneArg() - reciprocal = FakeUfuncOneArg() - rint = FakeUfuncOneArg() - sign = FakeUfuncOneArg() - signbit = FakeUfuncOneArg() - sinh = FakeUfuncOneArg() - spacing = FakeUfuncOneArg() - square = FakeUfuncOneArg() - tan = FakeUfuncOneArg() - tanh = FakeUfuncOneArg() - trunc = FakeUfuncOneArg() - - # Two args functions with optional kwargs - add = FakeUfuncTwoArgs() - bitwise_and = FakeUfuncTwoArgs() - bitwise_or = FakeUfuncTwoArgs() - bitwise_xor = FakeUfuncTwoArgs() - copysign = FakeUfuncTwoArgs() - divide = FakeUfuncTwoArgs() - divmod = FakeUfuncTwoArgs() - equal = FakeUfuncTwoArgs() - float_power = FakeUfuncTwoArgs() - floor_divide = FakeUfuncTwoArgs() - fmax = FakeUfuncTwoArgs() - fmin = FakeUfuncTwoArgs() - fmod = FakeUfuncTwoArgs() - greater = FakeUfuncTwoArgs() - gcd = FakeUfuncTwoArgs() - hypot = FakeUfuncTwoArgs() - heaviside = FakeUfuncTwoArgs() - lcm = FakeUfuncTwoArgs() - ldexp = FakeUfuncTwoArgs() - left_shift = FakeUfuncTwoArgs() - less = FakeUfuncTwoArgs() - logaddexp = FakeUfuncTwoArgs() - logaddexp2 = FakeUfuncTwoArgs() - logical_and = FakeUfuncTwoArgs() - logical_or = FakeUfuncTwoArgs() - logical_xor = FakeUfuncTwoArgs() - maximum = FakeUfuncTwoArgs() - minimum = FakeUfuncTwoArgs() - multiply = FakeUfuncTwoArgs() - nextafter = FakeUfuncTwoArgs() - not_equal = FakeUfuncTwoArgs() - power = FakeUfuncTwoArgs() - remainder = FakeUfuncTwoArgs() - right_shift = FakeUfuncTwoArgs() - subtract = FakeUfuncTwoArgs() - true_divide = FakeUfuncTwoArgs() - """.format( - opt_args=ufunc_optional_keyword_arguments - ) - ) - - -def register(manager: AstroidManager) -> None: - register_module_extender(manager, "numpy.core.umath", numpy_core_umath_transform) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_ma.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_ma.py deleted file mode 100644 index e61acb5..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_ma.py +++ /dev/null @@ -1,33 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Astroid hooks for numpy ma module.""" - -from astroid import nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import parse -from astroid.manager import AstroidManager - - -def numpy_ma_transform() -> nodes.Module: - """ - Infer the call of various numpy.ma functions. - - :param node: node to infer - :param context: inference context - """ - return parse( - """ - import numpy.ma - def masked_where(condition, a, copy=True): - return numpy.ma.masked_array(a, mask=[]) - - def masked_invalid(a, copy=True): - return numpy.ma.masked_array(a, mask=[]) - """ - ) - - -def register(manager: AstroidManager) -> None: - register_module_extender(manager, "numpy.ma", numpy_ma_transform) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_ndarray.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_ndarray.py deleted file mode 100644 index c98adb1..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_ndarray.py +++ /dev/null @@ -1,163 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Astroid hooks for numpy ndarray class.""" -from __future__ import annotations - -from astroid import nodes -from astroid.brain.brain_numpy_utils import numpy_supports_type_hints -from astroid.builder import extract_node -from astroid.context import InferenceContext -from astroid.inference_tip import inference_tip -from astroid.manager import AstroidManager - - -def infer_numpy_ndarray(node, context: InferenceContext | None = None): - ndarray = """ - class ndarray(object): - def __init__(self, shape, dtype=float, buffer=None, offset=0, - strides=None, order=None): - self.T = numpy.ndarray([0, 0]) - self.base = None - self.ctypes = None - self.data = None - self.dtype = None - self.flags = None - # Should be a numpy.flatiter instance but not available for now - # Putting an array instead so that iteration and indexing are authorized - self.flat = np.ndarray([0, 0]) - self.imag = np.ndarray([0, 0]) - self.itemsize = None - self.nbytes = None - self.ndim = None - self.real = np.ndarray([0, 0]) - self.shape = numpy.ndarray([0, 0]) - self.size = None - self.strides = None - - def __abs__(self): return numpy.ndarray([0, 0]) - def __add__(self, value): return numpy.ndarray([0, 0]) - def __and__(self, value): return numpy.ndarray([0, 0]) - def __array__(self, dtype=None): return numpy.ndarray([0, 0]) - def __array_wrap__(self, obj): return numpy.ndarray([0, 0]) - def __contains__(self, key): return True - def __copy__(self): return numpy.ndarray([0, 0]) - def __deepcopy__(self, memo): return numpy.ndarray([0, 0]) - def __divmod__(self, value): return (numpy.ndarray([0, 0]), numpy.ndarray([0, 0])) - def __eq__(self, value): return numpy.ndarray([0, 0]) - def __float__(self): return 0. - def __floordiv__(self): return numpy.ndarray([0, 0]) - def __ge__(self, value): return numpy.ndarray([0, 0]) - def __getitem__(self, key): return uninferable - def __gt__(self, value): return numpy.ndarray([0, 0]) - def __iadd__(self, value): return numpy.ndarray([0, 0]) - def __iand__(self, value): return numpy.ndarray([0, 0]) - def __ifloordiv__(self, value): return numpy.ndarray([0, 0]) - def __ilshift__(self, value): return numpy.ndarray([0, 0]) - def __imod__(self, value): return numpy.ndarray([0, 0]) - def __imul__(self, value): return numpy.ndarray([0, 0]) - def __int__(self): return 0 - def __invert__(self): return numpy.ndarray([0, 0]) - def __ior__(self, value): return numpy.ndarray([0, 0]) - def __ipow__(self, value): return numpy.ndarray([0, 0]) - def __irshift__(self, value): return numpy.ndarray([0, 0]) - def __isub__(self, value): return numpy.ndarray([0, 0]) - def __itruediv__(self, value): return numpy.ndarray([0, 0]) - def __ixor__(self, value): return numpy.ndarray([0, 0]) - def __le__(self, value): return numpy.ndarray([0, 0]) - def __len__(self): return 1 - def __lshift__(self, value): return numpy.ndarray([0, 0]) - def __lt__(self, value): return numpy.ndarray([0, 0]) - def __matmul__(self, value): return numpy.ndarray([0, 0]) - def __mod__(self, value): return numpy.ndarray([0, 0]) - def __mul__(self, value): return numpy.ndarray([0, 0]) - def __ne__(self, value): return numpy.ndarray([0, 0]) - def __neg__(self): return numpy.ndarray([0, 0]) - def __or__(self, value): return numpy.ndarray([0, 0]) - def __pos__(self): return numpy.ndarray([0, 0]) - def __pow__(self): return numpy.ndarray([0, 0]) - def __repr__(self): return str() - def __rshift__(self): return numpy.ndarray([0, 0]) - def __setitem__(self, key, value): return uninferable - def __str__(self): return str() - def __sub__(self, value): return numpy.ndarray([0, 0]) - def __truediv__(self, value): return numpy.ndarray([0, 0]) - def __xor__(self, value): return numpy.ndarray([0, 0]) - def all(self, axis=None, out=None, keepdims=False): return np.ndarray([0, 0]) - def any(self, axis=None, out=None, keepdims=False): return np.ndarray([0, 0]) - def argmax(self, axis=None, out=None): return np.ndarray([0, 0]) - def argmin(self, axis=None, out=None): return np.ndarray([0, 0]) - def argpartition(self, kth, axis=-1, kind='introselect', order=None): return np.ndarray([0, 0]) - def argsort(self, axis=-1, kind='quicksort', order=None): return np.ndarray([0, 0]) - def astype(self, dtype, order='K', casting='unsafe', subok=True, copy=True): return np.ndarray([0, 0]) - def byteswap(self, inplace=False): return np.ndarray([0, 0]) - def choose(self, choices, out=None, mode='raise'): return np.ndarray([0, 0]) - def clip(self, min=None, max=None, out=None): return np.ndarray([0, 0]) - def compress(self, condition, axis=None, out=None): return np.ndarray([0, 0]) - def conj(self): return np.ndarray([0, 0]) - def conjugate(self): return np.ndarray([0, 0]) - def copy(self, order='C'): return np.ndarray([0, 0]) - def cumprod(self, axis=None, dtype=None, out=None): return np.ndarray([0, 0]) - def cumsum(self, axis=None, dtype=None, out=None): return np.ndarray([0, 0]) - def diagonal(self, offset=0, axis1=0, axis2=1): return np.ndarray([0, 0]) - def dot(self, b, out=None): return np.ndarray([0, 0]) - def dump(self, file): return None - def dumps(self): return str() - def fill(self, value): return None - def flatten(self, order='C'): return np.ndarray([0, 0]) - def getfield(self, dtype, offset=0): return np.ndarray([0, 0]) - def item(self, *args): return uninferable - def itemset(self, *args): return None - def max(self, axis=None, out=None): return np.ndarray([0, 0]) - def mean(self, axis=None, dtype=None, out=None, keepdims=False): return np.ndarray([0, 0]) - def min(self, axis=None, out=None, keepdims=False): return np.ndarray([0, 0]) - def newbyteorder(self, new_order='S'): return np.ndarray([0, 0]) - def nonzero(self): return (1,) - def partition(self, kth, axis=-1, kind='introselect', order=None): return None - def prod(self, axis=None, dtype=None, out=None, keepdims=False): return np.ndarray([0, 0]) - def ptp(self, axis=None, out=None): return np.ndarray([0, 0]) - def put(self, indices, values, mode='raise'): return None - def ravel(self, order='C'): return np.ndarray([0, 0]) - def repeat(self, repeats, axis=None): return np.ndarray([0, 0]) - def reshape(self, shape, order='C'): return np.ndarray([0, 0]) - def resize(self, new_shape, refcheck=True): return None - def round(self, decimals=0, out=None): return np.ndarray([0, 0]) - def searchsorted(self, v, side='left', sorter=None): return np.ndarray([0, 0]) - def setfield(self, val, dtype, offset=0): return None - def setflags(self, write=None, align=None, uic=None): return None - def sort(self, axis=-1, kind='quicksort', order=None): return None - def squeeze(self, axis=None): return np.ndarray([0, 0]) - def std(self, axis=None, dtype=None, out=None, ddof=0, keepdims=False): return np.ndarray([0, 0]) - def sum(self, axis=None, dtype=None, out=None, keepdims=False): return np.ndarray([0, 0]) - def swapaxes(self, axis1, axis2): return np.ndarray([0, 0]) - def take(self, indices, axis=None, out=None, mode='raise'): return np.ndarray([0, 0]) - def tobytes(self, order='C'): return b'' - def tofile(self, fid, sep="", format="%s"): return None - def tolist(self, ): return [] - def tostring(self, order='C'): return b'' - def trace(self, offset=0, axis1=0, axis2=1, dtype=None, out=None): return np.ndarray([0, 0]) - def transpose(self, *axes): return np.ndarray([0, 0]) - def var(self, axis=None, dtype=None, out=None, ddof=0, keepdims=False): return np.ndarray([0, 0]) - def view(self, dtype=None, type=None): return np.ndarray([0, 0]) - """ - if numpy_supports_type_hints(): - ndarray += """ - @classmethod - def __class_getitem__(cls, value): - return cls - """ - node = extract_node(ndarray) - return node.infer(context=context) - - -def _looks_like_numpy_ndarray(node: nodes.Attribute) -> bool: - return node.attrname == "ndarray" - - -def register(manager: AstroidManager) -> None: - manager.register_transform( - nodes.Attribute, - inference_tip(infer_numpy_ndarray), - _looks_like_numpy_ndarray, - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_random_mtrand.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_random_mtrand.py deleted file mode 100644 index be1c957..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_random_mtrand.py +++ /dev/null @@ -1,73 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -# TODO(hippo91) : correct the functions return types -"""Astroid hooks for numpy.random.mtrand module.""" -from astroid import nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import parse -from astroid.manager import AstroidManager - - -def numpy_random_mtrand_transform() -> nodes.Module: - return parse( - """ - def beta(a, b, size=None): return uninferable - def binomial(n, p, size=None): return uninferable - def bytes(length): return uninferable - def chisquare(df, size=None): return uninferable - def choice(a, size=None, replace=True, p=None): return uninferable - def dirichlet(alpha, size=None): return uninferable - def exponential(scale=1.0, size=None): return uninferable - def f(dfnum, dfden, size=None): return uninferable - def gamma(shape, scale=1.0, size=None): return uninferable - def geometric(p, size=None): return uninferable - def get_state(): return uninferable - def gumbel(loc=0.0, scale=1.0, size=None): return uninferable - def hypergeometric(ngood, nbad, nsample, size=None): return uninferable - def laplace(loc=0.0, scale=1.0, size=None): return uninferable - def logistic(loc=0.0, scale=1.0, size=None): return uninferable - def lognormal(mean=0.0, sigma=1.0, size=None): return uninferable - def logseries(p, size=None): return uninferable - def multinomial(n, pvals, size=None): return uninferable - def multivariate_normal(mean, cov, size=None): return uninferable - def negative_binomial(n, p, size=None): return uninferable - def noncentral_chisquare(df, nonc, size=None): return uninferable - def noncentral_f(dfnum, dfden, nonc, size=None): return uninferable - def normal(loc=0.0, scale=1.0, size=None): return uninferable - def pareto(a, size=None): return uninferable - def permutation(x): return uninferable - def poisson(lam=1.0, size=None): return uninferable - def power(a, size=None): return uninferable - def rand(*args): return uninferable - def randint(low, high=None, size=None, dtype='l'): - import numpy - return numpy.ndarray((1,1)) - def randn(*args): return uninferable - def random(size=None): return uninferable - def random_integers(low, high=None, size=None): return uninferable - def random_sample(size=None): return uninferable - def rayleigh(scale=1.0, size=None): return uninferable - def seed(seed=None): return uninferable - def set_state(state): return uninferable - def shuffle(x): return uninferable - def standard_cauchy(size=None): return uninferable - def standard_exponential(size=None): return uninferable - def standard_gamma(shape, size=None): return uninferable - def standard_normal(size=None): return uninferable - def standard_t(df, size=None): return uninferable - def triangular(left, mode, right, size=None): return uninferable - def uniform(low=0.0, high=1.0, size=None): return uninferable - def vonmises(mu, kappa, size=None): return uninferable - def wald(mean, scale, size=None): return uninferable - def weibull(a, size=None): return uninferable - def zipf(a, size=None): return uninferable - """ - ) - - -def register(manager: AstroidManager) -> None: - register_module_extender( - manager, "numpy.random.mtrand", numpy_random_mtrand_transform - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_utils.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_utils.py deleted file mode 100644 index 1a8f665..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_numpy_utils.py +++ /dev/null @@ -1,94 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Different utilities for the numpy brains.""" - -from __future__ import annotations - -from astroid import nodes -from astroid.builder import extract_node -from astroid.context import InferenceContext - -# Class subscript is available in numpy starting with version 1.20.0 -NUMPY_VERSION_TYPE_HINTS_SUPPORT = ("1", "20", "0") - - -def numpy_supports_type_hints() -> bool: - """Returns True if numpy supports type hints.""" - np_ver = _get_numpy_version() - return np_ver and np_ver > NUMPY_VERSION_TYPE_HINTS_SUPPORT - - -def _get_numpy_version() -> tuple[str, str, str]: - """ - Return the numpy version number if numpy can be imported. - - Otherwise returns ('0', '0', '0') - """ - try: - import numpy # pylint: disable=import-outside-toplevel - - return tuple(numpy.version.version.split(".")) - except (ImportError, AttributeError): - return ("0", "0", "0") - - -def infer_numpy_name( - sources: dict[str, str], node: nodes.Name, context: InferenceContext | None = None -): - extracted_node = extract_node(sources[node.name]) - return extracted_node.infer(context=context) - - -def infer_numpy_attribute( - sources: dict[str, str], - node: nodes.Attribute, - context: InferenceContext | None = None, -): - extracted_node = extract_node(sources[node.attrname]) - return extracted_node.infer(context=context) - - -def _is_a_numpy_module(node: nodes.Name) -> bool: - """ - Returns True if the node is a representation of a numpy module. - - For example in : - import numpy as np - x = np.linspace(1, 2) - The node is a representation of the numpy module. - - :param node: node to test - :return: True if the node is a representation of the numpy module. - """ - module_nickname = node.name - potential_import_target = [ - x for x in node.lookup(module_nickname)[1] if isinstance(x, nodes.Import) - ] - return any( - ("numpy", module_nickname) in target.names or ("numpy", None) in target.names - for target in potential_import_target - ) - - -def member_name_looks_like_numpy_member( - member_names: frozenset[str], node: nodes.Name -) -> bool: - """ - Returns True if the Name node's name matches a member name from numpy - """ - return node.name in member_names and node.root().name.startswith("numpy") - - -def attribute_name_looks_like_numpy_member( - member_names: frozenset[str], node: nodes.Attribute -) -> bool: - """ - Returns True if the Attribute node's name matches a member name from numpy - """ - return ( - node.attrname in member_names - and isinstance(node.expr, nodes.Name) - and _is_a_numpy_module(node.expr) - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_pathlib.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_pathlib.py deleted file mode 100644 index d1d1bda..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_pathlib.py +++ /dev/null @@ -1,55 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from __future__ import annotations - -from collections.abc import Iterator - -from astroid import bases, context, nodes -from astroid.builder import _extract_single_node -from astroid.const import PY313 -from astroid.exceptions import InferenceError, UseInferenceDefault -from astroid.inference_tip import inference_tip -from astroid.manager import AstroidManager - -PATH_TEMPLATE = """ -from pathlib import Path -Path -""" - - -def _looks_like_parents_subscript(node: nodes.Subscript) -> bool: - if not ( - isinstance(node.value, nodes.Attribute) and node.value.attrname == "parents" - ): - return False - - try: - value = next(node.value.infer()) - except (InferenceError, StopIteration): - return False - parents = "builtins.tuple" if PY313 else "pathlib._PathParents" - return ( - isinstance(value, bases.Instance) - and isinstance(value._proxied, nodes.ClassDef) - and value.qname() == parents - ) - - -def infer_parents_subscript( - subscript_node: nodes.Subscript, ctx: context.InferenceContext | None = None -) -> Iterator[bases.Instance]: - if isinstance(subscript_node.slice, nodes.Const): - path_cls = next(_extract_single_node(PATH_TEMPLATE).infer()) - return iter([path_cls.instantiate_class()]) - - raise UseInferenceDefault - - -def register(manager: AstroidManager) -> None: - manager.register_transform( - nodes.Subscript, - inference_tip(infer_parents_subscript), - _looks_like_parents_subscript, - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_pkg_resources.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_pkg_resources.py deleted file mode 100644 index e2bd669..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_pkg_resources.py +++ /dev/null @@ -1,72 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from astroid import nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import parse -from astroid.manager import AstroidManager - - -def pkg_resources_transform() -> nodes.Module: - return parse( - """ -def require(*requirements): - return pkg_resources.working_set.require(*requirements) - -def run_script(requires, script_name): - return pkg_resources.working_set.run_script(requires, script_name) - -def iter_entry_points(group, name=None): - return pkg_resources.working_set.iter_entry_points(group, name) - -def resource_exists(package_or_requirement, resource_name): - return get_provider(package_or_requirement).has_resource(resource_name) - -def resource_isdir(package_or_requirement, resource_name): - return get_provider(package_or_requirement).resource_isdir( - resource_name) - -def resource_filename(package_or_requirement, resource_name): - return get_provider(package_or_requirement).get_resource_filename( - self, resource_name) - -def resource_stream(package_or_requirement, resource_name): - return get_provider(package_or_requirement).get_resource_stream( - self, resource_name) - -def resource_string(package_or_requirement, resource_name): - return get_provider(package_or_requirement).get_resource_string( - self, resource_name) - -def resource_listdir(package_or_requirement, resource_name): - return get_provider(package_or_requirement).resource_listdir( - resource_name) - -def extraction_error(): - pass - -def get_cache_path(archive_name, names=()): - extract_path = self.extraction_path or get_default_cache() - target_path = os.path.join(extract_path, archive_name+'-tmp', *names) - return target_path - -def postprocess(tempname, filename): - pass - -def set_extraction_path(path): - pass - -def cleanup_resources(force=False): - pass - -def get_distribution(dist): - return Distribution(dist) - -_namespace_packages = {} -""" - ) - - -def register(manager: AstroidManager) -> None: - register_module_extender(manager, "pkg_resources", pkg_resources_transform) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_pytest.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_pytest.py deleted file mode 100644 index 6d06267..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_pytest.py +++ /dev/null @@ -1,85 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Astroid hooks for pytest.""" -from astroid import nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import AstroidBuilder -from astroid.manager import AstroidManager - - -def pytest_transform() -> nodes.Module: - return AstroidBuilder(AstroidManager()).string_build( - """ - -try: - import _pytest.mark - import _pytest.recwarn - import _pytest.runner - import _pytest.python - import _pytest.skipping - import _pytest.assertion -except ImportError: - pass -else: - deprecated_call = _pytest.recwarn.deprecated_call - warns = _pytest.recwarn.warns - - exit = _pytest.runner.exit - fail = _pytest.runner.fail - skip = _pytest.runner.skip - importorskip = _pytest.runner.importorskip - - xfail = _pytest.skipping.xfail - mark = _pytest.mark.MarkGenerator() - raises = _pytest.python.raises - - # New in pytest 3.0 - try: - approx = _pytest.python.approx - register_assert_rewrite = _pytest.assertion.register_assert_rewrite - except AttributeError: - pass - - -# Moved in pytest 3.0 - -try: - import _pytest.freeze_support - freeze_includes = _pytest.freeze_support.freeze_includes -except ImportError: - try: - import _pytest.genscript - freeze_includes = _pytest.genscript.freeze_includes - except ImportError: - pass - -try: - import _pytest.debugging - set_trace = _pytest.debugging.pytestPDB().set_trace -except ImportError: - try: - import _pytest.pdb - set_trace = _pytest.pdb.pytestPDB().set_trace - except ImportError: - pass - -try: - import _pytest.fixtures - fixture = _pytest.fixtures.fixture - yield_fixture = _pytest.fixtures.yield_fixture -except ImportError: - try: - import _pytest.python - fixture = _pytest.python.fixture - yield_fixture = _pytest.python.yield_fixture - except ImportError: - pass -""" - ) - - -def register(manager: AstroidManager) -> None: - register_module_extender(manager, "pytest", pytest_transform) - register_module_extender(manager, "py.test", pytest_transform) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_qt.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_qt.py deleted file mode 100644 index 30581e0..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_qt.py +++ /dev/null @@ -1,89 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Astroid hooks for the PyQT library.""" - -from astroid import nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import AstroidBuilder, parse -from astroid.manager import AstroidManager - - -def _looks_like_signal( - node: nodes.FunctionDef, signal_name: str = "pyqtSignal" -) -> bool: - """Detect a Signal node.""" - klasses = node.instance_attrs.get("__class__", []) - # On PySide2 or PySide6 (since Qt 5.15.2) the Signal class changed locations - if node.qname().partition(".")[0] in {"PySide2", "PySide6"}: - return any(cls.qname() == "Signal" for cls in klasses) # pragma: no cover - if klasses: - try: - return klasses[0].name == signal_name - except AttributeError: # pragma: no cover - # return False if the cls does not have a name attribute - pass - return False - - -def transform_pyqt_signal(node: nodes.FunctionDef) -> None: - module = parse( - """ - _UNSET = object() - - class pyqtSignal(object): - def connect(self, slot, type=None, no_receiver_check=False): - pass - def disconnect(self, slot=_UNSET): - pass - def emit(self, *args): - pass - """ - ) - signal_cls: nodes.ClassDef = module["pyqtSignal"] - node.instance_attrs["emit"] = [signal_cls["emit"]] - node.instance_attrs["disconnect"] = [signal_cls["disconnect"]] - node.instance_attrs["connect"] = [signal_cls["connect"]] - - -def transform_pyside_signal(node: nodes.FunctionDef) -> None: - module = parse( - """ - class NotPySideSignal(object): - def connect(self, receiver, type=None): - pass - def disconnect(self, receiver): - pass - def emit(self, *args): - pass - """ - ) - signal_cls: nodes.ClassDef = module["NotPySideSignal"] - node.instance_attrs["connect"] = [signal_cls["connect"]] - node.instance_attrs["disconnect"] = [signal_cls["disconnect"]] - node.instance_attrs["emit"] = [signal_cls["emit"]] - - -def pyqt4_qtcore_transform(): - return AstroidBuilder(AstroidManager()).string_build( - """ - -def SIGNAL(signal_name): pass - -class QObject(object): - def emit(self, signal): pass -""" - ) - - -def register(manager: AstroidManager) -> None: - register_module_extender(manager, "PyQt4.QtCore", pyqt4_qtcore_transform) - manager.register_transform( - nodes.FunctionDef, transform_pyqt_signal, _looks_like_signal - ) - manager.register_transform( - nodes.ClassDef, - transform_pyside_signal, - lambda node: node.qname() in {"PySide.QtCore.Signal", "PySide2.QtCore.Signal"}, - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_random.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_random.py deleted file mode 100644 index 84b4f4e..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_random.py +++ /dev/null @@ -1,94 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from __future__ import annotations - -import random - -from astroid import nodes -from astroid.context import InferenceContext -from astroid.exceptions import UseInferenceDefault -from astroid.inference_tip import inference_tip -from astroid.manager import AstroidManager -from astroid.util import safe_infer - -ACCEPTED_ITERABLES_FOR_SAMPLE = (nodes.List, nodes.Set, nodes.Tuple) - - -def _clone_node_with_lineno(node, parent, lineno): - if isinstance(node, nodes.EvaluatedObject): - node = node.original - cls = node.__class__ - other_fields = node._other_fields - _astroid_fields = node._astroid_fields - init_params = { - "lineno": lineno, - "col_offset": node.col_offset, - "parent": parent, - "end_lineno": node.end_lineno, - "end_col_offset": node.end_col_offset, - } - postinit_params = {param: getattr(node, param) for param in _astroid_fields} - if other_fields: - init_params.update({param: getattr(node, param) for param in other_fields}) - new_node = cls(**init_params) - if hasattr(node, "postinit") and _astroid_fields: - new_node.postinit(**postinit_params) - return new_node - - -def infer_random_sample(node, context: InferenceContext | None = None): - if len(node.args) != 2: - raise UseInferenceDefault - - inferred_length = safe_infer(node.args[1], context=context) - if not isinstance(inferred_length, nodes.Const): - raise UseInferenceDefault - if not isinstance(inferred_length.value, int): - raise UseInferenceDefault - - inferred_sequence = safe_infer(node.args[0], context=context) - if not inferred_sequence: - raise UseInferenceDefault - - if not isinstance(inferred_sequence, ACCEPTED_ITERABLES_FOR_SAMPLE): - raise UseInferenceDefault - - if inferred_length.value > len(inferred_sequence.elts): - # In this case, this will raise a ValueError - raise UseInferenceDefault - - try: - elts = random.sample(inferred_sequence.elts, inferred_length.value) - except ValueError as exc: - raise UseInferenceDefault from exc - - new_node = nodes.List( - lineno=node.lineno, - col_offset=node.col_offset, - parent=node.scope(), - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - ) - new_elts = [ - _clone_node_with_lineno(elt, parent=new_node, lineno=new_node.lineno) - for elt in elts - ] - new_node.postinit(new_elts) - return iter((new_node,)) - - -def _looks_like_random_sample(node) -> bool: - func = node.func - if isinstance(func, nodes.Attribute): - return func.attrname == "sample" - if isinstance(func, nodes.Name): - return func.name == "sample" - return False - - -def register(manager: AstroidManager) -> None: - manager.register_transform( - nodes.Call, inference_tip(infer_random_sample), _looks_like_random_sample - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_re.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_re.py deleted file mode 100644 index 6464645..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_re.py +++ /dev/null @@ -1,97 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from __future__ import annotations - -from astroid import context, nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import _extract_single_node, parse -from astroid.const import PY311_PLUS -from astroid.inference_tip import inference_tip -from astroid.manager import AstroidManager - - -def _re_transform() -> nodes.Module: - # The RegexFlag enum exposes all its entries by updating globals() - # In 3.6-3.10 all flags come from sre_compile - # On 3.11+ all flags come from re._compiler - if PY311_PLUS: - import_compiler = "import re._compiler as _compiler" - else: - import_compiler = "import sre_compile as _compiler" - return parse( - f""" - {import_compiler} - NOFLAG = 0 - ASCII = _compiler.SRE_FLAG_ASCII - IGNORECASE = _compiler.SRE_FLAG_IGNORECASE - LOCALE = _compiler.SRE_FLAG_LOCALE - UNICODE = _compiler.SRE_FLAG_UNICODE - MULTILINE = _compiler.SRE_FLAG_MULTILINE - DOTALL = _compiler.SRE_FLAG_DOTALL - VERBOSE = _compiler.SRE_FLAG_VERBOSE - TEMPLATE = _compiler.SRE_FLAG_TEMPLATE - DEBUG = _compiler.SRE_FLAG_DEBUG - A = ASCII - I = IGNORECASE - L = LOCALE - U = UNICODE - M = MULTILINE - S = DOTALL - X = VERBOSE - T = TEMPLATE - """ - ) - - -CLASS_GETITEM_TEMPLATE = """ -@classmethod -def __class_getitem__(cls, item): - return cls -""" - - -def _looks_like_pattern_or_match(node: nodes.Call) -> bool: - """Check for re.Pattern or re.Match call in stdlib. - - Match these patterns from stdlib/re.py - ```py - Pattern = type(...) - Match = type(...) - ``` - """ - return ( - node.root().name == "re" - and isinstance(node.func, nodes.Name) - and node.func.name == "type" - and isinstance(node.parent, nodes.Assign) - and len(node.parent.targets) == 1 - and isinstance(node.parent.targets[0], nodes.AssignName) - and node.parent.targets[0].name in {"Pattern", "Match"} - ) - - -def infer_pattern_match(node: nodes.Call, ctx: context.InferenceContext | None = None): - """Infer re.Pattern and re.Match as classes. - - For PY39+ add `__class_getitem__`. - """ - class_def = nodes.ClassDef( - name=node.parent.targets[0].name, - lineno=node.lineno, - col_offset=node.col_offset, - parent=node.parent, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - ) - func_to_add = _extract_single_node(CLASS_GETITEM_TEMPLATE) - class_def.locals["__class_getitem__"] = [func_to_add] - return iter([class_def]) - - -def register(manager: AstroidManager) -> None: - register_module_extender(manager, "re", _re_transform) - manager.register_transform( - nodes.Call, inference_tip(infer_pattern_match), _looks_like_pattern_or_match - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_regex.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_regex.py deleted file mode 100644 index 70fb946..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_regex.py +++ /dev/null @@ -1,95 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from __future__ import annotations - -from astroid import context, nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import _extract_single_node, parse -from astroid.inference_tip import inference_tip -from astroid.manager import AstroidManager - - -def _regex_transform() -> nodes.Module: - """The RegexFlag enum exposes all its entries by updating globals(). - - We hard-code the flags for now. - # pylint: disable-next=line-too-long - See https://github.com/mrabarnett/mrab-regex/blob/2022.10.31/regex_3/regex.py#L200 - """ - return parse( - """ - A = ASCII = 0x80 # Assume ASCII locale. - B = BESTMATCH = 0x1000 # Best fuzzy match. - D = DEBUG = 0x200 # Print parsed pattern. - E = ENHANCEMATCH = 0x8000 # Attempt to improve the fit after finding the first - # fuzzy match. - F = FULLCASE = 0x4000 # Unicode full case-folding. - I = IGNORECASE = 0x2 # Ignore case. - L = LOCALE = 0x4 # Assume current 8-bit locale. - M = MULTILINE = 0x8 # Make anchors look for newline. - P = POSIX = 0x10000 # POSIX-style matching (leftmost longest). - R = REVERSE = 0x400 # Search backwards. - S = DOTALL = 0x10 # Make dot match newline. - U = UNICODE = 0x20 # Assume Unicode locale. - V0 = VERSION0 = 0x2000 # Old legacy behaviour. - DEFAULT_VERSION = V0 - V1 = VERSION1 = 0x100 # New enhanced behaviour. - W = WORD = 0x800 # Default Unicode word breaks. - X = VERBOSE = 0x40 # Ignore whitespace and comments. - T = TEMPLATE = 0x1 # Template (present because re module has it). - """ - ) - - -CLASS_GETITEM_TEMPLATE = """ -@classmethod -def __class_getitem__(cls, item): - return cls -""" - - -def _looks_like_pattern_or_match(node: nodes.Call) -> bool: - """Check for regex.Pattern or regex.Match call in stdlib. - - Match these patterns from stdlib/re.py - ```py - Pattern = type(...) - Match = type(...) - ``` - """ - return ( - node.root().name == "regex.regex" - and isinstance(node.func, nodes.Name) - and node.func.name == "type" - and isinstance(node.parent, nodes.Assign) - and len(node.parent.targets) == 1 - and isinstance(node.parent.targets[0], nodes.AssignName) - and node.parent.targets[0].name in {"Pattern", "Match"} - ) - - -def infer_pattern_match(node: nodes.Call, ctx: context.InferenceContext | None = None): - """Infer regex.Pattern and regex.Match as classes. - - For PY39+ add `__class_getitem__`. - """ - class_def = nodes.ClassDef( - name=node.parent.targets[0].name, - lineno=node.lineno, - col_offset=node.col_offset, - parent=node.parent, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - ) - func_to_add = _extract_single_node(CLASS_GETITEM_TEMPLATE) - class_def.locals["__class_getitem__"] = [func_to_add] - return iter([class_def]) - - -def register(manager: AstroidManager) -> None: - register_module_extender(manager, "regex", _regex_transform) - manager.register_transform( - nodes.Call, inference_tip(infer_pattern_match), _looks_like_pattern_or_match - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_responses.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_responses.py deleted file mode 100644 index f2e6069..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_responses.py +++ /dev/null @@ -1,80 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -""" -Astroid hooks for responses. - -It might need to be manually updated from the public methods of -:class:`responses.RequestsMock`. - -See: https://github.com/getsentry/responses/blob/master/responses.py -""" -from astroid import nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import parse -from astroid.manager import AstroidManager - - -def responses_funcs() -> nodes.Module: - return parse( - """ - DELETE = "DELETE" - GET = "GET" - HEAD = "HEAD" - OPTIONS = "OPTIONS" - PATCH = "PATCH" - POST = "POST" - PUT = "PUT" - response_callback = None - - def reset(): - return - - def add( - method=None, # method or ``Response`` - url=None, - body="", - adding_headers=None, - *args, - **kwargs - ): - return - - def add_passthru(prefix): - return - - def remove(method_or_response=None, url=None): - return - - def replace(method_or_response=None, url=None, body="", *args, **kwargs): - return - - def add_callback( - method, url, callback, match_querystring=False, content_type="text/plain" - ): - return - - calls = [] - - def __enter__(): - return - - def __exit__(type, value, traceback): - success = type is None - return success - - def activate(func): - return func - - def start(): - return - - def stop(allow_assert=True): - return - """ - ) - - -def register(manager: AstroidManager) -> None: - register_module_extender(manager, "responses", responses_funcs) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_scipy_signal.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_scipy_signal.py deleted file mode 100644 index a7a2576..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_scipy_signal.py +++ /dev/null @@ -1,90 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Astroid hooks for scipy.signal module.""" -from astroid import nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import parse -from astroid.manager import AstroidManager - - -def scipy_signal() -> nodes.Module: - return parse( - """ - # different functions defined in scipy.signals - - def barthann(M, sym=True): - return numpy.ndarray([0]) - - def bartlett(M, sym=True): - return numpy.ndarray([0]) - - def blackman(M, sym=True): - return numpy.ndarray([0]) - - def blackmanharris(M, sym=True): - return numpy.ndarray([0]) - - def bohman(M, sym=True): - return numpy.ndarray([0]) - - def boxcar(M, sym=True): - return numpy.ndarray([0]) - - def chebwin(M, at, sym=True): - return numpy.ndarray([0]) - - def cosine(M, sym=True): - return numpy.ndarray([0]) - - def exponential(M, center=None, tau=1.0, sym=True): - return numpy.ndarray([0]) - - def flattop(M, sym=True): - return numpy.ndarray([0]) - - def gaussian(M, std, sym=True): - return numpy.ndarray([0]) - - def general_gaussian(M, p, sig, sym=True): - return numpy.ndarray([0]) - - def hamming(M, sym=True): - return numpy.ndarray([0]) - - def hann(M, sym=True): - return numpy.ndarray([0]) - - def hanning(M, sym=True): - return numpy.ndarray([0]) - - def impulse2(system, X0=None, T=None, N=None, **kwargs): - return numpy.ndarray([0]), numpy.ndarray([0]) - - def kaiser(M, beta, sym=True): - return numpy.ndarray([0]) - - def nuttall(M, sym=True): - return numpy.ndarray([0]) - - def parzen(M, sym=True): - return numpy.ndarray([0]) - - def slepian(M, width, sym=True): - return numpy.ndarray([0]) - - def step2(system, X0=None, T=None, N=None, **kwargs): - return numpy.ndarray([0]), numpy.ndarray([0]) - - def triang(M, sym=True): - return numpy.ndarray([0]) - - def tukey(M, alpha=0.5, sym=True): - return numpy.ndarray([0]) - """ - ) - - -def register(manager: AstroidManager) -> None: - register_module_extender(manager, "scipy.signal", scipy_signal) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_signal.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_signal.py deleted file mode 100644 index 649e974..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_signal.py +++ /dev/null @@ -1,120 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Astroid hooks for the signal library. - -The signal module generates the 'Signals', 'Handlers' and 'Sigmasks' IntEnums -dynamically using the IntEnum._convert() classmethod, which modifies the module -globals. Astroid is unable to handle this type of code. - -Without these hooks, the following are erroneously triggered by Pylint: - * E1101: Module 'signal' has no 'Signals' member (no-member) - * E1101: Module 'signal' has no 'Handlers' member (no-member) - * E1101: Module 'signal' has no 'Sigmasks' member (no-member) - -These enums are defined slightly differently depending on the user's operating -system and platform. These platform differences should follow the current -Python typeshed stdlib `signal.pyi` stub file, available at: - -* https://github.com/python/typeshed/blob/master/stdlib/signal.pyi - -Note that the enum.auto() values defined here for the Signals, Handlers and -Sigmasks IntEnums are just dummy integer values, and do not correspond to the -actual standard signal numbers - which may vary depending on the system. -""" - - -import sys - -from astroid.brain.helpers import register_module_extender -from astroid.builder import parse -from astroid.manager import AstroidManager - - -def _signals_enums_transform(): - """Generates the AST for 'Signals', 'Handlers' and 'Sigmasks' IntEnums.""" - return parse(_signals_enum() + _handlers_enum() + _sigmasks_enum()) - - -def _signals_enum() -> str: - """Generates the source code for the Signals int enum.""" - signals_enum = """ - import enum - class Signals(enum.IntEnum): - SIGABRT = enum.auto() - SIGEMT = enum.auto() - SIGFPE = enum.auto() - SIGILL = enum.auto() - SIGINFO = enum.auto() - SIGINT = enum.auto() - SIGSEGV = enum.auto() - SIGTERM = enum.auto() - """ - if sys.platform != "win32": - signals_enum += """ - SIGALRM = enum.auto() - SIGBUS = enum.auto() - SIGCHLD = enum.auto() - SIGCONT = enum.auto() - SIGHUP = enum.auto() - SIGIO = enum.auto() - SIGIOT = enum.auto() - SIGKILL = enum.auto() - SIGPIPE = enum.auto() - SIGPROF = enum.auto() - SIGQUIT = enum.auto() - SIGSTOP = enum.auto() - SIGSYS = enum.auto() - SIGTRAP = enum.auto() - SIGTSTP = enum.auto() - SIGTTIN = enum.auto() - SIGTTOU = enum.auto() - SIGURG = enum.auto() - SIGUSR1 = enum.auto() - SIGUSR2 = enum.auto() - SIGVTALRM = enum.auto() - SIGWINCH = enum.auto() - SIGXCPU = enum.auto() - SIGXFSZ = enum.auto() - """ - if sys.platform == "win32": - signals_enum += """ - SIGBREAK = enum.auto() - """ - if sys.platform not in ("darwin", "win32"): - signals_enum += """ - SIGCLD = enum.auto() - SIGPOLL = enum.auto() - SIGPWR = enum.auto() - SIGRTMAX = enum.auto() - SIGRTMIN = enum.auto() - """ - return signals_enum - - -def _handlers_enum() -> str: - """Generates the source code for the Handlers int enum.""" - return """ - import enum - class Handlers(enum.IntEnum): - SIG_DFL = enum.auto() - SIG_IGN = eunm.auto() - """ - - -def _sigmasks_enum() -> str: - """Generates the source code for the Sigmasks int enum.""" - if sys.platform != "win32": - return """ - import enum - class Sigmasks(enum.IntEnum): - SIG_BLOCK = enum.auto() - SIG_UNBLOCK = enum.auto() - SIG_SETMASK = enum.auto() - """ - return "" - - -def register(manager: AstroidManager) -> None: - register_module_extender(manager, "signal", _signals_enums_transform) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_six.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_six.py deleted file mode 100644 index 1218009..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_six.py +++ /dev/null @@ -1,244 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Astroid hooks for six module.""" - -from textwrap import dedent - -from astroid import nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import AstroidBuilder -from astroid.exceptions import ( - AstroidBuildingError, - AttributeInferenceError, - InferenceError, -) -from astroid.manager import AstroidManager - -SIX_ADD_METACLASS = "six.add_metaclass" -SIX_WITH_METACLASS = "six.with_metaclass" - - -def default_predicate(line): - return line.strip() - - -def _indent(text, prefix, predicate=default_predicate) -> str: - """Adds 'prefix' to the beginning of selected lines in 'text'. - - If 'predicate' is provided, 'prefix' will only be added to the lines - where 'predicate(line)' is True. If 'predicate' is not provided, - it will default to adding 'prefix' to all non-empty lines that do not - consist solely of whitespace characters. - """ - - def prefixed_lines(): - for line in text.splitlines(True): - yield prefix + line if predicate(line) else line - - return "".join(prefixed_lines()) - - -_IMPORTS = """ -import _io -cStringIO = _io.StringIO -filter = filter -from itertools import filterfalse -input = input -from sys import intern -map = map -range = range -from importlib import reload -reload_module = lambda module: reload(module) -from functools import reduce -from shlex import quote as shlex_quote -from io import StringIO -from collections import UserDict, UserList, UserString -xrange = range -zip = zip -from itertools import zip_longest -import builtins -import configparser -import copyreg -import _dummy_thread -import http.cookiejar as http_cookiejar -import http.cookies as http_cookies -import html.entities as html_entities -import html.parser as html_parser -import http.client as http_client -import http.server as http_server -BaseHTTPServer = CGIHTTPServer = SimpleHTTPServer = http.server -import pickle as cPickle -import queue -import reprlib -import socketserver -import _thread -import winreg -import xmlrpc.server as xmlrpc_server -import xmlrpc.client as xmlrpc_client -import urllib.robotparser as urllib_robotparser -import email.mime.multipart as email_mime_multipart -import email.mime.nonmultipart as email_mime_nonmultipart -import email.mime.text as email_mime_text -import email.mime.base as email_mime_base -import urllib.parse as urllib_parse -import urllib.error as urllib_error -import tkinter -import tkinter.dialog as tkinter_dialog -import tkinter.filedialog as tkinter_filedialog -import tkinter.scrolledtext as tkinter_scrolledtext -import tkinter.simpledialog as tkinder_simpledialog -import tkinter.tix as tkinter_tix -import tkinter.ttk as tkinter_ttk -import tkinter.constants as tkinter_constants -import tkinter.dnd as tkinter_dnd -import tkinter.colorchooser as tkinter_colorchooser -import tkinter.commondialog as tkinter_commondialog -import tkinter.filedialog as tkinter_tkfiledialog -import tkinter.font as tkinter_font -import tkinter.messagebox as tkinter_messagebox -import urllib -import urllib.request as urllib_request -import urllib.robotparser as urllib_robotparser -import urllib.parse as urllib_parse -import urllib.error as urllib_error -""" - - -def six_moves_transform(): - code = dedent( - """ - class Moves(object): - {} - moves = Moves() - """ - ).format(_indent(_IMPORTS, " ")) - module = AstroidBuilder(AstroidManager()).string_build(code) - module.name = "six.moves" - return module - - -def _six_fail_hook(modname): - """Fix six.moves imports due to the dynamic nature of this - class. - - Construct a pseudo-module which contains all the necessary imports - for six - - :param modname: Name of failed module - :type modname: str - - :return: An astroid module - :rtype: nodes.Module - """ - - attribute_of = modname != "six.moves" and modname.startswith("six.moves") - if modname != "six.moves" and not attribute_of: - raise AstroidBuildingError(modname=modname) - module = AstroidBuilder(AstroidManager()).string_build(_IMPORTS) - module.name = "six.moves" - if attribute_of: - # Facilitate import of submodules in Moves - start_index = len(module.name) - attribute = modname[start_index:].lstrip(".").replace(".", "_") - try: - import_attr = module.getattr(attribute)[0] - except AttributeInferenceError as exc: - raise AstroidBuildingError(modname=modname) from exc - if isinstance(import_attr, nodes.Import): - submodule = AstroidManager().ast_from_module_name(import_attr.names[0][0]) - return submodule - # Let dummy submodule imports pass through - # This will cause an Uninferable result, which is okay - return module - - -def _looks_like_decorated_with_six_add_metaclass(node) -> bool: - if not node.decorators: - return False - - for decorator in node.decorators.nodes: - if not isinstance(decorator, nodes.Call): - continue - if decorator.func.as_string() == SIX_ADD_METACLASS: - return True - return False - - -def transform_six_add_metaclass(node): # pylint: disable=inconsistent-return-statements - """Check if the given class node is decorated with *six.add_metaclass*. - - If so, inject its argument as the metaclass of the underlying class. - """ - if not node.decorators: - return - - for decorator in node.decorators.nodes: - if not isinstance(decorator, nodes.Call): - continue - - try: - func = next(decorator.func.infer()) - except (InferenceError, StopIteration): - continue - if ( - isinstance(func, (nodes.FunctionDef, nodes.ClassDef)) - and func.qname() == SIX_ADD_METACLASS - and decorator.args - ): - metaclass = decorator.args[0] - node._metaclass = metaclass - return node - return - - -def _looks_like_nested_from_six_with_metaclass(node) -> bool: - if len(node.bases) != 1: - return False - base = node.bases[0] - if not isinstance(base, nodes.Call): - return False - try: - if hasattr(base.func, "expr"): - # format when explicit 'six.with_metaclass' is used - mod = base.func.expr.name - func = base.func.attrname - func = f"{mod}.{func}" - else: - # format when 'with_metaclass' is used directly (local import from six) - # check reference module to avoid 'with_metaclass' name clashes - mod = base.parent.parent - import_from = mod.locals["with_metaclass"][0] - func = f"{import_from.modname}.{base.func.name}" - except (AttributeError, KeyError, IndexError): - return False - return func == SIX_WITH_METACLASS - - -def transform_six_with_metaclass(node): - """Check if the given class node is defined with *six.with_metaclass*. - - If so, inject its argument as the metaclass of the underlying class. - """ - call = node.bases[0] - node._metaclass = call.args[0] - return node - - -def register(manager: AstroidManager) -> None: - register_module_extender(manager, "six", six_moves_transform) - register_module_extender( - manager, "requests.packages.urllib3.packages.six", six_moves_transform - ) - manager.register_failed_import_hook(_six_fail_hook) - manager.register_transform( - nodes.ClassDef, - transform_six_add_metaclass, - _looks_like_decorated_with_six_add_metaclass, - ) - manager.register_transform( - nodes.ClassDef, - transform_six_with_metaclass, - _looks_like_nested_from_six_with_metaclass, - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_sqlalchemy.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_sqlalchemy.py deleted file mode 100644 index 8410d9e..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_sqlalchemy.py +++ /dev/null @@ -1,41 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from astroid import nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import parse -from astroid.manager import AstroidManager - - -def _session_transform() -> nodes.Module: - return parse( - """ - from sqlalchemy.orm.session import Session - - class sessionmaker: - def __init__( - self, - bind=None, - class_=Session, - autoflush=True, - autocommit=False, - expire_on_commit=True, - info=None, - **kw - ): - return - - def __call__(self, **local_kw): - return Session() - - def configure(self, **new_kw): - return - - return Session() - """ - ) - - -def register(manager: AstroidManager) -> None: - register_module_extender(manager, "sqlalchemy.orm.session", _session_transform) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_ssl.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_ssl.py deleted file mode 100644 index 6b4fc5c..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_ssl.py +++ /dev/null @@ -1,163 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Astroid hooks for the ssl library.""" - -from astroid import nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import parse -from astroid.const import PY312_PLUS -from astroid.manager import AstroidManager - - -def _verifyflags_enum() -> str: - enum = """ - class VerifyFlags(_IntFlag): - VERIFY_DEFAULT = 0 - VERIFY_CRL_CHECK_LEAF = 1 - VERIFY_CRL_CHECK_CHAIN = 2 - VERIFY_X509_STRICT = 3 - VERIFY_X509_TRUSTED_FIRST = 4 - VERIFY_ALLOW_PROXY_CERTS = 5 - VERIFY_X509_PARTIAL_CHAIN = 6 - """ - return enum - - -def _options_enum() -> str: - enum = """ - class Options(_IntFlag): - OP_ALL = 1 - OP_NO_SSLv2 = 2 - OP_NO_SSLv3 = 3 - OP_NO_TLSv1 = 4 - OP_NO_TLSv1_1 = 5 - OP_NO_TLSv1_2 = 6 - OP_NO_TLSv1_3 = 7 - OP_CIPHER_SERVER_PREFERENCE = 8 - OP_SINGLE_DH_USE = 9 - OP_SINGLE_ECDH_USE = 10 - OP_NO_COMPRESSION = 11 - OP_NO_TICKET = 12 - OP_NO_RENEGOTIATION = 13 - OP_ENABLE_MIDDLEBOX_COMPAT = 14 - """ - if PY312_PLUS: - enum += "OP_LEGACY_SERVER_CONNECT = 15" - return enum - - -def ssl_transform() -> nodes.Module: - return parse( - f""" - # Import necessary for conversion of objects defined in C into enums - from enum import IntEnum as _IntEnum, IntFlag as _IntFlag - - from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION - from _ssl import _SSLContext, MemoryBIO - from _ssl import ( - SSLError, SSLZeroReturnError, SSLWantReadError, SSLWantWriteError, - SSLSyscallError, SSLEOFError, - ) - from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED - from _ssl import txt2obj as _txt2obj, nid2obj as _nid2obj - from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes - try: - from _ssl import RAND_egd - except ImportError: - # LibreSSL does not provide RAND_egd - pass - from _ssl import (OP_ALL, OP_CIPHER_SERVER_PREFERENCE, - OP_NO_COMPRESSION, OP_NO_SSLv2, OP_NO_SSLv3, - OP_NO_TLSv1, OP_NO_TLSv1_1, OP_NO_TLSv1_2, - OP_SINGLE_DH_USE, OP_SINGLE_ECDH_USE) - - {"from _ssl import OP_LEGACY_SERVER_CONNECT" if PY312_PLUS else ""} - - from _ssl import (ALERT_DESCRIPTION_ACCESS_DENIED, ALERT_DESCRIPTION_BAD_CERTIFICATE, - ALERT_DESCRIPTION_BAD_CERTIFICATE_HASH_VALUE, - ALERT_DESCRIPTION_BAD_CERTIFICATE_STATUS_RESPONSE, - ALERT_DESCRIPTION_BAD_RECORD_MAC, - ALERT_DESCRIPTION_CERTIFICATE_EXPIRED, - ALERT_DESCRIPTION_CERTIFICATE_REVOKED, - ALERT_DESCRIPTION_CERTIFICATE_UNKNOWN, - ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE, - ALERT_DESCRIPTION_CLOSE_NOTIFY, ALERT_DESCRIPTION_DECODE_ERROR, - ALERT_DESCRIPTION_DECOMPRESSION_FAILURE, - ALERT_DESCRIPTION_DECRYPT_ERROR, - ALERT_DESCRIPTION_HANDSHAKE_FAILURE, - ALERT_DESCRIPTION_ILLEGAL_PARAMETER, - ALERT_DESCRIPTION_INSUFFICIENT_SECURITY, - ALERT_DESCRIPTION_INTERNAL_ERROR, - ALERT_DESCRIPTION_NO_RENEGOTIATION, - ALERT_DESCRIPTION_PROTOCOL_VERSION, - ALERT_DESCRIPTION_RECORD_OVERFLOW, - ALERT_DESCRIPTION_UNEXPECTED_MESSAGE, - ALERT_DESCRIPTION_UNKNOWN_CA, - ALERT_DESCRIPTION_UNKNOWN_PSK_IDENTITY, - ALERT_DESCRIPTION_UNRECOGNIZED_NAME, - ALERT_DESCRIPTION_UNSUPPORTED_CERTIFICATE, - ALERT_DESCRIPTION_UNSUPPORTED_EXTENSION, - ALERT_DESCRIPTION_USER_CANCELLED) - from _ssl import (SSL_ERROR_EOF, SSL_ERROR_INVALID_ERROR_CODE, SSL_ERROR_SSL, - SSL_ERROR_SYSCALL, SSL_ERROR_WANT_CONNECT, SSL_ERROR_WANT_READ, - SSL_ERROR_WANT_WRITE, SSL_ERROR_WANT_X509_LOOKUP, SSL_ERROR_ZERO_RETURN) - from _ssl import VERIFY_CRL_CHECK_CHAIN, VERIFY_CRL_CHECK_LEAF, VERIFY_DEFAULT, VERIFY_X509_STRICT - from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN, HAS_ALPN - from _ssl import _OPENSSL_API_VERSION - from _ssl import PROTOCOL_SSLv23, PROTOCOL_TLSv1, PROTOCOL_TLSv1_1, PROTOCOL_TLSv1_2 - from _ssl import PROTOCOL_TLS, PROTOCOL_TLS_CLIENT, PROTOCOL_TLS_SERVER - - class AlertDescription(_IntEnum): - ALERT_DESCRIPTION_ACCESS_DENIED = 0 - ALERT_DESCRIPTION_BAD_CERTIFICATE = 1 - ALERT_DESCRIPTION_BAD_CERTIFICATE_HASH_VALUE = 2 - ALERT_DESCRIPTION_BAD_CERTIFICATE_STATUS_RESPONSE = 3 - ALERT_DESCRIPTION_BAD_RECORD_MAC = 4 - ALERT_DESCRIPTION_CERTIFICATE_EXPIRED = 5 - ALERT_DESCRIPTION_CERTIFICATE_REVOKED = 6 - ALERT_DESCRIPTION_CERTIFICATE_UNKNOWN = 7 - ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE = 8 - ALERT_DESCRIPTION_CLOSE_NOTIFY = 9 - ALERT_DESCRIPTION_DECODE_ERROR = 10 - ALERT_DESCRIPTION_DECOMPRESSION_FAILURE = 11 - ALERT_DESCRIPTION_DECRYPT_ERROR = 12 - ALERT_DESCRIPTION_HANDSHAKE_FAILURE = 13 - ALERT_DESCRIPTION_ILLEGAL_PARAMETER = 14 - ALERT_DESCRIPTION_INSUFFICIENT_SECURITY = 15 - ALERT_DESCRIPTION_INTERNAL_ERROR = 16 - ALERT_DESCRIPTION_NO_RENEGOTIATION = 17 - ALERT_DESCRIPTION_PROTOCOL_VERSION = 18 - ALERT_DESCRIPTION_RECORD_OVERFLOW = 19 - ALERT_DESCRIPTION_UNEXPECTED_MESSAGE = 20 - ALERT_DESCRIPTION_UNKNOWN_CA = 21 - ALERT_DESCRIPTION_UNKNOWN_PSK_IDENTITY = 22 - ALERT_DESCRIPTION_UNRECOGNIZED_NAME = 23 - ALERT_DESCRIPTION_UNSUPPORTED_CERTIFICATE = 24 - ALERT_DESCRIPTION_UNSUPPORTED_EXTENSION = 25 - ALERT_DESCRIPTION_USER_CANCELLED = 26 - - class SSLErrorNumber(_IntEnum): - SSL_ERROR_EOF = 0 - SSL_ERROR_INVALID_ERROR_CODE = 1 - SSL_ERROR_SSL = 2 - SSL_ERROR_SYSCALL = 3 - SSL_ERROR_WANT_CONNECT = 4 - SSL_ERROR_WANT_READ = 5 - SSL_ERROR_WANT_WRITE = 6 - SSL_ERROR_WANT_X509_LOOKUP = 7 - SSL_ERROR_ZERO_RETURN = 8 - - class VerifyMode(_IntEnum): - CERT_NONE = 0 - CERT_OPTIONAL = 1 - CERT_REQUIRED = 2 - """ - + _verifyflags_enum() - + _options_enum() - ) - - -def register(manager: AstroidManager) -> None: - register_module_extender(manager, "ssl", ssl_transform) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_statistics.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_statistics.py deleted file mode 100644 index 5420ef9..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_statistics.py +++ /dev/null @@ -1,73 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Astroid hooks for understanding statistics library module. - -Provides inference improvements for statistics module functions that have -complex runtime behavior difficult to analyze statically. -""" - -from __future__ import annotations - -from collections.abc import Iterator -from typing import TYPE_CHECKING - -from astroid import nodes -from astroid.context import InferenceContext -from astroid.inference_tip import inference_tip -from astroid.manager import AstroidManager -from astroid.util import Uninferable - -if TYPE_CHECKING: - from astroid.typing import InferenceResult - - -def _looks_like_statistics_quantiles(node: nodes.Call) -> bool: - """Check if this is a call to statistics.quantiles.""" - match node.func: - case nodes.Attribute(expr=nodes.Name(name="statistics"), attrname="quantiles"): - # Case 1: statistics.quantiles(...) - return True - case nodes.Name(name="quantiles"): - # Case 2: from statistics import quantiles; quantiles(...) - # Check if quantiles was imported from statistics - try: - frame = node.frame() - if "quantiles" in frame.locals: - # Look for import from statistics - for stmt in frame.body: - if ( - isinstance(stmt, nodes.ImportFrom) - and stmt.modname == "statistics" - and any(name[0] == "quantiles" for name in stmt.names or []) - ): - return True - except (AttributeError, TypeError): - # If we can't determine the import context, be conservative - pass - return False - - -def infer_statistics_quantiles( - node: nodes.Call, context: InferenceContext | None = None -) -> Iterator[InferenceResult]: - """Infer the result of statistics.quantiles() calls. - - Returns Uninferable because quantiles() has complex runtime behavior - that cannot be statically analyzed, preventing false positives in - pylint's unbalanced-tuple-unpacking checker. - - statistics.quantiles() returns a list with (n-1) elements, but static - analysis sees only the empty list initializations in the function body. - """ - yield Uninferable - - -def register(manager: AstroidManager) -> None: - """Register statistics-specific inference improvements.""" - manager.register_transform( - nodes.Call, - inference_tip(infer_statistics_quantiles), - _looks_like_statistics_quantiles, - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_subprocess.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_subprocess.py deleted file mode 100644 index 3a99802..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_subprocess.py +++ /dev/null @@ -1,100 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -import textwrap - -from astroid import nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import parse -from astroid.const import PY311_PLUS -from astroid.manager import AstroidManager - - -def _subprocess_transform() -> nodes.Module: - communicate = (bytes("string", "ascii"), bytes("string", "ascii")) - communicate_signature = "def communicate(self, input=None, timeout=None)" - args = """\ - self, args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, - preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, - universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, - start_new_session=False, pass_fds=(), *, encoding=None, errors=None, text=None, - user=None, group=None, extra_groups=None, umask=-1, pipesize=-1""" - if PY311_PLUS: - args += ", process_group=None" - - init = f""" - def __init__({args}): - pass""" - wait_signature = "def wait(self, timeout=None)" - ctx_manager = """ - def __enter__(self): return self - def __exit__(self, *args): pass - """ - py3_args = "args = []" - - check_output_signature = """ - check_output( - args, *, - stdin=None, - stderr=None, - shell=False, - cwd=None, - encoding=None, - errors=None, - universal_newlines=False, - timeout=None, - env=None, - text=None, - restore_signals=True, - preexec_fn=None, - pass_fds=(), - input=None, - bufsize=0, - executable=None, - close_fds=False, - startupinfo=None, - creationflags=0, - start_new_session=False - ): - """.strip() - - code = textwrap.dedent( - f""" - def {check_output_signature} - if universal_newlines: - return "" - return b"" - - class Popen(object): - returncode = pid = 0 - stdin = stdout = stderr = file() - {py3_args} - - {communicate_signature}: - return {communicate!r} - {wait_signature}: - return self.returncode - def poll(self): - return self.returncode - def send_signal(self, signal): - pass - def terminate(self): - pass - def kill(self): - pass - {ctx_manager} - @classmethod - def __class_getitem__(cls, item): - pass - """ - ) - - init_lines = textwrap.dedent(init).splitlines() - indented_init = "\n".join(" " * 4 + line for line in init_lines) - code += indented_init - return parse(code) - - -def register(manager: AstroidManager) -> None: - register_module_extender(manager, "subprocess", _subprocess_transform) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_threading.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_threading.py deleted file mode 100644 index 95af2db..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_threading.py +++ /dev/null @@ -1,33 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from astroid import nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import parse -from astroid.manager import AstroidManager - - -def _thread_transform() -> nodes.Module: - return parse( - """ - class lock(object): - def acquire(self, blocking=True, timeout=-1): - return False - def release(self): - pass - def __enter__(self): - return True - def __exit__(self, *args): - pass - def locked(self): - return False - - def Lock(*args, **kwargs): - return lock() - """ - ) - - -def register(manager: AstroidManager) -> None: - register_module_extender(manager, "threading", _thread_transform) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_type.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_type.py deleted file mode 100644 index 8391e59..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_type.py +++ /dev/null @@ -1,70 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -""" -Astroid hooks for type support. - -Starting from python3.9, type object behaves as it had __class_getitem__ method. -However it was not possible to simply add this method inside type's body, otherwise -all types would also have this method. In this case it would have been possible -to write str[int]. -Guido Van Rossum proposed a hack to handle this in the interpreter: -https://github.com/python/cpython/blob/67e394562d67cbcd0ac8114e5439494e7645b8f5/Objects/abstract.c#L181-L184 - -This brain follows the same logic. It is no wise to add permanently the __class_getitem__ method -to the type object. Instead we choose to add it only in the case of a subscript node -which inside name node is type. -Doing this type[int] is allowed whereas str[int] is not. - -Thanks to Lukasz Langa for fruitful discussion. -""" - -from __future__ import annotations - -from astroid import nodes -from astroid.builder import extract_node -from astroid.context import InferenceContext -from astroid.exceptions import UseInferenceDefault -from astroid.inference_tip import inference_tip -from astroid.manager import AstroidManager - - -def _looks_like_type_subscript(node: nodes.Name) -> bool: - """ - Try to figure out if a Name node is used inside a type related subscript. - - :param node: node to check - :type node: astroid.nodes.NodeNG - :return: whether the node is a Name node inside a type related subscript - """ - if isinstance(node.parent, nodes.Subscript): - return node.name == "type" - return False - - -def infer_type_sub(node, context: InferenceContext | None = None): - """ - Infer a type[...] subscript. - - :param node: node to infer - :type node: astroid.nodes.NodeNG - :return: the inferred node - :rtype: nodes.NodeNG - """ - node_scope, _ = node.scope().lookup("type") - if not (isinstance(node_scope, nodes.Module) and node_scope.qname() == "builtins"): - raise UseInferenceDefault() - class_src = """ - class type: - def __class_getitem__(cls, key): - return cls - """ - node = extract_node(class_src) - return node.infer(context=context) - - -def register(manager: AstroidManager) -> None: - manager.register_transform( - nodes.Name, inference_tip(infer_type_sub), _looks_like_type_subscript - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_typing.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_typing.py deleted file mode 100644 index 217a803..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_typing.py +++ /dev/null @@ -1,504 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Astroid hooks for typing.py support.""" - -from __future__ import annotations - -import textwrap -import typing -from collections.abc import Iterator -from functools import partial -from typing import Final - -from astroid import context, nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import AstroidBuilder, _extract_single_node, extract_node -from astroid.const import PY312_PLUS, PY313_PLUS, PY314_PLUS -from astroid.exceptions import ( - AstroidSyntaxError, - AttributeInferenceError, - InferenceError, - UseInferenceDefault, -) -from astroid.inference_tip import inference_tip -from astroid.manager import AstroidManager - -TYPING_TYPEVARS = {"TypeVar", "NewType"} -TYPING_TYPEVARS_QUALIFIED: Final = { - "typing.TypeVar", - "typing.NewType", - "typing_extensions.TypeVar", -} -TYPING_TYPEDDICT_QUALIFIED: Final = {"typing.TypedDict", "typing_extensions.TypedDict"} -TYPING_TYPE_TEMPLATE = """ -class Meta(type): - def __getitem__(self, item): - return self - - @property - def __args__(self): - return () - -class {0}(metaclass=Meta): - pass -""" -TYPING_MEMBERS = set(getattr(typing, "__all__", [])) - -TYPING_ALIAS = frozenset( - ( - "typing.Hashable", - "typing.Awaitable", - "typing.Coroutine", - "typing.AsyncIterable", - "typing.AsyncIterator", - "typing.Iterable", - "typing.Iterator", - "typing.Reversible", - "typing.Sized", - "typing.Container", - "typing.Collection", - "typing.Callable", - "typing.AbstractSet", - "typing.MutableSet", - "typing.Mapping", - "typing.MutableMapping", - "typing.Sequence", - "typing.MutableSequence", - "typing.ByteString", # scheduled for removal in 3.17 - "typing.Tuple", - "typing.List", - "typing.Deque", - "typing.Set", - "typing.FrozenSet", - "typing.MappingView", - "typing.KeysView", - "typing.ItemsView", - "typing.ValuesView", - "typing.ContextManager", - "typing.AsyncContextManager", - "typing.Dict", - "typing.DefaultDict", - "typing.OrderedDict", - "typing.Counter", - "typing.ChainMap", - "typing.Generator", - "typing.AsyncGenerator", - "typing.Type", - "typing.Pattern", - "typing.Match", - ) -) - -CLASS_GETITEM_TEMPLATE = """ -@classmethod -def __class_getitem__(cls, item): - return cls -""" - - -def looks_like_typing_typevar_or_newtype(node) -> bool: - func = node.func - if isinstance(func, nodes.Attribute): - return func.attrname in TYPING_TYPEVARS - if isinstance(func, nodes.Name): - return func.name in TYPING_TYPEVARS - return False - - -def infer_typing_typevar_or_newtype( - node: nodes.Call, context_itton: context.InferenceContext | None = None -) -> Iterator[nodes.ClassDef]: - """Infer a typing.TypeVar(...) or typing.NewType(...) call.""" - try: - func = next(node.func.infer(context=context_itton)) - except (InferenceError, StopIteration) as exc: - raise UseInferenceDefault from exc - - if func.qname() not in TYPING_TYPEVARS_QUALIFIED: - raise UseInferenceDefault - if not node.args: - raise UseInferenceDefault - # Cannot infer from a dynamic class name (f-string) - if isinstance(node.args[0], nodes.JoinedStr): - raise UseInferenceDefault - - typename = node.args[0].as_string().strip("'") - try: - node = extract_node(TYPING_TYPE_TEMPLATE.format(typename)) - except AstroidSyntaxError as exc: - raise InferenceError from exc - return node.infer(context=context_itton) - - -def _looks_like_typing_subscript(node) -> bool: - """Try to figure out if a Subscript node *might* be a typing-related subscript.""" - if isinstance(node, nodes.Name): - return node.name in TYPING_MEMBERS - if isinstance(node, nodes.Attribute): - return node.attrname in TYPING_MEMBERS - if isinstance(node, nodes.Subscript): - return _looks_like_typing_subscript(node.value) - return False - - -def infer_typing_attr( - node: nodes.Subscript, ctx: context.InferenceContext | None = None -) -> Iterator[nodes.ClassDef]: - """Infer a typing.X[...] subscript.""" - try: - value = next(node.value.infer()) # type: ignore[union-attr] # value shouldn't be None for Subscript. - except (InferenceError, StopIteration) as exc: - raise UseInferenceDefault from exc - - if not value.qname().startswith("typing.") or value.qname() in TYPING_ALIAS: - # If typing subscript belongs to an alias handle it separately. - raise UseInferenceDefault - - if ( - PY313_PLUS - and isinstance(value, nodes.FunctionDef) - and value.qname() == "typing.Annotated" - ): - # typing.Annotated is a FunctionDef on 3.13+ - node._explicit_inference = lambda node, context: iter([value]) - return iter([value]) - - if isinstance(value, nodes.ClassDef) and value.qname() in { - "typing.Generic", - "typing.Annotated", - "typing_extensions.Annotated", - }: - # typing.Generic and typing.Annotated (PY39) are subscriptable - # through __class_getitem__. Since astroid can't easily - # infer the native methods, replace them for an easy inference tip - func_to_add = _extract_single_node(CLASS_GETITEM_TEMPLATE) - value.locals["__class_getitem__"] = [func_to_add] - if ( - isinstance(node.parent, nodes.ClassDef) - and node in node.parent.bases - and getattr(node.parent, "__cache", None) - ): - # node.parent.slots is evaluated and cached before the inference tip - # is first applied. Remove the last result to allow a recalculation of slots - cache = node.parent.__cache # type: ignore[attr-defined] # Unrecognized getattr - if cache.get(node.parent.slots) is not None: - del cache[node.parent.slots] - # Avoid re-instantiating this class every time it's seen - node._explicit_inference = lambda node, context: iter([value]) - return iter([value]) - - node = extract_node(TYPING_TYPE_TEMPLATE.format(value.qname().split(".")[-1])) - return node.infer(context=ctx) - - -def _looks_like_generic_class_pep695(node: nodes.ClassDef) -> bool: - """Check if class is using type parameter. Python 3.12+.""" - return len(node.type_params) > 0 - - -def infer_typing_generic_class_pep695( - node: nodes.ClassDef, ctx: context.InferenceContext | None = None -) -> Iterator[nodes.ClassDef]: - """Add __class_getitem__ for generic classes. Python 3.12+.""" - func_to_add = _extract_single_node(CLASS_GETITEM_TEMPLATE) - node.locals["__class_getitem__"] = [func_to_add] - return iter([node]) - - -def _looks_like_typedDict( # pylint: disable=invalid-name - node: nodes.FunctionDef | nodes.ClassDef, -) -> bool: - """Check if node is TypedDict FunctionDef.""" - return node.qname() in TYPING_TYPEDDICT_QUALIFIED - - -def infer_typedDict( # pylint: disable=invalid-name - node: nodes.FunctionDef, ctx: context.InferenceContext | None = None -) -> Iterator[nodes.ClassDef]: - """Replace TypedDict FunctionDef with ClassDef.""" - class_def = nodes.ClassDef( - name="TypedDict", - lineno=node.lineno, - col_offset=node.col_offset, - parent=node.parent, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - ) - class_def.postinit(bases=[extract_node("dict")], body=[], decorators=None) - func_to_add = _extract_single_node("dict") - class_def.locals["__call__"] = [func_to_add] - return iter([class_def]) - - -def _looks_like_typing_alias(node: nodes.Call) -> bool: - """ - Returns True if the node corresponds to a call to _alias function. - - For example : - - MutableSet = _alias(collections.abc.MutableSet, T) - - :param node: call node - """ - return ( - isinstance(node.func, nodes.Name) - # TODO: remove _DeprecatedGenericAlias when Py3.14 min - and node.func.name in {"_alias", "_DeprecatedGenericAlias"} - and len(node.args) == 2 - and ( - # _alias function works also for builtins object such as list and dict - isinstance(node.args[0], (nodes.Attribute, nodes.Name)) - ) - ) - - -def _forbid_class_getitem_access(node: nodes.ClassDef) -> None: - """Disable the access to __class_getitem__ method for the node in parameters.""" - - def full_raiser(origin_func, attr, *args, **kwargs): - """ - Raises an AttributeInferenceError in case of access to __class_getitem__ method. - Otherwise, just call origin_func. - """ - if attr == "__class_getitem__": - raise AttributeInferenceError("__class_getitem__ access is not allowed") - return origin_func(attr, *args, **kwargs) - - try: - node.getattr("__class_getitem__") - # If we are here, then we are sure to modify an object that does have - # __class_getitem__ method (which origin is the protocol defined in - # collections module) whereas the typing module considers it should not. - # We do not want __class_getitem__ to be found in the classdef - partial_raiser = partial(full_raiser, node.getattr) - node.getattr = partial_raiser - except AttributeInferenceError: - pass - - -def infer_typing_alias( - node: nodes.Call, ctx: context.InferenceContext | None = None -) -> Iterator[nodes.ClassDef]: - """ - Infers the call to _alias function - Insert ClassDef, with same name as aliased class, - in mro to simulate _GenericAlias. - - :param node: call node - :param context: inference context - - # TODO: evaluate if still necessary when Py3.12 is minimum - """ - if not ( - isinstance(node.parent, nodes.Assign) - and len(node.parent.targets) == 1 - and isinstance(node.parent.targets[0], nodes.AssignName) - ): - raise UseInferenceDefault - try: - res = next(node.args[0].infer(context=ctx)) - except StopIteration as e: - raise InferenceError(node=node.args[0], context=ctx) from e - - assign_name = node.parent.targets[0] - - class_def = nodes.ClassDef( - name=assign_name.name, - lineno=assign_name.lineno, - col_offset=assign_name.col_offset, - parent=node.parent, - end_lineno=assign_name.end_lineno, - end_col_offset=assign_name.end_col_offset, - ) - if isinstance(res, nodes.ClassDef): - # Only add `res` as base if it's a `ClassDef` - # This isn't the case for `typing.Pattern` and `typing.Match` - class_def.postinit(bases=[res], body=[], decorators=None) - - maybe_type_var = node.args[1] - if isinstance(maybe_type_var, nodes.Const) and maybe_type_var.value > 0: - # If typing alias is subscriptable, add `__class_getitem__` to ClassDef - func_to_add = _extract_single_node(CLASS_GETITEM_TEMPLATE) - class_def.locals["__class_getitem__"] = [func_to_add] - else: - # If not, make sure that `__class_getitem__` access is forbidden. - # This is an issue in cases where the aliased class implements it, - # but the typing alias isn't subscriptable. E.g., `typing.ByteString` for PY39+ - _forbid_class_getitem_access(class_def) - - # Avoid re-instantiating this class every time it's seen - node._explicit_inference = lambda node, context: iter([class_def]) - return iter([class_def]) - - -def _looks_like_special_alias(node: nodes.Call) -> bool: - """Return True if call is for Tuple or Callable alias. - - In PY37 and PY38 the call is to '_VariadicGenericAlias' with 'tuple' as - first argument. In PY39+ it is replaced by a call to '_TupleType'. - - PY37: Tuple = _VariadicGenericAlias(tuple, (), inst=False, special=True) - PY39: Tuple = _TupleType(tuple, -1, inst=False, name='Tuple') - - PY37: Callable = _VariadicGenericAlias(collections.abc.Callable, (), special=True) - PY39: Callable = _CallableType(collections.abc.Callable, 2) - """ - return ( - isinstance(node.func, nodes.Name) - and node.args - and ( - ( - node.func.name == "_TupleType" - and isinstance(node.args[0], nodes.Name) - and node.args[0].name == "tuple" - ) - or ( - node.func.name == "_CallableType" - and isinstance(node.args[0], nodes.Attribute) - and node.args[0].as_string() == "collections.abc.Callable" - ) - ) - ) - - -def infer_special_alias( - node: nodes.Call, ctx: context.InferenceContext | None = None -) -> Iterator[nodes.ClassDef]: - """Infer call to tuple alias as new subscriptable class typing.Tuple.""" - if not ( - isinstance(node.parent, nodes.Assign) - and len(node.parent.targets) == 1 - and isinstance(node.parent.targets[0], nodes.AssignName) - ): - raise UseInferenceDefault - try: - res = next(node.args[0].infer(context=ctx)) - except StopIteration as e: - raise InferenceError(node=node.args[0], context=ctx) from e - - assign_name = node.parent.targets[0] - class_def = nodes.ClassDef( - name=assign_name.name, - parent=node.parent, - lineno=assign_name.lineno, - col_offset=assign_name.col_offset, - end_lineno=assign_name.end_lineno, - end_col_offset=assign_name.end_col_offset, - ) - class_def.postinit(bases=[res], body=[], decorators=None) - func_to_add = _extract_single_node(CLASS_GETITEM_TEMPLATE) - class_def.locals["__class_getitem__"] = [func_to_add] - # Avoid re-instantiating this class every time it's seen - node._explicit_inference = lambda node, context: iter([class_def]) - return iter([class_def]) - - -def _looks_like_typing_cast(node: nodes.Call) -> bool: - return (isinstance(node.func, nodes.Name) and node.func.name == "cast") or ( - isinstance(node.func, nodes.Attribute) and node.func.attrname == "cast" - ) - - -def infer_typing_cast( - node: nodes.Call, ctx: context.InferenceContext | None = None -) -> Iterator[nodes.NodeNG]: - """Infer call to cast() returning same type as casted-from var.""" - if not isinstance(node.func, (nodes.Name, nodes.Attribute)): - raise UseInferenceDefault - - try: - func = next(node.func.infer(context=ctx)) - except (InferenceError, StopIteration) as exc: - raise UseInferenceDefault from exc - if not ( - isinstance(func, nodes.FunctionDef) - and func.qname() == "typing.cast" - and len(node.args) == 2 - ): - raise UseInferenceDefault - - return node.args[1].infer(context=ctx) - - -def _typing_transform(): - code = textwrap.dedent( - """ - class Generic: - @classmethod - def __class_getitem__(cls, item): return cls - class ParamSpec: - @property - def args(self): - return ParamSpecArgs(self) - @property - def kwargs(self): - return ParamSpecKwargs(self) - class ParamSpecArgs: ... - class ParamSpecKwargs: ... - class TypeAlias: ... - class Type: - @classmethod - def __class_getitem__(cls, item): return cls - class TypeVar: - @classmethod - def __class_getitem__(cls, item): return cls - class TypeVarTuple: ... - class ContextManager: - @classmethod - def __class_getitem__(cls, item): return cls - class AsyncContextManager: - @classmethod - def __class_getitem__(cls, item): return cls - class Pattern: - @classmethod - def __class_getitem__(cls, item): return cls - class Match: - @classmethod - def __class_getitem__(cls, item): return cls - """ - ) - if PY314_PLUS: - code += textwrap.dedent( - """ - from annotationlib import ForwardRef - class Union: - @classmethod - def __class_getitem__(cls, item): return cls - """ - ) - return AstroidBuilder(AstroidManager()).string_build(code) - - -def register(manager: AstroidManager) -> None: - manager.register_transform( - nodes.Call, - inference_tip(infer_typing_typevar_or_newtype), - looks_like_typing_typevar_or_newtype, - ) - manager.register_transform( - nodes.Subscript, inference_tip(infer_typing_attr), _looks_like_typing_subscript - ) - manager.register_transform( - nodes.Call, inference_tip(infer_typing_cast), _looks_like_typing_cast - ) - - manager.register_transform( - nodes.FunctionDef, inference_tip(infer_typedDict), _looks_like_typedDict - ) - - manager.register_transform( - nodes.Call, inference_tip(infer_typing_alias), _looks_like_typing_alias - ) - manager.register_transform( - nodes.Call, inference_tip(infer_special_alias), _looks_like_special_alias - ) - - if PY312_PLUS: - register_module_extender(manager, "typing", _typing_transform) - manager.register_transform( - nodes.ClassDef, - inference_tip(infer_typing_generic_class_pep695), - _looks_like_generic_class_pep695, - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_unittest.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_unittest.py deleted file mode 100644 index 4103ce0..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_unittest.py +++ /dev/null @@ -1,31 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Astroid hooks for unittest module.""" -from astroid import nodes -from astroid.brain.helpers import register_module_extender -from astroid.builder import parse -from astroid.manager import AstroidManager - - -def IsolatedAsyncioTestCaseImport() -> nodes.Module: - """ - In the unittest package, the IsolatedAsyncioTestCase class is imported lazily. - - I.E. only when the ``__getattr__`` method of the unittest module is called with - 'IsolatedAsyncioTestCase' as argument. Thus the IsolatedAsyncioTestCase - is not imported statically (during import time). - This function mocks a classical static import of the IsolatedAsyncioTestCase. - - (see https://github.com/pylint-dev/pylint/issues/4060) - """ - return parse( - """ - from .async_case import IsolatedAsyncioTestCase - """ - ) - - -def register(manager: AstroidManager) -> None: - register_module_extender(manager, "unittest", IsolatedAsyncioTestCaseImport) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/brain_uuid.py b/venv/lib/python3.12/site-packages/astroid/brain/brain_uuid.py deleted file mode 100644 index 4405a62..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/brain_uuid.py +++ /dev/null @@ -1,18 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Astroid hooks for the UUID module.""" -from astroid import nodes -from astroid.manager import AstroidManager - - -def _patch_uuid_class(node: nodes.ClassDef) -> None: - # The .int member is patched using __dict__ - node.locals["int"] = [nodes.Const(0, parent=node)] - - -def register(manager: AstroidManager) -> None: - manager.register_transform( - nodes.ClassDef, _patch_uuid_class, lambda node: node.qname() == "uuid.UUID" - ) diff --git a/venv/lib/python3.12/site-packages/astroid/brain/helpers.py b/venv/lib/python3.12/site-packages/astroid/brain/helpers.py deleted file mode 100644 index 0064a1f..0000000 --- a/venv/lib/python3.12/site-packages/astroid/brain/helpers.py +++ /dev/null @@ -1,146 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from __future__ import annotations - -from collections.abc import Callable -from typing import TYPE_CHECKING - -from astroid.exceptions import InferenceError -from astroid.manager import AstroidManager -from astroid.nodes.scoped_nodes import Module - -if TYPE_CHECKING: - from astroid.nodes.node_ng import NodeNG - - -def register_module_extender( - manager: AstroidManager, module_name: str, get_extension_mod: Callable[[], Module] -) -> None: - def transform(node: Module) -> None: - extension_module = get_extension_mod() - for name, objs in extension_module.locals.items(): - node.locals[name] = objs - for obj in objs: - if obj.parent is extension_module: - obj.parent = node - - manager.register_transform(Module, transform, lambda n: n.name == module_name) - - -# pylint: disable-next=too-many-locals -def register_all_brains(manager: AstroidManager) -> None: - from astroid.brain import ( # pylint: disable=import-outside-toplevel - brain_argparse, - brain_attrs, - brain_boto3, - brain_builtin_inference, - brain_collections, - brain_crypt, - brain_ctypes, - brain_curses, - brain_dataclasses, - brain_datetime, - brain_dateutil, - brain_functools, - brain_gi, - brain_hashlib, - brain_http, - brain_hypothesis, - brain_io, - brain_mechanize, - brain_multiprocessing, - brain_namedtuple_enum, - brain_numpy_core_einsumfunc, - brain_numpy_core_fromnumeric, - brain_numpy_core_function_base, - brain_numpy_core_multiarray, - brain_numpy_core_numeric, - brain_numpy_core_numerictypes, - brain_numpy_core_umath, - brain_numpy_ma, - brain_numpy_ndarray, - brain_numpy_random_mtrand, - brain_pathlib, - brain_pkg_resources, - brain_pytest, - brain_qt, - brain_random, - brain_re, - brain_regex, - brain_responses, - brain_scipy_signal, - brain_signal, - brain_six, - brain_sqlalchemy, - brain_ssl, - brain_statistics, - brain_subprocess, - brain_threading, - brain_type, - brain_typing, - brain_unittest, - brain_uuid, - ) - - brain_argparse.register(manager) - brain_attrs.register(manager) - brain_boto3.register(manager) - brain_builtin_inference.register(manager) - brain_collections.register(manager) - brain_crypt.register(manager) - brain_ctypes.register(manager) - brain_curses.register(manager) - brain_dataclasses.register(manager) - brain_datetime.register(manager) - brain_dateutil.register(manager) - brain_functools.register(manager) - brain_gi.register(manager) - brain_hashlib.register(manager) - brain_http.register(manager) - brain_hypothesis.register(manager) - brain_io.register(manager) - brain_mechanize.register(manager) - brain_multiprocessing.register(manager) - brain_namedtuple_enum.register(manager) - brain_numpy_core_einsumfunc.register(manager) - brain_numpy_core_fromnumeric.register(manager) - brain_numpy_core_function_base.register(manager) - brain_numpy_core_multiarray.register(manager) - brain_numpy_core_numerictypes.register(manager) - brain_numpy_core_umath.register(manager) - brain_numpy_random_mtrand.register(manager) - brain_numpy_ma.register(manager) - brain_numpy_ndarray.register(manager) - brain_numpy_core_numeric.register(manager) - brain_pathlib.register(manager) - brain_pkg_resources.register(manager) - brain_pytest.register(manager) - brain_qt.register(manager) - brain_random.register(manager) - brain_re.register(manager) - brain_regex.register(manager) - brain_responses.register(manager) - brain_scipy_signal.register(manager) - brain_signal.register(manager) - brain_six.register(manager) - brain_sqlalchemy.register(manager) - brain_ssl.register(manager) - brain_statistics.register(manager) - brain_subprocess.register(manager) - brain_threading.register(manager) - brain_type.register(manager) - brain_typing.register(manager) - brain_unittest.register(manager) - brain_uuid.register(manager) - - -def is_class_var(node: NodeNG) -> bool: - """Return True if node is a ClassVar, with or without subscripting.""" - try: - inferred = next(node.infer()) - except (InferenceError, StopIteration): - return False - - return getattr(inferred, "name", "") == "ClassVar" diff --git a/venv/lib/python3.12/site-packages/astroid/builder.py b/venv/lib/python3.12/site-packages/astroid/builder.py deleted file mode 100644 index f166ab4..0000000 --- a/venv/lib/python3.12/site-packages/astroid/builder.py +++ /dev/null @@ -1,505 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""The AstroidBuilder makes astroid from living object and / or from _ast. - -The builder is not thread safe and can't be used to parse different sources -at the same time. -""" - -from __future__ import annotations - -import ast -import os -import re -import textwrap -import types -import warnings -from collections.abc import Collection, Iterator, Sequence -from io import TextIOWrapper -from tokenize import detect_encoding -from typing import TYPE_CHECKING, cast - -from astroid import bases, modutils, nodes, raw_building, rebuilder, util -from astroid._ast import ParserModule, get_parser_module -from astroid.const import PY312_PLUS, PY314_PLUS -from astroid.exceptions import AstroidBuildingError, AstroidSyntaxError, InferenceError - -if TYPE_CHECKING: - from astroid.manager import AstroidManager - -# The name of the transient function that is used to -# wrap expressions to be extracted when calling -# extract_node. -_TRANSIENT_FUNCTION = "__" - -# The comment used to select a statement to be extracted -# when calling extract_node. -_STATEMENT_SELECTOR = "#@" - -if PY312_PLUS: - warnings.filterwarnings("ignore", ".*invalid escape sequence", SyntaxWarning) -if PY314_PLUS: - warnings.filterwarnings( - "ignore", "'(return|continue|break)' in a 'finally'", SyntaxWarning - ) - - -def open_source_file(filename: str) -> tuple[TextIOWrapper, str, str]: - # pylint: disable=consider-using-with - with open(filename, "rb") as byte_stream: - encoding = detect_encoding(byte_stream.readline)[0] - stream = open(filename, newline=None, encoding=encoding) - data = stream.read() - return stream, encoding, data - - -def _can_assign_attr(node: nodes.ClassDef, attrname: str | None) -> bool: - try: - slots = node.slots() - except NotImplementedError: - pass - else: - if slots and attrname not in {slot.value for slot in slots}: - return False - return node.qname() != "builtins.object" - - -class AstroidBuilder(raw_building.InspectBuilder): - """Class for building an astroid tree from source code or from a live module. - - The param *manager* specifies the manager class which should be used. The - param *apply_transforms* determines if the transforms should be - applied after the tree was built from source or from a live object, - by default being True. - """ - - def __init__(self, manager: AstroidManager, apply_transforms: bool = True) -> None: - super().__init__(manager) - self._apply_transforms = apply_transforms - if not raw_building.InspectBuilder.bootstrapped: - manager.bootstrap() - - def module_build( - self, module: types.ModuleType, modname: str | None = None - ) -> nodes.Module: - """Build an astroid from a living module instance.""" - node = None - path = getattr(module, "__file__", None) - loader = getattr(module, "__loader__", None) - # Prefer the loader to get the source rather than assuming we have a - # filesystem to read the source file from ourselves. - if loader: - modname = modname or module.__name__ - source = loader.get_source(modname) - if source: - node = self.string_build(source, modname, path=path) - if node is None and path is not None: - path_, ext = os.path.splitext(modutils._path_from_filename(path)) - if ext in {".py", ".pyc", ".pyo"} and os.path.exists(path_ + ".py"): - node = self.file_build(path_ + ".py", modname) - if node is None: - # this is a built-in module - # get a partial representation by introspection - node = self.inspect_build(module, modname=modname, path=path) - if self._apply_transforms: - # We have to handle transformation by ourselves since the - # rebuilder isn't called for builtin nodes - node = self._manager.visit_transforms(node) - assert isinstance(node, nodes.Module) - return node - - def file_build(self, path: str, modname: str | None = None) -> nodes.Module: - """Build astroid from a source code file (i.e. from an ast). - - *path* is expected to be a python source file - """ - try: - stream, encoding, data = open_source_file(path) - except OSError as exc: - raise AstroidBuildingError( - "Unable to load file {path}:\n{error}", - modname=modname, - path=path, - error=exc, - ) from exc - except (SyntaxError, LookupError) as exc: - raise AstroidSyntaxError( - "Python 3 encoding specification error or unknown encoding:\n" - "{error}", - modname=modname, - path=path, - error=exc, - ) from exc - except UnicodeError as exc: # wrong encoding - # detect_encoding returns utf-8 if no encoding specified - raise AstroidBuildingError( - "Wrong or no encoding specified for {filename}.", filename=path - ) from exc - with stream: - # get module name if necessary - if modname is None: - try: - modname = ".".join(modutils.modpath_from_file(path)) - except ImportError: - modname = os.path.splitext(os.path.basename(path))[0] - # build astroid representation - module, builder = self._data_build(data, modname, path) - return self._post_build(module, builder, encoding) - - def string_build( - self, data: str, modname: str = "", path: str | None = None - ) -> nodes.Module: - """Build astroid from source code string.""" - module, builder = self._data_build(data, modname, path) - module.file_bytes = data.encode("utf-8") - return self._post_build(module, builder, "utf-8") - - def _post_build( - self, module: nodes.Module, builder: rebuilder.TreeRebuilder, encoding: str - ) -> nodes.Module: - """Handles encoding and delayed nodes after a module has been built.""" - module.file_encoding = encoding - self._manager.cache_module(module) - # post tree building steps after we stored the module in the cache: - for from_node, global_names in builder._import_from_nodes: - if from_node.modname == "__future__": - for symbol, _ in from_node.names: - module.future_imports.add(symbol) - self.add_from_names_to_locals(from_node, global_names) - # handle delayed assattr nodes - for delayed in builder._delayed_assattr: - self.delayed_assattr(delayed) - - # Visit the transforms - if self._apply_transforms: - module = self._manager.visit_transforms(module) - return module - - def _data_build( - self, data: str, modname: str, path: str | None - ) -> tuple[nodes.Module, rebuilder.TreeRebuilder]: - """Build tree node from data and add some informations.""" - try: - node, parser_module = _parse_string( - data, type_comments=True, modname=modname - ) - except (TypeError, ValueError, SyntaxError, MemoryError) as exc: - raise AstroidSyntaxError( - "Parsing Python code failed:\n{error}", - source=data, - modname=modname, - path=path, - error=exc, - ) from exc - - if path is not None: - node_file = os.path.abspath(path) - else: - node_file = "" - if modname.endswith(".__init__"): - modname = modname[:-9] - package = True - else: - package = ( - path is not None - and os.path.splitext(os.path.basename(path))[0] == "__init__" - ) - builder = rebuilder.TreeRebuilder(self._manager, parser_module, data) - module = builder.visit_module(node, modname, node_file, package) - return module, builder - - def add_from_names_to_locals( - self, node: nodes.ImportFrom, global_name: Collection[str] - ) -> None: - """Store imported names to the locals. - - Resort the locals if coming from a delayed node - """ - - def add_local(parent_or_root: nodes.NodeNG, name: str) -> None: - parent_or_root.set_local(name, node) - my_list = parent_or_root.scope().locals[name] - if TYPE_CHECKING: - my_list = cast(list[nodes.NodeNG], my_list) - my_list.sort(key=lambda n: n.fromlineno or 0) - - assert node.parent # It should always default to the module - module = node.root() - for name, asname in node.names: - if name == "*": - try: - imported = node.do_import_module() - except AstroidBuildingError: - continue - for name in imported.public_names(): - if name in global_name: - add_local(module, name) - else: - add_local(node.parent, name) - else: - name = asname or name - if name in global_name: - add_local(module, name) - else: - add_local(node.parent, name) - - def delayed_assattr(self, node: nodes.AssignAttr) -> None: - """Visit an AssignAttr node. - - This adds name to locals and handle members definition. - """ - from astroid import objects # pylint: disable=import-outside-toplevel - - try: - for inferred in node.expr.infer(): - if isinstance(inferred, util.UninferableBase): - continue - try: - # We want a narrow check on the parent type, not all of its subclasses - if type(inferred) in {bases.Instance, objects.ExceptionInstance}: - inferred = inferred._proxied - iattrs = inferred.instance_attrs - if not _can_assign_attr(inferred, node.attrname): - continue - elif isinstance(inferred, bases.Instance): - # Const, Tuple or other containers that inherit from - # `Instance` - continue - elif isinstance(inferred, (bases.Proxy, util.UninferableBase)): - continue - elif inferred.is_function: - iattrs = inferred.instance_attrs - else: - iattrs = inferred.locals - except AttributeError: - # XXX log error - continue - values = iattrs.setdefault(node.attrname, []) - if node in values: - continue - values.append(node) - except InferenceError: - pass - - -def build_namespace_package_module(name: str, path: Sequence[str]) -> nodes.Module: - module = nodes.Module(name, path=path, package=True) - module.postinit(body=[], doc_node=None) - return module - - -def parse( - code: str, - module_name: str = "", - path: str | None = None, - apply_transforms: bool = True, -) -> nodes.Module: - """Parses a source string in order to obtain an astroid AST from it. - - :param str code: The code for the module. - :param str module_name: The name for the module, if any - :param str path: The path for the module - :param bool apply_transforms: - Apply the transforms for the give code. Use it if you - don't want the default transforms to be applied. - """ - # pylint: disable-next=import-outside-toplevel - from astroid.manager import AstroidManager - - code = textwrap.dedent(code) - builder = AstroidBuilder(AstroidManager(), apply_transforms=apply_transforms) - return builder.string_build(code, modname=module_name, path=path) - - -def _extract_expressions(node: nodes.NodeNG) -> Iterator[nodes.NodeNG]: - """Find expressions in a call to _TRANSIENT_FUNCTION and extract them. - - The function walks the AST recursively to search for expressions that - are wrapped into a call to _TRANSIENT_FUNCTION. If it finds such an - expression, it completely removes the function call node from the tree, - replacing it by the wrapped expression inside the parent. - - :param node: An astroid node. - :type node: astroid.bases.NodeNG - :yields: The sequence of wrapped expressions on the modified tree - expression can be found. - """ - if ( - isinstance(node, nodes.Call) - and isinstance(node.func, nodes.Name) - and node.func.name == _TRANSIENT_FUNCTION - and node.args - ): - real_expr = node.args[0] - assert node.parent - real_expr.parent = node.parent - # Search for node in all _astng_fields (the fields checked when - # get_children is called) of its parent. Some of those fields may - # be lists or tuples, in which case the elements need to be checked. - # When we find it, replace it by real_expr, so that the AST looks - # like no call to _TRANSIENT_FUNCTION ever took place. - for name in node.parent._astroid_fields: - child = getattr(node.parent, name) - if isinstance(child, list): - for idx, compound_child in enumerate(child): - if compound_child is node: - child[idx] = real_expr - elif child is node: - setattr(node.parent, name, real_expr) - yield real_expr - else: - for child in node.get_children(): - yield from _extract_expressions(child) - - -def _find_statement_by_line(node: nodes.NodeNG, line: int) -> nodes.NodeNG | None: - """Extracts the statement on a specific line from an AST. - - If the line number of node matches line, it will be returned; - otherwise its children are iterated and the function is called - recursively. - - :param node: An astroid node. - :type node: astroid.bases.NodeNG - :param line: The line number of the statement to extract. - :type line: int - :returns: The statement on the line, or None if no statement for the line - can be found. - :rtype: astroid.bases.NodeNG or None - """ - if isinstance(node, (nodes.ClassDef, nodes.FunctionDef, nodes.MatchCase)): - # This is an inaccuracy in the AST: the nodes that can be - # decorated do not carry explicit information on which line - # the actual definition (class/def), but .fromline seems to - # be close enough. - node_line = node.fromlineno - else: - node_line = node.lineno - - if node_line == line: - return node - - for child in node.get_children(): - result = _find_statement_by_line(child, line) - if result: - return result - - return None - - -def extract_node(code: str, module_name: str = "") -> nodes.NodeNG | list[nodes.NodeNG]: - """Parses some Python code as a module and extracts a designated AST node. - - Statements: - To extract one or more statement nodes, append #@ to the end of the line - - Examples: - >>> def x(): - >>> def y(): - >>> return 1 #@ - - The return statement will be extracted. - - >>> class X(object): - >>> def meth(self): #@ - >>> pass - - The function object 'meth' will be extracted. - - Expressions: - To extract arbitrary expressions, surround them with the fake - function call __(...). After parsing, the surrounded expression - will be returned and the whole AST (accessible via the returned - node's parent attribute) will look like the function call was - never there in the first place. - - Examples: - >>> a = __(1) - - The const node will be extracted. - - >>> def x(d=__(foo.bar)): pass - - The node containing the default argument will be extracted. - - >>> def foo(a, b): - >>> return 0 < __(len(a)) < b - - The node containing the function call 'len' will be extracted. - - If no statements or expressions are selected, the last toplevel - statement will be returned. - - If the selected statement is a discard statement, (i.e. an expression - turned into a statement), the wrapped expression is returned instead. - - For convenience, singleton lists are unpacked. - - :param str code: A piece of Python code that is parsed as - a module. Will be passed through textwrap.dedent first. - :param str module_name: The name of the module. - :returns: The designated node from the parse tree, or a list of nodes. - """ - - def _extract(node: nodes.NodeNG | None) -> nodes.NodeNG | None: - if isinstance(node, nodes.Expr): - return node.value - - return node - - requested_lines: list[int] = [] - for idx, line in enumerate(code.splitlines()): - if line.strip().endswith(_STATEMENT_SELECTOR): - requested_lines.append(idx + 1) - - tree = parse(code, module_name=module_name) - if not tree.body: - raise ValueError("Empty tree, cannot extract from it") - - extracted: list[nodes.NodeNG | None] = [] - if requested_lines: - extracted = [_find_statement_by_line(tree, line) for line in requested_lines] - - # Modifies the tree. - extracted.extend(_extract_expressions(tree)) - - if not extracted: - extracted.append(tree.body[-1]) - - extracted = [_extract(node) for node in extracted] - extracted_without_none = [node for node in extracted if node is not None] - if len(extracted_without_none) == 1: - return extracted_without_none[0] - return extracted_without_none - - -def _extract_single_node(code: str, module_name: str = "") -> nodes.NodeNG: - """Call extract_node while making sure that only one value is returned.""" - ret = extract_node(code, module_name) - if isinstance(ret, list): - return ret[0] - return ret - - -def _parse_string( - data: str, type_comments: bool = True, modname: str | None = None -) -> tuple[ast.Module, ParserModule]: - parser_module = get_parser_module(type_comments=type_comments) - try: - parsed = parser_module.parse( - data + "\n", type_comments=type_comments, filename=modname - ) - except SyntaxError as exc: - # If the type annotations are misplaced for some reason, we do not want - # to fail the entire parsing of the file, so we need to retry the - # parsing without type comment support. We use a heuristic for - # determining if the error is due to type annotations. - type_annot_related = re.search(r"#\s+type:", exc.text or "") - if not (type_annot_related and type_comments): - raise - - parser_module = get_parser_module(type_comments=False) - parsed = parser_module.parse(data + "\n", type_comments=False) - return parsed, parser_module diff --git a/venv/lib/python3.12/site-packages/astroid/const.py b/venv/lib/python3.12/site-packages/astroid/const.py deleted file mode 100644 index dcce074..0000000 --- a/venv/lib/python3.12/site-packages/astroid/const.py +++ /dev/null @@ -1,26 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -import enum -import sys - -PY311_PLUS = sys.version_info >= (3, 11) -PY312_PLUS = sys.version_info >= (3, 12) -PY313 = sys.version_info[:2] == (3, 13) -PY313_PLUS = sys.version_info >= (3, 13) -PY314_PLUS = sys.version_info >= (3, 14) - -WIN32 = sys.platform == "win32" - -IS_PYPY = sys.implementation.name == "pypy" -IS_JYTHON = sys.implementation.name == "jython" - - -class Context(enum.Enum): - Load = 1 - Store = 2 - Del = 3 - - -_EMPTY_OBJECT_MARKER = object() diff --git a/venv/lib/python3.12/site-packages/astroid/constraint.py b/venv/lib/python3.12/site-packages/astroid/constraint.py deleted file mode 100644 index 692d22d..0000000 --- a/venv/lib/python3.12/site-packages/astroid/constraint.py +++ /dev/null @@ -1,186 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Classes representing different types of constraints on inference values.""" -from __future__ import annotations - -import sys -from abc import ABC, abstractmethod -from collections.abc import Iterator -from typing import TYPE_CHECKING - -from astroid import nodes, util -from astroid.typing import InferenceResult - -if sys.version_info >= (3, 11): - from typing import Self -else: - from typing_extensions import Self - -if TYPE_CHECKING: - from astroid import bases - -_NameNodes = nodes.AssignAttr | nodes.Attribute | nodes.AssignName | nodes.Name - - -class Constraint(ABC): - """Represents a single constraint on a variable.""" - - def __init__(self, node: nodes.NodeNG, negate: bool) -> None: - self.node = node - """The node that this constraint applies to.""" - self.negate = negate - """True if this constraint is negated. E.g., "is not" instead of "is".""" - - @classmethod - @abstractmethod - def match( - cls, node: _NameNodes, expr: nodes.NodeNG, negate: bool = False - ) -> Self | None: - """Return a new constraint for node matched from expr, if expr matches - the constraint pattern. - - If negate is True, negate the constraint. - """ - - @abstractmethod - def satisfied_by(self, inferred: InferenceResult) -> bool: - """Return True if this constraint is satisfied by the given inferred value.""" - - -class NoneConstraint(Constraint): - """Represents an "is None" or "is not None" constraint.""" - - CONST_NONE: nodes.Const = nodes.Const(None) - - @classmethod - def match( - cls, node: _NameNodes, expr: nodes.NodeNG, negate: bool = False - ) -> Self | None: - """Return a new constraint for node matched from expr, if expr matches - the constraint pattern. - - Negate the constraint based on the value of negate. - """ - if isinstance(expr, nodes.Compare) and len(expr.ops) == 1: - left = expr.left - op, right = expr.ops[0] - if op in {"is", "is not"} and ( - _matches(left, node) and _matches(right, cls.CONST_NONE) - ): - negate = (op == "is" and negate) or (op == "is not" and not negate) - return cls(node=node, negate=negate) - - return None - - def satisfied_by(self, inferred: InferenceResult) -> bool: - """Return True if this constraint is satisfied by the given inferred value.""" - # Assume true if uninferable - if isinstance(inferred, util.UninferableBase): - return True - - # Return the XOR of self.negate and matches(inferred, self.CONST_NONE) - return self.negate ^ _matches(inferred, self.CONST_NONE) - - -class BooleanConstraint(Constraint): - """Represents an "x" or "not x" constraint.""" - - @classmethod - def match( - cls, node: _NameNodes, expr: nodes.NodeNG, negate: bool = False - ) -> Self | None: - """Return a new constraint for node if expr matches one of these patterns: - - - direct match (expr == node): use given negate value - - negated match (expr == `not node`): flip negate value - - Return None if no pattern matches. - """ - if _matches(expr, node): - return cls(node=node, negate=negate) - - if ( - isinstance(expr, nodes.UnaryOp) - and expr.op == "not" - and _matches(expr.operand, node) - ): - return cls(node=node, negate=not negate) - - return None - - def satisfied_by(self, inferred: InferenceResult) -> bool: - """Return True for uninferable results, or depending on negate flag: - - - negate=False: satisfied if boolean value is True - - negate=True: satisfied if boolean value is False - """ - inferred_booleaness = inferred.bool_value() - if isinstance(inferred, util.UninferableBase) or isinstance( - inferred_booleaness, util.UninferableBase - ): - return True - - return self.negate ^ inferred_booleaness - - -def get_constraints( - expr: _NameNodes, frame: nodes.LocalsDictNodeNG -) -> dict[nodes.If | nodes.IfExp, set[Constraint]]: - """Returns the constraints for the given expression. - - The returned dictionary maps the node where the constraint was generated to the - corresponding constraint(s). - - Constraints are computed statically by analysing the code surrounding expr. - Currently this only supports constraints generated from if conditions. - """ - current_node: nodes.NodeNG | None = expr - constraints_mapping: dict[nodes.If | nodes.IfExp, set[Constraint]] = {} - while current_node is not None and current_node is not frame: - parent = current_node.parent - if isinstance(parent, (nodes.If, nodes.IfExp)): - branch, _ = parent.locate_child(current_node) - constraints: set[Constraint] | None = None - if branch == "body": - constraints = set(_match_constraint(expr, parent.test)) - elif branch == "orelse": - constraints = set(_match_constraint(expr, parent.test, invert=True)) - - if constraints: - constraints_mapping[parent] = constraints - current_node = parent - - return constraints_mapping - - -ALL_CONSTRAINT_CLASSES = frozenset( - ( - NoneConstraint, - BooleanConstraint, - ) -) -"""All supported constraint types.""" - - -def _matches(node1: nodes.NodeNG | bases.Proxy, node2: nodes.NodeNG) -> bool: - """Returns True if the two nodes match.""" - if isinstance(node1, nodes.Name) and isinstance(node2, nodes.Name): - return node1.name == node2.name - if isinstance(node1, nodes.Attribute) and isinstance(node2, nodes.Attribute): - return node1.attrname == node2.attrname and _matches(node1.expr, node2.expr) - if isinstance(node1, nodes.Const) and isinstance(node2, nodes.Const): - return node1.value == node2.value - - return False - - -def _match_constraint( - node: _NameNodes, expr: nodes.NodeNG, invert: bool = False -) -> Iterator[Constraint]: - """Yields all constraint patterns for node that match.""" - for constraint_cls in ALL_CONSTRAINT_CLASSES: - constraint = constraint_cls.match(node, expr, invert) - if constraint: - yield constraint diff --git a/venv/lib/python3.12/site-packages/astroid/context.py b/venv/lib/python3.12/site-packages/astroid/context.py deleted file mode 100644 index fa9ed22..0000000 --- a/venv/lib/python3.12/site-packages/astroid/context.py +++ /dev/null @@ -1,204 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Various context related utilities, including inference and call contexts.""" - -from __future__ import annotations - -import contextlib -import pprint -from collections.abc import Iterator, Sequence -from typing import TYPE_CHECKING - -from astroid.typing import InferenceResult, SuccessfulInferenceResult - -if TYPE_CHECKING: - from astroid import constraint, nodes - -_InferenceCache = dict[ - tuple["nodes.NodeNG", str | None, str | None, str | None], Sequence["nodes.NodeNG"] -] - -_INFERENCE_CACHE: _InferenceCache = {} - - -def _invalidate_cache() -> None: - _INFERENCE_CACHE.clear() - - -class InferenceContext: - """Provide context for inference. - - Store already inferred nodes to save time - Account for already visited nodes to stop infinite recursion - """ - - __slots__ = ( - "_nodes_inferred", - "boundnode", - "callcontext", - "constraints", - "extra_context", - "lookupname", - "path", - ) - - max_inferred = 100 - - def __init__( - self, - path: set[tuple[nodes.NodeNG, str | None]] | None = None, - nodes_inferred: list[int] | None = None, - ) -> None: - if nodes_inferred is None: - self._nodes_inferred = [0] - else: - self._nodes_inferred = nodes_inferred - - self.path = path or set() - """Path of visited nodes and their lookupname. - - Currently this key is ``(node, context.lookupname)`` - """ - self.lookupname: str | None = None - """The original name of the node. - - e.g. - foo = 1 - The inference of 'foo' is nodes.Const(1) but the lookup name is 'foo' - """ - self.callcontext: CallContext | None = None - """The call arguments and keywords for the given context.""" - self.boundnode: SuccessfulInferenceResult | None = None - """The bound node of the given context. - - e.g. the bound node of object.__new__(cls) is the object node - """ - self.extra_context: dict[SuccessfulInferenceResult, InferenceContext] = {} - """Context that needs to be passed down through call stacks for call arguments.""" - - self.constraints: dict[ - str, dict[nodes.If | nodes.IfExp, set[constraint.Constraint]] - ] = {} - """The constraints on nodes.""" - - @property - def nodes_inferred(self) -> int: - """ - Number of nodes inferred in this context and all its clones/descendents. - - Wrap inner value in a mutable cell to allow for mutating a class - variable in the presence of __slots__ - """ - return self._nodes_inferred[0] - - @nodes_inferred.setter - def nodes_inferred(self, value: int) -> None: - self._nodes_inferred[0] = value - - @property - def inferred(self) -> _InferenceCache: - """ - Inferred node contexts to their mapped results. - - Currently the key is ``(node, lookupname, callcontext, boundnode)`` - and the value is tuple of the inferred results - """ - return _INFERENCE_CACHE - - def push(self, node: nodes.NodeNG) -> bool: - """Push node into inference path. - - Allows one to see if the given node has already - been looked at for this inference context - """ - name = self.lookupname - if (node, name) in self.path: - return True - - self.path.add((node, name)) - return False - - def clone(self) -> InferenceContext: - """Clone inference path. - - For example, each side of a binary operation (BinOp) - starts with the same context but diverge as each side is inferred - so the InferenceContext will need be cloned - """ - # XXX copy lookupname/callcontext ? - clone = InferenceContext(self.path.copy(), nodes_inferred=self._nodes_inferred) - clone.callcontext = self.callcontext - clone.boundnode = self.boundnode - clone.extra_context = self.extra_context - clone.constraints = self.constraints.copy() - return clone - - @contextlib.contextmanager - def restore_path(self) -> Iterator[None]: - path = set(self.path) - yield - self.path = path - - def is_empty(self) -> bool: - return ( - not self.path - and not self.nodes_inferred - and not self.callcontext - and not self.boundnode - and not self.lookupname - and not self.callcontext - and not self.extra_context - and not self.constraints - ) - - def __str__(self) -> str: - state = ( - f"{field}={pprint.pformat(getattr(self, field), width=80 - len(field))}" - for field in self.__slots__ - ) - return "{}({})".format(type(self).__name__, ",\n ".join(state)) - - -class CallContext: - """Holds information for a call site.""" - - __slots__ = ("args", "callee", "keywords") - - def __init__( - self, - args: list[nodes.NodeNG], - keywords: list[nodes.Keyword] | None = None, - callee: InferenceResult | None = None, - ): - self.args = args # Call positional arguments - if keywords: - arg_value_pairs = [(arg.arg, arg.value) for arg in keywords] - else: - arg_value_pairs = [] - self.keywords = arg_value_pairs # Call keyword arguments - self.callee = callee # Function being called - - -def copy_context(context: InferenceContext | None) -> InferenceContext: - """Clone a context if given, or return a fresh context.""" - if context is not None: - return context.clone() - - return InferenceContext() - - -def bind_context_to_node( - context: InferenceContext | None, node: SuccessfulInferenceResult -) -> InferenceContext: - """Give a context a boundnode - to retrieve the correct function name or attribute value - with from further inference. - - Do not use an existing context since the boundnode could then - be incorrectly propagated higher up in the call stack. - """ - context = copy_context(context) - context.boundnode = node - return context diff --git a/venv/lib/python3.12/site-packages/astroid/decorators.py b/venv/lib/python3.12/site-packages/astroid/decorators.py deleted file mode 100644 index 05d2dd3..0000000 --- a/venv/lib/python3.12/site-packages/astroid/decorators.py +++ /dev/null @@ -1,232 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""A few useful function/method decorators.""" - -from __future__ import annotations - -import functools -import inspect -import sys -import warnings -from collections.abc import Callable, Generator -from typing import ParamSpec, TypeVar - -from astroid import util -from astroid.context import InferenceContext -from astroid.exceptions import InferenceError -from astroid.typing import InferenceResult - -_R = TypeVar("_R") -_P = ParamSpec("_P") - - -def path_wrapper(func): - """Return the given infer function wrapped to handle the path. - - Used to stop inference if the node has already been looked - at for a given `InferenceContext` to prevent infinite recursion - """ - - @functools.wraps(func) - def wrapped( - node, context: InferenceContext | None = None, _func=func, **kwargs - ) -> Generator: - """Wrapper function handling context.""" - if context is None: - context = InferenceContext() - if context.push(node): - return - - yielded = set() - - for res in _func(node, context, **kwargs): - # unproxy only true instance, not const, tuple, dict... - if res.__class__.__name__ == "Instance": - ares = res._proxied - else: - ares = res - if ares not in yielded: - yield res - yielded.add(ares) - - return wrapped - - -def yes_if_nothing_inferred( - func: Callable[_P, Generator[InferenceResult]], -) -> Callable[_P, Generator[InferenceResult]]: - def inner(*args: _P.args, **kwargs: _P.kwargs) -> Generator[InferenceResult]: - generator = func(*args, **kwargs) - - try: - yield next(generator) - except StopIteration: - # generator is empty - yield util.Uninferable - return - - yield from generator - - return inner - - -def raise_if_nothing_inferred( - func: Callable[_P, Generator[InferenceResult]], -) -> Callable[_P, Generator[InferenceResult]]: - def inner(*args: _P.args, **kwargs: _P.kwargs) -> Generator[InferenceResult]: - generator = func(*args, **kwargs) - try: - yield next(generator) - except StopIteration as error: - # generator is empty - if error.args: - raise InferenceError(**error.args[0]) from error - raise InferenceError( - "StopIteration raised without any error information." - ) from error - except RecursionError as error: - raise InferenceError( - f"RecursionError raised with limit {sys.getrecursionlimit()}." - ) from error - - yield from generator - - return inner - - -# Expensive decorators only used to emit Deprecation warnings. -# If no other than the default DeprecationWarning are enabled, -# fall back to passthrough implementations. -if util.check_warnings_filter(): # noqa: C901 - - def deprecate_default_argument_values( - astroid_version: str = "3.0", **arguments: str - ) -> Callable[[Callable[_P, _R]], Callable[_P, _R]]: - """Decorator which emits a DeprecationWarning if any arguments specified - are None or not passed at all. - - Arguments should be a key-value mapping, with the key being the argument to check - and the value being a type annotation as string for the value of the argument. - - To improve performance, only used when DeprecationWarnings other than - the default one are enabled. - """ - # Helpful links - # Decorator for DeprecationWarning: https://stackoverflow.com/a/49802489 - # Typing of stacked decorators: https://stackoverflow.com/a/68290080 - - def deco(func: Callable[_P, _R]) -> Callable[_P, _R]: - """Decorator function.""" - - @functools.wraps(func) - def wrapper(*args: _P.args, **kwargs: _P.kwargs) -> _R: - """Emit DeprecationWarnings if conditions are met.""" - - keys = list(inspect.signature(func).parameters.keys()) - for arg, type_annotation in arguments.items(): - try: - index = keys.index(arg) - except ValueError: - raise ValueError( - f"Can't find argument '{arg}' for '{args[0].__class__.__qualname__}'" - ) from None - # pylint: disable = too-many-boolean-expressions - if ( - # Check kwargs - # - if found, check it's not None - (arg in kwargs and kwargs[arg] is None) - # Check args - # - make sure not in kwargs - # - len(args) needs to be long enough, if too short - # arg can't be in args either - # - args[index] should not be None - or ( - arg not in kwargs - and ( - index == -1 - or len(args) <= index - or (len(args) > index and args[index] is None) - ) - ) - ): - warnings.warn( - f"'{arg}' will be a required argument for " - f"'{args[0].__class__.__qualname__}.{func.__name__}'" - f" in astroid {astroid_version} " - f"('{arg}' should be of type: '{type_annotation}')", - DeprecationWarning, - stacklevel=2, - ) - return func(*args, **kwargs) - - return wrapper - - return deco - - def deprecate_arguments( - astroid_version: str = "3.0", **arguments: str - ) -> Callable[[Callable[_P, _R]], Callable[_P, _R]]: - """Decorator which emits a DeprecationWarning if any arguments specified - are passed. - - Arguments should be a key-value mapping, with the key being the argument to check - and the value being a string that explains what to do instead of passing the argument. - - To improve performance, only used when DeprecationWarnings other than - the default one are enabled. - """ - - def deco(func: Callable[_P, _R]) -> Callable[_P, _R]: - @functools.wraps(func) - def wrapper(*args: _P.args, **kwargs: _P.kwargs) -> _R: - keys = list(inspect.signature(func).parameters.keys()) - for arg, note in arguments.items(): - try: - index = keys.index(arg) - except ValueError: - raise ValueError( - f"Can't find argument '{arg}' for '{args[0].__class__.__qualname__}'" - ) from None - if arg in kwargs or len(args) > index: - warnings.warn( - f"The argument '{arg}' for " - f"'{args[0].__class__.__qualname__}.{func.__name__}' is deprecated " - f"and will be removed in astroid {astroid_version} ({note})", - DeprecationWarning, - stacklevel=2, - ) - return func(*args, **kwargs) - - return wrapper - - return deco - -else: - - def deprecate_default_argument_values( - astroid_version: str = "3.0", **arguments: str - ) -> Callable[[Callable[_P, _R]], Callable[_P, _R]]: - """Passthrough decorator to improve performance if DeprecationWarnings are - disabled. - """ - - def deco(func: Callable[_P, _R]) -> Callable[_P, _R]: - """Decorator function.""" - return func - - return deco - - def deprecate_arguments( - astroid_version: str = "3.0", **arguments: str - ) -> Callable[[Callable[_P, _R]], Callable[_P, _R]]: - """Passthrough decorator to improve performance if DeprecationWarnings are - disabled. - """ - - def deco(func: Callable[_P, _R]) -> Callable[_P, _R]: - """Decorator function.""" - return func - - return deco diff --git a/venv/lib/python3.12/site-packages/astroid/exceptions.py b/venv/lib/python3.12/site-packages/astroid/exceptions.py deleted file mode 100644 index e523b70..0000000 --- a/venv/lib/python3.12/site-packages/astroid/exceptions.py +++ /dev/null @@ -1,419 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""This module contains exceptions used in the astroid library.""" - -from __future__ import annotations - -from collections.abc import Iterable, Iterator -from typing import TYPE_CHECKING, Any - -from astroid.typing import InferenceResult, SuccessfulInferenceResult - -if TYPE_CHECKING: - from astroid import arguments, bases, nodes, objects - from astroid.context import InferenceContext - -__all__ = ( - "AstroidBuildingError", - "AstroidError", - "AstroidImportError", - "AstroidIndexError", - "AstroidSyntaxError", - "AstroidTypeError", - "AstroidValueError", - "AttributeInferenceError", - "DuplicateBasesError", - "InconsistentMroError", - "InferenceError", - "InferenceOverwriteError", - "MroError", - "NameInferenceError", - "NoDefault", - "NotFoundError", - "ParentMissingError", - "ResolveError", - "StatementMissing", - "SuperArgumentTypeError", - "SuperError", - "TooManyLevelsError", - "UnresolvableName", - "UseInferenceDefault", -) - - -class AstroidError(Exception): - """Base exception class for all astroid related exceptions. - - AstroidError and its subclasses are structured, intended to hold - objects representing state when the exception is thrown. Field - values are passed to the constructor as keyword-only arguments. - Each subclass has its own set of standard fields, but use your - best judgment to decide whether a specific exception instance - needs more or fewer fields for debugging. Field values may be - used to lazily generate the error message: self.message.format() - will be called with the field names and values supplied as keyword - arguments. - """ - - def __init__(self, message: str = "", **kws: Any) -> None: - super().__init__(message) - self.message = message - for key, value in kws.items(): - setattr(self, key, value) - - def __str__(self) -> str: - try: - return self.message.format(**vars(self)) - except ValueError: - return self.message # Return raw message if formatting fails - - -class AstroidBuildingError(AstroidError): - """Exception class when we are unable to build an astroid representation. - - Standard attributes: - modname: Name of the module that AST construction failed for. - error: Exception raised during construction. - """ - - def __init__( - self, - message: str = "Failed to import module {modname}.", - modname: str | None = None, - error: Exception | None = None, - source: str | None = None, - path: str | None = None, - cls: type | None = None, - class_repr: str | None = None, - **kws: Any, - ) -> None: - self.modname = modname - self.error = error - self.source = source - self.path = path - self.cls = cls - self.class_repr = class_repr - super().__init__(message, **kws) - - -class AstroidImportError(AstroidBuildingError): - """Exception class used when a module can't be imported by astroid.""" - - -class TooManyLevelsError(AstroidImportError): - """Exception class which is raised when a relative import was beyond the top-level. - - Standard attributes: - level: The level which was attempted. - name: the name of the module on which the relative import was attempted. - """ - - def __init__( - self, - message: str = "Relative import with too many levels " - "({level}) for module {name!r}", - level: int | None = None, - name: str | None = None, - **kws: Any, - ) -> None: - self.level = level - self.name = name - super().__init__(message, **kws) - - -class AstroidSyntaxError(AstroidBuildingError): - """Exception class used when a module can't be parsed.""" - - def __init__( - self, - message: str, - modname: str | None, - error: Exception, - path: str | None, - source: str | None = None, - ) -> None: - super().__init__(message, modname, error, source, path) - - -class NoDefault(AstroidError): - """Raised by function's `default_value` method when an argument has - no default value. - - Standard attributes: - func: Function node. - name: Name of argument without a default. - """ - - def __init__( - self, - message: str = "{func!r} has no default for {name!r}.", - func: nodes.FunctionDef | None = None, - name: str | None = None, - **kws: Any, - ) -> None: - self.func = func - self.name = name - super().__init__(message, **kws) - - -class ResolveError(AstroidError): - """Base class of astroid resolution/inference error. - - ResolveError is not intended to be raised. - - Standard attributes: - context: InferenceContext object. - """ - - def __init__( - self, message: str = "", context: InferenceContext | None = None, **kws: Any - ) -> None: - self.context = context - super().__init__(message, **kws) - - -class MroError(ResolveError): - """Error raised when there is a problem with method resolution of a class. - - Standard attributes: - mros: A sequence of sequences containing ClassDef nodes. - cls: ClassDef node whose MRO resolution failed. - context: InferenceContext object. - """ - - def __init__( - self, - message: str, - mros: Iterable[Iterable[nodes.ClassDef]], - cls: nodes.ClassDef, - context: InferenceContext | None = None, - **kws: Any, - ) -> None: - self.mros = mros - self.cls = cls - self.context = context - super().__init__(message, **kws) - - def __str__(self) -> str: - mro_names = ", ".join(f"({', '.join(b.name for b in m)})" for m in self.mros) - return self.message.format(mros=mro_names, cls=self.cls) - - -class DuplicateBasesError(MroError): - """Error raised when there are duplicate bases in the same class bases.""" - - -class InconsistentMroError(MroError): - """Error raised when a class's MRO is inconsistent.""" - - -class SuperError(ResolveError): - """Error raised when there is a problem with a *super* call. - - Standard attributes: - *super_*: The Super instance that raised the exception. - context: InferenceContext object. - """ - - def __init__(self, message: str, super_: objects.Super, **kws: Any) -> None: - self.super_ = super_ - super().__init__(message, **kws) - - def __str__(self) -> str: - return self.message.format(**vars(self.super_)) - - -class InferenceError(ResolveError): # pylint: disable=too-many-instance-attributes - """Raised when we are unable to infer a node. - - Standard attributes: - node: The node inference was called on. - context: InferenceContext object. - """ - - def __init__( # pylint: disable=too-many-arguments, too-many-positional-arguments - self, - message: str = "Inference failed for {node!r}.", - node: InferenceResult | None = None, - context: InferenceContext | None = None, - target: InferenceResult | None = None, - targets: InferenceResult | None = None, - attribute: str | None = None, - unknown: InferenceResult | None = None, - assign_path: list[int] | None = None, - caller: SuccessfulInferenceResult | None = None, - stmts: Iterator[InferenceResult] | None = None, - frame: InferenceResult | None = None, - call_site: arguments.CallSite | None = None, - func: InferenceResult | None = None, - arg: str | None = None, - positional_arguments: list | None = None, - unpacked_args: list | None = None, - keyword_arguments: dict | None = None, - unpacked_kwargs: dict | None = None, - **kws: Any, - ) -> None: - self.node = node - self.context = context - self.target = target - self.targets = targets - self.attribute = attribute - self.unknown = unknown - self.assign_path = assign_path - self.caller = caller - self.stmts = stmts - self.frame = frame - self.call_site = call_site - self.func = func - self.arg = arg - self.positional_arguments = positional_arguments - self.unpacked_args = unpacked_args - self.keyword_arguments = keyword_arguments - self.unpacked_kwargs = unpacked_kwargs - super().__init__(message, **kws) - - -# Why does this inherit from InferenceError rather than ResolveError? -# Changing it causes some inference tests to fail. -class NameInferenceError(InferenceError): - """Raised when a name lookup fails, corresponds to NameError. - - Standard attributes: - name: The name for which lookup failed, as a string. - scope: The node representing the scope in which the lookup occurred. - context: InferenceContext object. - """ - - def __init__( - self, - message: str = "{name!r} not found in {scope!r}.", - name: str | None = None, - scope: nodes.LocalsDictNodeNG | None = None, - context: InferenceContext | None = None, - **kws: Any, - ) -> None: - self.name = name - self.scope = scope - self.context = context - super().__init__(message, **kws) - - -class AttributeInferenceError(ResolveError): - """Raised when an attribute lookup fails, corresponds to AttributeError. - - Standard attributes: - target: The node for which lookup failed. - attribute: The attribute for which lookup failed, as a string. - context: InferenceContext object. - """ - - def __init__( - self, - message: str = "{attribute!r} not found on {target!r}.", - attribute: str = "", - target: nodes.NodeNG | bases.BaseInstance | None = None, - context: InferenceContext | None = None, - mros: list[nodes.ClassDef] | None = None, - super_: nodes.ClassDef | None = None, - cls: nodes.ClassDef | None = None, - **kws: Any, - ) -> None: - self.attribute = attribute - self.target = target - self.context = context - self.mros = mros - self.super_ = super_ - self.cls = cls - super().__init__(message, **kws) - - -class UseInferenceDefault(Exception): - """Exception to be raised in custom inference function to indicate that it - should go back to the default behaviour. - """ - - -class _NonDeducibleTypeHierarchy(Exception): - """Raised when is_subtype / is_supertype can't deduce the relation between two - types. - """ - - -class AstroidIndexError(AstroidError): - """Raised when an Indexable / Mapping does not have an index / key.""" - - def __init__( - self, - message: str = "", - node: nodes.NodeNG | bases.Instance | None = None, - index: nodes.Subscript | None = None, - context: InferenceContext | None = None, - **kws: Any, - ) -> None: - self.node = node - self.index = index - self.context = context - super().__init__(message, **kws) - - -class AstroidTypeError(AstroidError): - """Raised when a TypeError would be expected in Python code.""" - - def __init__( - self, - message: str = "", - node: nodes.NodeNG | bases.Instance | None = None, - index: nodes.Subscript | None = None, - context: InferenceContext | None = None, - **kws: Any, - ) -> None: - self.node = node - self.index = index - self.context = context - super().__init__(message, **kws) - - -class AstroidValueError(AstroidError): - """Raised when a ValueError would be expected in Python code.""" - - -class InferenceOverwriteError(AstroidError): - """Raised when an inference tip is overwritten. - - Currently only used for debugging. - """ - - -class ParentMissingError(AstroidError): - """Raised when a node which is expected to have a parent attribute is missing one. - - Standard attributes: - target: The node for which the parent lookup failed. - """ - - def __init__(self, target: nodes.NodeNG) -> None: - self.target = target - super().__init__(message=f"Parent not found on {target!r}.") - - -class StatementMissing(ParentMissingError): - """Raised when a call to node.statement() does not return a node. - - This is because a node in the chain does not have a parent attribute - and therefore does not return a node for statement(). - - Standard attributes: - target: The node for which the parent lookup failed. - """ - - def __init__(self, target: nodes.NodeNG) -> None: - super(ParentMissingError, self).__init__( - message=f"Statement not found on {target!r}" - ) - - -SuperArgumentTypeError = SuperError -UnresolvableName = NameInferenceError -NotFoundError = AttributeInferenceError diff --git a/venv/lib/python3.12/site-packages/astroid/filter_statements.py b/venv/lib/python3.12/site-packages/astroid/filter_statements.py deleted file mode 100644 index a48b6e7..0000000 --- a/venv/lib/python3.12/site-packages/astroid/filter_statements.py +++ /dev/null @@ -1,240 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""_filter_stmts and helper functions. - -This method gets used in LocalsDictnodes.NodeNG._scope_lookup. -It is not considered public. -""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -from astroid import nodes -from astroid.typing import SuccessfulInferenceResult - -if TYPE_CHECKING: - from astroid.nodes import _base_nodes - - -def _get_filtered_node_statements( - base_node: nodes.NodeNG, stmt_nodes: list[nodes.NodeNG] -) -> list[tuple[nodes.NodeNG, _base_nodes.Statement]]: - statements = [(node, node.statement()) for node in stmt_nodes] - # Next we check if we have ExceptHandlers that are parent - # of the underlying variable, in which case the last one survives - if len(statements) > 1 and all( - isinstance(stmt, nodes.ExceptHandler) for _, stmt in statements - ): - statements = [ - (node, stmt) for node, stmt in statements if stmt.parent_of(base_node) - ] - return statements - - -def _is_from_decorator(node) -> bool: - """Return whether the given node is the child of a decorator.""" - return any(isinstance(parent, nodes.Decorators) for parent in node.node_ancestors()) - - -def _get_if_statement_ancestor(node: nodes.NodeNG) -> nodes.If | None: - """Return the first parent node that is an If node (or None).""" - for parent in node.node_ancestors(): - if isinstance(parent, nodes.If): - return parent - return None - - -def _filter_stmts( - base_node: _base_nodes.LookupMixIn, - stmts: list[SuccessfulInferenceResult], - frame: nodes.LocalsDictNodeNG, - offset: int, -) -> list[nodes.NodeNG]: - """Filter the given list of statements to remove ignorable statements. - - If base_node is not a frame itself and the name is found in the inner - frame locals, statements will be filtered to remove ignorable - statements according to base_node's location. - - :param stmts: The statements to filter. - - :param frame: The frame that all of the given statements belong to. - - :param offset: The line offset to filter statements up to. - - :returns: The filtered statements. - """ - # pylint: disable = too-many-branches, too-many-statements - - # if offset == -1, my actual frame is not the inner frame but its parent - # - # class A(B): pass - # - # we need this to resolve B correctly - if offset == -1: - myframe = base_node.frame().parent.frame() - else: - myframe = base_node.frame() - # If the frame of this node is the same as the statement - # of this node, then the node is part of a class or - # a function definition and the frame of this node should be the - # the upper frame, not the frame of the definition. - # For more information why this is important, - # see Pylint issue #295. - # For example, for 'b', the statement is the same - # as the frame / scope: - # - # def test(b=1): - # ... - if base_node.parent and base_node.statement() is myframe and myframe.parent: - myframe = myframe.parent.frame() - - mystmt: _base_nodes.Statement | None = None - if base_node.parent: - mystmt = base_node.statement() - - # line filtering if we are in the same frame - # - # take care node may be missing lineno information (this is the case for - # nodes inserted for living objects) - if myframe is frame and mystmt and mystmt.fromlineno is not None: - assert mystmt.fromlineno is not None, mystmt - mylineno = mystmt.fromlineno + offset - else: - # disabling lineno filtering - mylineno = 0 - - _stmts: list[nodes.NodeNG] = [] - _stmt_parents = [] - statements = _get_filtered_node_statements(base_node, stmts) - for node, stmt in statements: - # line filtering is on and we have reached our location, break - if stmt.fromlineno and stmt.fromlineno > mylineno > 0: - break - # Ignore decorators with the same name as the - # decorated function - # Fixes issue #375 - if mystmt is stmt and _is_from_decorator(base_node): - continue - if node.has_base(base_node): - break - - if isinstance(node, nodes.EmptyNode): - # EmptyNode does not have assign_type(), so just add it and move on - _stmts.append(node) - continue - - assign_type = node.assign_type() - _stmts, done = assign_type._get_filtered_stmts(base_node, node, _stmts, mystmt) - if done: - break - - optional_assign = assign_type.optional_assign - if optional_assign and assign_type.parent_of(base_node): - # we are inside a loop, loop var assignment is hiding previous - # assignment - _stmts = [node] - _stmt_parents = [stmt.parent] - continue - - if isinstance(assign_type, nodes.NamedExpr): - # If the NamedExpr is in an if statement we do some basic control flow inference - if_parent = _get_if_statement_ancestor(assign_type) - if if_parent: - # If the if statement is within another if statement we append the node - # to possible statements - if _get_if_statement_ancestor(if_parent): - optional_assign = False - _stmts.append(node) - _stmt_parents.append(stmt.parent) - # Else we assume that it will be evaluated - else: - _stmts = [node] - _stmt_parents = [stmt.parent] - else: - _stmts = [node] - _stmt_parents = [stmt.parent] - - # XXX comment various branches below!!! - try: - pindex = _stmt_parents.index(stmt.parent) - except ValueError: - pass - else: - # we got a parent index, this means the currently visited node - # is at the same block level as a previously visited node - if _stmts[pindex].assign_type().parent_of(assign_type): - # both statements are not at the same block level - continue - # if currently visited node is following previously considered - # assignment and both are not exclusive, we can drop the - # previous one. For instance in the following code :: - # - # if a: - # x = 1 - # else: - # x = 2 - # print x - # - # we can't remove neither x = 1 nor x = 2 when looking for 'x' - # of 'print x'; while in the following :: - # - # x = 1 - # x = 2 - # print x - # - # we can remove x = 1 when we see x = 2 - # - # moreover, on loop assignment types, assignment won't - # necessarily be done if the loop has no iteration, so we don't - # want to clear previous assignments if any (hence the test on - # optional_assign) - if not (optional_assign or nodes.are_exclusive(_stmts[pindex], node)): - del _stmt_parents[pindex] - del _stmts[pindex] - - # If base_node and node are exclusive, then we can ignore node - if nodes.are_exclusive(base_node, node): - continue - - # An AssignName node overrides previous assignments if: - # 1. node's statement always assigns - # 2. node and base_node are in the same block (i.e., has the same parent as base_node) - if isinstance(node, (nodes.NamedExpr, nodes.AssignName)): - if isinstance(stmt, nodes.ExceptHandler): - # If node's statement is an ExceptHandler, then it is the variable - # bound to the caught exception. If base_node is not contained within - # the exception handler block, node should override previous assignments; - # otherwise, node should be ignored, as an exception variable - # is local to the handler block. - if stmt.parent_of(base_node): - _stmts = [] - _stmt_parents = [] - else: - continue - elif not optional_assign and mystmt and stmt.parent is mystmt.parent: - _stmts = [] - _stmt_parents = [] - elif isinstance(node, nodes.DelName): - # Remove all previously stored assignments - _stmts = [] - _stmt_parents = [] - continue - # Add the new assignment - _stmts.append(node) - if isinstance(node, nodes.Arguments) or isinstance( - node.parent, nodes.Arguments - ): - # Special case for _stmt_parents when node is a function parameter; - # in this case, stmt is the enclosing FunctionDef, which is what we - # want to add to _stmt_parents, not stmt.parent. This case occurs when - # node is an Arguments node (representing varargs or kwargs parameter), - # and when node.parent is an Arguments node (other parameters). - # See issue #180. - _stmt_parents.append(stmt) - else: - _stmt_parents.append(stmt.parent) - return _stmts diff --git a/venv/lib/python3.12/site-packages/astroid/helpers.py b/venv/lib/python3.12/site-packages/astroid/helpers.py deleted file mode 100644 index 9c370aa..0000000 --- a/venv/lib/python3.12/site-packages/astroid/helpers.py +++ /dev/null @@ -1,335 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Various helper utilities.""" - -from __future__ import annotations - -import warnings -from collections.abc import Generator - -from astroid import bases, manager, nodes, objects, raw_building, util -from astroid.context import CallContext, InferenceContext -from astroid.exceptions import ( - AstroidTypeError, - AttributeInferenceError, - InferenceError, - MroError, - _NonDeducibleTypeHierarchy, -) -from astroid.nodes import scoped_nodes -from astroid.typing import InferenceResult -from astroid.util import safe_infer as real_safe_infer - - -def safe_infer( - node: nodes.NodeNG | bases.Proxy | util.UninferableBase, - context: InferenceContext | None = None, -) -> InferenceResult | None: - # When removing, also remove the real_safe_infer alias - warnings.warn( - "Import safe_infer from astroid.util; this shim in astroid.helpers will be removed.", - DeprecationWarning, - stacklevel=2, - ) - return real_safe_infer(node, context=context) - - -def _build_proxy_class(cls_name: str, builtins: nodes.Module) -> nodes.ClassDef: - proxy = raw_building.build_class(cls_name, builtins) - return proxy - - -def _function_type( - function: nodes.Lambda | nodes.FunctionDef | bases.UnboundMethod, - builtins: nodes.Module, -) -> nodes.ClassDef: - if isinstance(function, (scoped_nodes.Lambda, scoped_nodes.FunctionDef)): - if function.root().name == "builtins": - cls_name = "builtin_function_or_method" - else: - cls_name = "function" - elif isinstance(function, bases.BoundMethod): - cls_name = "method" - else: - cls_name = "function" - return _build_proxy_class(cls_name, builtins) - - -def _object_type( - node: InferenceResult, context: InferenceContext | None = None -) -> Generator[InferenceResult | None]: - astroid_manager = manager.AstroidManager() - builtins = astroid_manager.builtins_module - context = context or InferenceContext() - - for inferred in node.infer(context=context): - if isinstance(inferred, scoped_nodes.ClassDef): - metaclass = inferred.metaclass(context=context) - if metaclass: - yield metaclass - continue - yield builtins.getattr("type")[0] - elif isinstance( - inferred, - (scoped_nodes.Lambda, bases.UnboundMethod, scoped_nodes.FunctionDef), - ): - yield _function_type(inferred, builtins) - elif isinstance(inferred, scoped_nodes.Module): - yield _build_proxy_class("module", builtins) - elif isinstance(inferred, nodes.Unknown): - raise InferenceError - elif isinstance(inferred, util.UninferableBase): - yield inferred - elif isinstance(inferred, (bases.Proxy, nodes.Slice, objects.Super)): - yield inferred._proxied - else: # pragma: no cover - raise AssertionError(f"We don't handle {type(inferred)} currently") - - -def object_type( - node: InferenceResult, context: InferenceContext | None = None -) -> InferenceResult | None: - """Obtain the type of the given node. - - This is used to implement the ``type`` builtin, which means that it's - used for inferring type calls, as well as used in a couple of other places - in the inference. - The node will be inferred first, so this function can support all - sorts of objects, as long as they support inference. - """ - - try: - types = set(_object_type(node, context)) - except InferenceError: - return util.Uninferable - if len(types) != 1: - return util.Uninferable - return next(iter(types)) - - -def _object_type_is_subclass( - obj_type: InferenceResult | None, - class_or_seq: list[InferenceResult], - context: InferenceContext | None = None, -) -> util.UninferableBase | bool: - if isinstance(obj_type, util.UninferableBase) or not isinstance( - obj_type, nodes.ClassDef - ): - return util.Uninferable - - # Instances are not types - class_seq = [ - item if not isinstance(item, bases.Instance) else util.Uninferable - for item in class_or_seq - ] - # strict compatibility with issubclass - # issubclass(type, (object, 1)) evaluates to true - # issubclass(object, (1, type)) raises TypeError - for klass in class_seq: - if isinstance(klass, util.UninferableBase): - raise AstroidTypeError( - f"arg 2 must be a type or tuple of types, not {type(klass)!r}" - ) - - for obj_subclass in obj_type.mro(): - if obj_subclass == klass: - return True - return False - - -def object_isinstance( - node: InferenceResult, - class_or_seq: list[InferenceResult], - context: InferenceContext | None = None, -) -> util.UninferableBase | bool: - """Check if a node 'isinstance' any node in class_or_seq. - - :raises AstroidTypeError: if the given ``classes_or_seq`` are not types - """ - obj_type = object_type(node, context) - if isinstance(obj_type, util.UninferableBase): - return util.Uninferable - return _object_type_is_subclass(obj_type, class_or_seq, context=context) - - -def object_issubclass( - node: nodes.NodeNG, - class_or_seq: list[InferenceResult], - context: InferenceContext | None = None, -) -> util.UninferableBase | bool: - """Check if a type is a subclass of any node in class_or_seq. - - :raises AstroidTypeError: if the given ``classes_or_seq`` are not types - :raises AstroidError: if the type of the given node cannot be inferred - or its type's mro doesn't work - """ - if not isinstance(node, nodes.ClassDef): - raise TypeError(f"{node} needs to be a ClassDef node, not {type(node)!r}") - return _object_type_is_subclass(node, class_or_seq, context=context) - - -def has_known_bases(klass, context: InferenceContext | None = None) -> bool: - """Return whether all base classes of a class could be inferred.""" - try: - return klass._all_bases_known - except AttributeError: - pass - for base in klass.bases: - result = real_safe_infer(base, context=context) - # TODO: check for A->B->A->B pattern in class structure too? - if ( - not isinstance(result, scoped_nodes.ClassDef) - or result is klass - or not has_known_bases(result, context=context) - ): - klass._all_bases_known = False - return False - klass._all_bases_known = True - return True - - -def _type_check(type1, type2) -> bool: - if not all(map(has_known_bases, (type1, type2))): - raise _NonDeducibleTypeHierarchy - - try: - return type1 in type2.mro()[:-1] - except MroError as e: - # The MRO is invalid. - raise _NonDeducibleTypeHierarchy from e - - -def is_subtype(type1, type2) -> bool: - """Check if *type1* is a subtype of *type2*.""" - return _type_check(type1=type2, type2=type1) - - -def is_supertype(type1, type2) -> bool: - """Check if *type2* is a supertype of *type1*.""" - return _type_check(type1, type2) - - -def class_instance_as_index(node: bases.Instance) -> nodes.Const | None: - """Get the value as an index for the given instance. - - If an instance provides an __index__ method, then it can - be used in some scenarios where an integer is expected, - for instance when multiplying or subscripting a list. - """ - context = InferenceContext() - try: - for inferred in node.igetattr("__index__", context=context): - if not isinstance(inferred, bases.BoundMethod): - continue - - context.boundnode = node - context.callcontext = CallContext(args=[], callee=inferred) - for result in inferred.infer_call_result(node, context=context): - if isinstance(result, nodes.Const) and isinstance(result.value, int): - return result - except InferenceError: - pass - return None - - -def object_len(node, context: InferenceContext | None = None): - """Infer length of given node object. - - :param Union[nodes.ClassDef, nodes.Instance] node: - :param node: Node to infer length of - - :raises AstroidTypeError: If an invalid node is returned - from __len__ method or no __len__ method exists - :raises InferenceError: If the given node cannot be inferred - or if multiple nodes are inferred or if the code executed in python - would result in a infinite recursive check for length - :rtype int: Integer length of node - """ - # pylint: disable=import-outside-toplevel; circular import - from astroid.objects import FrozenSet - - inferred_node = real_safe_infer(node, context=context) - - # prevent self referential length calls from causing a recursion error - # see https://github.com/pylint-dev/astroid/issues/777 - node_frame = node.frame() - if ( - isinstance(node_frame, scoped_nodes.FunctionDef) - and node_frame.name == "__len__" - and isinstance(inferred_node, bases.Proxy) - and inferred_node._proxied == node_frame.parent - ): - message = ( - "Self referential __len__ function will " - "cause a RecursionError on line {} of {}".format( - node.lineno, node.root().file - ) - ) - raise InferenceError(message) - - if inferred_node is None or isinstance(inferred_node, util.UninferableBase): - raise InferenceError(node=node) - if isinstance(inferred_node, nodes.Const) and isinstance( - inferred_node.value, (bytes, str) - ): - return len(inferred_node.value) - if isinstance(inferred_node, (nodes.List, nodes.Set, nodes.Tuple, FrozenSet)): - return len(inferred_node.elts) - if isinstance(inferred_node, nodes.Dict): - return len(inferred_node.items) - - node_type = object_type(inferred_node, context=context) - if not node_type: - raise InferenceError(node=node) - - try: - len_call = next(node_type.igetattr("__len__", context=context)) - except StopIteration as e: - raise AstroidTypeError(str(e)) from e - except AttributeInferenceError as e: - raise AstroidTypeError( - f"object of type '{node_type.pytype()}' has no len()" - ) from e - - inferred = len_call.infer_call_result(node, context) - if isinstance(inferred, util.UninferableBase): - raise InferenceError(node=node, context=context) - result_of_len = next(inferred, None) - if ( - isinstance(result_of_len, nodes.Const) - and result_of_len.pytype() == "builtins.int" - ): - return result_of_len.value - if result_of_len is None or ( - isinstance(result_of_len, bases.Instance) - and result_of_len.is_subtype_of("builtins.int") - ): - # Fake a result as we don't know the arguments of the instance call. - return 0 - raise AstroidTypeError( - f"'{result_of_len}' object cannot be interpreted as an integer" - ) - - -def _higher_function_scope(node: nodes.NodeNG) -> nodes.FunctionDef | None: - """Search for the first function which encloses the given - scope. - - This can be used for looking up in that function's - scope, in case looking up in a lower scope for a particular - name fails. - - :param node: A scope node. - :returns: - ``None``, if no parent function scope was found, - otherwise an instance of :class:`astroid.nodes.scoped_nodes.Function`, - which encloses the given node. - """ - current = node - while current.parent and not isinstance(current.parent, nodes.FunctionDef): - current = current.parent - if current and current.parent: - return current.parent - return None diff --git a/venv/lib/python3.12/site-packages/astroid/inference_tip.py b/venv/lib/python3.12/site-packages/astroid/inference_tip.py deleted file mode 100644 index c3187c0..0000000 --- a/venv/lib/python3.12/site-packages/astroid/inference_tip.py +++ /dev/null @@ -1,130 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Transform utilities (filters and decorator).""" - -from __future__ import annotations - -from collections import OrderedDict -from collections.abc import Generator -from typing import Any, TypeVar - -from astroid.context import InferenceContext -from astroid.exceptions import InferenceOverwriteError, UseInferenceDefault -from astroid.nodes import NodeNG -from astroid.typing import ( - InferenceResult, - InferFn, - TransformFn, -) - -_cache: OrderedDict[ - tuple[InferFn[Any], NodeNG, InferenceContext | None], list[InferenceResult] -] = OrderedDict() - -_CURRENTLY_INFERRING: set[tuple[InferFn[Any], NodeNG]] = set() - -_NodesT = TypeVar("_NodesT", bound=NodeNG) - - -def clear_inference_tip_cache() -> None: - """Clear the inference tips cache.""" - _cache.clear() - - -def _inference_tip_cached(func: InferFn[_NodesT]) -> InferFn[_NodesT]: - """Cache decorator used for inference tips.""" - - def inner( - node: _NodesT, - context: InferenceContext | None = None, - **kwargs: Any, - ) -> Generator[InferenceResult]: - partial_cache_key = (func, node) - if partial_cache_key in _CURRENTLY_INFERRING: - # If through recursion we end up trying to infer the same - # func + node we raise here. - _CURRENTLY_INFERRING.remove(partial_cache_key) - raise UseInferenceDefault - if context is not None and context.is_empty(): - # Fresh, empty contexts will defeat the cache. - context = None - try: - yield from _cache[func, node, context] - return - except KeyError: - # Recursion guard with a partial cache key. - # Using the full key causes a recursion error on PyPy. - # It's a pragmatic compromise to avoid so much recursive inference - # with slightly different contexts while still passing the simple - # test cases included with this commit. - _CURRENTLY_INFERRING.add(partial_cache_key) - try: - # May raise UseInferenceDefault - result = _cache[func, node, context] = list( - func(node, context, **kwargs) - ) - except Exception as e: - # Suppress the KeyError from the cache miss. - raise e from None - finally: - # Remove recursion guard. - try: - _CURRENTLY_INFERRING.remove(partial_cache_key) - except KeyError: - pass # Recursion may beat us to the punch. - - if len(_cache) > 64: - _cache.popitem(last=False) - - # https://github.com/pylint-dev/pylint/issues/8686 - yield from result # pylint: disable=used-before-assignment - - return inner - - -def inference_tip( - infer_function: InferFn[_NodesT], raise_on_overwrite: bool = False -) -> TransformFn[_NodesT]: - """Given an instance specific inference function, return a function to be - given to AstroidManager().register_transform to set this inference function. - - :param bool raise_on_overwrite: Raise an `InferenceOverwriteError` - if the inference tip will overwrite another. Used for debugging - - Typical usage - - .. sourcecode:: python - - AstroidManager().register_transform(Call, inference_tip(infer_named_tuple), - predicate) - - .. Note:: - - Using an inference tip will override - any previously set inference tip for the given - node. Use a predicate in the transform to prevent - excess overwrites. - """ - - def transform( - node: _NodesT, infer_function: InferFn[_NodesT] = infer_function - ) -> _NodesT: - if ( - raise_on_overwrite - and node._explicit_inference is not None - and node._explicit_inference is not infer_function - ): - raise InferenceOverwriteError( - "Inference already set to {existing_inference}. " - "Trying to overwrite with {new_inference} for {node}".format( - existing_inference=infer_function, - new_inference=node._explicit_inference, - node=node, - ) - ) - node._explicit_inference = _inference_tip_cached(infer_function) - return node - - return transform diff --git a/venv/lib/python3.12/site-packages/astroid/interpreter/__init__.py b/venv/lib/python3.12/site-packages/astroid/interpreter/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/astroid/interpreter/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/interpreter/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 5469919..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/interpreter/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/interpreter/__pycache__/dunder_lookup.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/interpreter/__pycache__/dunder_lookup.cpython-312.pyc deleted file mode 100644 index f55919c..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/interpreter/__pycache__/dunder_lookup.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/interpreter/__pycache__/objectmodel.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/interpreter/__pycache__/objectmodel.cpython-312.pyc deleted file mode 100644 index c45f6a4..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/interpreter/__pycache__/objectmodel.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/interpreter/_import/__init__.py b/venv/lib/python3.12/site-packages/astroid/interpreter/_import/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/astroid/interpreter/_import/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/interpreter/_import/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 739b94b..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/interpreter/_import/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/interpreter/_import/__pycache__/spec.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/interpreter/_import/__pycache__/spec.cpython-312.pyc deleted file mode 100644 index f930d16..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/interpreter/_import/__pycache__/spec.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/interpreter/_import/__pycache__/util.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/interpreter/_import/__pycache__/util.cpython-312.pyc deleted file mode 100644 index 0d8d723..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/interpreter/_import/__pycache__/util.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/interpreter/_import/spec.py b/venv/lib/python3.12/site-packages/astroid/interpreter/_import/spec.py deleted file mode 100644 index af7c55b..0000000 --- a/venv/lib/python3.12/site-packages/astroid/interpreter/_import/spec.py +++ /dev/null @@ -1,496 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from __future__ import annotations - -import abc -import enum -import importlib -import importlib.machinery -import importlib.util -import os -import pathlib -import sys -import types -import warnings -import zipimport -from collections.abc import Iterable, Iterator, Sequence -from functools import lru_cache -from pathlib import Path -from typing import Literal, NamedTuple, Protocol - -from . import util - - -# The MetaPathFinder protocol comes from typeshed, which says: -# Intentionally omits one deprecated and one optional method of `importlib.abc.MetaPathFinder` -class _MetaPathFinder(Protocol): - def find_spec( - self, - fullname: str, - path: Sequence[str] | None, - target: types.ModuleType | None = ..., - ) -> importlib.machinery.ModuleSpec | None: ... # pragma: no cover - - -class ModuleType(enum.Enum): - """Python module types used for ModuleSpec.""" - - C_BUILTIN = enum.auto() - C_EXTENSION = enum.auto() - PKG_DIRECTORY = enum.auto() - PY_CODERESOURCE = enum.auto() - PY_COMPILED = enum.auto() - PY_FROZEN = enum.auto() - PY_RESOURCE = enum.auto() - PY_SOURCE = enum.auto() - PY_ZIPMODULE = enum.auto() - PY_NAMESPACE = enum.auto() - - -_MetaPathFinderModuleTypes: dict[str, ModuleType] = { - # Finders created by setuptools editable installs - "_EditableFinder": ModuleType.PY_SOURCE, - "_EditableNamespaceFinder": ModuleType.PY_NAMESPACE, - # Finders create by six - "_SixMetaPathImporter": ModuleType.PY_SOURCE, -} - -_EditableFinderClasses: set[str] = { - "_EditableFinder", - "_EditableNamespaceFinder", -} - - -class ModuleSpec(NamedTuple): - """Defines a class similar to PEP 420's ModuleSpec. - - A module spec defines a name of a module, its type, location - and where submodules can be found, if the module is a package. - """ - - name: str - type: ModuleType | None - location: str | None = None - origin: str | None = None - submodule_search_locations: Sequence[str] | None = None - - -class Finder: - """A finder is a class which knows how to find a particular module.""" - - def __init__(self, path: Sequence[str] | None = None) -> None: - self._path = path or sys.path - - @staticmethod - @abc.abstractmethod - def find_module( - modname: str, - module_parts: tuple[str, ...], - processed: tuple[str, ...], - submodule_path: tuple[str, ...] | None, - ) -> ModuleSpec | None: - """Find the given module. - - Each finder is responsible for each protocol of finding, as long as - they all return a ModuleSpec. - - :param modname: The module which needs to be searched. - :param module_parts: It should be a tuple of strings, - where each part contributes to the module's - namespace. - :param processed: What parts from the module parts were processed - so far. - :param submodule_path: A tuple of paths where the module - can be looked into. - :returns: A ModuleSpec, describing how and where the module was found, - None, otherwise. - """ - - def contribute_to_path( - self, spec: ModuleSpec, processed: list[str] - ) -> Sequence[str] | None: - """Get a list of extra paths where this finder can search.""" - - -class ImportlibFinder(Finder): - """A finder based on the importlib module.""" - - _SUFFIXES: Sequence[tuple[str, ModuleType]] = ( - [(s, ModuleType.C_EXTENSION) for s in importlib.machinery.EXTENSION_SUFFIXES] - + [(s, ModuleType.PY_SOURCE) for s in importlib.machinery.SOURCE_SUFFIXES] - + [(s, ModuleType.PY_COMPILED) for s in importlib.machinery.BYTECODE_SUFFIXES] - ) - - @staticmethod - @lru_cache(maxsize=1024) - def find_module( - modname: str, - module_parts: tuple[str, ...], - processed: tuple[str, ...], - submodule_path: tuple[str, ...] | None, - ) -> ModuleSpec | None: - # pylint: disable-next=import-outside-toplevel - from astroid.modutils import cached_os_path_isfile - - # Although we should be able to use `find_spec` this doesn't work on PyPy for builtins. - # Therefore, we use the `builtin_module_nams` heuristic for these. - if submodule_path is None and modname in sys.builtin_module_names: - return ModuleSpec( - name=modname, - location=None, - type=ModuleType.C_BUILTIN, - ) - - if submodule_path is not None: - search_paths = list(submodule_path) - else: - search_paths = sys.path - - suffixes = (".py", ".pyi", importlib.machinery.BYTECODE_SUFFIXES[0]) - for entry in search_paths: - package_directory = os.path.join(entry, modname) - for suffix in suffixes: - package_file_name = "__init__" + suffix - file_path = os.path.join(package_directory, package_file_name) - if cached_os_path_isfile(file_path): - return ModuleSpec( - name=modname, - location=package_directory, - type=ModuleType.PKG_DIRECTORY, - ) - for suffix, type_ in ImportlibFinder._SUFFIXES: - file_name = modname + suffix - file_path = os.path.join(entry, file_name) - if cached_os_path_isfile(file_path): - return ModuleSpec(name=modname, location=file_path, type=type_) - - # If the module name matches a stdlib module name, check whether this is a frozen - # module. Note that `find_spec` actually imports parent modules, so we want to make - # sure we only run this code for stuff that can be expected to be frozen. For now - # this is only stdlib. - if (modname in sys.stdlib_module_names and not processed) or ( - processed and processed[0] in sys.stdlib_module_names - ): - try: - with warnings.catch_warnings(): - warnings.filterwarnings("ignore", category=Warning) - spec = importlib.util.find_spec(".".join((*processed, modname))) - except ValueError: - spec = None - - if ( - spec - and spec.loader # type: ignore[comparison-overlap] # noqa: E501 - is importlib.machinery.FrozenImporter - ): - return ModuleSpec( - name=modname, - location=getattr(spec.loader_state, "filename", None), - type=ModuleType.PY_FROZEN, - ) - - return None - - def contribute_to_path( - self, spec: ModuleSpec, processed: list[str] - ) -> Sequence[str] | None: - if spec.location is None: - # Builtin. - return None - # pylint: disable-next=import-outside-toplevel - from astroid.modutils import EXT_LIB_DIRS - - if _is_setuptools_namespace(Path(spec.location)): - # extend_path is called, search sys.path for module/packages - # of this name see pkgutil.extend_path documentation - path = [ - os.path.join(p, *processed) - for p in sys.path - if os.path.isdir(os.path.join(p, *processed)) - ] - elif spec.name == "distutils" and not any( - spec.location.lower().startswith(ext_lib_dir.lower()) - for ext_lib_dir in EXT_LIB_DIRS - ): - # virtualenv below 20.0 patches distutils in an unexpected way - # so we just find the location of distutils that will be - # imported to avoid spurious import-error messages - # https://github.com/pylint-dev/pylint/issues/5645 - # A regression test to create this scenario exists in release-tests.yml - # and can be triggered manually from GitHub Actions - distutils_spec = importlib.util.find_spec("distutils") - if distutils_spec and distutils_spec.origin: - origin_path = Path( - distutils_spec.origin - ) # e.g. .../distutils/__init__.py - path = [str(origin_path.parent)] # e.g. .../distutils - else: - path = [spec.location] - else: - path = [spec.location] - return path - - -class ExplicitNamespacePackageFinder(ImportlibFinder): - """A finder for the explicit namespace packages.""" - - @staticmethod - @lru_cache(maxsize=1024) - def find_module( - modname: str, - module_parts: tuple[str, ...], - processed: tuple[str, ...], - submodule_path: tuple[str, ...] | None, - ) -> ModuleSpec | None: - if processed: - modname = ".".join([*processed, modname]) - if util.is_namespace(modname) and modname in sys.modules: - return ModuleSpec( - name=modname, - location="", - origin="namespace", - type=ModuleType.PY_NAMESPACE, - submodule_search_locations=sys.modules[modname].__path__, - ) - return None - - def contribute_to_path( - self, spec: ModuleSpec, processed: list[str] - ) -> Sequence[str] | None: - return spec.submodule_search_locations - - -class ZipFinder(Finder): - """Finder that knows how to find a module inside zip files.""" - - def __init__(self, path: Sequence[str]) -> None: - super().__init__(path) - for entry_path in path: - if entry_path not in sys.path_importer_cache: - try: - sys.path_importer_cache[entry_path] = zipimport.zipimporter( - entry_path - ) - except zipimport.ZipImportError: - continue - - @staticmethod - @lru_cache(maxsize=1024) - def find_module( - modname: str, - module_parts: tuple[str, ...], - processed: tuple[str, ...], - submodule_path: tuple[str, ...] | None, - ) -> ModuleSpec | None: - try: - file_type, filename, path = _search_zip(module_parts) - except ImportError: - return None - - return ModuleSpec( - name=modname, - location=filename, - origin="egg", - type=file_type, - submodule_search_locations=path, - ) - - def contribute_to_path( - self, spec: ModuleSpec, processed: list[str] - ) -> Sequence[str] | None: - return spec.submodule_search_locations - - -class PathSpecFinder(Finder): - """Finder based on importlib.machinery.PathFinder.""" - - @staticmethod - @lru_cache(maxsize=1024) - def find_module( - modname: str, - module_parts: tuple[str, ...], - processed: tuple[str, ...], - submodule_path: tuple[str, ...] | None, - ) -> ModuleSpec | None: - spec = importlib.machinery.PathFinder.find_spec(modname, path=submodule_path) - if spec is not None: - is_namespace_pkg = spec.origin is None - location = spec.origin if not is_namespace_pkg else None - module_type = ModuleType.PY_NAMESPACE if is_namespace_pkg else None - return ModuleSpec( - name=spec.name, - location=location, - origin=spec.origin, - type=module_type, - submodule_search_locations=list(spec.submodule_search_locations or []), - ) - return spec - - def contribute_to_path( - self, spec: ModuleSpec, processed: list[str] - ) -> Sequence[str] | None: - if spec.type == ModuleType.PY_NAMESPACE: - return spec.submodule_search_locations - return None - - -_SPEC_FINDERS = ( - ImportlibFinder, - ZipFinder, - PathSpecFinder, - ExplicitNamespacePackageFinder, -) - - -@lru_cache(maxsize=1024) -def _is_setuptools_namespace(location: pathlib.Path) -> bool: - try: - with open(location / "__init__.py", "rb") as stream: - data = stream.read(4096) - except OSError: - return False - extend_path = b"pkgutil" in data and b"extend_path" in data - declare_namespace = ( - b"pkg_resources" in data and b"declare_namespace(__name__)" in data - ) - return extend_path or declare_namespace - - -def _get_zipimporters() -> Iterator[tuple[str, zipimport.zipimporter]]: - for filepath, importer in sys.path_importer_cache.items(): - if importer is not None and isinstance(importer, zipimport.zipimporter): - yield filepath, importer - - -def _search_zip( - modpath: tuple[str, ...], -) -> tuple[Literal[ModuleType.PY_ZIPMODULE], str, str]: - for filepath, importer in _get_zipimporters(): - found = importer.find_spec(modpath[0]) - if found: - if not importer.find_spec(os.path.sep.join(modpath)): - raise ImportError( - "No module named {} in {}/{}".format( - ".".join(modpath[1:]), filepath, modpath - ) - ) - return ( - ModuleType.PY_ZIPMODULE, - os.path.abspath(filepath) + os.path.sep + os.path.sep.join(modpath), - filepath, - ) - raise ImportError(f"No module named {'.'.join(modpath)}") - - -def _find_spec_with_path( - search_path: Sequence[str], - modname: str, - module_parts: tuple[str, ...], - processed: tuple[str, ...], - submodule_path: tuple[str, ...] | None, -) -> tuple[Finder | _MetaPathFinder, ModuleSpec]: - for finder in _SPEC_FINDERS: - finder_instance = finder(search_path) - mod_spec = finder.find_module(modname, module_parts, processed, submodule_path) - if mod_spec is None: - continue - return finder_instance, mod_spec - - # Support for custom finders - for meta_finder in sys.meta_path: - # See if we support the customer import hook of the meta_finder - meta_finder_name = meta_finder.__class__.__name__ - if meta_finder_name not in _MetaPathFinderModuleTypes: - # Setuptools>62 creates its EditableFinders dynamically and have - # "type" as their __class__.__name__. We check __name__ as well - # to see if we can support the finder. - try: - meta_finder_name = meta_finder.__name__ # type: ignore[attr-defined] - except AttributeError: - continue - if meta_finder_name not in _MetaPathFinderModuleTypes: - continue - - module_type = _MetaPathFinderModuleTypes[meta_finder_name] - - # Meta path finders are supposed to have a find_spec method since - # Python 3.4. However, some third-party finders do not implement it. - # PEP302 does not refer to find_spec as well. - # See: https://github.com/pylint-dev/astroid/pull/1752/ - if not hasattr(meta_finder, "find_spec"): - continue - - spec = meta_finder.find_spec(modname, submodule_path) - if spec: - return ( - meta_finder, - ModuleSpec( - spec.name, - module_type, - spec.origin, - spec.origin, - spec.submodule_search_locations, - ), - ) - - raise ImportError(f"No module named {'.'.join(module_parts)}") - - -def find_spec(modpath: Iterable[str], path: Iterable[str] | None = None) -> ModuleSpec: - """Find a spec for the given module. - - :type modpath: list or tuple - :param modpath: - split module's name (i.e name of a module or package split - on '.'), with leading empty strings for explicit relative import - - :type path: list or None - :param path: - optional list of path where the module or package should be - searched (use sys.path if nothing or None is given) - - :rtype: ModuleSpec - :return: A module spec, which describes how the module was - found and where. - """ - return _find_spec(tuple(modpath), tuple(path) if path else None) - - -@lru_cache(maxsize=1024) -def _find_spec( - module_path: tuple[str, ...], path: tuple[str, ...] | None -) -> ModuleSpec: - _path = path or sys.path - - # Need a copy for not mutating the argument. - modpath = list(module_path) - - search_paths = None - processed: list[str] = [] - - while modpath: - modname = modpath.pop(0) - - submodule_path = search_paths or path - if submodule_path is not None: - submodule_path = tuple(submodule_path) - - finder, spec = _find_spec_with_path( - _path, modname, module_path, tuple(processed), submodule_path - ) - processed.append(modname) - if modpath: - if isinstance(finder, Finder): - search_paths = finder.contribute_to_path(spec, processed) - # If modname is a package from an editable install, update search_paths - # so that the next module in the path will be found inside of it using importlib. - # Existence of __name__ is guaranteed by _find_spec_with_path. - elif finder.__name__ in _EditableFinderClasses: # type: ignore[attr-defined] - search_paths = spec.submodule_search_locations - - if spec.type == ModuleType.PKG_DIRECTORY: - spec = spec._replace(submodule_search_locations=search_paths) - - return spec diff --git a/venv/lib/python3.12/site-packages/astroid/interpreter/_import/util.py b/venv/lib/python3.12/site-packages/astroid/interpreter/_import/util.py deleted file mode 100644 index df1aca2..0000000 --- a/venv/lib/python3.12/site-packages/astroid/interpreter/_import/util.py +++ /dev/null @@ -1,114 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from __future__ import annotations - -import pathlib -import sys -from functools import lru_cache -from importlib._bootstrap_external import _NamespacePath # type: ignore[attr-defined] -from importlib.util import _find_spec_from_path # type: ignore[attr-defined] - -from astroid.const import IS_PYPY - -if sys.version_info >= (3, 11): - from importlib.machinery import NamespaceLoader -else: - from importlib._bootstrap_external import _NamespaceLoader as NamespaceLoader - - -@lru_cache(maxsize=4096) -def is_namespace(modname: str) -> bool: - from astroid.modutils import ( # pylint: disable=import-outside-toplevel - EXT_LIB_DIRS, - STD_LIB_DIRS, - ) - - STD_AND_EXT_LIB_DIRS = STD_LIB_DIRS.union(EXT_LIB_DIRS) - - if modname in sys.builtin_module_names: - return False - - found_spec = None - - # find_spec() attempts to import parent packages when given dotted paths. - # That's unacceptable here, so we fallback to _find_spec_from_path(), which does - # not, but requires instead that each single parent ('astroid', 'nodes', etc.) - # be specced from left to right. - processed_components = [] - last_submodule_search_locations: _NamespacePath | None = None - for component in modname.split("."): - processed_components.append(component) - working_modname = ".".join(processed_components) - try: - # Both the modname and the path are built iteratively, with the - # path (e.g. ['a', 'a/b', 'a/b/c']) lagging the modname by one - found_spec = _find_spec_from_path( - working_modname, path=last_submodule_search_locations - ) - except AttributeError: - return False - except ValueError: - if modname == "__main__": - return False - try: - # .pth files will be on sys.modules - # __spec__ is set inconsistently on PyPy so we can't really on the heuristic here - # See: https://foss.heptapod.net/pypy/pypy/-/issues/3736 - # Check first fragment of modname, e.g. "astroid", not "astroid.interpreter" - # because of cffi's behavior - # See: https://github.com/pylint-dev/astroid/issues/1776 - mod = sys.modules[processed_components[0]] - return ( - mod.__spec__ is None - and getattr(mod, "__file__", None) is None - and hasattr(mod, "__path__") - and not IS_PYPY - ) - except KeyError: - return False - except AttributeError: - # Workaround for "py" module - # https://github.com/pytest-dev/apipkg/issues/13 - return False - except KeyError: - # Intermediate steps might raise KeyErrors - # https://github.com/python/cpython/issues/93334 - # TODO: update if fixed in importlib - # For tree a > b > c.py - # >>> from importlib.machinery import PathFinder - # >>> PathFinder.find_spec('a.b', ['a']) - # KeyError: 'a' - - # Repair last_submodule_search_locations - if last_submodule_search_locations: - last_item = last_submodule_search_locations[-1] - # e.g. for failure example above, add 'a/b' and keep going - # so that find_spec('a.b.c', path=['a', 'a/b']) succeeds - assumed_location = pathlib.Path(last_item) / component - last_submodule_search_locations.append(str(assumed_location)) - continue - - # Update last_submodule_search_locations for next iteration - if found_spec and found_spec.submodule_search_locations: - # But immediately return False if we can detect we are in stdlib - # or external lib (e.g site-packages) - if any( - any( - str(location).startswith(lib_dir) - for lib_dir in STD_AND_EXT_LIB_DIRS - ) - for location in found_spec.submodule_search_locations - ): - return False - last_submodule_search_locations = found_spec.submodule_search_locations - - return ( - found_spec is not None - and found_spec.submodule_search_locations is not None - and found_spec.origin is None - and ( - found_spec.loader is None or isinstance(found_spec.loader, NamespaceLoader) - ) - ) diff --git a/venv/lib/python3.12/site-packages/astroid/interpreter/dunder_lookup.py b/venv/lib/python3.12/site-packages/astroid/interpreter/dunder_lookup.py deleted file mode 100644 index 8eab35c..0000000 --- a/venv/lib/python3.12/site-packages/astroid/interpreter/dunder_lookup.py +++ /dev/null @@ -1,75 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Contains logic for retrieving special methods. - -This implementation does not rely on the dot attribute access -logic, found in ``.getattr()``. The difference between these two -is that the dunder methods are looked with the type slots -(you can find more about these here -http://lucumr.pocoo.org/2014/8/16/the-python-i-would-like-to-see/) -As such, the lookup for the special methods is actually simpler than -the dot attribute access. -""" -from __future__ import annotations - -import itertools -from typing import TYPE_CHECKING - -import astroid -from astroid import nodes -from astroid.exceptions import AttributeInferenceError - -if TYPE_CHECKING: - from astroid.context import InferenceContext - - -def _lookup_in_mro(node, name) -> list: - attrs = node.locals.get(name, []) - - nodes_ = itertools.chain.from_iterable( - ancestor.locals.get(name, []) for ancestor in node.ancestors(recurs=True) - ) - values = list(itertools.chain(attrs, nodes_)) - if not values: - raise AttributeInferenceError(attribute=name, target=node) - - return values - - -def lookup( - node: nodes.NodeNG, name: str, context: InferenceContext | None = None -) -> list: - """Lookup the given special method name in the given *node*. - - If the special method was found, then a list of attributes - will be returned. Otherwise, `astroid.AttributeInferenceError` - is going to be raised. - """ - if isinstance(node, (nodes.List, nodes.Tuple, nodes.Const, nodes.Dict, nodes.Set)): - return _builtin_lookup(node, name) - if isinstance(node, astroid.Instance): - return _lookup_in_mro(node, name) - if isinstance(node, nodes.ClassDef): - return _class_lookup(node, name, context=context) - - raise AttributeInferenceError(attribute=name, target=node) - - -def _class_lookup( - node: nodes.ClassDef, name: str, context: InferenceContext | None = None -) -> list: - metaclass = node.metaclass(context=context) - if metaclass is None: - raise AttributeInferenceError(attribute=name, target=node) - - return _lookup_in_mro(metaclass, name) - - -def _builtin_lookup(node, name) -> list: - values = node.locals.get(name, []) - if not values: - raise AttributeInferenceError(attribute=name, target=node) - - return values diff --git a/venv/lib/python3.12/site-packages/astroid/interpreter/objectmodel.py b/venv/lib/python3.12/site-packages/astroid/interpreter/objectmodel.py deleted file mode 100644 index eac9e43..0000000 --- a/venv/lib/python3.12/site-packages/astroid/interpreter/objectmodel.py +++ /dev/null @@ -1,1013 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -""" -Data object model, as per https://docs.python.org/3/reference/datamodel.html. - -This module describes, at least partially, a data object model for some -of astroid's nodes. The model contains special attributes that nodes such -as functions, classes, modules etc have, such as __doc__, __class__, -__module__ etc, being used when doing attribute lookups over nodes. - -For instance, inferring `obj.__class__` will first trigger an inference -of the `obj` variable. If it was successfully inferred, then an attribute -`__class__ will be looked for in the inferred object. This is the part -where the data model occurs. The model is attached to those nodes -and the lookup mechanism will try to see if attributes such as -`__class__` are defined by the model or not. If they are defined, -the model will be requested to return the corresponding value of that -attribute. Thus the model can be viewed as a special part of the lookup -mechanism. -""" - -from __future__ import annotations - -import itertools -import os -import pprint -import types -from collections.abc import Iterator -from functools import lru_cache -from typing import TYPE_CHECKING, Any, Literal - -import astroid -from astroid import bases, nodes, util -from astroid.context import InferenceContext, copy_context -from astroid.exceptions import AttributeInferenceError, InferenceError, NoDefault -from astroid.manager import AstroidManager -from astroid.nodes import node_classes -from astroid.typing import InferenceResult, SuccessfulInferenceResult - -if TYPE_CHECKING: - from astroid.objects import Property - -IMPL_PREFIX = "attr_" -LEN_OF_IMPL_PREFIX = len(IMPL_PREFIX) - - -def _dunder_dict(instance, attributes): - obj = node_classes.Dict( - parent=instance, - lineno=instance.lineno, - col_offset=instance.col_offset, - end_lineno=instance.end_lineno, - end_col_offset=instance.end_col_offset, - ) - - # Convert the keys to node strings - keys = [ - node_classes.Const(value=value, parent=obj) for value in list(attributes.keys()) - ] - - # The original attribute has a list of elements for each key, - # but that is not useful for retrieving the special attribute's value. - # In this case, we're picking the last value from each list. - values = [elem[-1] for elem in attributes.values()] - - obj.postinit(list(zip(keys, values))) - return obj - - -def _get_bound_node(model: ObjectModel) -> Any: - # TODO: Use isinstance instead of try ... except after _instance has typing - try: - return model._instance._proxied - except AttributeError: - return model._instance - - -class ObjectModel: - def __init__(self): - self._instance = None - - def __repr__(self): - result = [] - cname = type(self).__name__ - string = "%(cname)s(%(fields)s)" - alignment = len(cname) + 1 - for field in sorted(self.attributes()): - width = 80 - len(field) - alignment - lines = pprint.pformat(field, indent=2, width=width).splitlines(True) - - inner = [lines[0]] - for line in lines[1:]: - inner.append(" " * alignment + line) - result.append(field) - - return string % { - "cname": cname, - "fields": (",\n" + " " * alignment).join(result), - } - - def __call__(self, instance): - self._instance = instance - return self - - def __get__(self, instance, cls=None): - # ObjectModel needs to be a descriptor so that just doing - # `special_attributes = SomeObjectModel` should be enough in the body of a node. - # But at the same time, node.special_attributes should return an object - # which can be used for manipulating the special attributes. That's the reason - # we pass the instance through which it got accessed to ObjectModel.__call__, - # returning itself afterwards, so we can still have access to the - # underlying data model and to the instance for which it got accessed. - return self(instance) - - def __contains__(self, name) -> bool: - return name in self.attributes() - - @lru_cache # noqa - def attributes(self) -> list[str]: - """Get the attributes which are exported by this object model.""" - return [o[LEN_OF_IMPL_PREFIX:] for o in dir(self) if o.startswith(IMPL_PREFIX)] - - def lookup(self, name): - """Look up the given *name* in the current model. - - It should return an AST or an interpreter object, - but if the name is not found, then an AttributeInferenceError will be raised. - """ - if name in self.attributes(): - return getattr(self, IMPL_PREFIX + name) - raise AttributeInferenceError(target=self._instance, attribute=name) - - @property - def attr___new__(self) -> bases.BoundMethod: - """Calling cls.__new__(type) on an object returns an instance of 'type'.""" - from astroid import builder # pylint: disable=import-outside-toplevel - - node: nodes.FunctionDef = builder.extract_node( - """def __new__(self, cls): return cls()""" - ) - # We set the parent as being the ClassDef of 'object' as that - # triggers correct inference as a call to __new__ in bases.py - node.parent = AstroidManager().builtins_module["object"] - - return bases.BoundMethod(proxy=node, bound=_get_bound_node(self)) - - @property - def attr___init__(self) -> bases.BoundMethod: - """Calling cls.__init__() normally returns None.""" - from astroid import builder # pylint: disable=import-outside-toplevel - - # The *args and **kwargs are necessary not to trigger warnings about missing - # or extra parameters for '__init__' methods we don't infer correctly. - # This BoundMethod is the fallback value for those. - node: nodes.FunctionDef = builder.extract_node( - """def __init__(self, *args, **kwargs): return None""" - ) - # We set the parent as being the ClassDef of 'object' as that - # is where this method originally comes from - node.parent = AstroidManager().builtins_module["object"] - - return bases.BoundMethod(proxy=node, bound=_get_bound_node(self)) - - -class ModuleModel(ObjectModel): - def _builtins(self): - builtins_ast_module = AstroidManager().builtins_module - return builtins_ast_module.special_attributes.lookup("__dict__") - - @property - def attr_builtins(self): - return self._builtins() - - @property - def attr___path__(self): - if not self._instance.package: - raise AttributeInferenceError(target=self._instance, attribute="__path__") - - path_objs = [ - node_classes.Const( - value=( - path if not path.endswith("__init__.py") else os.path.dirname(path) - ), - parent=self._instance, - ) - for path in self._instance.path - ] - - container = node_classes.List(parent=self._instance) - container.postinit(path_objs) - - return container - - @property - def attr___name__(self): - return node_classes.Const(value=self._instance.name, parent=self._instance) - - @property - def attr___doc__(self): - return node_classes.Const( - value=getattr(self._instance.doc_node, "value", None), - parent=self._instance, - ) - - @property - def attr___file__(self): - return node_classes.Const(value=self._instance.file, parent=self._instance) - - @property - def attr___dict__(self): - return _dunder_dict(self._instance, self._instance.globals) - - @property - def attr___package__(self): - if not self._instance.package: - value = "" - else: - value = self._instance.name - - return node_classes.Const(value=value, parent=self._instance) - - # These are related to the Python 3 implementation of the - # import system, - # https://docs.python.org/3/reference/import.html#import-related-module-attributes - - @property - def attr___spec__(self): - # No handling for now. - return node_classes.Unknown(parent=self._instance) - - @property - def attr___loader__(self): - # No handling for now. - return node_classes.Unknown(parent=self._instance) - - @property - def attr___cached__(self): - # No handling for now. - return node_classes.Unknown(parent=self._instance) - - -class FunctionModel(ObjectModel): - @property - def attr___name__(self): - return node_classes.Const(value=self._instance.name, parent=self._instance) - - @property - def attr___doc__(self): - return node_classes.Const( - value=getattr(self._instance.doc_node, "value", None), - parent=self._instance, - ) - - @property - def attr___qualname__(self): - return node_classes.Const(value=self._instance.qname(), parent=self._instance) - - @property - def attr___defaults__(self): - func = self._instance - if not func.args.defaults: - return node_classes.Const(value=None, parent=func) - - defaults_obj = node_classes.Tuple(parent=func) - defaults_obj.postinit(func.args.defaults) - return defaults_obj - - @property - def attr___annotations__(self): - obj = node_classes.Dict( - parent=self._instance, - lineno=self._instance.lineno, - col_offset=self._instance.col_offset, - end_lineno=self._instance.end_lineno, - end_col_offset=self._instance.end_col_offset, - ) - - if not self._instance.returns: - returns = None - else: - returns = self._instance.returns - - args = self._instance.args - pair_annotations = itertools.chain( - zip(args.args or [], args.annotations), - zip(args.kwonlyargs, args.kwonlyargs_annotations), - zip(args.posonlyargs or [], args.posonlyargs_annotations), - ) - - annotations = { - arg.name: annotation for (arg, annotation) in pair_annotations if annotation - } - if args.varargannotation: - annotations[args.vararg] = args.varargannotation - if args.kwargannotation: - annotations[args.kwarg] = args.kwargannotation - if returns: - annotations["return"] = returns - - items = [ - (node_classes.Const(key, parent=obj), value) - for (key, value) in annotations.items() - ] - - obj.postinit(items) - return obj - - @property - def attr___dict__(self): - return node_classes.Dict( - parent=self._instance, - lineno=self._instance.lineno, - col_offset=self._instance.col_offset, - end_lineno=self._instance.end_lineno, - end_col_offset=self._instance.end_col_offset, - ) - - attr___globals__ = attr___dict__ - - @property - def attr___kwdefaults__(self): - def _default_args(args, parent): - for arg in args.kwonlyargs: - try: - default = args.default_value(arg.name) - except NoDefault: - continue - - name = node_classes.Const(arg.name, parent=parent) - yield name, default - - args = self._instance.args - obj = node_classes.Dict( - parent=self._instance, - lineno=self._instance.lineno, - col_offset=self._instance.col_offset, - end_lineno=self._instance.end_lineno, - end_col_offset=self._instance.end_col_offset, - ) - defaults = dict(_default_args(args, obj)) - - obj.postinit(list(defaults.items())) - return obj - - @property - def attr___module__(self): - return node_classes.Const(self._instance.root().qname()) - - @property - def attr___get__(self): - func = self._instance - - class DescriptorBoundMethod(bases.BoundMethod): - """Bound method which knows how to understand calling descriptor - binding. - """ - - def implicit_parameters(self) -> Literal[0]: - # Different than BoundMethod since the signature - # is different. - return 0 - - def infer_call_result( - self, - caller: SuccessfulInferenceResult | None, - context: InferenceContext | None = None, - ) -> Iterator[bases.BoundMethod]: - if len(caller.args) > 2 or len(caller.args) < 1: - raise InferenceError( - "Invalid arguments for descriptor binding", - target=self, - context=context, - ) - - context = copy_context(context) - try: - cls = next(caller.args[0].infer(context=context)) - except StopIteration as e: - raise InferenceError(context=context, node=caller.args[0]) from e - - if isinstance(cls, util.UninferableBase): - raise InferenceError( - "Invalid class inferred", target=self, context=context - ) - - # For some reason func is a Node that the below - # code is not expecting - if isinstance(func, bases.BoundMethod): - yield func - return - - # Rebuild the original value, but with the parent set as the - # class where it will be bound. - new_func = func.__class__( - name=func.name, - lineno=func.lineno, - col_offset=func.col_offset, - parent=func.parent, - end_lineno=func.end_lineno, - end_col_offset=func.end_col_offset, - ) - # pylint: disable=no-member - new_func.postinit( - func.args, - func.body, - func.decorators, - func.returns, - doc_node=func.doc_node, - ) - - # Build a proper bound method that points to our newly built function. - proxy = bases.UnboundMethod(new_func) - yield bases.BoundMethod(proxy=proxy, bound=cls) - - @property - def args(self): - """Overwrite the underlying args to match those of the underlying func. - - Usually the underlying *func* is a function/method, as in: - - def test(self): - pass - - This has only the *self* parameter but when we access test.__get__ - we get a new object which has two parameters, *self* and *type*. - """ - nonlocal func - arguments = nodes.Arguments( - parent=func.args.parent, vararg=None, kwarg=None - ) - - positional_or_keyword_params = func.args.args.copy() - positional_or_keyword_params.append( - nodes.AssignName( - name="type", - lineno=0, - col_offset=0, - parent=arguments, - end_lineno=None, - end_col_offset=None, - ) - ) - - positional_only_params = func.args.posonlyargs.copy() - - arguments.postinit( - args=positional_or_keyword_params, - posonlyargs=positional_only_params, - defaults=[], - kwonlyargs=[], - kw_defaults=[], - annotations=[], - kwonlyargs_annotations=[], - posonlyargs_annotations=[], - ) - return arguments - - return DescriptorBoundMethod(proxy=self._instance, bound=self._instance) - - # These are here just for completion. - @property - def attr___ne__(self): - return node_classes.Unknown(parent=self._instance) - - attr___subclasshook__ = attr___ne__ - attr___str__ = attr___ne__ - attr___sizeof__ = attr___ne__ - attr___setattr___ = attr___ne__ - attr___repr__ = attr___ne__ - attr___reduce__ = attr___ne__ - attr___reduce_ex__ = attr___ne__ - attr___lt__ = attr___ne__ - attr___eq__ = attr___ne__ - attr___gt__ = attr___ne__ - attr___format__ = attr___ne__ - attr___delattr___ = attr___ne__ - attr___getattribute__ = attr___ne__ - attr___hash__ = attr___ne__ - attr___dir__ = attr___ne__ - attr___call__ = attr___ne__ - attr___class__ = attr___ne__ - attr___closure__ = attr___ne__ - attr___code__ = attr___ne__ - - -class ClassModel(ObjectModel): - def __init__(self): - # Add a context so that inferences called from an instance don't recurse endlessly - self.context = InferenceContext() - - super().__init__() - - @property - def attr___annotations__(self) -> node_classes.Unknown: - return node_classes.Unknown(parent=self._instance) - - @property - def attr___module__(self): - return node_classes.Const(self._instance.root().qname()) - - @property - def attr___name__(self): - return node_classes.Const(self._instance.name) - - @property - def attr___qualname__(self): - return node_classes.Const(self._instance.qname()) - - @property - def attr___doc__(self): - return node_classes.Const(getattr(self._instance.doc_node, "value", None)) - - @property - def attr___mro__(self): - mro = self._instance.mro() - obj = node_classes.Tuple(parent=self._instance) - obj.postinit(mro) - return obj - - @property - def attr_mro(self): - other_self = self - - # Cls.mro is a method and we need to return one in order to have a proper inference. - # The method we're returning is capable of inferring the underlying MRO though. - class MroBoundMethod(bases.BoundMethod): - def infer_call_result( - self, - caller: SuccessfulInferenceResult | None, - context: InferenceContext | None = None, - ) -> Iterator[node_classes.Tuple]: - yield other_self.attr___mro__ - - implicit_metaclass = self._instance.implicit_metaclass() - mro_method = implicit_metaclass.locals["mro"][0] - return MroBoundMethod(proxy=mro_method, bound=implicit_metaclass) - - @property - def attr___bases__(self): - obj = node_classes.Tuple() - context = InferenceContext() - elts = list(self._instance._inferred_bases(context)) - obj.postinit(elts=elts) - return obj - - @property - def attr___class__(self): - # pylint: disable=import-outside-toplevel; circular import - from astroid import helpers - - return helpers.object_type(self._instance) - - @property - def attr___subclasses__(self): - """Get the subclasses of the underlying class. - - This looks only in the current module for retrieving the subclasses, - thus it might miss a couple of them. - """ - - qname = self._instance.qname() - root = self._instance.root() - classes = [ - cls - for cls in root.nodes_of_class(nodes.ClassDef) - if cls != self._instance and cls.is_subtype_of(qname, context=self.context) - ] - - obj = node_classes.List(parent=self._instance) - obj.postinit(classes) - - class SubclassesBoundMethod(bases.BoundMethod): - def infer_call_result( - self, - caller: SuccessfulInferenceResult | None, - context: InferenceContext | None = None, - ) -> Iterator[node_classes.List]: - yield obj - - implicit_metaclass = self._instance.implicit_metaclass() - subclasses_method = implicit_metaclass.locals["__subclasses__"][0] - return SubclassesBoundMethod(proxy=subclasses_method, bound=implicit_metaclass) - - @property - def attr___dict__(self): - return node_classes.Dict( - parent=self._instance, - lineno=self._instance.lineno, - col_offset=self._instance.col_offset, - end_lineno=self._instance.end_lineno, - end_col_offset=self._instance.end_col_offset, - ) - - @property - def attr___call__(self): - """Calling a class A() returns an instance of A.""" - return self._instance.instantiate_class() - - -class SuperModel(ObjectModel): - @property - def attr___thisclass__(self): - return self._instance.mro_pointer - - @property - def attr___self_class__(self): - return self._instance._self_class - - @property - def attr___self__(self): - return self._instance.type - - @property - def attr___class__(self): - return self._instance._proxied - - -class UnboundMethodModel(ObjectModel): - @property - def attr___class__(self): - # pylint: disable=import-outside-toplevel; circular import - from astroid import helpers - - return helpers.object_type(self._instance) - - @property - def attr___func__(self): - return self._instance._proxied - - @property - def attr___self__(self): - return node_classes.Const(value=None, parent=self._instance) - - attr_im_func = attr___func__ - attr_im_class = attr___class__ - attr_im_self = attr___self__ - - -class ContextManagerModel(ObjectModel): - """Model for context managers. - - Based on 3.3.9 of the Data Model documentation: - https://docs.python.org/3/reference/datamodel.html#with-statement-context-managers - """ - - @property - def attr___enter__(self) -> bases.BoundMethod: - """Representation of the base implementation of __enter__. - - As per Python documentation: - Enter the runtime context related to this object. The with statement - will bind this method's return value to the target(s) specified in the - as clause of the statement, if any. - """ - from astroid import builder # pylint: disable=import-outside-toplevel - - node: nodes.FunctionDef = builder.extract_node("""def __enter__(self): ...""") - # We set the parent as being the ClassDef of 'object' as that - # is where this method originally comes from - node.parent = AstroidManager().builtins_module["object"] - - return bases.BoundMethod(proxy=node, bound=_get_bound_node(self)) - - @property - def attr___exit__(self) -> bases.BoundMethod: - """Representation of the base implementation of __exit__. - - As per Python documentation: - Exit the runtime context related to this object. The parameters describe the - exception that caused the context to be exited. If the context was exited - without an exception, all three arguments will be None. - """ - from astroid import builder # pylint: disable=import-outside-toplevel - - node: nodes.FunctionDef = builder.extract_node( - """def __exit__(self, exc_type, exc_value, traceback): ...""" - ) - # We set the parent as being the ClassDef of 'object' as that - # is where this method originally comes from - node.parent = AstroidManager().builtins_module["object"] - - return bases.BoundMethod(proxy=node, bound=_get_bound_node(self)) - - -class BoundMethodModel(FunctionModel): - @property - def attr___func__(self): - return self._instance._proxied._proxied - - @property - def attr___self__(self): - return self._instance.bound - - -class GeneratorBaseModel(FunctionModel, ContextManagerModel): - def __init__(self, gen_module: nodes.Module): - super().__init__() - for name, values in gen_module.locals.items(): - method = values[0] - if isinstance(method, nodes.FunctionDef): - method = bases.BoundMethod(method, _get_bound_node(self)) - - def patched(cls, meth=method): - return meth - - setattr(type(self), IMPL_PREFIX + name, property(patched)) - - @property - def attr___name__(self): - return node_classes.Const( - value=self._instance.parent.name, parent=self._instance - ) - - @property - def attr___doc__(self): - return node_classes.Const( - value=getattr(self._instance.parent.doc_node, "value", None), - parent=self._instance, - ) - - -class GeneratorModel(GeneratorBaseModel): - def __init__(self): - super().__init__(AstroidManager().builtins_module["generator"]) - - -class AsyncGeneratorModel(GeneratorBaseModel): - def __init__(self): - super().__init__(AstroidManager().builtins_module["async_generator"]) - - -class InstanceModel(ObjectModel): - @property - def attr___class__(self): - return self._instance._proxied - - @property - def attr___module__(self): - return node_classes.Const(self._instance.root().qname()) - - @property - def attr___doc__(self): - return node_classes.Const(getattr(self._instance.doc_node, "value", None)) - - @property - def attr___dict__(self): - return _dunder_dict(self._instance, self._instance.instance_attrs) - - -# Exception instances - - -class ExceptionInstanceModel(InstanceModel): - @property - def attr_args(self) -> nodes.Tuple: - return nodes.Tuple(parent=self._instance) - - @property - def attr___traceback__(self): - builtins_ast_module = AstroidManager().builtins_module - traceback_type = builtins_ast_module[types.TracebackType.__name__] - return traceback_type.instantiate_class() - - -class SyntaxErrorInstanceModel(ExceptionInstanceModel): - @property - def attr_text(self): - return node_classes.Const("") - - -class GroupExceptionInstanceModel(ExceptionInstanceModel): - @property - def attr_exceptions(self) -> nodes.Tuple: - return node_classes.Tuple(parent=self._instance) - - -class OSErrorInstanceModel(ExceptionInstanceModel): - @property - def attr_filename(self): - return node_classes.Const("") - - @property - def attr_errno(self): - return node_classes.Const(0) - - @property - def attr_strerror(self): - return node_classes.Const("") - - attr_filename2 = attr_filename - - -class ImportErrorInstanceModel(ExceptionInstanceModel): - @property - def attr_name(self): - return node_classes.Const("") - - @property - def attr_path(self): - return node_classes.Const("") - - -class UnicodeDecodeErrorInstanceModel(ExceptionInstanceModel): - @property - def attr_object(self): - return node_classes.Const(b"") - - -BUILTIN_EXCEPTIONS = { - "builtins.SyntaxError": SyntaxErrorInstanceModel, - "builtins.ExceptionGroup": GroupExceptionInstanceModel, - "builtins.ImportError": ImportErrorInstanceModel, - "builtins.UnicodeDecodeError": UnicodeDecodeErrorInstanceModel, - # These are all similar to OSError in terms of attributes - "builtins.OSError": OSErrorInstanceModel, - "builtins.BlockingIOError": OSErrorInstanceModel, - "builtins.BrokenPipeError": OSErrorInstanceModel, - "builtins.ChildProcessError": OSErrorInstanceModel, - "builtins.ConnectionAbortedError": OSErrorInstanceModel, - "builtins.ConnectionError": OSErrorInstanceModel, - "builtins.ConnectionRefusedError": OSErrorInstanceModel, - "builtins.ConnectionResetError": OSErrorInstanceModel, - "builtins.FileExistsError": OSErrorInstanceModel, - "builtins.FileNotFoundError": OSErrorInstanceModel, - "builtins.InterruptedError": OSErrorInstanceModel, - "builtins.IsADirectoryError": OSErrorInstanceModel, - "builtins.NotADirectoryError": OSErrorInstanceModel, - "builtins.PermissionError": OSErrorInstanceModel, - "builtins.ProcessLookupError": OSErrorInstanceModel, - "builtins.TimeoutError": OSErrorInstanceModel, -} - - -class DictModel(ObjectModel): - @property - def attr___class__(self): - return self._instance._proxied - - def _generic_dict_attribute(self, obj, name): - """Generate a bound method that can infer the given *obj*.""" - - class DictMethodBoundMethod(astroid.BoundMethod): - def infer_call_result( - self, - caller: SuccessfulInferenceResult | None, - context: InferenceContext | None = None, - ) -> Iterator[InferenceResult]: - yield obj - - meth = next(self._instance._proxied.igetattr(name), None) - return DictMethodBoundMethod(proxy=meth, bound=self._instance) - - @property - def attr_items(self): - from astroid import objects # pylint: disable=import-outside-toplevel - - elems = [] - obj = node_classes.List(parent=self._instance) - for key, value in self._instance.items: - elem = node_classes.Tuple(parent=obj) - elem.postinit((key, value)) - elems.append(elem) - obj.postinit(elts=elems) - - items_obj = objects.DictItems(obj) - return self._generic_dict_attribute(items_obj, "items") - - @property - def attr_keys(self): - from astroid import objects # pylint: disable=import-outside-toplevel - - keys = [key for (key, _) in self._instance.items] - obj = node_classes.List(parent=self._instance) - obj.postinit(elts=keys) - - keys_obj = objects.DictKeys(obj) - return self._generic_dict_attribute(keys_obj, "keys") - - @property - def attr_values(self): - from astroid import objects # pylint: disable=import-outside-toplevel - - values = [value for (_, value) in self._instance.items] - obj = node_classes.List(parent=self._instance) - obj.postinit(values) - - values_obj = objects.DictValues(obj) - return self._generic_dict_attribute(values_obj, "values") - - -class PropertyModel(ObjectModel): - """Model for a builtin property.""" - - def _init_function(self, name): - function = nodes.FunctionDef( - name=name, - parent=self._instance, - lineno=self._instance.lineno, - col_offset=self._instance.col_offset, - end_lineno=self._instance.end_lineno, - end_col_offset=self._instance.end_col_offset, - ) - - args = nodes.Arguments(parent=function, vararg=None, kwarg=None) - args.postinit( - args=[], - defaults=[], - kwonlyargs=[], - kw_defaults=[], - annotations=[], - posonlyargs=[], - posonlyargs_annotations=[], - kwonlyargs_annotations=[], - ) - - function.postinit(args=args, body=[]) - return function - - @property - def attr_fget(self): - func = self._instance - - class PropertyFuncAccessor(nodes.FunctionDef): - def infer_call_result( - self, - caller: SuccessfulInferenceResult | None, - context: InferenceContext | None = None, - ) -> Iterator[InferenceResult]: - nonlocal func - if caller and len(caller.args) != 1: - raise InferenceError( - "fget() needs a single argument", target=self, context=context - ) - - yield from func.function.infer_call_result( - caller=caller, context=context - ) - - property_accessor = PropertyFuncAccessor( - name="fget", - parent=self._instance, - lineno=self._instance.lineno, - col_offset=self._instance.col_offset, - end_lineno=self._instance.end_lineno, - end_col_offset=self._instance.end_col_offset, - ) - property_accessor.postinit(args=func.args, body=func.body) - return property_accessor - - @property - def attr_fset(self): - func = self._instance - - def find_setter(func: Property) -> nodes.FunctionDef | None: - """ - Given a property, find the corresponding setter function and returns it. - - :param func: property for which the setter has to be found - :return: the setter function or None - """ - for target in [ - t for t in func.parent.get_children() if t.name == func.function.name - ]: - for dec_name in target.decoratornames(): - if dec_name.endswith(func.function.name + ".setter"): - return target - return None - - func_setter = find_setter(func) - if not func_setter: - raise InferenceError( - f"Unable to find the setter of property {func.function.name}" - ) - - class PropertyFuncAccessor(nodes.FunctionDef): - def infer_call_result( - self, - caller: SuccessfulInferenceResult | None, - context: InferenceContext | None = None, - ) -> Iterator[InferenceResult]: - nonlocal func_setter - if caller and len(caller.args) != 2: - raise InferenceError( - "fset() needs two arguments", target=self, context=context - ) - yield from func_setter.infer_call_result(caller=caller, context=context) - - property_accessor = PropertyFuncAccessor( - name="fset", - parent=self._instance, - lineno=self._instance.lineno, - col_offset=self._instance.col_offset, - end_lineno=self._instance.end_lineno, - end_col_offset=self._instance.end_col_offset, - ) - property_accessor.postinit(args=func_setter.args, body=func_setter.body) - return property_accessor - - @property - def attr_setter(self): - return self._init_function("setter") - - @property - def attr_deleter(self): - return self._init_function("deleter") - - @property - def attr_getter(self): - return self._init_function("getter") - - # pylint: enable=import-outside-toplevel diff --git a/venv/lib/python3.12/site-packages/astroid/manager.py b/venv/lib/python3.12/site-packages/astroid/manager.py deleted file mode 100644 index e232886..0000000 --- a/venv/lib/python3.12/site-packages/astroid/manager.py +++ /dev/null @@ -1,478 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""astroid manager: avoid multiple astroid build of a same module when -possible by providing a class responsible to get astroid representation -from various source and using a cache of built modules) -""" - -from __future__ import annotations - -import collections -import os -import types -import zipimport -from collections.abc import Callable, Iterator, Sequence -from typing import Any, ClassVar - -from astroid import nodes -from astroid.builder import AstroidBuilder, build_namespace_package_module -from astroid.context import InferenceContext, _invalidate_cache -from astroid.exceptions import AstroidBuildingError, AstroidImportError -from astroid.interpreter._import import spec, util -from astroid.modutils import ( - NoSourceFile, - _cache_normalize_path_, - _has_init, - cached_os_path_isfile, - file_info_from_modpath, - get_source_file, - is_module_name_part_of_extension_package_whitelist, - is_python_source, - is_stdlib_module, - load_module_from_name, - modpath_from_file, -) -from astroid.transforms import TransformVisitor -from astroid.typing import AstroidManagerBrain, InferenceResult - -ZIP_IMPORT_EXTS = (".zip", ".egg", ".whl", ".pyz", ".pyzw") - - -def safe_repr(obj: Any) -> str: - try: - return repr(obj) - except Exception: # pylint: disable=broad-except - return "???" - - -class AstroidManager: - """Responsible to build astroid from files or modules. - - Use the Borg (singleton) pattern. - """ - - name = "astroid loader" - brain: ClassVar[AstroidManagerBrain] = { - "astroid_cache": {}, - "_mod_file_cache": {}, - "_failed_import_hooks": [], - "always_load_extensions": False, - "optimize_ast": False, - "max_inferable_values": 100, - "extension_package_whitelist": set(), - "module_denylist": set(), - "_transform": TransformVisitor(), - "prefer_stubs": False, - } - - def __init__(self) -> None: - # NOTE: cache entries are added by the [re]builder - self.astroid_cache = AstroidManager.brain["astroid_cache"] - self._mod_file_cache = AstroidManager.brain["_mod_file_cache"] - self._failed_import_hooks = AstroidManager.brain["_failed_import_hooks"] - self.extension_package_whitelist = AstroidManager.brain[ - "extension_package_whitelist" - ] - self.module_denylist = AstroidManager.brain["module_denylist"] - self._transform = AstroidManager.brain["_transform"] - self.prefer_stubs = AstroidManager.brain["prefer_stubs"] - - @property - def always_load_extensions(self) -> bool: - return AstroidManager.brain["always_load_extensions"] - - @always_load_extensions.setter - def always_load_extensions(self, value: bool) -> None: - AstroidManager.brain["always_load_extensions"] = value - - @property - def optimize_ast(self) -> bool: - return AstroidManager.brain["optimize_ast"] - - @optimize_ast.setter - def optimize_ast(self, value: bool) -> None: - AstroidManager.brain["optimize_ast"] = value - - @property - def max_inferable_values(self) -> int: - return AstroidManager.brain["max_inferable_values"] - - @max_inferable_values.setter - def max_inferable_values(self, value: int) -> None: - AstroidManager.brain["max_inferable_values"] = value - - @property - def register_transform(self): - # This and unregister_transform below are exported for convenience - return self._transform.register_transform - - @property - def unregister_transform(self): - return self._transform.unregister_transform - - @property - def builtins_module(self) -> nodes.Module: - return self.astroid_cache["builtins"] - - @property - def prefer_stubs(self) -> bool: - return AstroidManager.brain["prefer_stubs"] - - @prefer_stubs.setter - def prefer_stubs(self, value: bool) -> None: - AstroidManager.brain["prefer_stubs"] = value - - def visit_transforms(self, node: nodes.NodeNG) -> InferenceResult: - """Visit the transforms and apply them to the given *node*.""" - return self._transform.visit(node) - - def ast_from_file( - self, - filepath: str, - modname: str | None = None, - fallback: bool = True, - source: bool = False, - ) -> nodes.Module: - """Given a module name, return the astroid object.""" - if modname is None: - try: - modname = ".".join(modpath_from_file(filepath)) - except ImportError: - modname = filepath - if ( - modname in self.astroid_cache - and self.astroid_cache[modname].file == filepath - ): - return self.astroid_cache[modname] - # Call get_source_file() only after a cache miss, - # since it calls os.path.exists(). - try: - filepath = get_source_file( - filepath, include_no_ext=True, prefer_stubs=self.prefer_stubs - ) - source = True - except NoSourceFile: - pass - # Second attempt on the cache after get_source_file(). - if ( - modname in self.astroid_cache - and self.astroid_cache[modname].file == filepath - ): - return self.astroid_cache[modname] - if source: - return AstroidBuilder(self).file_build(filepath, modname) - if fallback and modname: - return self.ast_from_module_name(modname) - raise AstroidBuildingError("Unable to build an AST for {path}.", path=filepath) - - def ast_from_string( - self, data: str, modname: str = "", filepath: str | None = None - ) -> nodes.Module: - """Given some source code as a string, return its corresponding astroid - object. - """ - return AstroidBuilder(self).string_build(data, modname, filepath) - - def _build_stub_module(self, modname: str) -> nodes.Module: - return AstroidBuilder(self).string_build("", modname) - - def _build_namespace_module( - self, modname: str, path: Sequence[str] - ) -> nodes.Module: - return build_namespace_package_module(modname, path) - - def _can_load_extension(self, modname: str) -> bool: - if self.always_load_extensions: - return True - if is_stdlib_module(modname): - return True - return is_module_name_part_of_extension_package_whitelist( - modname, self.extension_package_whitelist - ) - - def ast_from_module_name( # noqa: C901 - self, - modname: str | None, - context_file: str | None = None, - use_cache: bool = True, - ) -> nodes.Module: - """Given a module name, return the astroid object.""" - if modname is None: - raise AstroidBuildingError("No module name given.") - # Sometimes we don't want to use the cache. For example, when we're - # importing a module with the same name as the file that is importing - # we want to fallback on the import system to make sure we get the correct - # module. - if modname in self.module_denylist: - raise AstroidImportError(f"Skipping ignored module {modname!r}") - if modname in self.astroid_cache and use_cache: - return self.astroid_cache[modname] - if modname == "__main__": - return self._build_stub_module(modname) - if context_file: - old_cwd = os.getcwd() - os.chdir(os.path.dirname(context_file)) - try: - found_spec = self.file_from_module_name(modname, context_file) - if found_spec.type == spec.ModuleType.PY_ZIPMODULE: - module = self.zip_import_data(found_spec.location) - if module is not None: - return module - - elif found_spec.type in ( - spec.ModuleType.C_BUILTIN, - spec.ModuleType.C_EXTENSION, - ): - if ( - found_spec.type == spec.ModuleType.C_EXTENSION - and not self._can_load_extension(modname) - ): - return self._build_stub_module(modname) - try: - named_module = load_module_from_name(modname) - except Exception as e: - raise AstroidImportError( - "Loading {modname} failed with:\n{error}", - modname=modname, - path=found_spec.location, - ) from e - return self.ast_from_module(named_module, modname) - - elif found_spec.type == spec.ModuleType.PY_COMPILED: - raise AstroidImportError( - "Unable to load compiled module {modname}.", - modname=modname, - path=found_spec.location, - ) - - elif found_spec.type == spec.ModuleType.PY_NAMESPACE: - return self._build_namespace_module( - modname, found_spec.submodule_search_locations or [] - ) - elif found_spec.type == spec.ModuleType.PY_FROZEN: - if found_spec.location is None: - return self._build_stub_module(modname) - # For stdlib frozen modules we can determine the location and - # can therefore create a module from the source file - return self.ast_from_file(found_spec.location, modname, fallback=False) - - if found_spec.location is None: - raise AstroidImportError( - "Can't find a file for module {modname}.", modname=modname - ) - - return self.ast_from_file(found_spec.location, modname, fallback=False) - except AstroidBuildingError as e: - for hook in self._failed_import_hooks: - try: - return hook(modname) - except AstroidBuildingError: - pass - raise e - finally: - if context_file: - os.chdir(old_cwd) - - def zip_import_data(self, filepath: str) -> nodes.Module | None: - if zipimport is None: - return None - - builder = AstroidBuilder(self) - for ext in ZIP_IMPORT_EXTS: - try: - eggpath, resource = filepath.rsplit(ext + os.path.sep, 1) - except ValueError: - continue - try: - importer = zipimport.zipimporter(eggpath + ext) - zmodname = resource.replace(os.path.sep, ".") - if importer.is_package(resource): - zmodname = zmodname + ".__init__" - module = builder.string_build( - importer.get_source(resource), zmodname, filepath - ) - return module - except Exception: # pylint: disable=broad-except - continue - return None - - def file_from_module_name( - self, modname: str, contextfile: str | None - ) -> spec.ModuleSpec: - try: - value = self._mod_file_cache[(modname, contextfile)] - except KeyError: - try: - value = file_info_from_modpath( - modname.split("."), context_file=contextfile - ) - except ImportError as e: - value = AstroidImportError( - "Failed to import module {modname} with error:\n{error}.", - modname=modname, - # we remove the traceback here to save on memory usage (since these exceptions are cached) - error=e.with_traceback(None), - ) - self._mod_file_cache[(modname, contextfile)] = value - if isinstance(value, AstroidBuildingError): - # we remove the traceback here to save on memory usage (since these exceptions are cached) - raise value.with_traceback(None) # pylint: disable=no-member - return value - - def ast_from_module( - self, module: types.ModuleType, modname: str | None = None - ) -> nodes.Module: - """Given an imported module, return the astroid object.""" - modname = modname or module.__name__ - if modname in self.astroid_cache: - return self.astroid_cache[modname] - try: - # some builtin modules don't have __file__ attribute - filepath = module.__file__ - if is_python_source(filepath): - # Type is checked in is_python_source - return self.ast_from_file(filepath, modname) # type: ignore[arg-type] - except AttributeError: - pass - - return AstroidBuilder(self).module_build(module, modname) - - def ast_from_class(self, klass: type, modname: str | None = None) -> nodes.ClassDef: - """Get astroid for the given class.""" - if modname is None: - try: - modname = klass.__module__ - except AttributeError as exc: - raise AstroidBuildingError( - "Unable to get module for class {class_name}.", - cls=klass, - class_repr=safe_repr(klass), - modname=modname, - ) from exc - modastroid = self.ast_from_module_name(modname) - ret = modastroid.getattr(klass.__name__)[0] - assert isinstance(ret, nodes.ClassDef) - return ret - - def infer_ast_from_something( - self, obj: object, context: InferenceContext | None = None - ) -> Iterator[InferenceResult]: - """Infer astroid for the given class.""" - if hasattr(obj, "__class__") and not isinstance(obj, type): - klass = obj.__class__ - elif isinstance(obj, type): - klass = obj - else: - raise AstroidBuildingError( # pragma: no cover - "Unable to get type for {class_repr}.", - cls=None, - class_repr=safe_repr(obj), - ) - try: - modname = klass.__module__ - except AttributeError as exc: - raise AstroidBuildingError( - "Unable to get module for {class_repr}.", - cls=klass, - class_repr=safe_repr(klass), - ) from exc - except Exception as exc: - raise AstroidImportError( - "Unexpected error while retrieving module for {class_repr}:\n" - "{error}", - cls=klass, - class_repr=safe_repr(klass), - ) from exc - try: - name = klass.__name__ - except AttributeError as exc: - raise AstroidBuildingError( - "Unable to get name for {class_repr}:\n", - cls=klass, - class_repr=safe_repr(klass), - ) from exc - except Exception as exc: - raise AstroidImportError( - "Unexpected error while retrieving name for {class_repr}:\n{error}", - cls=klass, - class_repr=safe_repr(klass), - ) from exc - # take care, on living object __module__ is regularly wrong :( - modastroid = self.ast_from_module_name(modname) - if klass is obj: - yield from modastroid.igetattr(name, context) - else: - for inferred in modastroid.igetattr(name, context): - yield inferred.instantiate_class() - - def register_failed_import_hook(self, hook: Callable[[str], nodes.Module]) -> None: - """Registers a hook to resolve imports that cannot be found otherwise. - - `hook` must be a function that accepts a single argument `modname` which - contains the name of the module or package that could not be imported. - If `hook` can resolve the import, must return a node of type `nodes.Module`, - otherwise, it must raise `AstroidBuildingError`. - """ - self._failed_import_hooks.append(hook) - - def cache_module(self, module: nodes.Module) -> None: - """Cache a module if no module with the same name is known yet.""" - self.astroid_cache.setdefault(module.name, module) - - def bootstrap(self) -> None: - """Bootstrap the required AST modules needed for the manager to work. - - The bootstrap usually involves building the AST for the builtins - module, which is required by the rest of astroid to work correctly. - """ - from astroid import raw_building # pylint: disable=import-outside-toplevel - - raw_building._astroid_bootstrapping() - - def clear_cache(self) -> None: - """Clear the underlying caches, bootstrap the builtins module and - re-register transforms. - """ - # import here because of cyclic imports - # pylint: disable=import-outside-toplevel - from astroid.brain.helpers import register_all_brains - from astroid.inference_tip import clear_inference_tip_cache - from astroid.interpreter._import.spec import ( - _find_spec, - _is_setuptools_namespace, - ) - from astroid.interpreter.objectmodel import ObjectModel - from astroid.nodes._base_nodes import LookupMixIn - from astroid.nodes.scoped_nodes import ClassDef - - clear_inference_tip_cache() - _invalidate_cache() # inference context cache - - self.astroid_cache.clear() - self._mod_file_cache.clear() - - # NB: not a new TransformVisitor() - AstroidManager.brain["_transform"].transforms = collections.defaultdict(list) - - for lru_cache in ( - LookupMixIn.lookup, - _cache_normalize_path_, - _has_init, - cached_os_path_isfile, - util.is_namespace, - ObjectModel.attributes, - ClassDef._metaclass_lookup_attribute, - _find_spec, - _is_setuptools_namespace, - ): - lru_cache.cache_clear() # type: ignore[attr-defined] - - for finder in spec._SPEC_FINDERS: - finder.find_module.cache_clear() - - self.bootstrap() - - # Reload brain plugins. During initialisation this is done in astroid.manager.py - register_all_brains(self) diff --git a/venv/lib/python3.12/site-packages/astroid/modutils.py b/venv/lib/python3.12/site-packages/astroid/modutils.py deleted file mode 100644 index 0868c60..0000000 --- a/venv/lib/python3.12/site-packages/astroid/modutils.py +++ /dev/null @@ -1,703 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Python modules manipulation utility functions. - -:type PY_SOURCE_EXTS: tuple(str) -:var PY_SOURCE_EXTS: list of possible python source file extension - -:type STD_LIB_DIRS: set of str -:var STD_LIB_DIRS: directories where standard modules are located - -:type BUILTIN_MODULES: dict -:var BUILTIN_MODULES: dictionary with builtin module names has key -""" - -from __future__ import annotations - -import importlib -import importlib.machinery -import importlib.util -import io -import itertools -import logging -import os -import sys -import sysconfig -import types -import warnings -from collections.abc import Callable, Iterable, Sequence -from contextlib import redirect_stderr, redirect_stdout -from functools import lru_cache -from sys import stdlib_module_names - -from astroid.const import IS_JYTHON -from astroid.interpreter._import import spec, util - -logger = logging.getLogger(__name__) - - -if sys.platform.startswith("win"): - PY_SOURCE_EXTS = ("py", "pyw", "pyi") - PY_SOURCE_EXTS_STUBS_FIRST = ("pyi", "pyw", "py") - PY_COMPILED_EXTS = ("dll", "pyd") -else: - PY_SOURCE_EXTS = ("py", "pyi") - PY_SOURCE_EXTS_STUBS_FIRST = ("pyi", "py") - PY_COMPILED_EXTS = ("so",) - - -# TODO: Adding `platstdlib` is a fix for a workaround in virtualenv. At some point we should -# revisit whether this is still necessary. See https://github.com/pylint-dev/astroid/pull/1323. -STD_LIB_DIRS = {sysconfig.get_path("stdlib"), sysconfig.get_path("platstdlib")} - -if os.name == "nt": - STD_LIB_DIRS.add(os.path.join(sys.prefix, "dlls")) - try: - # real_prefix is defined when running inside virtual environments, - # created with the **virtualenv** library. - # Deprecated in virtualenv==16.7.9 - # See: https://github.com/pypa/virtualenv/issues/1622 - STD_LIB_DIRS.add(os.path.join(sys.real_prefix, "dlls")) # type: ignore[attr-defined] - except AttributeError: - # sys.base_exec_prefix is always defined, but in a virtual environment - # created with the stdlib **venv** module, it points to the original - # installation, if the virtual env is activated. - try: - STD_LIB_DIRS.add(os.path.join(sys.base_exec_prefix, "dlls")) - except AttributeError: - pass - -if os.name == "posix": - # Need the real prefix if we're in a virtualenv, otherwise - # the usual one will do. - # Deprecated in virtualenv==16.7.9 - # See: https://github.com/pypa/virtualenv/issues/1622 - try: - prefix: str = sys.real_prefix # type: ignore[attr-defined] - except AttributeError: - prefix = sys.prefix - - def _posix_path(path: str) -> str: - base_python = "python%d.%d" % sys.version_info[:2] - return os.path.join(prefix, path, base_python) - - STD_LIB_DIRS.add(_posix_path("lib")) - if sys.maxsize > 2**32: - # This tries to fix a problem with /usr/lib64 builds, - # where systems are running both 32-bit and 64-bit code - # on the same machine, which reflects into the places where - # standard library could be found. More details can be found - # here http://bugs.python.org/issue1294959. - # An easy reproducing case would be - # https://github.com/pylint-dev/pylint/issues/712#issuecomment-163178753 - STD_LIB_DIRS.add(_posix_path("lib64")) - -EXT_LIB_DIRS = {sysconfig.get_path("purelib"), sysconfig.get_path("platlib")} -BUILTIN_MODULES = dict.fromkeys(sys.builtin_module_names, True) - - -class NoSourceFile(Exception): - """Exception raised when we are not able to get a python - source file for a precompiled file. - """ - - -def _normalize_path(path: str) -> str: - """Resolve symlinks in path and convert to absolute path. - - Note that environment variables and ~ in the path need to be expanded in - advance. - - This can be cached by using _cache_normalize_path. - """ - return os.path.normcase(os.path.realpath(path)) - - -def _path_from_filename(filename: str, is_jython: bool = IS_JYTHON) -> str: - if not is_jython: - return filename - head, has_pyclass, _ = filename.partition("$py.class") - if has_pyclass: - return head + ".py" - return filename - - -def _handle_blacklist( - blacklist: Sequence[str], dirnames: list[str], filenames: list[str] -) -> None: - """Remove files/directories in the black list. - - dirnames/filenames are usually from os.walk - """ - for norecurs in blacklist: - if norecurs in dirnames: - dirnames.remove(norecurs) - elif norecurs in filenames: - filenames.remove(norecurs) - - -@lru_cache -def _cache_normalize_path_(path: str) -> str: - return _normalize_path(path) - - -def _cache_normalize_path(path: str) -> str: - """Normalize path with caching.""" - # _module_file calls abspath on every path in sys.path every time it's - # called; on a larger codebase this easily adds up to half a second just - # assembling path components. This cache alleviates that. - if not path: # don't cache result for '' - return _normalize_path(path) - return _cache_normalize_path_(path) - - -def load_module_from_name(dotted_name: str) -> types.ModuleType: - """Load a Python module from its name. - - :type dotted_name: str - :param dotted_name: python name of a module or package - - :raise ImportError: if the module or package is not found - - :rtype: module - :return: the loaded module - """ - try: - return sys.modules[dotted_name] - except KeyError: - pass - - # Capture and log anything emitted during import to avoid - # contaminating JSON reports in pylint - with ( - redirect_stderr(io.StringIO()) as stderr, - redirect_stdout(io.StringIO()) as stdout, - ): - module = importlib.import_module(dotted_name) - - stderr_value = stderr.getvalue() - if stderr_value: - logger.error( - "Captured stderr while importing %s:\n%s", dotted_name, stderr_value - ) - stdout_value = stdout.getvalue() - if stdout_value: - logger.info( - "Captured stdout while importing %s:\n%s", dotted_name, stdout_value - ) - - return module - - -def load_module_from_modpath(parts: Sequence[str]) -> types.ModuleType: - """Load a python module from its split name. - - :param parts: - python name of a module or package split on '.' - - :raise ImportError: if the module or package is not found - - :return: the loaded module - """ - return load_module_from_name(".".join(parts)) - - -def load_module_from_file(filepath: str) -> types.ModuleType: - """Load a Python module from it's path. - - :type filepath: str - :param filepath: path to the python module or package - - :raise ImportError: if the module or package is not found - - :rtype: module - :return: the loaded module - """ - modpath = modpath_from_file(filepath) - return load_module_from_modpath(modpath) - - -def check_modpath_has_init(path: str, mod_path: list[str]) -> bool: - """Check there are some __init__.py all along the way.""" - modpath: list[str] = [] - for part in mod_path: - modpath.append(part) - path = os.path.join(path, part) - if not _has_init(path): - old_namespace = util.is_namespace(".".join(modpath)) - if not old_namespace: - return False - return True - - -def _is_subpath(path: str, base: str) -> bool: - path = os.path.normcase(os.path.normpath(path)) - base = os.path.normcase(os.path.normpath(base)) - if not path.startswith(base): - return False - return (len(path) == len(base)) or (path[len(base)] == os.path.sep) - - -def _get_relative_base_path(filename: str, path_to_check: str) -> list[str] | None: - """Extracts the relative mod path of the file to import from. - - Check if a file is within the passed in path and if so, returns the - relative mod path from the one passed in. - - If the filename is no in path_to_check, returns None - - Note this function will look for both abs and realpath of the file, - this allows to find the relative base path even if the file is a - symlink of a file in the passed in path - - Examples: - _get_relative_base_path("/a/b/c/d.py", "/a/b") -> ["c","d"] - _get_relative_base_path("/a/b/c/d.py", "/dev") -> None - """ - path_to_check = os.path.normcase(os.path.normpath(path_to_check)) - - abs_filename = os.path.abspath(filename) - if _is_subpath(abs_filename, path_to_check): - base_path = os.path.splitext(abs_filename)[0] - relative_base_path = base_path[len(path_to_check) :].lstrip(os.path.sep) - return [pkg for pkg in relative_base_path.split(os.sep) if pkg] - - real_filename = os.path.realpath(filename) - if _is_subpath(real_filename, path_to_check): - base_path = os.path.splitext(real_filename)[0] - relative_base_path = base_path[len(path_to_check) :].lstrip(os.path.sep) - return [pkg for pkg in relative_base_path.split(os.sep) if pkg] - - return None - - -def modpath_from_file_with_callback( - filename: str, - path: list[str] | None = None, - is_package_cb: Callable[[str, list[str]], bool] | None = None, -) -> list[str]: - filename = os.path.expanduser(_path_from_filename(filename)) - paths_to_check = sys.path.copy() - if path: - paths_to_check = path + paths_to_check - for pathname in itertools.chain( - paths_to_check, map(_cache_normalize_path, paths_to_check) - ): - if not pathname: - continue - modpath = _get_relative_base_path(filename, pathname) - if not modpath: - continue - assert is_package_cb is not None - if is_package_cb(pathname, modpath[:-1]): - return modpath - - raise ImportError( - "Unable to find module for {} in {}".format( - filename, ", \n".join(paths_to_check) - ) - ) - - -def modpath_from_file(filename: str, path: list[str] | None = None) -> list[str]: - """Get the corresponding split module's name from a filename. - - This function will return the name of a module or package split on `.`. - - :type filename: str - :param filename: file's path for which we want the module's name - - :type Optional[List[str]] path: - Optional list of paths where the module or package should be - searched, additionally to sys.path - - :raise ImportError: - if the corresponding module's name has not been found - - :rtype: list(str) - :return: the corresponding split module's name - """ - return modpath_from_file_with_callback(filename, path, check_modpath_has_init) - - -def file_from_modpath( - modpath: list[str], - path: Sequence[str] | None = None, - context_file: str | None = None, -) -> str | None: - return file_info_from_modpath(modpath, path, context_file).location - - -def file_info_from_modpath( - modpath: list[str], - path: Sequence[str] | None = None, - context_file: str | None = None, -) -> spec.ModuleSpec: - """Given a mod path (i.e. split module / package name), return the - corresponding file. - - Giving priority to source file over precompiled file if it exists. - - :param modpath: - split module's name (i.e name of a module or package split - on '.') - (this means explicit relative imports that start with dots have - empty strings in this list!) - - :param path: - optional list of path where the module or package should be - searched (use sys.path if nothing or None is given) - - :param context_file: - context file to consider, necessary if the identifier has been - introduced using a relative import unresolvable in the actual - context (i.e. modutils) - - :raise ImportError: if there is no such module in the directory - - :return: - the path to the module's file or None if it's an integrated - builtin module such as 'sys' - """ - if context_file is not None: - context: str | None = os.path.dirname(context_file) - else: - context = context_file - if modpath[0] == "xml": - # handle _xmlplus - try: - return _spec_from_modpath(["_xmlplus", *modpath[1:]], path, context) - except ImportError: - return _spec_from_modpath(modpath, path, context) - elif modpath == ["os", "path"]: - # FIXME: currently ignoring search_path... - return spec.ModuleSpec( - name="os.path", - location=os.path.__file__, - type=spec.ModuleType.PY_SOURCE, - ) - return _spec_from_modpath(modpath, path, context) - - -def get_module_part(dotted_name: str, context_file: str | None = None) -> str: - """Given a dotted name return the module part of the name : - - >>> get_module_part('astroid.as_string.dump') - 'astroid.as_string' - - :param dotted_name: full name of the identifier we are interested in - - :param context_file: - context file to consider, necessary if the identifier has been - introduced using a relative import unresolvable in the actual - context (i.e. modutils) - - :raise ImportError: if there is no such module in the directory - - :return: - the module part of the name or None if we have not been able at - all to import the given name - - XXX: deprecated, since it doesn't handle package precedence over module - (see #10066) - """ - # os.path trick - if dotted_name.startswith("os.path"): - return "os.path" - parts = dotted_name.split(".") - if context_file is not None: - # first check for builtin module which won't be considered latter - # in that case (path != None) - if parts[0] in BUILTIN_MODULES: - if len(parts) > 2: - raise ImportError(dotted_name) - return parts[0] - # don't use += or insert, we want a new list to be created ! - path: list[str] | None = None - starti = 0 - if parts[0] == "": - assert ( - context_file is not None - ), "explicit relative import, but no context_file?" - path = [] # prevent resolving the import non-relatively - starti = 1 - # for all further dots: change context - while starti < len(parts) and parts[starti] == "": - starti += 1 - assert ( - context_file is not None - ), "explicit relative import, but no context_file?" - context_file = os.path.dirname(context_file) - for i in range(starti, len(parts)): - try: - file_from_modpath( - parts[starti : i + 1], path=path, context_file=context_file - ) - except ImportError: - if i < max(1, len(parts) - 2): - raise - return ".".join(parts[:i]) - return dotted_name - - -def get_module_files( - src_directory: str, blacklist: Sequence[str], list_all: bool = False -) -> list[str]: - """Given a package directory return a list of all available python - module's files in the package and its subpackages. - - :param src_directory: - path of the directory corresponding to the package - - :param blacklist: iterable - list of files or directories to ignore. - - :param list_all: - get files from all paths, including ones without __init__.py - - :return: - the list of all available python module's files in the package and - its subpackages - """ - files: list[str] = [] - for directory, dirnames, filenames in os.walk(src_directory): - if directory in blacklist: - continue - _handle_blacklist(blacklist, dirnames, filenames) - # check for __init__.py - if not list_all and {"__init__.py", "__init__.pyi"}.isdisjoint(filenames): - dirnames[:] = () - continue - for filename in filenames: - if _is_python_file(filename): - src = os.path.join(directory, filename) - files.append(src) - return files - - -def get_source_file( - filename: str, include_no_ext: bool = False, prefer_stubs: bool = False -) -> str: - """Given a python module's file name return the matching source file - name (the filename will be returned identically if it's already an - absolute path to a python source file). - - :param filename: python module's file name - - :raise NoSourceFile: if no source file exists on the file system - - :return: the absolute path of the source file if it exists - """ - filename = os.path.abspath(_path_from_filename(filename)) - base, orig_ext = os.path.splitext(filename) - orig_ext = orig_ext.lstrip(".") - if orig_ext not in PY_SOURCE_EXTS and os.path.exists(f"{base}.{orig_ext}"): - return f"{base}.{orig_ext}" - for ext in PY_SOURCE_EXTS_STUBS_FIRST if prefer_stubs else PY_SOURCE_EXTS: - source_path = f"{base}.{ext}" - if os.path.exists(source_path): - return source_path - if include_no_ext and not orig_ext and os.path.exists(base): - return base - raise NoSourceFile(filename) - - -def is_python_source(filename: str | None) -> bool: - """Return: True if the filename is a python source file.""" - if not filename: - return False - return os.path.splitext(filename)[1][1:] in PY_SOURCE_EXTS - - -def is_stdlib_module(modname: str) -> bool: - """Return: True if the modname is in the standard library""" - return modname.split(".")[0] in stdlib_module_names - - -def module_in_path(modname: str, path: str | Iterable[str]) -> bool: - """Try to determine if a module is imported from one of the specified paths - - :param modname: name of the module - - :param path: paths to consider - - :return: - true if the module: - - is located on the path listed in one of the directory in `paths` - """ - - modname = modname.split(".")[0] - try: - filename = file_from_modpath([modname]) - except ImportError: - # Import failed, we can't check path if we don't know it - return False - - if filename is None: - # No filename likely means it's compiled in, or potentially a namespace - return False - filename = _normalize_path(filename) - - if isinstance(path, str): - return filename.startswith(_cache_normalize_path(path)) - - return any(filename.startswith(_cache_normalize_path(entry)) for entry in path) - - -def is_standard_module(modname: str, std_path: Iterable[str] | None = None) -> bool: - """Try to guess if a module is a standard python module (by default, - see `std_path` parameter's description). - - :param modname: name of the module we are interested in - - :param std_path: list of path considered has standard - - :return: - true if the module: - - is located on the path listed in one of the directory in `std_path` - - is a built-in module - """ - warnings.warn( - "is_standard_module() is deprecated. Use, is_stdlib_module() or module_in_path() instead", - DeprecationWarning, - stacklevel=2, - ) - - modname = modname.split(".")[0] - try: - filename = file_from_modpath([modname]) - except ImportError: - # import failed, i'm probably not so wrong by supposing it's - # not standard... - return False - # modules which are not living in a file are considered standard - # (sys and __builtin__ for instance) - if filename is None: - # we assume there are no namespaces in stdlib - return not util.is_namespace(modname) - filename = _normalize_path(filename) - for path in EXT_LIB_DIRS: - if filename.startswith(_cache_normalize_path(path)): - return False - if std_path is None: - std_path = STD_LIB_DIRS - - return any(filename.startswith(_cache_normalize_path(path)) for path in std_path) - - -def is_relative(modname: str, from_file: str) -> bool: - """Return true if the given module name is relative to the given - file name. - - :param modname: name of the module we are interested in - - :param from_file: - path of the module from which modname has been imported - - :return: - true if the module has been imported relatively to `from_file` - """ - if not os.path.isdir(from_file): - from_file = os.path.dirname(from_file) - if from_file in sys.path: - return False - return bool( - importlib.machinery.PathFinder.find_spec( - modname.split(".", maxsplit=1)[0], [from_file] - ) - ) - - -@lru_cache(maxsize=1024) -def cached_os_path_isfile(path: str | os.PathLike[str]) -> bool: - """A cached version of os.path.isfile that helps avoid repetitive I/O""" - return os.path.isfile(path) - - -# internal only functions ##################################################### - - -def _spec_from_modpath( - modpath: list[str], - path: Sequence[str] | None = None, - context: str | None = None, -) -> spec.ModuleSpec: - """Given a mod path (i.e. split module / package name), return the - corresponding spec. - - this function is used internally, see `file_from_modpath`'s - documentation for more information - """ - assert modpath - location = None - if context is not None: - try: - found_spec = spec.find_spec(modpath, [context]) - location = found_spec.location - except ImportError: - found_spec = spec.find_spec(modpath, path) - location = found_spec.location - else: - found_spec = spec.find_spec(modpath, path) - if found_spec.type == spec.ModuleType.PY_COMPILED: - try: - assert found_spec.location is not None - location = get_source_file(found_spec.location) - return found_spec._replace( - location=location, type=spec.ModuleType.PY_SOURCE - ) - except NoSourceFile: - return found_spec._replace(location=location) - elif found_spec.type == spec.ModuleType.C_BUILTIN: - # integrated builtin module - return found_spec._replace(location=None) - elif found_spec.type == spec.ModuleType.PKG_DIRECTORY: - assert found_spec.location is not None - location = _has_init(found_spec.location) - return found_spec._replace(location=location, type=spec.ModuleType.PY_SOURCE) - return found_spec - - -def _is_python_file(filename: str) -> bool: - """Return true if the given filename should be considered as a python file. - - .pyc and .pyo are ignored - """ - return filename.endswith((".py", ".pyi", ".so", ".pyd", ".pyw")) - - -@lru_cache(maxsize=1024) -def _has_init(directory: str) -> str | None: - """If the given directory has a valid __init__ file, return its path, - else return None. - """ - mod_or_pack = os.path.join(directory, "__init__") - for ext in (*PY_SOURCE_EXTS, "pyc", "pyo"): - if os.path.exists(mod_or_pack + "." + ext): - return mod_or_pack + "." + ext - return None - - -def is_namespace(specobj: spec.ModuleSpec) -> bool: - return specobj.type == spec.ModuleType.PY_NAMESPACE - - -def is_directory(specobj: spec.ModuleSpec) -> bool: - return specobj.type == spec.ModuleType.PKG_DIRECTORY - - -def is_module_name_part_of_extension_package_whitelist( - module_name: str, package_whitelist: set[str] -) -> bool: - """ - Returns True if one part of the module name is in the package whitelist. - - >>> is_module_name_part_of_extension_package_whitelist('numpy.core.umath', {'numpy'}) - True - """ - parts = module_name.split(".") - return any( - ".".join(parts[:x]) in package_whitelist for x in range(1, len(parts) + 1) - ) diff --git a/venv/lib/python3.12/site-packages/astroid/nodes/__init__.py b/venv/lib/python3.12/site-packages/astroid/nodes/__init__.py deleted file mode 100644 index 6a67516..0000000 --- a/venv/lib/python3.12/site-packages/astroid/nodes/__init__.py +++ /dev/null @@ -1,303 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Every available node class. - -.. seealso:: - :doc:`ast documentation ` - -All nodes inherit from :class:`~astroid.nodes.node_classes.NodeNG`. -""" - -# Nodes not present in the builtin ast module: DictUnpack, Unknown, and EvaluatedObject. -from astroid.nodes.node_classes import ( - CONST_CLS, - AnnAssign, - Arguments, - Assert, - Assign, - AssignAttr, - AssignName, - AsyncFor, - AsyncWith, - Attribute, - AugAssign, - Await, - BaseContainer, - BinOp, - BoolOp, - Break, - Call, - Compare, - Comprehension, - Const, - Continue, - Decorators, - DelAttr, - Delete, - DelName, - Dict, - DictUnpack, - EmptyNode, - EvaluatedObject, - ExceptHandler, - Expr, - For, - FormattedValue, - Global, - If, - IfExp, - Import, - ImportFrom, - Interpolation, - JoinedStr, - Keyword, - List, - Match, - MatchAs, - MatchCase, - MatchClass, - MatchMapping, - MatchOr, - MatchSequence, - MatchSingleton, - MatchStar, - MatchValue, - Name, - NamedExpr, - NodeNG, - Nonlocal, - ParamSpec, - Pass, - Pattern, - Raise, - Return, - Set, - Slice, - Starred, - Subscript, - TemplateStr, - Try, - TryStar, - Tuple, - TypeAlias, - TypeVar, - TypeVarTuple, - UnaryOp, - Unknown, - While, - With, - Yield, - YieldFrom, - are_exclusive, - const_factory, - unpack_infer, -) -from astroid.nodes.scoped_nodes import ( - SYNTHETIC_ROOT, - AsyncFunctionDef, - ClassDef, - ComprehensionScope, - DictComp, - FunctionDef, - GeneratorExp, - Lambda, - ListComp, - LocalsDictNodeNG, - Module, - SetComp, - builtin_lookup, - function_to_method, - get_wrapping_class, -) -from astroid.nodes.utils import Position - -ALL_NODE_CLASSES = ( - BaseContainer, - AnnAssign, - Arguments, - Assert, - Assign, - AssignAttr, - AssignName, - AsyncFor, - AsyncFunctionDef, - AsyncWith, - Attribute, - AugAssign, - Await, - BinOp, - BoolOp, - Break, - Call, - ClassDef, - Compare, - Comprehension, - ComprehensionScope, - Const, - const_factory, - Continue, - Decorators, - DelAttr, - Delete, - DelName, - Dict, - DictComp, - DictUnpack, - EmptyNode, - EvaluatedObject, - ExceptHandler, - Expr, - For, - FormattedValue, - FunctionDef, - GeneratorExp, - Global, - If, - IfExp, - Import, - ImportFrom, - JoinedStr, - Keyword, - Lambda, - List, - ListComp, - LocalsDictNodeNG, - Match, - MatchAs, - MatchCase, - MatchClass, - MatchMapping, - MatchOr, - MatchSequence, - MatchSingleton, - MatchStar, - MatchValue, - Module, - Name, - NamedExpr, - NodeNG, - Nonlocal, - ParamSpec, - Pass, - Pattern, - Raise, - Return, - Set, - SetComp, - Slice, - Starred, - Subscript, - Try, - TryStar, - Tuple, - TypeAlias, - TypeVar, - TypeVarTuple, - UnaryOp, - Unknown, - While, - With, - Yield, - YieldFrom, -) - -__all__ = ( - "CONST_CLS", - "SYNTHETIC_ROOT", - "AnnAssign", - "Arguments", - "Assert", - "Assign", - "AssignAttr", - "AssignName", - "AsyncFor", - "AsyncFunctionDef", - "AsyncWith", - "Attribute", - "AugAssign", - "Await", - "BaseContainer", - "BinOp", - "BoolOp", - "Break", - "Call", - "ClassDef", - "Compare", - "Comprehension", - "ComprehensionScope", - "Const", - "Continue", - "Decorators", - "DelAttr", - "DelName", - "Delete", - "Dict", - "DictComp", - "DictUnpack", - "EmptyNode", - "EvaluatedObject", - "ExceptHandler", - "Expr", - "For", - "FormattedValue", - "FunctionDef", - "GeneratorExp", - "Global", - "If", - "IfExp", - "Import", - "ImportFrom", - "Interpolation", - "JoinedStr", - "Keyword", - "Lambda", - "List", - "ListComp", - "LocalsDictNodeNG", - "Match", - "MatchAs", - "MatchCase", - "MatchClass", - "MatchMapping", - "MatchOr", - "MatchSequence", - "MatchSingleton", - "MatchStar", - "MatchValue", - "Module", - "Name", - "NamedExpr", - "NodeNG", - "Nonlocal", - "ParamSpec", - "Pass", - "Position", - "Raise", - "Return", - "Set", - "SetComp", - "Slice", - "Starred", - "Subscript", - "TemplateStr", - "Try", - "TryStar", - "Tuple", - "TypeAlias", - "TypeVar", - "TypeVarTuple", - "UnaryOp", - "Unknown", - "While", - "With", - "Yield", - "YieldFrom", - "are_exclusive", - "builtin_lookup", - "const_factory", - "function_to_method", - "get_wrapping_class", - "unpack_infer", -) diff --git a/venv/lib/python3.12/site-packages/astroid/nodes/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/nodes/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 4ced8e8..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/nodes/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/nodes/__pycache__/_base_nodes.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/nodes/__pycache__/_base_nodes.cpython-312.pyc deleted file mode 100644 index 1b7e6a5..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/nodes/__pycache__/_base_nodes.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/nodes/__pycache__/as_string.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/nodes/__pycache__/as_string.cpython-312.pyc deleted file mode 100644 index bc2eb6c..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/nodes/__pycache__/as_string.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/nodes/__pycache__/const.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/nodes/__pycache__/const.cpython-312.pyc deleted file mode 100644 index a20bcfd..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/nodes/__pycache__/const.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/nodes/__pycache__/node_classes.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/nodes/__pycache__/node_classes.cpython-312.pyc deleted file mode 100644 index dc7d120..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/nodes/__pycache__/node_classes.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/nodes/__pycache__/node_ng.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/nodes/__pycache__/node_ng.cpython-312.pyc deleted file mode 100644 index e204b65..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/nodes/__pycache__/node_ng.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/nodes/__pycache__/utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/nodes/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index 90eabc3..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/nodes/__pycache__/utils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/nodes/_base_nodes.py b/venv/lib/python3.12/site-packages/astroid/nodes/_base_nodes.py deleted file mode 100644 index df452cb..0000000 --- a/venv/lib/python3.12/site-packages/astroid/nodes/_base_nodes.py +++ /dev/null @@ -1,672 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""This module contains some base nodes that can be inherited for the different nodes. - -Previously these were called Mixin nodes. -""" - -from __future__ import annotations - -import itertools -from collections.abc import Callable, Generator, Iterator -from functools import cached_property, lru_cache, partial -from typing import TYPE_CHECKING, Any, ClassVar - -from astroid import bases, nodes, util -from astroid.context import ( - CallContext, - InferenceContext, - bind_context_to_node, -) -from astroid.exceptions import ( - AttributeInferenceError, - InferenceError, -) -from astroid.interpreter import dunder_lookup -from astroid.nodes.node_ng import NodeNG -from astroid.typing import InferenceResult - -if TYPE_CHECKING: - from astroid.nodes.node_classes import LocalsDictNodeNG - - GetFlowFactory = Callable[ - [ - InferenceResult, - InferenceResult | None, - nodes.AugAssign | nodes.BinOp, - InferenceResult, - InferenceResult | None, - InferenceContext, - InferenceContext, - ], - list[partial[Generator[InferenceResult]]], - ] - - -class Statement(NodeNG): - """Statement node adding a few attributes. - - NOTE: This class is part of the public API of 'astroid.nodes'. - """ - - is_statement = True - """Whether this node indicates a statement.""" - - def next_sibling(self): - """The next sibling statement node. - - :returns: The next sibling statement node. - :rtype: NodeNG or None - """ - stmts = self.parent.child_sequence(self) - index = stmts.index(self) - try: - return stmts[index + 1] - except IndexError: - return None - - def previous_sibling(self): - """The previous sibling statement. - - :returns: The previous sibling statement node. - :rtype: NodeNG or None - """ - stmts = self.parent.child_sequence(self) - index = stmts.index(self) - if index >= 1: - return stmts[index - 1] - return None - - -class NoChildrenNode(NodeNG): - """Base nodes for nodes with no children, e.g. Pass.""" - - def get_children(self) -> Iterator[NodeNG]: - yield from () - - -class FilterStmtsBaseNode(NodeNG): - """Base node for statement filtering and assignment type.""" - - def _get_filtered_stmts(self, _, node, _stmts, mystmt: Statement | None): - """Method used in _filter_stmts to get statements and trigger break.""" - if self.statement() is mystmt: - # original node's statement is the assignment, only keep - # current node (gen exp, list comp) - return [node], True - return _stmts, False - - def assign_type(self): - return self - - -class AssignTypeNode(NodeNG): - """Base node for nodes that can 'assign' such as AnnAssign.""" - - def assign_type(self): - return self - - def _get_filtered_stmts(self, lookup_node, node, _stmts, mystmt: Statement | None): - """Method used in filter_stmts.""" - if self is mystmt: - return _stmts, True - if self.statement() is mystmt: - # original node's statement is the assignment, only keep - # current node (gen exp, list comp) - return [node], True - return _stmts, False - - -class ParentAssignNode(AssignTypeNode): - """Base node for nodes whose assign_type is determined by the parent node.""" - - def assign_type(self): - return self.parent.assign_type() - - -class ImportNode(FilterStmtsBaseNode, NoChildrenNode, Statement): - """Base node for From and Import Nodes.""" - - modname: str | None - """The module that is being imported from. - - This is ``None`` for relative imports. - """ - - names: list[tuple[str, str | None]] - """What is being imported from the module. - - Each entry is a :class:`tuple` of the name being imported, - and the alias that the name is assigned to (if any). - """ - - def _infer_name(self, frame, name): - return name - - def do_import_module(self, modname: str | None = None) -> nodes.Module: - """Return the ast for a module whose name is imported by .""" - mymodule = self.root() - level: int | None = getattr(self, "level", None) # Import has no level - if modname is None: - modname = self.modname - # If the module ImportNode is importing is a module with the same name - # as the file that contains the ImportNode we don't want to use the cache - # to make sure we use the import system to get the correct module. - if ( - modname - # pylint: disable-next=no-member # pylint doesn't recognize type of mymodule - and mymodule.relative_to_absolute_name(modname, level) == mymodule.name - ): - use_cache = False - else: - use_cache = True - - # pylint: disable-next=no-member # pylint doesn't recognize type of mymodule - return mymodule.import_module( - modname, - level=level, - relative_only=bool(level and level >= 1), - use_cache=use_cache, - ) - - def real_name(self, asname: str) -> str: - """Get name from 'as' name.""" - for name, _asname in self.names: - if name == "*": - return asname - if not _asname: - name = name.split(".", 1)[0] - _asname = name - if asname == _asname: - return name - raise AttributeInferenceError( - "Could not find original name for {attribute} in {target!r}", - target=self, - attribute=asname, - ) - - -class MultiLineBlockNode(NodeNG): - """Base node for multi-line blocks, e.g. For and FunctionDef. - - Note that this does not apply to every node with a `body` field. - For instance, an If node has a multi-line body, but the body of an - IfExpr is not multi-line, and hence cannot contain Return nodes, - Assign nodes, etc. - """ - - _multi_line_block_fields: ClassVar[tuple[str, ...]] = () - - @cached_property - def _multi_line_blocks(self): - return tuple(getattr(self, field) for field in self._multi_line_block_fields) - - def _get_return_nodes_skip_functions(self): - for block in self._multi_line_blocks: - for child_node in block: - if child_node.is_function: - continue - yield from child_node._get_return_nodes_skip_functions() - - def _get_yield_nodes_skip_functions(self): - for block in self._multi_line_blocks: - for child_node in block: - if child_node.is_function: - continue - yield from child_node._get_yield_nodes_skip_functions() - - def _get_yield_nodes_skip_lambdas(self): - for block in self._multi_line_blocks: - for child_node in block: - if child_node.is_lambda: - continue - yield from child_node._get_yield_nodes_skip_lambdas() - - @cached_property - def _assign_nodes_in_scope(self) -> list[nodes.Assign]: - children_assign_nodes = ( - child_node._assign_nodes_in_scope - for block in self._multi_line_blocks - for child_node in block - ) - return list(itertools.chain.from_iterable(children_assign_nodes)) - - -class MultiLineWithElseBlockNode(MultiLineBlockNode): - """Base node for multi-line blocks that can have else statements.""" - - @cached_property - def blockstart_tolineno(self): - return self.lineno - - def _elsed_block_range( - self, lineno: int, orelse: list[nodes.NodeNG], last: int | None = None - ) -> tuple[int, int]: - """Handle block line numbers range for try/finally, for, if and while - statements. - """ - if lineno == self.fromlineno: - return lineno, lineno - if orelse: - if lineno >= orelse[0].fromlineno: - return lineno, orelse[-1].tolineno - return lineno, orelse[0].fromlineno - 1 - return lineno, last or self.tolineno - - -class LookupMixIn(NodeNG): - """Mixin to look up a name in the right scope.""" - - @lru_cache # noqa - def lookup(self, name: str) -> tuple[LocalsDictNodeNG, list[NodeNG]]: - """Lookup where the given variable is assigned. - - The lookup starts from self's scope. If self is not a frame itself - and the name is found in the inner frame locals, statements will be - filtered to remove ignorable statements according to self's location. - - :param name: The name of the variable to find assignments for. - - :returns: The scope node and the list of assignments associated to the - given name according to the scope where it has been found (locals, - globals or builtin). - """ - return self.scope().scope_lookup(self, name) - - def ilookup(self, name): - """Lookup the inferred values of the given variable. - - :param name: The variable name to find values for. - :type name: str - - :returns: The inferred values of the statements returned from - :meth:`lookup`. - :rtype: iterable - """ - frame, stmts = self.lookup(name) - context = InferenceContext() - return bases._infer_stmts(stmts, context, frame) - - -def _reflected_name(name) -> str: - return "__r" + name[2:] - - -def _augmented_name(name) -> str: - return "__i" + name[2:] - - -BIN_OP_METHOD = { - "+": "__add__", - "-": "__sub__", - "/": "__truediv__", - "//": "__floordiv__", - "*": "__mul__", - "**": "__pow__", - "%": "__mod__", - "&": "__and__", - "|": "__or__", - "^": "__xor__", - "<<": "__lshift__", - ">>": "__rshift__", - "@": "__matmul__", -} - -REFLECTED_BIN_OP_METHOD = { - key: _reflected_name(value) for (key, value) in BIN_OP_METHOD.items() -} -AUGMENTED_OP_METHOD = { - key + "=": _augmented_name(value) for (key, value) in BIN_OP_METHOD.items() -} - - -class OperatorNode(NodeNG): - @staticmethod - def _filter_operation_errors( - infer_callable: Callable[ - [InferenceContext | None], - Generator[InferenceResult | util.BadOperationMessage], - ], - context: InferenceContext | None, - error: type[util.BadOperationMessage], - ) -> Generator[InferenceResult]: - for result in infer_callable(context): - if isinstance(result, error): - # For the sake of .infer(), we don't care about operation - # errors, which is the job of a linter. So return something - # which shows that we can't infer the result. - yield util.Uninferable - else: - yield result - - @staticmethod - def _is_not_implemented(const) -> bool: - """Check if the given const node is NotImplemented.""" - return isinstance(const, nodes.Const) and const.value is NotImplemented - - @staticmethod - def _infer_old_style_string_formatting( - instance: nodes.Const, other: nodes.NodeNG, context: InferenceContext - ) -> tuple[util.UninferableBase | nodes.Const]: - """Infer the result of '"string" % ...'. - - TODO: Instead of returning Uninferable we should rely - on the call to '%' to see if the result is actually uninferable. - """ - if isinstance(other, nodes.Tuple): - if util.Uninferable in other.elts: - return (util.Uninferable,) - inferred_positional = [util.safe_infer(i, context) for i in other.elts] - if all(isinstance(i, nodes.Const) for i in inferred_positional): - values = tuple(i.value for i in inferred_positional) - else: - values = None - elif isinstance(other, nodes.Dict): - values: dict[Any, Any] = {} - for pair in other.items: - key = util.safe_infer(pair[0], context) - if not isinstance(key, nodes.Const): - return (util.Uninferable,) - value = util.safe_infer(pair[1], context) - if not isinstance(value, nodes.Const): - return (util.Uninferable,) - values[key.value] = value.value - elif isinstance(other, nodes.Const): - values = other.value - else: - return (util.Uninferable,) - - try: - return (nodes.const_factory(instance.value % values),) - except (TypeError, KeyError, ValueError): - return (util.Uninferable,) - - @staticmethod - def _invoke_binop_inference( - instance: InferenceResult, - opnode: nodes.AugAssign | nodes.BinOp, - op: str, - other: InferenceResult, - context: InferenceContext, - method_name: str, - ) -> Generator[InferenceResult]: - """Invoke binary operation inference on the given instance.""" - methods = dunder_lookup.lookup(instance, method_name) - context = bind_context_to_node(context, instance) - method = methods[0] - context.callcontext.callee = method - - if ( - isinstance(instance, nodes.Const) - and isinstance(instance.value, str) - and op == "%" - ): - return iter( - OperatorNode._infer_old_style_string_formatting( - instance, other, context - ) - ) - - try: - inferred = next(method.infer(context=context)) - except StopIteration as e: - raise InferenceError(node=method, context=context) from e - if isinstance(inferred, util.UninferableBase): - raise InferenceError - if not isinstance( - instance, - (nodes.Const, nodes.Tuple, nodes.List, nodes.ClassDef, bases.Instance), - ): - raise InferenceError # pragma: no cover # Used as a failsafe - return instance.infer_binary_op(opnode, op, other, context, inferred) - - @staticmethod - def _aug_op( - instance: InferenceResult, - opnode: nodes.AugAssign, - op: str, - other: InferenceResult, - context: InferenceContext, - reverse: bool = False, - ) -> partial[Generator[InferenceResult]]: - """Get an inference callable for an augmented binary operation.""" - method_name = AUGMENTED_OP_METHOD[op] - return partial( - OperatorNode._invoke_binop_inference, - instance=instance, - op=op, - opnode=opnode, - other=other, - context=context, - method_name=method_name, - ) - - @staticmethod - def _bin_op( - instance: InferenceResult, - opnode: nodes.AugAssign | nodes.BinOp, - op: str, - other: InferenceResult, - context: InferenceContext, - reverse: bool = False, - ) -> partial[Generator[InferenceResult]]: - """Get an inference callable for a normal binary operation. - - If *reverse* is True, then the reflected method will be used instead. - """ - if reverse: - method_name = REFLECTED_BIN_OP_METHOD[op] - else: - method_name = BIN_OP_METHOD[op] - return partial( - OperatorNode._invoke_binop_inference, - instance=instance, - op=op, - opnode=opnode, - other=other, - context=context, - method_name=method_name, - ) - - @staticmethod - def _bin_op_or_union_type( - left: bases.UnionType | nodes.ClassDef | nodes.Const, - right: bases.UnionType | nodes.ClassDef | nodes.Const, - ) -> Generator[InferenceResult]: - """Create a new UnionType instance for binary or, e.g. int | str.""" - yield bases.UnionType(left, right) - - @staticmethod - def _get_binop_contexts(context, left, right): - """Get contexts for binary operations. - - This will return two inference contexts, the first one - for x.__op__(y), the other one for y.__rop__(x), where - only the arguments are inversed. - """ - # The order is important, since the first one should be - # left.__op__(right). - for arg in (right, left): - new_context = context.clone() - new_context.callcontext = CallContext(args=[arg]) - new_context.boundnode = None - yield new_context - - @staticmethod - def _same_type(type1, type2) -> bool: - """Check if type1 is the same as type2.""" - return type1.qname() == type2.qname() - - @staticmethod - def _get_aug_flow( - left: InferenceResult, - left_type: InferenceResult | None, - aug_opnode: nodes.AugAssign, - right: InferenceResult, - right_type: InferenceResult | None, - context: InferenceContext, - reverse_context: InferenceContext, - ) -> list[partial[Generator[InferenceResult]]]: - """Get the flow for augmented binary operations. - - The rules are a bit messy: - - * if left and right have the same type, then left.__augop__(right) - is first tried and then left.__op__(right). - * if left and right are unrelated typewise, then - left.__augop__(right) is tried, then left.__op__(right) - is tried and then right.__rop__(left) is tried. - * if left is a subtype of right, then left.__augop__(right) - is tried and then left.__op__(right). - * if left is a supertype of right, then left.__augop__(right) - is tried, then right.__rop__(left) and then - left.__op__(right) - """ - from astroid import helpers # pylint: disable=import-outside-toplevel - - bin_op = aug_opnode.op.strip("=") - aug_op = aug_opnode.op - if OperatorNode._same_type(left_type, right_type): - methods = [ - OperatorNode._aug_op(left, aug_opnode, aug_op, right, context), - OperatorNode._bin_op(left, aug_opnode, bin_op, right, context), - ] - elif helpers.is_subtype(left_type, right_type): - methods = [ - OperatorNode._aug_op(left, aug_opnode, aug_op, right, context), - OperatorNode._bin_op(left, aug_opnode, bin_op, right, context), - ] - elif helpers.is_supertype(left_type, right_type): - methods = [ - OperatorNode._aug_op(left, aug_opnode, aug_op, right, context), - OperatorNode._bin_op( - right, aug_opnode, bin_op, left, reverse_context, reverse=True - ), - OperatorNode._bin_op(left, aug_opnode, bin_op, right, context), - ] - else: - methods = [ - OperatorNode._aug_op(left, aug_opnode, aug_op, right, context), - OperatorNode._bin_op(left, aug_opnode, bin_op, right, context), - OperatorNode._bin_op( - right, aug_opnode, bin_op, left, reverse_context, reverse=True - ), - ] - return methods - - @staticmethod - def _get_binop_flow( - left: InferenceResult, - left_type: InferenceResult | None, - binary_opnode: nodes.AugAssign | nodes.BinOp, - right: InferenceResult, - right_type: InferenceResult | None, - context: InferenceContext, - reverse_context: InferenceContext, - ) -> list[partial[Generator[InferenceResult]]]: - """Get the flow for binary operations. - - The rules are a bit messy: - - * if left and right have the same type, then only one - method will be called, left.__op__(right) - * if left and right are unrelated typewise, then first - left.__op__(right) is tried and if this does not exist - or returns NotImplemented, then right.__rop__(left) is tried. - * if left is a subtype of right, then only left.__op__(right) - is tried. - * if left is a supertype of right, then right.__rop__(left) - is first tried and then left.__op__(right) - """ - from astroid import helpers # pylint: disable=import-outside-toplevel - - op = binary_opnode.op - if OperatorNode._same_type(left_type, right_type): - methods = [OperatorNode._bin_op(left, binary_opnode, op, right, context)] - elif helpers.is_subtype(left_type, right_type): - methods = [OperatorNode._bin_op(left, binary_opnode, op, right, context)] - elif helpers.is_supertype(left_type, right_type): - methods = [ - OperatorNode._bin_op( - right, binary_opnode, op, left, reverse_context, reverse=True - ), - OperatorNode._bin_op(left, binary_opnode, op, right, context), - ] - else: - methods = [ - OperatorNode._bin_op(left, binary_opnode, op, right, context), - OperatorNode._bin_op( - right, binary_opnode, op, left, reverse_context, reverse=True - ), - ] - - # pylint: disable = too-many-boolean-expressions - if ( - op == "|" - and ( - isinstance(left, (bases.UnionType, nodes.ClassDef)) - or (isinstance(left, nodes.Const) and left.value is None) - ) - and ( - isinstance(right, (bases.UnionType, nodes.ClassDef)) - or (isinstance(right, nodes.Const) and right.value is None) - ) - ): - methods.extend([partial(OperatorNode._bin_op_or_union_type, left, right)]) - return methods - - @staticmethod - def _infer_binary_operation( - left: InferenceResult, - right: InferenceResult, - binary_opnode: nodes.AugAssign | nodes.BinOp, - context: InferenceContext, - flow_factory: GetFlowFactory, - ) -> Generator[InferenceResult | util.BadBinaryOperationMessage]: - """Infer a binary operation between a left operand and a right operand. - - This is used by both normal binary operations and augmented binary - operations, the only difference is the flow factory used. - """ - from astroid import helpers # pylint: disable=import-outside-toplevel - - context, reverse_context = OperatorNode._get_binop_contexts( - context, left, right - ) - left_type = helpers.object_type(left) - right_type = helpers.object_type(right) - methods = flow_factory( - left, left_type, binary_opnode, right, right_type, context, reverse_context - ) - for method in methods: - try: - results = list(method()) - except AttributeError: - continue - except AttributeInferenceError: - continue - except InferenceError: - yield util.Uninferable - return - else: - if any(isinstance(result, util.UninferableBase) for result in results): - yield util.Uninferable - return - - if all(map(OperatorNode._is_not_implemented, results)): - continue - not_implemented = sum( - 1 for result in results if OperatorNode._is_not_implemented(result) - ) - if not_implemented and not_implemented != len(results): - # Can't infer yet what this is. - yield util.Uninferable - return - - yield from results - return - - # The operation doesn't seem to be supported so let the caller know about it - yield util.BadBinaryOperationMessage(left_type, binary_opnode.op, right_type) diff --git a/venv/lib/python3.12/site-packages/astroid/nodes/as_string.py b/venv/lib/python3.12/site-packages/astroid/nodes/as_string.py deleted file mode 100644 index 01007b9..0000000 --- a/venv/lib/python3.12/site-packages/astroid/nodes/as_string.py +++ /dev/null @@ -1,740 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""This module renders Astroid nodes as string""" - -from __future__ import annotations - -import warnings -from collections.abc import Iterator -from typing import TYPE_CHECKING - -from astroid import nodes - -if TYPE_CHECKING: - from astroid import objects - -# pylint: disable=unused-argument - -DOC_NEWLINE = "\0" - - -# Visitor pattern require argument all the time and is not better with staticmethod -# noinspection PyUnusedLocal,PyMethodMayBeStatic -class AsStringVisitor: - """Visitor to render an Astroid node as a valid python code string""" - - def __init__(self, indent: str = " "): - self.indent: str = indent - - def __call__(self, node: nodes.NodeNG) -> str: - """Makes this visitor behave as a simple function""" - return node.accept(self).replace(DOC_NEWLINE, "\n") - - def _docs_dedent(self, doc_node: nodes.Const | None) -> str: - """Stop newlines in docs being indented by self._stmt_list""" - if not doc_node: - return "" - - return '\n{}"""{}"""'.format( - self.indent, doc_node.value.replace("\n", DOC_NEWLINE) - ) - - def _stmt_list(self, stmts: list, indent: bool = True) -> str: - """return a list of nodes to string""" - stmts_str: str = "\n".join( - nstr for nstr in [n.accept(self) for n in stmts] if nstr - ) - if not indent: - return stmts_str - - return self.indent + stmts_str.replace("\n", "\n" + self.indent) - - def _precedence_parens( - self, node: nodes.NodeNG, child: nodes.NodeNG, is_left: bool = True - ) -> str: - """Wrap child in parens only if required to keep same semantics""" - if self._should_wrap(node, child, is_left): - return f"({child.accept(self)})" - - return child.accept(self) - - def _should_wrap( - self, node: nodes.NodeNG, child: nodes.NodeNG, is_left: bool - ) -> bool: - """Wrap child if: - - it has lower precedence - - same precedence with position opposite to associativity direction - """ - node_precedence = node.op_precedence() - child_precedence = child.op_precedence() - - if node_precedence > child_precedence: - # 3 * (4 + 5) - return True - - if ( - node_precedence == child_precedence - and is_left != node.op_left_associative() - ): - # 3 - (4 - 5) - # (2**3)**4 - return True - - return False - - # visit_ methods ########################################### - - def visit_await(self, node: nodes.Await) -> str: - return f"await {node.value.accept(self)}" - - def visit_asyncwith(self, node: nodes.AsyncWith) -> str: - return f"async {self.visit_with(node)}" - - def visit_asyncfor(self, node: nodes.AsyncFor) -> str: - return f"async {self.visit_for(node)}" - - def visit_arguments(self, node: nodes.Arguments) -> str: - """return an nodes.Arguments node as string""" - return node.format_args() - - def visit_assignattr(self, node: nodes.AssignAttr) -> str: - """return an nodes.AssignAttr node as string""" - return self.visit_attribute(node) - - def visit_assert(self, node: nodes.Assert) -> str: - """return an nodes.Assert node as string""" - if node.fail: - return f"assert {node.test.accept(self)}, {node.fail.accept(self)}" - return f"assert {node.test.accept(self)}" - - def visit_assignname(self, node: nodes.AssignName) -> str: - """return an nodes.AssignName node as string""" - return node.name - - def visit_assign(self, node: nodes.Assign) -> str: - """return an nodes.Assign node as string""" - lhs = " = ".join(n.accept(self) for n in node.targets) - return f"{lhs} = {node.value.accept(self)}" - - def visit_augassign(self, node: nodes.AugAssign) -> str: - """return an nodes.AugAssign node as string""" - return f"{node.target.accept(self)} {node.op} {node.value.accept(self)}" - - def visit_annassign(self, node: nodes.AnnAssign) -> str: - """Return an nodes.AnnAssign node as string""" - - target = node.target.accept(self) - annotation = node.annotation.accept(self) - if node.value is None: - return f"{target}: {annotation}" - return f"{target}: {annotation} = {node.value.accept(self)}" - - def visit_binop(self, node: nodes.BinOp) -> str: - """return an nodes.BinOp node as string""" - left = self._precedence_parens(node, node.left) - right = self._precedence_parens(node, node.right, is_left=False) - if node.op == "**": - return f"{left}{node.op}{right}" - - return f"{left} {node.op} {right}" - - def visit_boolop(self, node: nodes.BoolOp) -> str: - """return an nodes.BoolOp node as string""" - values = [f"{self._precedence_parens(node, n)}" for n in node.values] - return (f" {node.op} ").join(values) - - def visit_break(self, node: nodes.Break) -> str: - """return an nodes.Break node as string""" - return "break" - - def visit_call(self, node: nodes.Call) -> str: - """return an nodes.Call node as string""" - expr_str = self._precedence_parens(node, node.func) - args = [arg.accept(self) for arg in node.args] - if node.keywords: - keywords = [kwarg.accept(self) for kwarg in node.keywords] - else: - keywords = [] - - args.extend(keywords) - return f"{expr_str}({', '.join(args)})" - - def _handle_type_params( - self, type_params: list[nodes.TypeVar | nodes.ParamSpec | nodes.TypeVarTuple] - ) -> str: - return ( - f"[{', '.join(tp.accept(self) for tp in type_params)}]" - if type_params - else "" - ) - - def visit_classdef(self, node: nodes.ClassDef) -> str: - """return an nodes.ClassDef node as string""" - decorate = node.decorators.accept(self) if node.decorators else "" - type_params = self._handle_type_params(node.type_params) - args = [n.accept(self) for n in node.bases] - if node._metaclass and not node.has_metaclass_hack(): - args.append("metaclass=" + node._metaclass.accept(self)) - args += [n.accept(self) for n in node.keywords] - args_str = f"({', '.join(args)})" if args else "" - docs = self._docs_dedent(node.doc_node) - return "\n\n{}class {}{}{}:{}\n{}\n".format( - decorate, node.name, type_params, args_str, docs, self._stmt_list(node.body) - ) - - def visit_compare(self, node: nodes.Compare) -> str: - """return an nodes.Compare node as string""" - rhs_str = " ".join( - f"{op} {self._precedence_parens(node, expr, is_left=False)}" - for op, expr in node.ops - ) - return f"{self._precedence_parens(node, node.left)} {rhs_str}" - - def visit_comprehension(self, node: nodes.Comprehension) -> str: - """return an nodes.Comprehension node as string""" - ifs = "".join(f" if {n.accept(self)}" for n in node.ifs) - generated = f"for {node.target.accept(self)} in {node.iter.accept(self)}{ifs}" - return f"{'async ' if node.is_async else ''}{generated}" - - def visit_const(self, node: nodes.Const) -> str: - """return an nodes.Const node as string""" - if node.value is Ellipsis: - return "..." - return repr(node.value) - - def visit_continue(self, node: nodes.Continue) -> str: - """return an nodes.Continue node as string""" - return "continue" - - def visit_delete(self, node: nodes.Delete) -> str: - """return an nodes.Delete node as string""" - return f"del {', '.join(child.accept(self) for child in node.targets)}" - - def visit_delattr(self, node: nodes.DelAttr) -> str: - """return an nodes.DelAttr node as string""" - return self.visit_attribute(node) - - def visit_delname(self, node: nodes.DelName) -> str: - """return an nodes.DelName node as string""" - return node.name - - def visit_decorators(self, node: nodes.Decorators) -> str: - """return an nodes.Decorators node as string""" - return "@%s\n" % "\n@".join(item.accept(self) for item in node.nodes) - - def visit_dict(self, node: nodes.Dict) -> str: - """return an nodes.Dict node as string""" - return "{%s}" % ", ".join(self._visit_dict(node)) - - def _visit_dict(self, node: nodes.Dict) -> Iterator[str]: - for key, value in node.items: - key = key.accept(self) - value = value.accept(self) - if key == "**": - # It can only be a DictUnpack node. - yield key + value - else: - yield f"{key}: {value}" - - def visit_dictunpack(self, node: nodes.DictUnpack) -> str: - return "**" - - def visit_dictcomp(self, node: nodes.DictComp) -> str: - """return an nodes.DictComp node as string""" - return "{{{}: {} {}}}".format( - node.key.accept(self), - node.value.accept(self), - " ".join(n.accept(self) for n in node.generators), - ) - - def visit_expr(self, node: nodes.Expr) -> str: - """return an nodes.Expr node as string""" - return node.value.accept(self) - - def visit_emptynode(self, node: nodes.EmptyNode) -> str: - """dummy method for visiting an EmptyNode""" - return "" - - def visit_excepthandler(self, node: nodes.ExceptHandler) -> str: - n = "except" - if isinstance(getattr(node, "parent", None), nodes.TryStar): - n = "except*" - if node.type: - if node.name: - excs = f"{n} {node.type.accept(self)} as {node.name.accept(self)}" - else: - excs = f"{n} {node.type.accept(self)}" - else: - excs = f"{n}" - return f"{excs}:\n{self._stmt_list(node.body)}" - - def visit_empty(self, node: nodes.EmptyNode) -> str: - """return an EmptyNode as string""" - return "" - - def visit_for(self, node: nodes.For) -> str: - """return an nodes.For node as string""" - fors = "for {} in {}:\n{}".format( - node.target.accept(self), node.iter.accept(self), self._stmt_list(node.body) - ) - if node.orelse: - fors = f"{fors}\nelse:\n{self._stmt_list(node.orelse)}" - return fors - - def visit_importfrom(self, node: nodes.ImportFrom) -> str: - """return an nodes.ImportFrom node as string""" - return "from {} import {}".format( - "." * (node.level or 0) + node.modname, _import_string(node.names) - ) - - def visit_joinedstr(self, node: nodes.JoinedStr) -> str: - string = "".join( - # Use repr on the string literal parts - # to get proper escapes, e.g. \n, \\, \" - # But strip the quotes off the ends - # (they will always be one character: ' or ") - ( - repr(value.value)[1:-1] - # Literal braces must be doubled to escape them - .replace("{", "{{").replace("}", "}}") - # Each value in values is either a string literal (Const) - # or a FormattedValue - if type(value).__name__ == "Const" - else value.accept(self) - ) - for value in node.values - ) - - # Try to find surrounding quotes that don't appear at all in the string. - # Because the formatted values inside {} can't contain backslash (\) - # using a triple quote is sometimes necessary - for quote in ("'", '"', '"""', "'''"): - if quote not in string: - break - - return "f" + quote + string + quote - - def visit_formattedvalue(self, node: nodes.FormattedValue) -> str: - result = node.value.accept(self) - if node.conversion and node.conversion >= 0: - # e.g. if node.conversion == 114: result += "!r" - result += "!" + chr(node.conversion) - if node.format_spec: - # The format spec is itself a JoinedString, i.e. an f-string - # We strip the f and quotes of the ends - result += ":" + node.format_spec.accept(self)[2:-1] - return "{%s}" % result - - def handle_functiondef(self, node: nodes.FunctionDef, keyword: str) -> str: - """return a (possibly async) function definition node as string""" - decorate = node.decorators.accept(self) if node.decorators else "" - type_params = self._handle_type_params(node.type_params) - docs = self._docs_dedent(node.doc_node) - trailer = ":" - if node.returns: - return_annotation = " -> " + node.returns.as_string() - trailer = return_annotation + ":" - def_format = "\n%s%s %s%s(%s)%s%s\n%s" - return def_format % ( - decorate, - keyword, - node.name, - type_params, - node.args.accept(self), - trailer, - docs, - self._stmt_list(node.body), - ) - - def visit_functiondef(self, node: nodes.FunctionDef) -> str: - """return an nodes.FunctionDef node as string""" - return self.handle_functiondef(node, "def") - - def visit_asyncfunctiondef(self, node: nodes.AsyncFunctionDef) -> str: - """return an nodes.AsyncFunction node as string""" - return self.handle_functiondef(node, "async def") - - def visit_generatorexp(self, node: nodes.GeneratorExp) -> str: - """return an nodes.GeneratorExp node as string""" - return "({} {})".format( - node.elt.accept(self), " ".join(n.accept(self) for n in node.generators) - ) - - def visit_attribute( - self, node: nodes.Attribute | nodes.AssignAttr | nodes.DelAttr - ) -> str: - """return an nodes.Attribute node as string""" - try: - left = self._precedence_parens(node, node.expr) - except RecursionError: - warnings.warn( - "Recursion limit exhausted; defaulting to adding parentheses.", - UserWarning, - stacklevel=2, - ) - left = f"({node.expr.accept(self)})" - if left.isdigit(): - left = f"({left})" - return f"{left}.{node.attrname}" - - def visit_global(self, node: nodes.Global) -> str: - """return an nodes.Global node as string""" - return f"global {', '.join(node.names)}" - - def visit_if(self, node: nodes.If) -> str: - """return an nodes.If node as string""" - ifs = [f"if {node.test.accept(self)}:\n{self._stmt_list(node.body)}"] - if node.has_elif_block(): - ifs.append(f"el{self._stmt_list(node.orelse, indent=False)}") - elif node.orelse: - ifs.append(f"else:\n{self._stmt_list(node.orelse)}") - return "\n".join(ifs) - - def visit_ifexp(self, node: nodes.IfExp) -> str: - """return an nodes.IfExp node as string""" - return "{} if {} else {}".format( - self._precedence_parens(node, node.body, is_left=True), - self._precedence_parens(node, node.test, is_left=True), - self._precedence_parens(node, node.orelse, is_left=False), - ) - - def visit_import(self, node: nodes.Import) -> str: - """return an nodes.Import node as string""" - return f"import {_import_string(node.names)}" - - def visit_keyword(self, node: nodes.Keyword) -> str: - """return an nodes.Keyword node as string""" - if node.arg is None: - return f"**{node.value.accept(self)}" - return f"{node.arg}={node.value.accept(self)}" - - def visit_lambda(self, node: nodes.Lambda) -> str: - """return an nodes.Lambda node as string""" - args = node.args.accept(self) - body = node.body.accept(self) - if args: - return f"lambda {args}: {body}" - - return f"lambda: {body}" - - def visit_list(self, node: nodes.List) -> str: - """return an nodes.List node as string""" - return f"[{', '.join(child.accept(self) for child in node.elts)}]" - - def visit_listcomp(self, node: nodes.ListComp) -> str: - """return an nodes.ListComp node as string""" - return "[{} {}]".format( - node.elt.accept(self), " ".join(n.accept(self) for n in node.generators) - ) - - def visit_module(self, node: nodes.Module) -> str: - """return an nodes.Module node as string""" - docs = f'"""{node.doc_node.value}"""\n\n' if node.doc_node else "" - return docs + "\n".join(n.accept(self) for n in node.body) + "\n\n" - - def visit_name(self, node: nodes.Name) -> str: - """return an nodes.Name node as string""" - return node.name - - def visit_namedexpr(self, node: nodes.NamedExpr) -> str: - """Return an assignment expression node as string""" - target = node.target.accept(self) - value = node.value.accept(self) - return f"{target} := {value}" - - def visit_nonlocal(self, node: nodes.Nonlocal) -> str: - """return an nodes.Nonlocal node as string""" - return f"nonlocal {', '.join(node.names)}" - - def visit_paramspec(self, node: nodes.ParamSpec) -> str: - """return an nodes.ParamSpec node as string""" - default_value_str = ( - f" = {node.default_value.accept(self)}" if node.default_value else "" - ) - return f"**{node.name.accept(self)}{default_value_str}" - - def visit_pass(self, node: nodes.Pass) -> str: - """return an nodes.Pass node as string""" - return "pass" - - def visit_partialfunction(self, node: objects.PartialFunction) -> str: - """Return an objects.PartialFunction as string.""" - return self.visit_functiondef(node) - - def visit_raise(self, node: nodes.Raise) -> str: - """return an nodes.Raise node as string""" - if node.exc: - if node.cause: - return f"raise {node.exc.accept(self)} from {node.cause.accept(self)}" - return f"raise {node.exc.accept(self)}" - return "raise" - - def visit_return(self, node: nodes.Return) -> str: - """return an nodes.Return node as string""" - if node.is_tuple_return() and len(node.value.elts) > 1: - elts = [child.accept(self) for child in node.value.elts] - return f"return {', '.join(elts)}" - - if node.value: - return f"return {node.value.accept(self)}" - - return "return" - - def visit_set(self, node: nodes.Set) -> str: - """return an nodes.Set node as string""" - return "{%s}" % ", ".join(child.accept(self) for child in node.elts) - - def visit_setcomp(self, node: nodes.SetComp) -> str: - """return an nodes.SetComp node as string""" - return "{{{} {}}}".format( - node.elt.accept(self), " ".join(n.accept(self) for n in node.generators) - ) - - def visit_slice(self, node: nodes.Slice) -> str: - """return an nodes.Slice node as string""" - lower = node.lower.accept(self) if node.lower else "" - upper = node.upper.accept(self) if node.upper else "" - step = node.step.accept(self) if node.step else "" - if step: - return f"{lower}:{upper}:{step}" - return f"{lower}:{upper}" - - def visit_subscript(self, node: nodes.Subscript) -> str: - """return an nodes.Subscript node as string""" - idx = node.slice - if idx.__class__.__name__.lower() == "index": - idx = idx.value - idxstr = idx.accept(self) - if idx.__class__.__name__.lower() == "tuple" and idx.elts: - # Remove parenthesis in tuple and extended slice. - # a[(::1, 1:)] is not valid syntax. - idxstr = idxstr[1:-1] - return f"{self._precedence_parens(node, node.value)}[{idxstr}]" - - def visit_try(self, node: nodes.Try) -> str: - """return an nodes.Try node as string""" - trys = [f"try:\n{self._stmt_list(node.body)}"] - for handler in node.handlers: - trys.append(handler.accept(self)) - if node.orelse: - trys.append(f"else:\n{self._stmt_list(node.orelse)}") - if node.finalbody: - trys.append(f"finally:\n{self._stmt_list(node.finalbody)}") - return "\n".join(trys) - - def visit_trystar(self, node: nodes.TryStar) -> str: - """return an nodes.TryStar node as string""" - trys = [f"try:\n{self._stmt_list(node.body)}"] - for handler in node.handlers: - trys.append(handler.accept(self)) - if node.orelse: - trys.append(f"else:\n{self._stmt_list(node.orelse)}") - if node.finalbody: - trys.append(f"finally:\n{self._stmt_list(node.finalbody)}") - return "\n".join(trys) - - def visit_tuple(self, node: nodes.Tuple) -> str: - """return an nodes.Tuple node as string""" - if len(node.elts) == 1: - return f"({node.elts[0].accept(self)}, )" - return f"({', '.join(child.accept(self) for child in node.elts)})" - - def visit_typealias(self, node: nodes.TypeAlias) -> str: - """return an nodes.TypeAlias node as string""" - type_params = self._handle_type_params(node.type_params) - return f"type {node.name.accept(self)}{type_params} = {node.value.accept(self)}" - - def visit_typevar(self, node: nodes.TypeVar) -> str: - """return an nodes.TypeVar node as string""" - bound_str = f": {node.bound.accept(self)}" if node.bound else "" - default_value_str = ( - f" = {node.default_value.accept(self)}" if node.default_value else "" - ) - return f"{node.name.accept(self)}{bound_str}{default_value_str}" - - def visit_typevartuple(self, node: nodes.TypeVarTuple) -> str: - """return an nodes.TypeVarTuple node as string""" - default_value_str = ( - f" = {node.default_value.accept(self)}" if node.default_value else "" - ) - return f"*{node.name.accept(self)}{default_value_str}" - - def visit_unaryop(self, node: nodes.UnaryOp) -> str: - """return an nodes.UnaryOp node as string""" - if node.op == "not": - operator = "not " - else: - operator = node.op - return f"{operator}{self._precedence_parens(node, node.operand)}" - - def visit_while(self, node: nodes.While) -> str: - """return an nodes.While node as string""" - whiles = f"while {node.test.accept(self)}:\n{self._stmt_list(node.body)}" - if node.orelse: - whiles = f"{whiles}\nelse:\n{self._stmt_list(node.orelse)}" - return whiles - - def visit_with(self, node: nodes.With) -> str: # 'with' without 'as' is possible - """return an nodes.With node as string""" - items = ", ".join( - f"{expr.accept(self)}" + ((v and f" as {v.accept(self)}") or "") - for expr, v in node.items - ) - return f"with {items}:\n{self._stmt_list(node.body)}" - - def visit_yield(self, node: nodes.Yield) -> str: - """yield an ast.Yield node as string""" - yi_val = (" " + node.value.accept(self)) if node.value else "" - expr = "yield" + yi_val - if node.parent.is_statement: - return expr - - return f"({expr})" - - def visit_yieldfrom(self, node: nodes.YieldFrom) -> str: - """Return an nodes.YieldFrom node as string.""" - yi_val = (" " + node.value.accept(self)) if node.value else "" - expr = "yield from" + yi_val - if node.parent.is_statement: - return expr - - return f"({expr})" - - def visit_starred(self, node: nodes.Starred) -> str: - """return Starred node as string""" - return "*" + node.value.accept(self) - - def visit_match(self, node: nodes.Match) -> str: - """Return an nodes.Match node as string.""" - return f"match {node.subject.accept(self)}:\n{self._stmt_list(node.cases)}" - - def visit_matchcase(self, node: nodes.MatchCase) -> str: - """Return an nodes.MatchCase node as string.""" - guard_str = f" if {node.guard.accept(self)}" if node.guard else "" - return ( - f"case {node.pattern.accept(self)}{guard_str}:\n" - f"{self._stmt_list(node.body)}" - ) - - def visit_matchvalue(self, node: nodes.MatchValue) -> str: - """Return an nodes.MatchValue node as string.""" - return node.value.accept(self) - - @staticmethod - def visit_matchsingleton(node: nodes.MatchSingleton) -> str: - """Return an nodes.MatchSingleton node as string.""" - return str(node.value) - - def visit_matchsequence(self, node: nodes.MatchSequence) -> str: - """Return an nodes.MatchSequence node as string.""" - if node.patterns is None: - return "[]" - return f"[{', '.join(p.accept(self) for p in node.patterns)}]" - - def visit_matchmapping(self, node: nodes.MatchMapping) -> str: - """Return an nodes..MatchMapping node as string.""" - mapping_strings: list[str] = [] - if node.keys and node.patterns: - mapping_strings.extend( - f"{key.accept(self)}: {p.accept(self)}" - for key, p in zip(node.keys, node.patterns) - ) - if node.rest: - mapping_strings.append(f"**{node.rest.accept(self)}") - return f"{'{'}{', '.join(mapping_strings)}{'}'}" - - def visit_matchclass(self, node: nodes.MatchClass) -> str: - """Return an nodes..MatchClass node as string.""" - if node.cls is None: - raise AssertionError(f"{node} does not have a 'cls' node") - class_strings: list[str] = [] - if node.patterns: - class_strings.extend(p.accept(self) for p in node.patterns) - if node.kwd_attrs and node.kwd_patterns: - for attr, pattern in zip(node.kwd_attrs, node.kwd_patterns): - class_strings.append(f"{attr}={pattern.accept(self)}") - return f"{node.cls.accept(self)}({', '.join(class_strings)})" - - def visit_matchstar(self, node: nodes.MatchStar) -> str: - """Return an nodes..MatchStar node as string.""" - return f"*{node.name.accept(self) if node.name else '_'}" - - def visit_matchas(self, node: nodes.MatchAs) -> str: - """Return an nodes..MatchAs node as string.""" - if isinstance( - node.parent, (nodes.MatchSequence, nodes.MatchMapping, nodes.MatchClass) - ): - return node.name.accept(self) if node.name else "_" - return ( - f"{node.pattern.accept(self) if node.pattern else '_'}" - f"{f' as {node.name.accept(self)}' if node.name else ''}" - ) - - def visit_matchor(self, node: nodes.MatchOr) -> str: - """Return an nodes.MatchOr node as string.""" - if node.patterns is None: - raise AssertionError(f"{node} does not have pattern nodes") - return " | ".join(p.accept(self) for p in node.patterns) - - def visit_templatestr(self, node: nodes.TemplateStr) -> str: - """Return an nodes.TemplateStr node as string.""" - string = "" - for value in node.values: - match value: - case nodes.Interpolation(): - string += "{" + value.accept(self) + "}" - case _: - string += value.accept(self)[1:-1] - for quote in ("'", '"', '"""', "'''"): - if quote not in string: - break - return "t" + quote + string + quote - - def visit_interpolation(self, node: nodes.Interpolation) -> str: - """Return an nodes.Interpolation node as string.""" - result = f"{node.str}" - if node.conversion and node.conversion >= 0: - # e.g. if node.conversion == 114: result += "!r" - result += "!" + chr(node.conversion) - if node.format_spec: - # The format spec is itself a JoinedString, i.e. an f-string - # We strip the f and quotes of the ends - result += ":" + node.format_spec.accept(self)[2:-1] - return result - - # These aren't for real AST nodes, but for inference objects. - - def visit_frozenset(self, node: objects.FrozenSet) -> str: - return node.parent.accept(self) - - def visit_super(self, node: objects.Super) -> str: - return node.parent.accept(self) - - def visit_uninferable(self, node) -> str: - return str(node) - - def visit_property(self, node: objects.Property) -> str: - return node.function.accept(self) - - def visit_evaluatedobject(self, node: nodes.EvaluatedObject) -> str: - return node.original.accept(self) - - def visit_unknown(self, node: nodes.Unknown) -> str: - return str(node) - - -def _import_string(names: list[tuple[str, str | None]]) -> str: - """return a list of (name, asname) formatted as a string""" - _names = [] - for name, asname in names: - if asname is not None: - _names.append(f"{name} as {asname}") - else: - _names.append(name) - return ", ".join(_names) - - -# This sets the default indent to 4 spaces. -to_code = AsStringVisitor(" ") diff --git a/venv/lib/python3.12/site-packages/astroid/nodes/const.py b/venv/lib/python3.12/site-packages/astroid/nodes/const.py deleted file mode 100644 index f66b633..0000000 --- a/venv/lib/python3.12/site-packages/astroid/nodes/const.py +++ /dev/null @@ -1,27 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -OP_PRECEDENCE = { - op: precedence - for precedence, ops in enumerate( - [ - ["Lambda"], # lambda x: x + 1 - ["IfExp"], # 1 if True else 2 - ["or"], - ["and"], - ["not"], - ["Compare"], # in, not in, is, is not, <, <=, >, >=, !=, == - ["|"], - ["^"], - ["&"], - ["<<", ">>"], - ["+", "-"], - ["*", "@", "/", "//", "%"], - ["UnaryOp"], # +, -, ~ - ["**"], - ["Await"], - ] - ) - for op in ops -} diff --git a/venv/lib/python3.12/site-packages/astroid/nodes/node_classes.py b/venv/lib/python3.12/site-packages/astroid/nodes/node_classes.py deleted file mode 100644 index b9077de..0000000 --- a/venv/lib/python3.12/site-packages/astroid/nodes/node_classes.py +++ /dev/null @@ -1,5707 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Module for some node classes. More nodes in scoped_nodes.py""" - -from __future__ import annotations - -import abc -import ast -import itertools -import operator -import sys -import typing -import warnings -from collections.abc import Callable, Generator, Iterable, Iterator, Mapping -from functools import cached_property -from typing import TYPE_CHECKING, Any, ClassVar, Literal, Union - -from astroid import decorators, protocols, util -from astroid.bases import Instance, _infer_stmts -from astroid.const import _EMPTY_OBJECT_MARKER, PY314_PLUS, Context -from astroid.context import CallContext, InferenceContext, copy_context -from astroid.exceptions import ( - AstroidBuildingError, - AstroidError, - AstroidIndexError, - AstroidTypeError, - AstroidValueError, - AttributeInferenceError, - InferenceError, - NameInferenceError, - NoDefault, - ParentMissingError, - _NonDeducibleTypeHierarchy, -) -from astroid.interpreter import dunder_lookup -from astroid.manager import AstroidManager -from astroid.nodes import _base_nodes -from astroid.nodes.const import OP_PRECEDENCE -from astroid.nodes.node_ng import NodeNG -from astroid.nodes.scoped_nodes import SYNTHETIC_ROOT -from astroid.typing import ( - ConstFactoryResult, - InferenceErrorInfo, - InferenceResult, - SuccessfulInferenceResult, -) - -if sys.version_info >= (3, 11): - from typing import Self -else: - from typing_extensions import Self - -if TYPE_CHECKING: - from astroid import nodes - from astroid.nodes import LocalsDictNodeNG - - -def _is_const(value) -> bool: - return isinstance(value, tuple(CONST_CLS)) - - -_NodesT = typing.TypeVar("_NodesT", bound=NodeNG) -_BadOpMessageT = typing.TypeVar("_BadOpMessageT", bound=util.BadOperationMessage) - -# pylint: disable-next=consider-alternative-union-syntax -AssignedStmtsPossibleNode = Union["List", "Tuple", "AssignName", "AssignAttr", None] -AssignedStmtsCall = Callable[ - [ - _NodesT, - AssignedStmtsPossibleNode, - InferenceContext | None, - list[int] | None, - ], - Any, -] -InferBinaryOperation = Callable[ - [_NodesT, InferenceContext | None], - Generator[InferenceResult | _BadOpMessageT], -] -InferLHS = Callable[ - [_NodesT, InferenceContext | None], - Generator[InferenceResult, None, InferenceErrorInfo | None], -] -InferUnaryOp = Callable[[_NodesT, str], ConstFactoryResult] - - -@decorators.raise_if_nothing_inferred -def unpack_infer(stmt, context: InferenceContext | None = None): - """recursively generate nodes inferred by the given statement. - If the inferred value is a list or a tuple, recurse on the elements - """ - if isinstance(stmt, (List, Tuple)): - for elt in stmt.elts: - if elt is util.Uninferable: - yield elt - continue - yield from unpack_infer(elt, context) - return {"node": stmt, "context": context} - # if inferred is a final node, return it and stop - inferred = next(stmt.infer(context), util.Uninferable) - if inferred is stmt: - yield inferred - return {"node": stmt, "context": context} - # else, infer recursively, except Uninferable object that should be returned as is - for inferred in stmt.infer(context): - if isinstance(inferred, util.UninferableBase): - yield inferred - else: - yield from unpack_infer(inferred, context) - - return {"node": stmt, "context": context} - - -def are_exclusive(stmt1, stmt2, exceptions: list[str] | None = None) -> bool: - """return true if the two given statements are mutually exclusive - - `exceptions` may be a list of exception names. If specified, discard If - branches and check one of the statement is in an exception handler catching - one of the given exceptions. - - algorithm : - 1) index stmt1's parents - 2) climb among stmt2's parents until we find a common parent - 3) if the common parent is a If or Try statement, look if nodes are - in exclusive branches - """ - # index stmt1's parents - stmt1_parents = {} - children = {} - previous = stmt1 - for node in stmt1.node_ancestors(): - stmt1_parents[node] = 1 - children[node] = previous - previous = node - # climb among stmt2's parents until we find a common parent - previous = stmt2 - for node in stmt2.node_ancestors(): - if node in stmt1_parents: - # if the common parent is a If or Try statement, look if - # nodes are in exclusive branches - if isinstance(node, If) and exceptions is None: - c2attr, c2node = node.locate_child(previous) - c1attr, c1node = node.locate_child(children[node]) - if "test" in (c1attr, c2attr): - # If any node is `If.test`, then it must be inclusive with - # the other node (`If.body` and `If.orelse`) - return False - if c1attr != c2attr: - # different `If` branches (`If.body` and `If.orelse`) - return True - elif isinstance(node, Try): - c2attr, c2node = node.locate_child(previous) - c1attr, c1node = node.locate_child(children[node]) - if c1node is not c2node: - first_in_body_caught_by_handlers = ( - c2attr == "handlers" - and c1attr == "body" - and previous.catch(exceptions) - ) - second_in_body_caught_by_handlers = ( - c2attr == "body" - and c1attr == "handlers" - and children[node].catch(exceptions) - ) - first_in_else_other_in_handlers = ( - c2attr == "handlers" and c1attr == "orelse" - ) - second_in_else_other_in_handlers = ( - c2attr == "orelse" and c1attr == "handlers" - ) - if any( - ( - first_in_body_caught_by_handlers, - second_in_body_caught_by_handlers, - first_in_else_other_in_handlers, - second_in_else_other_in_handlers, - ) - ): - return True - elif c2attr == "handlers" and c1attr == "handlers": - return previous is not children[node] - return False - previous = node - return False - - -# getitem() helpers. - -_SLICE_SENTINEL = object() - - -def _slice_value(index, context: InferenceContext | None = None): - """Get the value of the given slice index.""" - - if isinstance(index, Const): - if isinstance(index.value, (int, type(None))): - return index.value - elif index is None: - return None - else: - # Try to infer what the index actually is. - # Since we can't return all the possible values, - # we'll stop at the first possible value. - try: - inferred = next(index.infer(context=context)) - except (InferenceError, StopIteration): - pass - else: - if isinstance(inferred, Const): - if isinstance(inferred.value, (int, type(None))): - return inferred.value - - # Use a sentinel, because None can be a valid - # value that this function can return, - # as it is the case for unspecified bounds. - return _SLICE_SENTINEL - - -def _infer_slice(node, context: InferenceContext | None = None): - lower = _slice_value(node.lower, context) - upper = _slice_value(node.upper, context) - step = _slice_value(node.step, context) - if all(elem is not _SLICE_SENTINEL for elem in (lower, upper, step)): - return slice(lower, upper, step) - - raise AstroidTypeError( - message="Could not infer slice used in subscript", - node=node, - index=node.parent, - context=context, - ) - - -def _container_getitem(instance, elts, index, context: InferenceContext | None = None): - """Get a slice or an item, using the given *index*, for the given sequence.""" - try: - if isinstance(index, Slice): - index_slice = _infer_slice(index, context=context) - new_cls = instance.__class__() - new_cls.elts = elts[index_slice] - new_cls.parent = instance.parent - return new_cls - if isinstance(index, Const): - return elts[index.value] - except ValueError as exc: - raise AstroidValueError( - message="Slice {index!r} cannot index container", - node=instance, - index=index, - context=context, - ) from exc - except IndexError as exc: - raise AstroidIndexError( - message="Index {index!s} out of range", - node=instance, - index=index, - context=context, - ) from exc - except TypeError as exc: - raise AstroidTypeError( - message="Type error {error!r}", node=instance, index=index, context=context - ) from exc - - raise AstroidTypeError(f"Could not use {index} as subscript index") - - -class BaseContainer(_base_nodes.ParentAssignNode, Instance, metaclass=abc.ABCMeta): - """Base class for Set, FrozenSet, Tuple and List.""" - - _astroid_fields = ("elts",) - - def __init__( - self, - lineno: int | None, - col_offset: int | None, - parent: NodeNG | None, - *, - end_lineno: int | None, - end_col_offset: int | None, - ) -> None: - self.elts: list[SuccessfulInferenceResult] = [] - """The elements in the node.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit(self, elts: list[SuccessfulInferenceResult]) -> None: - self.elts = elts - - @classmethod - def from_elements(cls, elts: Iterable[Any]) -> Self: - """Create a node of this type from the given list of elements. - - :param elts: The list of elements that the node should contain. - - :returns: A new node containing the given elements. - """ - node = cls( - lineno=None, - col_offset=None, - parent=None, - end_lineno=None, - end_col_offset=None, - ) - node.elts = [const_factory(e) if _is_const(e) else e for e in elts] - return node - - def itered(self): - """An iterator over the elements this node contains. - - :returns: The contents of this node. - :rtype: iterable(NodeNG) - """ - return self.elts - - def bool_value(self, context: InferenceContext | None = None) -> bool: - """Determine the boolean value of this node. - - :returns: The boolean value of this node. - """ - return bool(self.elts) - - @abc.abstractmethod - def pytype(self) -> str: - """Get the name of the type that this node represents. - - :returns: The name of the type. - """ - - def get_children(self): - yield from self.elts - - @decorators.raise_if_nothing_inferred - def _infer( - self, - context: InferenceContext | None = None, - **kwargs: Any, - ) -> Iterator[Self]: - has_starred_named_expr = any( - isinstance(e, (Starred, NamedExpr)) for e in self.elts - ) - if has_starred_named_expr: - values = self._infer_sequence_helper(context) - new_seq = type(self)( - lineno=self.lineno, - col_offset=self.col_offset, - parent=self.parent, - end_lineno=self.end_lineno, - end_col_offset=self.end_col_offset, - ) - new_seq.postinit(values) - - yield new_seq - else: - yield self - - def _infer_sequence_helper( - self, context: InferenceContext | None = None - ) -> list[SuccessfulInferenceResult]: - """Infer all values based on BaseContainer.elts.""" - values = [] - - for elt in self.elts: - if isinstance(elt, Starred): - starred = util.safe_infer(elt.value, context) - if not starred: - raise InferenceError(node=self, context=context) - if not hasattr(starred, "elts"): - raise InferenceError(node=self, context=context) - # TODO: fresh context? - values.extend(starred._infer_sequence_helper(context)) - elif isinstance(elt, NamedExpr): - value = util.safe_infer(elt.value, context) - if not value: - raise InferenceError(node=self, context=context) - values.append(value) - else: - values.append(elt) - return values - - -# Name classes - - -class AssignName( - _base_nodes.NoChildrenNode, - _base_nodes.LookupMixIn, - _base_nodes.ParentAssignNode, -): - """Variation of :class:`ast.Assign` representing assignment to a name. - - An :class:`AssignName` is the name of something that is assigned to. - This includes variables defined in a function signature or in a loop. - - >>> import astroid - >>> node = astroid.extract_node('variable = range(10)') - >>> node - - >>> list(node.get_children()) - [, ] - >>> list(node.get_children())[0].as_string() - 'variable' - """ - - _other_fields = ("name",) - - def __init__( - self, - name: str, - lineno: int, - col_offset: int, - parent: NodeNG, - *, - end_lineno: int | None, - end_col_offset: int | None, - ) -> None: - self.name = name - """The name that is assigned to.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - assigned_stmts = protocols.assend_assigned_stmts - """Returns the assigned statement (non inferred) according to the assignment type. - See astroid/protocols.py for actual implementation. - """ - - @decorators.raise_if_nothing_inferred - @decorators.path_wrapper - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[InferenceResult, None, InferenceErrorInfo | None]: - """Infer an AssignName: need to inspect the RHS part of the - assign node. - """ - if isinstance(self.parent, AugAssign): - return self.parent.infer(context) - - stmts = list(self.assigned_stmts(context=context)) - return _infer_stmts(stmts, context) - - @decorators.raise_if_nothing_inferred - def infer_lhs( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[InferenceResult, None, InferenceErrorInfo | None]: - """Infer a Name: use name lookup rules. - - Same implementation as Name._infer.""" - # pylint: disable=import-outside-toplevel - from astroid.constraint import get_constraints - from astroid.helpers import _higher_function_scope - - frame, stmts = self.lookup(self.name) - if not stmts: - # Try to see if the name is enclosed in a nested function - # and use the higher (first function) scope for searching. - parent_function = _higher_function_scope(self.scope()) - if parent_function: - _, stmts = parent_function.lookup(self.name) - - if not stmts: - raise NameInferenceError( - name=self.name, scope=self.scope(), context=context - ) - context = copy_context(context) - context.lookupname = self.name - context.constraints[self.name] = get_constraints(self, frame) - - return _infer_stmts(stmts, context, frame) - - -class DelName( - _base_nodes.NoChildrenNode, _base_nodes.LookupMixIn, _base_nodes.ParentAssignNode -): - """Variation of :class:`ast.Delete` representing deletion of a name. - - A :class:`DelName` is the name of something that is deleted. - - >>> import astroid - >>> node = astroid.extract_node("del variable #@") - >>> list(node.get_children()) - [] - >>> list(node.get_children())[0].as_string() - 'variable' - """ - - _other_fields = ("name",) - - def __init__( - self, - name: str, - lineno: int, - col_offset: int, - parent: NodeNG, - *, - end_lineno: int | None, - end_col_offset: int | None, - ) -> None: - self.name = name - """The name that is being deleted.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - -class Name(_base_nodes.LookupMixIn, _base_nodes.NoChildrenNode): - """Class representing an :class:`ast.Name` node. - - A :class:`Name` node is something that is named, but not covered by - :class:`AssignName` or :class:`DelName`. - - >>> import astroid - >>> node = astroid.extract_node('range(10)') - >>> node - - >>> list(node.get_children()) - [, ] - >>> list(node.get_children())[0].as_string() - 'range' - """ - - _other_fields = ("name",) - - def __init__( - self, - name: str, - lineno: int, - col_offset: int, - parent: NodeNG, - *, - end_lineno: int | None, - end_col_offset: int | None, - ) -> None: - self.name = name - """The name that this node refers to.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def _get_name_nodes(self): - yield self - - for child_node in self.get_children(): - yield from child_node._get_name_nodes() - - @decorators.raise_if_nothing_inferred - @decorators.path_wrapper - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[InferenceResult, None, InferenceErrorInfo | None]: - """Infer a Name: use name lookup rules - - Same implementation as AssignName._infer_lhs.""" - # pylint: disable=import-outside-toplevel - from astroid.constraint import get_constraints - from astroid.helpers import _higher_function_scope - - frame, stmts = self.lookup(self.name) - if not stmts: - # Try to see if the name is enclosed in a nested function - # and use the higher (first function) scope for searching. - parent_function = _higher_function_scope(self.scope()) - if parent_function: - _, stmts = parent_function.lookup(self.name) - - if not stmts: - raise NameInferenceError( - name=self.name, scope=self.scope(), context=context - ) - context = copy_context(context) - context.lookupname = self.name - context.constraints[self.name] = get_constraints(self, frame) - - return _infer_stmts(stmts, context, frame) - - -DEPRECATED_ARGUMENT_DEFAULT = "DEPRECATED_ARGUMENT_DEFAULT" - - -class Arguments( - _base_nodes.AssignTypeNode -): # pylint: disable=too-many-instance-attributes - """Class representing an :class:`ast.arguments` node. - - An :class:`Arguments` node represents that arguments in a - function definition. - - >>> import astroid - >>> node = astroid.extract_node('def foo(bar): pass') - >>> node - - >>> node.args - - """ - - # Python 3.4+ uses a different approach regarding annotations, - # each argument is a new class, _ast.arg, which exposes an - # 'annotation' attribute. In astroid though, arguments are exposed - # as is in the Arguments node and the only way to expose annotations - # is by using something similar with Python 3.3: - # - we expose 'varargannotation' and 'kwargannotation' of annotations - # of varargs and kwargs. - # - we expose 'annotation', a list with annotations for - # for each normal argument. If an argument doesn't have an - # annotation, its value will be None. - _astroid_fields = ( - "args", - "defaults", - "kwonlyargs", - "posonlyargs", - "posonlyargs_annotations", - "kw_defaults", - "annotations", - "varargannotation", - "kwargannotation", - "kwonlyargs_annotations", - "type_comment_args", - "type_comment_kwonlyargs", - "type_comment_posonlyargs", - ) - - _other_fields = ("vararg", "kwarg") - - args: list[AssignName] | None - """The names of the required arguments. - - Can be None if the associated function does not have a retrievable - signature and the arguments are therefore unknown. - This can happen with (builtin) functions implemented in C that have - incomplete signature information. - """ - - defaults: list[NodeNG] | None - """The default values for arguments that can be passed positionally.""" - - kwonlyargs: list[AssignName] - """The keyword arguments that cannot be passed positionally.""" - - posonlyargs: list[AssignName] - """The arguments that can only be passed positionally.""" - - kw_defaults: list[NodeNG | None] | None - """The default values for keyword arguments that cannot be passed positionally.""" - - annotations: list[NodeNG | None] - """The type annotations of arguments that can be passed positionally.""" - - posonlyargs_annotations: list[NodeNG | None] - """The type annotations of arguments that can only be passed positionally.""" - - kwonlyargs_annotations: list[NodeNG | None] - """The type annotations of arguments that cannot be passed positionally.""" - - type_comment_args: list[NodeNG | None] - """The type annotation, passed by a type comment, of each argument. - - If an argument does not have a type comment, - the value for that argument will be None. - """ - - type_comment_kwonlyargs: list[NodeNG | None] - """The type annotation, passed by a type comment, of each keyword only argument. - - If an argument does not have a type comment, - the value for that argument will be None. - """ - - type_comment_posonlyargs: list[NodeNG | None] - """The type annotation, passed by a type comment, of each positional argument. - - If an argument does not have a type comment, - the value for that argument will be None. - """ - - varargannotation: NodeNG | None - """The type annotation for the variable length arguments.""" - - kwargannotation: NodeNG | None - """The type annotation for the variable length keyword arguments.""" - - vararg_node: AssignName | None - """The node for variable length arguments""" - - kwarg_node: AssignName | None - """The node for variable keyword arguments""" - - def __init__( - self, - vararg: str | None, - kwarg: str | None, - parent: NodeNG, - vararg_node: AssignName | None = None, - kwarg_node: AssignName | None = None, - ) -> None: - """Almost all attributes can be None for living objects where introspection failed.""" - super().__init__( - parent=parent, - lineno=None, - col_offset=None, - end_lineno=None, - end_col_offset=None, - ) - - self.vararg = vararg - """The name of the variable length arguments.""" - - self.kwarg = kwarg - """The name of the variable length keyword arguments.""" - - self.vararg_node = vararg_node - self.kwarg_node = kwarg_node - - # pylint: disable=too-many-arguments, too-many-positional-arguments - def postinit( - self, - args: list[AssignName] | None, - defaults: list[NodeNG] | None, - kwonlyargs: list[AssignName], - kw_defaults: list[NodeNG | None] | None, - annotations: list[NodeNG | None], - posonlyargs: list[AssignName], - kwonlyargs_annotations: list[NodeNG | None], - posonlyargs_annotations: list[NodeNG | None], - varargannotation: NodeNG | None = None, - kwargannotation: NodeNG | None = None, - type_comment_args: list[NodeNG | None] | None = None, - type_comment_kwonlyargs: list[NodeNG | None] | None = None, - type_comment_posonlyargs: list[NodeNG | None] | None = None, - ) -> None: - self.args = args - self.defaults = defaults - self.kwonlyargs = kwonlyargs - self.posonlyargs = posonlyargs - self.kw_defaults = kw_defaults - self.annotations = annotations - self.kwonlyargs_annotations = kwonlyargs_annotations - self.posonlyargs_annotations = posonlyargs_annotations - - # Parameters that got added later and need a default - self.varargannotation = varargannotation - self.kwargannotation = kwargannotation - if type_comment_args is None: - type_comment_args = [] - self.type_comment_args = type_comment_args - if type_comment_kwonlyargs is None: - type_comment_kwonlyargs = [] - self.type_comment_kwonlyargs = type_comment_kwonlyargs - if type_comment_posonlyargs is None: - type_comment_posonlyargs = [] - self.type_comment_posonlyargs = type_comment_posonlyargs - - assigned_stmts = protocols.arguments_assigned_stmts - """Returns the assigned statement (non inferred) according to the assignment type. - See astroid/protocols.py for actual implementation. - """ - - def _infer_name(self, frame, name): - if self.parent is frame: - return name - return None - - @cached_property - def fromlineno(self) -> int: - """The first line that this node appears on in the source code. - - Can also return 0 if the line can not be determined. - """ - lineno = super().fromlineno - return max(lineno, self.parent.fromlineno or 0) - - @cached_property - def arguments(self): - """Get all the arguments for this node. This includes: - * Positional only arguments - * Positional arguments - * Keyword arguments - * Variable arguments (.e.g *args) - * Variable keyword arguments (e.g **kwargs) - """ - retval = list(itertools.chain((self.posonlyargs or ()), (self.args or ()))) - if self.vararg_node: - retval.append(self.vararg_node) - retval += self.kwonlyargs or () - if self.kwarg_node: - retval.append(self.kwarg_node) - - return retval - - def format_args(self, *, skippable_names: set[str] | None = None) -> str: - """Get the arguments formatted as string. - - :returns: The formatted arguments. - :rtype: str - """ - result = [] - positional_only_defaults = [] - positional_or_keyword_defaults = self.defaults - if self.defaults: - args = self.args or [] - positional_or_keyword_defaults = self.defaults[-len(args) :] - positional_only_defaults = self.defaults[: len(self.defaults) - len(args)] - - if self.posonlyargs: - result.append( - _format_args( - self.posonlyargs, - positional_only_defaults, - self.posonlyargs_annotations, - skippable_names=skippable_names, - ) - ) - result.append("/") - if self.args: - result.append( - _format_args( - self.args, - positional_or_keyword_defaults, - getattr(self, "annotations", None), - skippable_names=skippable_names, - ) - ) - if self.vararg: - result.append(f"*{self.vararg}") - if self.kwonlyargs: - if not self.vararg: - result.append("*") - result.append( - _format_args( - self.kwonlyargs, - self.kw_defaults, - self.kwonlyargs_annotations, - skippable_names=skippable_names, - ) - ) - if self.kwarg: - result.append(f"**{self.kwarg}") - return ", ".join(result) - - def _get_arguments_data( - self, - ) -> tuple[ - dict[str, tuple[str | None, str | None]], - dict[str, tuple[str | None, str | None]], - ]: - """Get the arguments as dictionary with information about typing and defaults. - - The return tuple contains a dictionary for positional and keyword arguments with their typing - and their default value, if any. - The method follows a similar order as format_args but instead of formatting into a string it - returns the data that is used to do so. - """ - pos_only: dict[str, tuple[str | None, str | None]] = {} - kw_only: dict[str, tuple[str | None, str | None]] = {} - - # Setup and match defaults with arguments - positional_only_defaults = [] - positional_or_keyword_defaults = self.defaults - if self.defaults: - args = self.args or [] - positional_or_keyword_defaults = self.defaults[-len(args) :] - positional_only_defaults = self.defaults[: len(self.defaults) - len(args)] - - for index, posonly in enumerate(self.posonlyargs): - annotation, default = self.posonlyargs_annotations[index], None - if annotation is not None: - annotation = annotation.as_string() - if positional_only_defaults: - default = positional_only_defaults[index].as_string() - pos_only[posonly.name] = (annotation, default) - - for index, arg in enumerate(self.args): - annotation, default = self.annotations[index], None - if annotation is not None: - annotation = annotation.as_string() - if positional_or_keyword_defaults: - defaults_offset = len(self.args) - len(positional_or_keyword_defaults) - default_index = index - defaults_offset - if ( - default_index > -1 - and positional_or_keyword_defaults[default_index] is not None - ): - default = positional_or_keyword_defaults[default_index].as_string() - pos_only[arg.name] = (annotation, default) - - if self.vararg: - annotation = self.varargannotation - if annotation is not None: - annotation = annotation.as_string() - pos_only[self.vararg] = (annotation, None) - - for index, kwarg in enumerate(self.kwonlyargs): - annotation = self.kwonlyargs_annotations[index] - if annotation is not None: - annotation = annotation.as_string() - default = self.kw_defaults[index] - if default is not None: - default = default.as_string() - kw_only[kwarg.name] = (annotation, default) - - if self.kwarg: - annotation = self.kwargannotation - if annotation is not None: - annotation = annotation.as_string() - kw_only[self.kwarg] = (annotation, None) - - return pos_only, kw_only - - def default_value(self, argname): - """Get the default value for an argument. - - :param argname: The name of the argument to get the default value for. - :type argname: str - - :raises NoDefault: If there is no default value defined for the - given argument. - """ - args = [ - arg for arg in self.arguments if arg.name not in [self.vararg, self.kwarg] - ] - - index = _find_arg(argname, self.kwonlyargs)[0] - if (index is not None) and (len(self.kw_defaults) > index): - if self.kw_defaults[index] is not None: - return self.kw_defaults[index] - raise NoDefault(func=self.parent, name=argname) - - index = _find_arg(argname, args)[0] - if index is not None: - idx = index - (len(args) - len(self.defaults) - len(self.kw_defaults)) - if idx >= 0: - return self.defaults[idx] - - raise NoDefault(func=self.parent, name=argname) - - def is_argument(self, name) -> bool: - """Check if the given name is defined in the arguments. - - :param name: The name to check for. - :type name: str - - :returns: Whether the given name is defined in the arguments, - """ - if name == self.vararg: - return True - if name == self.kwarg: - return True - return self.find_argname(name)[1] is not None - - def find_argname(self, argname, rec=DEPRECATED_ARGUMENT_DEFAULT): - """Get the index and :class:`AssignName` node for given name. - - :param argname: The name of the argument to search for. - :type argname: str - - :returns: The index and node for the argument. - :rtype: tuple(str or None, AssignName or None) - """ - if rec != DEPRECATED_ARGUMENT_DEFAULT: # pragma: no cover - warnings.warn( - "The rec argument will be removed in astroid 3.1.", - DeprecationWarning, - stacklevel=2, - ) - if self.arguments: - index, argument = _find_arg(argname, self.arguments) - if argument: - return index, argument - return None, None - - def get_children(self): - yield from self.posonlyargs or () - - for elt in self.posonlyargs_annotations: - if elt is not None: - yield elt - - yield from self.args or () - - if self.defaults is not None: - yield from self.defaults - yield from self.kwonlyargs - - for elt in self.kw_defaults or (): - if elt is not None: - yield elt - - for elt in self.annotations: - if elt is not None: - yield elt - - if self.varargannotation is not None: - yield self.varargannotation - - if self.kwargannotation is not None: - yield self.kwargannotation - - for elt in self.kwonlyargs_annotations: - if elt is not None: - yield elt - - @decorators.raise_if_nothing_inferred - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[InferenceResult]: - # pylint: disable-next=import-outside-toplevel - from astroid.protocols import _arguments_infer_argname - - if context is None or context.lookupname is None: - raise InferenceError(node=self, context=context) - return _arguments_infer_argname(self, context.lookupname, context) - - -def _find_arg(argname, args): - for i, arg in enumerate(args): - if arg.name == argname: - return i, arg - return None, None - - -def _format_args( - args, defaults=None, annotations=None, skippable_names: set[str] | None = None -) -> str: - if skippable_names is None: - skippable_names = set() - values = [] - if args is None: - return "" - if annotations is None: - annotations = [] - if defaults is not None: - default_offset = len(args) - len(defaults) - else: - default_offset = None - packed = itertools.zip_longest(args, annotations) - for i, (arg, annotation) in enumerate(packed): - if arg.name in skippable_names: - continue - if isinstance(arg, Tuple): - values.append(f"({_format_args(arg.elts)})") - else: - argname = arg.name - default_sep = "=" - if annotation is not None: - argname += ": " + annotation.as_string() - default_sep = " = " - values.append(argname) - - if default_offset is not None and i >= default_offset: - if defaults[i - default_offset] is not None: - values[-1] += default_sep + defaults[i - default_offset].as_string() - return ", ".join(values) - - -def _infer_attribute( - node: nodes.AssignAttr | nodes.Attribute, - context: InferenceContext | None = None, - **kwargs: Any, -) -> Generator[InferenceResult, None, InferenceErrorInfo]: - """Infer an AssignAttr/Attribute node by using getattr on the associated object.""" - # pylint: disable=import-outside-toplevel - from astroid.constraint import get_constraints - from astroid.nodes import ClassDef - - for owner in node.expr.infer(context): - if isinstance(owner, util.UninferableBase): - yield owner - continue - - context = copy_context(context) - old_boundnode = context.boundnode - try: - context.boundnode = owner - if isinstance(owner, (ClassDef, Instance)): - frame = owner if isinstance(owner, ClassDef) else owner._proxied - context.constraints[node.attrname] = get_constraints(node, frame=frame) - if node.attrname == "argv" and owner.name == "sys": - # sys.argv will never be inferable during static analysis - # It's value would be the args passed to the linter itself - yield util.Uninferable - else: - yield from owner.igetattr(node.attrname, context) - except ( - AttributeInferenceError, - InferenceError, - AttributeError, - ): - pass - finally: - context.boundnode = old_boundnode - return InferenceErrorInfo(node=node, context=context) - - -class AssignAttr(_base_nodes.LookupMixIn, _base_nodes.ParentAssignNode): - """Variation of :class:`ast.Assign` representing assignment to an attribute. - - >>> import astroid - >>> node = astroid.extract_node('self.attribute = range(10)') - >>> node - - >>> list(node.get_children()) - [, ] - >>> list(node.get_children())[0].as_string() - 'self.attribute' - """ - - expr: NodeNG - - _astroid_fields = ("expr",) - _other_fields = ("attrname",) - - def __init__( - self, - attrname: str, - lineno: int, - col_offset: int, - parent: NodeNG, - *, - end_lineno: int | None, - end_col_offset: int | None, - ) -> None: - self.attrname = attrname - """The name of the attribute being assigned to.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit(self, expr: NodeNG) -> None: - self.expr = expr - - assigned_stmts = protocols.assend_assigned_stmts - """Returns the assigned statement (non inferred) according to the assignment type. - See astroid/protocols.py for actual implementation. - """ - - def get_children(self): - yield self.expr - - @decorators.raise_if_nothing_inferred - @decorators.path_wrapper - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[InferenceResult, None, InferenceErrorInfo | None]: - """Infer an AssignAttr: need to inspect the RHS part of the - assign node. - """ - if isinstance(self.parent, AugAssign): - return self.parent.infer(context) - - stmts = list(self.assigned_stmts(context=context)) - return _infer_stmts(stmts, context) - - @decorators.raise_if_nothing_inferred - @decorators.path_wrapper - def infer_lhs( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[InferenceResult, None, InferenceErrorInfo | None]: - return _infer_attribute(self, context, **kwargs) - - -class Assert(_base_nodes.Statement): - """Class representing an :class:`ast.Assert` node. - - An :class:`Assert` node represents an assert statement. - - >>> import astroid - >>> node = astroid.extract_node('assert len(things) == 10, "Not enough things"') - >>> node - - """ - - _astroid_fields = ("test", "fail") - - test: NodeNG - """The test that passes or fails the assertion.""" - - fail: NodeNG | None - """The message shown when the assertion fails.""" - - def postinit(self, test: NodeNG, fail: NodeNG | None) -> None: - self.fail = fail - self.test = test - - def get_children(self): - yield self.test - - if self.fail is not None: - yield self.fail - - -class Assign(_base_nodes.AssignTypeNode, _base_nodes.Statement): - """Class representing an :class:`ast.Assign` node. - - An :class:`Assign` is a statement where something is explicitly - asssigned to. - - >>> import astroid - >>> node = astroid.extract_node('variable = range(10)') - >>> node - - """ - - targets: list[NodeNG] - """What is being assigned to.""" - - value: NodeNG - """The value being assigned to the variables.""" - - type_annotation: NodeNG | None - """If present, this will contain the type annotation passed by a type comment""" - - _astroid_fields = ("targets", "value") - _other_other_fields = ("type_annotation",) - - def postinit( - self, - targets: list[NodeNG], - value: NodeNG, - type_annotation: NodeNG | None, - ) -> None: - self.targets = targets - self.value = value - self.type_annotation = type_annotation - - assigned_stmts = protocols.assign_assigned_stmts - """Returns the assigned statement (non inferred) according to the assignment type. - See astroid/protocols.py for actual implementation. - """ - - def get_children(self): - yield from self.targets - - yield self.value - - @cached_property - def _assign_nodes_in_scope(self) -> list[nodes.Assign]: - return [self, *self.value._assign_nodes_in_scope] - - def _get_yield_nodes_skip_functions(self): - yield from self.value._get_yield_nodes_skip_functions() - - def _get_yield_nodes_skip_lambdas(self): - yield from self.value._get_yield_nodes_skip_lambdas() - - -class AnnAssign(_base_nodes.AssignTypeNode, _base_nodes.Statement): - """Class representing an :class:`ast.AnnAssign` node. - - An :class:`AnnAssign` is an assignment with a type annotation. - - >>> import astroid - >>> node = astroid.extract_node('variable: List[int] = range(10)') - >>> node - - """ - - _astroid_fields = ("target", "annotation", "value") - _other_fields = ("simple",) - - target: Name | Attribute | Subscript - """What is being assigned to.""" - - annotation: NodeNG - """The type annotation of what is being assigned to.""" - - value: NodeNG | None - """The value being assigned to the variables.""" - - simple: int - """Whether :attr:`target` is a pure name or a complex statement.""" - - def postinit( - self, - target: Name | Attribute | Subscript, - annotation: NodeNG, - simple: int, - value: NodeNG | None, - ) -> None: - self.target = target - self.annotation = annotation - self.value = value - self.simple = simple - - assigned_stmts = protocols.assign_annassigned_stmts - """Returns the assigned statement (non inferred) according to the assignment type. - See astroid/protocols.py for actual implementation. - """ - - def get_children(self): - yield self.target - yield self.annotation - - if self.value is not None: - yield self.value - - -class AugAssign( - _base_nodes.AssignTypeNode, _base_nodes.OperatorNode, _base_nodes.Statement -): - """Class representing an :class:`ast.AugAssign` node. - - An :class:`AugAssign` is an assignment paired with an operator. - - >>> import astroid - >>> node = astroid.extract_node('variable += 1') - >>> node - - """ - - _astroid_fields = ("target", "value") - _other_fields = ("op",) - - target: Name | Attribute | Subscript - """What is being assigned to.""" - - value: NodeNG - """The value being assigned to the variable.""" - - def __init__( - self, - op: str, - lineno: int, - col_offset: int, - parent: NodeNG, - *, - end_lineno: int | None, - end_col_offset: int | None, - ) -> None: - self.op = op - """The operator that is being combined with the assignment. - - This includes the equals sign. - """ - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit(self, target: Name | Attribute | Subscript, value: NodeNG) -> None: - self.target = target - self.value = value - - assigned_stmts = protocols.assign_assigned_stmts - """Returns the assigned statement (non inferred) according to the assignment type. - See astroid/protocols.py for actual implementation. - """ - - def type_errors( - self, context: InferenceContext | None = None - ) -> list[util.BadBinaryOperationMessage]: - """Get a list of type errors which can occur during inference. - - Each TypeError is represented by a :class:`BadBinaryOperationMessage` , - which holds the original exception. - - If any inferred result is uninferable, an empty list is returned. - """ - bad = [] - try: - for result in self._infer_augassign(context=context): - if result is util.Uninferable: - raise InferenceError - if isinstance(result, util.BadBinaryOperationMessage): - bad.append(result) - except InferenceError: - return [] - return bad - - def get_children(self): - yield self.target - yield self.value - - def _get_yield_nodes_skip_functions(self): - """An AugAssign node can contain a Yield node in the value""" - yield from self.value._get_yield_nodes_skip_functions() - yield from super()._get_yield_nodes_skip_functions() - - def _get_yield_nodes_skip_lambdas(self): - """An AugAssign node can contain a Yield node in the value""" - yield from self.value._get_yield_nodes_skip_lambdas() - yield from super()._get_yield_nodes_skip_lambdas() - - def _infer_augassign( - self, context: InferenceContext | None = None - ) -> Generator[InferenceResult | util.BadBinaryOperationMessage]: - """Inference logic for augmented binary operations.""" - context = context or InferenceContext() - - rhs_context = context.clone() - - lhs_iter = self.target.infer_lhs(context=context) - rhs_iter = self.value.infer(context=rhs_context) - - for lhs, rhs in itertools.product(lhs_iter, rhs_iter): - if any(isinstance(value, util.UninferableBase) for value in (rhs, lhs)): - # Don't know how to process this. - yield util.Uninferable - return - - try: - yield from self._infer_binary_operation( - left=lhs, - right=rhs, - binary_opnode=self, - context=context, - flow_factory=self._get_aug_flow, - ) - except _NonDeducibleTypeHierarchy: - yield util.Uninferable - - @decorators.raise_if_nothing_inferred - @decorators.path_wrapper - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[InferenceResult]: - return self._filter_operation_errors( - self._infer_augassign, context, util.BadBinaryOperationMessage - ) - - -class BinOp(_base_nodes.OperatorNode): - """Class representing an :class:`ast.BinOp` node. - - A :class:`BinOp` node is an application of a binary operator. - - >>> import astroid - >>> node = astroid.extract_node('a + b') - >>> node - - """ - - _astroid_fields = ("left", "right") - _other_fields = ("op",) - - left: NodeNG - """What is being applied to the operator on the left side.""" - - right: NodeNG - """What is being applied to the operator on the right side.""" - - def __init__( - self, - op: str, - lineno: int, - col_offset: int, - parent: NodeNG, - *, - end_lineno: int | None, - end_col_offset: int | None, - ) -> None: - self.op = op - """The operator.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit(self, left: NodeNG, right: NodeNG) -> None: - self.left = left - self.right = right - - def type_errors( - self, context: InferenceContext | None = None - ) -> list[util.BadBinaryOperationMessage]: - """Get a list of type errors which can occur during inference. - - Each TypeError is represented by a :class:`BadBinaryOperationMessage`, - which holds the original exception. - - If any inferred result is uninferable, an empty list is returned. - """ - bad = [] - try: - for result in self._infer_binop(context=context): - if result is util.Uninferable: - raise InferenceError - if isinstance(result, util.BadBinaryOperationMessage): - bad.append(result) - except InferenceError: - return [] - return bad - - def get_children(self): - yield self.left - yield self.right - - def op_precedence(self) -> int: - return OP_PRECEDENCE[self.op] - - def op_left_associative(self) -> bool: - # 2**3**4 == 2**(3**4) - return self.op != "**" - - def _infer_binop( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[InferenceResult]: - """Binary operation inference logic.""" - left = self.left - right = self.right - - # we use two separate contexts for evaluating lhs and rhs because - # 1. evaluating lhs may leave some undesired entries in context.path - # which may not let us infer right value of rhs - context = context or InferenceContext() - lhs_context = copy_context(context) - rhs_context = copy_context(context) - lhs_iter = left.infer(context=lhs_context) - rhs_iter = right.infer(context=rhs_context) - for lhs, rhs in itertools.product(lhs_iter, rhs_iter): - if any(isinstance(value, util.UninferableBase) for value in (rhs, lhs)): - # Don't know how to process this. - yield util.Uninferable - return - - try: - yield from self._infer_binary_operation( - lhs, rhs, self, context, self._get_binop_flow - ) - except _NonDeducibleTypeHierarchy: - yield util.Uninferable - - @decorators.yes_if_nothing_inferred - @decorators.path_wrapper - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[InferenceResult]: - return self._filter_operation_errors( - self._infer_binop, context, util.BadBinaryOperationMessage - ) - - -class BoolOp(NodeNG): - """Class representing an :class:`ast.BoolOp` node. - - A :class:`BoolOp` is an application of a boolean operator. - - >>> import astroid - >>> node = astroid.extract_node('a and b') - >>> node - - """ - - _astroid_fields = ("values",) - _other_fields = ("op",) - - def __init__( - self, - op: str, - lineno: int | None = None, - col_offset: int | None = None, - parent: NodeNG | None = None, - *, - end_lineno: int | None = None, - end_col_offset: int | None = None, - ) -> None: - """ - :param op: The operator. - - :param lineno: The line that this node appears on in the source code. - - :param col_offset: The column that this node appears on in the - source code. - - :param parent: The parent node in the syntax tree. - - :param end_lineno: The last line this node appears on in the source code. - - :param end_col_offset: The end column this node appears on in the - source code. Note: This is after the last symbol. - """ - self.op: str = op - """The operator.""" - - self.values: list[NodeNG] = [] - """The values being applied to the operator.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit(self, values: list[NodeNG] | None = None) -> None: - """Do some setup after initialisation. - - :param values: The values being applied to the operator. - """ - if values is not None: - self.values = values - - def get_children(self): - yield from self.values - - def op_precedence(self) -> int: - return OP_PRECEDENCE[self.op] - - @decorators.raise_if_nothing_inferred - @decorators.path_wrapper - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[InferenceResult, None, InferenceErrorInfo | None]: - """Infer a boolean operation (and / or / not). - - The function will calculate the boolean operation - for all pairs generated through inference for each component - node. - """ - values = self.values - if self.op == "or": - predicate = operator.truth - else: - predicate = operator.not_ - - try: - inferred_values = [value.infer(context=context) for value in values] - except InferenceError: - yield util.Uninferable - return None - - for pair in itertools.product(*inferred_values): - if any(isinstance(item, util.UninferableBase) for item in pair): - # Can't infer the final result, just yield Uninferable. - yield util.Uninferable - continue - - bool_values = [item.bool_value() for item in pair] - if any(isinstance(item, util.UninferableBase) for item in bool_values): - # Can't infer the final result, just yield Uninferable. - yield util.Uninferable - continue - - # Since the boolean operations are short circuited operations, - # this code yields the first value for which the predicate is True - # and if no value respected the predicate, then the last value will - # be returned (or Uninferable if there was no last value). - # This is conforming to the semantics of `and` and `or`: - # 1 and 0 -> 1 - # 0 and 1 -> 0 - # 1 or 0 -> 1 - # 0 or 1 -> 1 - value = util.Uninferable - for value, bool_value in zip(pair, bool_values): - if predicate(bool_value): - yield value - break - else: - yield value - - return InferenceErrorInfo(node=self, context=context) - - -class Break(_base_nodes.NoChildrenNode, _base_nodes.Statement): - """Class representing an :class:`ast.Break` node. - - >>> import astroid - >>> node = astroid.extract_node('break') - >>> node - - """ - - -class Call(NodeNG): - """Class representing an :class:`ast.Call` node. - - A :class:`Call` node is a call to a function, method, etc. - - >>> import astroid - >>> node = astroid.extract_node('function()') - >>> node - - """ - - _astroid_fields = ("func", "args", "keywords") - - func: NodeNG - """What is being called.""" - - args: list[NodeNG] - """The positional arguments being given to the call.""" - - keywords: list[Keyword] - """The keyword arguments being given to the call.""" - - def postinit( - self, func: NodeNG, args: list[NodeNG], keywords: list[Keyword] - ) -> None: - self.func = func - self.args = args - self.keywords = keywords - - @property - def starargs(self) -> list[Starred]: - """The positional arguments that unpack something.""" - return [arg for arg in self.args if isinstance(arg, Starred)] - - @property - def kwargs(self) -> list[Keyword]: - """The keyword arguments that unpack something.""" - return [keyword for keyword in self.keywords if keyword.arg is None] - - def get_children(self): - yield self.func - - yield from self.args - - yield from self.keywords - - @decorators.raise_if_nothing_inferred - @decorators.path_wrapper - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[InferenceResult, None, InferenceErrorInfo]: - """Infer a Call node by trying to guess what the function returns.""" - callcontext = copy_context(context) - callcontext.boundnode = None - if context is not None: - callcontext.extra_context = self._populate_context_lookup(context.clone()) - - for callee in self.func.infer(context): - if isinstance(callee, util.UninferableBase): - yield callee - continue - try: - if hasattr(callee, "infer_call_result"): - callcontext.callcontext = CallContext( - args=self.args, keywords=self.keywords, callee=callee - ) - yield from callee.infer_call_result( - caller=self, context=callcontext - ) - except InferenceError: - continue - return InferenceErrorInfo(node=self, context=context) - - def _populate_context_lookup(self, context: InferenceContext | None): - """Allows context to be saved for later for inference inside a function.""" - context_lookup: dict[InferenceResult, InferenceContext] = {} - if context is None: - return context_lookup - for arg in self.args: - if isinstance(arg, Starred): - context_lookup[arg.value] = context - else: - context_lookup[arg] = context - keywords = self.keywords if self.keywords is not None else [] - for keyword in keywords: - context_lookup[keyword.value] = context - return context_lookup - - -COMPARE_OPS: dict[str, Callable[[Any, Any], bool]] = { - "==": operator.eq, - "!=": operator.ne, - "<": operator.lt, - "<=": operator.le, - ">": operator.gt, - ">=": operator.ge, - "in": lambda a, b: a in b, - "not in": lambda a, b: a not in b, -} -UNINFERABLE_OPS = { - "is", - "is not", -} - - -class Compare(NodeNG): - """Class representing an :class:`ast.Compare` node. - - A :class:`Compare` node indicates a comparison. - - >>> import astroid - >>> node = astroid.extract_node('a <= b <= c') - >>> node - - >>> node.ops - [('<=', ), ('<=', )] - """ - - _astroid_fields = ("left", "ops") - - left: NodeNG - """The value at the left being applied to a comparison operator.""" - - ops: list[tuple[str, NodeNG]] - """The remainder of the operators and their relevant right hand value.""" - - def postinit(self, left: NodeNG, ops: list[tuple[str, NodeNG]]) -> None: - self.left = left - self.ops = ops - - def get_children(self): - """Get the child nodes below this node. - - Overridden to handle the tuple fields and skip returning the operator - strings. - - :returns: The children. - :rtype: iterable(NodeNG) - """ - yield self.left - for _, comparator in self.ops: - yield comparator # we don't want the 'op' - - def last_child(self): - """An optimized version of list(get_children())[-1] - - :returns: The last child. - :rtype: NodeNG - """ - # XXX maybe if self.ops: - return self.ops[-1][1] - # return self.left - - # TODO: move to util? - @staticmethod - def _to_literal(node: SuccessfulInferenceResult) -> Any: - # Can raise SyntaxError, ValueError, or TypeError from ast.literal_eval - # Can raise AttributeError from node.as_string() as not all nodes have a visitor - # Is this the stupidest idea or the simplest idea? - return ast.literal_eval(node.as_string()) - - def _do_compare( - self, - left_iter: Iterable[InferenceResult], - op: str, - right_iter: Iterable[InferenceResult], - ) -> bool | util.UninferableBase: - """ - If all possible combinations are either True or False, return that: - >>> _do_compare([1, 2], '<=', [3, 4]) - True - >>> _do_compare([1, 2], '==', [3, 4]) - False - - If any item is uninferable, or if some combinations are True and some - are False, return Uninferable: - >>> _do_compare([1, 3], '<=', [2, 4]) - util.Uninferable - """ - retval: bool | None = None - if op in UNINFERABLE_OPS: - return util.Uninferable - op_func = COMPARE_OPS[op] - - for left, right in itertools.product(left_iter, right_iter): - if isinstance(left, util.UninferableBase) or isinstance( - right, util.UninferableBase - ): - return util.Uninferable - - try: - left, right = self._to_literal(left), self._to_literal(right) - except (SyntaxError, ValueError, AttributeError, TypeError): - return util.Uninferable - - try: - expr = op_func(left, right) - except TypeError as exc: - raise AstroidTypeError from exc - - if retval is None: - retval = expr - elif retval != expr: - return util.Uninferable - # (or both, but "True | False" is basically the same) - - assert retval is not None - return retval # it was all the same value - - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[nodes.Const | util.UninferableBase]: - """Chained comparison inference logic.""" - retval: bool | util.UninferableBase = True - - ops = self.ops - left_node = self.left - lhs = list(left_node.infer(context=context)) - # should we break early if first element is uninferable? - for op, right_node in ops: - # eagerly evaluate rhs so that values can be re-used as lhs - rhs = list(right_node.infer(context=context)) - try: - retval = self._do_compare(lhs, op, rhs) - except AstroidTypeError: - retval = util.Uninferable - break - if retval is not True: - break # short-circuit - lhs = rhs # continue - if retval is util.Uninferable: - yield retval # type: ignore[misc] - else: - yield Const(retval) - - -class Comprehension(NodeNG): - """Class representing an :class:`ast.comprehension` node. - - A :class:`Comprehension` indicates the loop inside any type of - comprehension including generator expressions. - - >>> import astroid - >>> node = astroid.extract_node('[x for x in some_values]') - >>> list(node.get_children()) - [, ] - >>> list(node.get_children())[1].as_string() - 'for x in some_values' - """ - - _astroid_fields = ("target", "iter", "ifs") - _other_fields = ("is_async",) - - optional_assign = True - """Whether this node optionally assigns a variable.""" - - target: NodeNG - """What is assigned to by the comprehension.""" - - iter: NodeNG - """What is iterated over by the comprehension.""" - - ifs: list[NodeNG] - """The contents of any if statements that filter the comprehension.""" - - is_async: bool - """Whether this is an asynchronous comprehension or not.""" - - def postinit( - self, - target: NodeNG, - iter: NodeNG, # pylint: disable = redefined-builtin - ifs: list[NodeNG], - is_async: bool, - ) -> None: - self.target = target - self.iter = iter - self.ifs = ifs - self.is_async = is_async - - assigned_stmts = protocols.for_assigned_stmts - """Returns the assigned statement (non inferred) according to the assignment type. - See astroid/protocols.py for actual implementation. - """ - - def assign_type(self): - """The type of assignment that this node performs. - - :returns: The assignment type. - :rtype: NodeNG - """ - return self - - def _get_filtered_stmts( - self, lookup_node, node, stmts, mystmt: _base_nodes.Statement | None - ): - """method used in filter_stmts""" - if self is mystmt: - if isinstance(lookup_node, (Const, Name)): - return [lookup_node], True - - elif self.statement() is mystmt: - # original node's statement is the assignment, only keeps - # current node (gen exp, list comp) - - return [node], True - - return stmts, False - - def get_children(self): - yield self.target - yield self.iter - - yield from self.ifs - - -class Const(_base_nodes.NoChildrenNode, Instance): - """Class representing any constant including num, str, bool, None, bytes. - - >>> import astroid - >>> node = astroid.extract_node('(5, "This is a string.", True, None, b"bytes")') - >>> node - - >>> list(node.get_children()) - [, - , - , - , - ] - """ - - _other_fields = ("value", "kind") - - def __init__( - self, - value: Any, - lineno: int | None = None, - col_offset: int | None = None, - parent: NodeNG = SYNTHETIC_ROOT, - kind: str | None = None, - *, - end_lineno: int | None = None, - end_col_offset: int | None = None, - ) -> None: - """ - :param value: The value that the constant represents. - - :param lineno: The line that this node appears on in the source code. - - :param col_offset: The column that this node appears on in the - source code. - - :param parent: The parent node in the syntax tree. - - :param kind: The string prefix. "u" for u-prefixed strings and ``None`` otherwise. Python 3.8+ only. - - :param end_lineno: The last line this node appears on in the source code. - - :param end_col_offset: The end column this node appears on in the - source code. Note: This is after the last symbol. - """ - if getattr(value, "__name__", None) == "__doc__": - warnings.warn( # pragma: no cover - "You have most likely called a __doc__ field of some object " - "and it didn't return a string. " - "That happens to some symbols from the standard library. " - "Check for isinstance(.__doc__, str).", - RuntimeWarning, - stacklevel=0, - ) - self.value = value - """The value that the constant represents.""" - - self.kind: str | None = kind # can be None - """"The string prefix. "u" for u-prefixed strings and ``None`` otherwise. Python 3.8+ only.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - Instance.__init__(self, None) - - infer_unary_op = protocols.const_infer_unary_op - infer_binary_op = protocols.const_infer_binary_op - - def __getattr__(self, name): - # This is needed because of Proxy's __getattr__ method. - # Calling object.__new__ on this class without calling - # __init__ would result in an infinite loop otherwise - # since __getattr__ is called when an attribute doesn't - # exist and self._proxied indirectly calls self.value - # and Proxy __getattr__ calls self.value - if name == "value": - raise AttributeError - return super().__getattr__(name) - - def getitem(self, index, context: InferenceContext | None = None): - """Get an item from this node if subscriptable. - - :param index: The node to use as a subscript index. - :type index: Const or Slice - - :raises AstroidTypeError: When the given index cannot be used as a - subscript index, or if this node is not subscriptable. - """ - if isinstance(index, Const): - index_value = index.value - elif isinstance(index, Slice): - index_value = _infer_slice(index, context=context) - - else: - raise AstroidTypeError( - f"Could not use type {type(index)} as subscript index" - ) - - try: - if isinstance(self.value, (str, bytes)): - return Const(self.value[index_value]) - except ValueError as exc: - raise AstroidValueError( - f"Could not index {self.value!r} with {index_value!r}" - ) from exc - except IndexError as exc: - raise AstroidIndexError( - message="Index {index!r} out of range", - node=self, - index=index, - context=context, - ) from exc - except TypeError as exc: - raise AstroidTypeError( - message="Type error {error!r}", node=self, index=index, context=context - ) from exc - - raise AstroidTypeError(f"{self!r} (value={self.value})") - - def has_dynamic_getattr(self) -> bool: - """Check if the node has a custom __getattr__ or __getattribute__. - - :returns: Whether the class has a custom __getattr__ or __getattribute__. - For a :class:`Const` this is always ``False``. - """ - return False - - def itered(self): - """An iterator over the elements this node contains. - - :returns: The contents of this node. - :rtype: iterable(Const) - - :raises TypeError: If this node does not represent something that is iterable. - """ - if isinstance(self.value, str): - return [const_factory(elem) for elem in self.value] - raise TypeError(f"Cannot iterate over type {type(self.value)!r}") - - def pytype(self) -> str: - """Get the name of the type that this node represents. - - :returns: The name of the type. - """ - return self._proxied.qname() - - def bool_value(self, context: InferenceContext | None = None): - """Determine the boolean value of this node. - - :returns: The boolean value of this node. - :rtype: bool or Uninferable - """ - # bool(NotImplemented) is deprecated; it raises TypeError starting from Python 3.14 - # and returns True for versions under 3.14 - if self.value is NotImplemented: - return util.Uninferable if PY314_PLUS else True - return bool(self.value) - - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Iterator[Const]: - yield self - - -class Continue(_base_nodes.NoChildrenNode, _base_nodes.Statement): - """Class representing an :class:`ast.Continue` node. - - >>> import astroid - >>> node = astroid.extract_node('continue') - >>> node - - """ - - -class Decorators(NodeNG): - """A node representing a list of decorators. - - A :class:`Decorators` is the decorators that are applied to - a method or function. - - >>> import astroid - >>> node = astroid.extract_node(''' - @property - def my_property(self): - return 3 - ''') - >>> node - - >>> list(node.get_children())[0] - - """ - - _astroid_fields = ("nodes",) - - nodes: list[NodeNG] - """The decorators that this node contains.""" - - def postinit(self, nodes: list[NodeNG]) -> None: - self.nodes = nodes - - def scope(self) -> LocalsDictNodeNG: - """The first parent node defining a new scope. - These can be Module, FunctionDef, ClassDef, Lambda, or GeneratorExp nodes. - - :returns: The first parent scope node. - """ - # skip the function node to go directly to the upper level scope - if not self.parent: - raise ParentMissingError(target=self) - if not self.parent.parent: - raise ParentMissingError(target=self.parent) - return self.parent.parent.scope() - - def get_children(self): - yield from self.nodes - - -class DelAttr(_base_nodes.ParentAssignNode): - """Variation of :class:`ast.Delete` representing deletion of an attribute. - - >>> import astroid - >>> node = astroid.extract_node('del self.attr') - >>> node - - >>> list(node.get_children())[0] - - """ - - _astroid_fields = ("expr",) - _other_fields = ("attrname",) - - expr: NodeNG - """The name that this node represents.""" - - def __init__( - self, - attrname: str, - lineno: int, - col_offset: int, - parent: NodeNG, - *, - end_lineno: int | None, - end_col_offset: int | None, - ) -> None: - self.attrname = attrname - """The name of the attribute that is being deleted.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit(self, expr: NodeNG) -> None: - self.expr = expr - - def get_children(self): - yield self.expr - - -class Delete(_base_nodes.AssignTypeNode, _base_nodes.Statement): - """Class representing an :class:`ast.Delete` node. - - A :class:`Delete` is a ``del`` statement this is deleting something. - - >>> import astroid - >>> node = astroid.extract_node('del self.attr') - >>> node - - """ - - _astroid_fields = ("targets",) - - def __init__( - self, - lineno: int, - col_offset: int, - parent: NodeNG, - *, - end_lineno: int | None, - end_col_offset: int | None, - ) -> None: - self.targets: list[NodeNG] = [] - """What is being deleted.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit(self, targets: list[NodeNG]) -> None: - self.targets = targets - - def get_children(self): - yield from self.targets - - -class Dict(NodeNG, Instance): - """Class representing an :class:`ast.Dict` node. - - A :class:`Dict` is a dictionary that is created with ``{}`` syntax. - - >>> import astroid - >>> node = astroid.extract_node('{1: "1"}') - >>> node - - """ - - _astroid_fields = ("items",) - - def __init__( - self, - lineno: int | None, - col_offset: int | None, - parent: NodeNG | None, - *, - end_lineno: int | None, - end_col_offset: int | None, - ) -> None: - self.items: list[tuple[InferenceResult, InferenceResult]] = [] - """The key-value pairs contained in the dictionary.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit(self, items: list[tuple[InferenceResult, InferenceResult]]) -> None: - """Do some setup after initialisation. - - :param items: The key-value pairs contained in the dictionary. - """ - self.items = items - - infer_unary_op = protocols.dict_infer_unary_op - - def pytype(self) -> Literal["builtins.dict"]: - """Get the name of the type that this node represents. - - :returns: The name of the type. - """ - return "builtins.dict" - - def get_children(self): - """Get the key and value nodes below this node. - - Children are returned in the order that they are defined in the source - code, key first then the value. - - :returns: The children. - :rtype: iterable(NodeNG) - """ - for key, value in self.items: - yield key - yield value - - def last_child(self): - """An optimized version of list(get_children())[-1] - - :returns: The last child, or None if no children exist. - :rtype: NodeNG or None - """ - if self.items: - return self.items[-1][1] - return None - - def itered(self): - """An iterator over the keys this node contains. - - :returns: The keys of this node. - :rtype: iterable(NodeNG) - """ - return [key for (key, _) in self.items] - - def getitem( - self, index: Const | Slice, context: InferenceContext | None = None - ) -> NodeNG: - """Get an item from this node. - - :param index: The node to use as a subscript index. - - :raises AstroidTypeError: When the given index cannot be used as a - subscript index, or if this node is not subscriptable. - :raises AstroidIndexError: If the given index does not exist in the - dictionary. - """ - for key, value in self.items: - # TODO(cpopa): no support for overriding yet, {1:2, **{1: 3}}. - if isinstance(key, DictUnpack): - inferred_value = util.safe_infer(value, context) - if not isinstance(inferred_value, Dict): - continue - - try: - return inferred_value.getitem(index, context) - except (AstroidTypeError, AstroidIndexError): - continue - - for inferredkey in key.infer(context): - if isinstance(inferredkey, util.UninferableBase): - continue - if isinstance(inferredkey, Const) and isinstance(index, Const): - if inferredkey.value == index.value: - return value - - raise AstroidIndexError(index) - - def bool_value(self, context: InferenceContext | None = None): - """Determine the boolean value of this node. - - :returns: The boolean value of this node. - :rtype: bool - """ - return bool(self.items) - - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Iterator[nodes.Dict]: - if not any(isinstance(k, DictUnpack) for k, _ in self.items): - yield self - else: - items = self._infer_map(context) - new_seq = type(self)( - lineno=self.lineno, - col_offset=self.col_offset, - parent=self.parent, - end_lineno=self.end_lineno, - end_col_offset=self.end_col_offset, - ) - new_seq.postinit(list(items.items())) - yield new_seq - - @staticmethod - def _update_with_replacement( - lhs_dict: dict[SuccessfulInferenceResult, SuccessfulInferenceResult], - rhs_dict: dict[SuccessfulInferenceResult, SuccessfulInferenceResult], - ) -> dict[SuccessfulInferenceResult, SuccessfulInferenceResult]: - """Delete nodes that equate to duplicate keys. - - Since an astroid node doesn't 'equal' another node with the same value, - this function uses the as_string method to make sure duplicate keys - don't get through - - Note that both the key and the value are astroid nodes - - Fixes issue with DictUnpack causing duplicate keys - in inferred Dict items - - :param lhs_dict: Dictionary to 'merge' nodes into - :param rhs_dict: Dictionary with nodes to pull from - :return : merged dictionary of nodes - """ - combined_dict = itertools.chain(lhs_dict.items(), rhs_dict.items()) - # Overwrite keys which have the same string values - string_map = {key.as_string(): (key, value) for key, value in combined_dict} - # Return to dictionary - return dict(string_map.values()) - - def _infer_map( - self, context: InferenceContext | None - ) -> dict[SuccessfulInferenceResult, SuccessfulInferenceResult]: - """Infer all values based on Dict.items.""" - values: dict[SuccessfulInferenceResult, SuccessfulInferenceResult] = {} - for name, value in self.items: - if isinstance(name, DictUnpack): - double_starred = util.safe_infer(value, context) - if not double_starred: - raise InferenceError - if not isinstance(double_starred, Dict): - raise InferenceError(node=self, context=context) - unpack_items = double_starred._infer_map(context) - values = self._update_with_replacement(values, unpack_items) - else: - key = util.safe_infer(name, context=context) - safe_value = util.safe_infer(value, context=context) - if any(not elem for elem in (key, safe_value)): - raise InferenceError(node=self, context=context) - # safe_value is SuccessfulInferenceResult as bool(Uninferable) == False - values = self._update_with_replacement(values, {key: safe_value}) - return values - - -class Expr(_base_nodes.Statement): - """Class representing an :class:`ast.Expr` node. - - An :class:`Expr` is any expression that does not have its value used or - stored. - - >>> import astroid - >>> node = astroid.extract_node('method()') - >>> node - - >>> node.parent - - """ - - _astroid_fields = ("value",) - - value: NodeNG - """What the expression does.""" - - def postinit(self, value: NodeNG) -> None: - self.value = value - - def get_children(self): - yield self.value - - def _get_yield_nodes_skip_functions(self): - if not self.value.is_function: - yield from self.value._get_yield_nodes_skip_functions() - - def _get_yield_nodes_skip_lambdas(self): - if not self.value.is_lambda: - yield from self.value._get_yield_nodes_skip_lambdas() - - -class EmptyNode(_base_nodes.NoChildrenNode): - """Holds an arbitrary object in the :attr:`LocalsDictNodeNG.locals`.""" - - object = None - - def __init__( - self, - lineno: None = None, - col_offset: None = None, - parent: NodeNG = SYNTHETIC_ROOT, - *, - end_lineno: None = None, - end_col_offset: None = None, - ) -> None: - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def has_underlying_object(self) -> bool: - return self.object is not None and self.object is not _EMPTY_OBJECT_MARKER - - @decorators.raise_if_nothing_inferred - @decorators.path_wrapper - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[InferenceResult]: - if not self.has_underlying_object(): - yield util.Uninferable - else: - try: - yield from AstroidManager().infer_ast_from_something( - self.object, context=context - ) - except AstroidError: - yield util.Uninferable - - -class ExceptHandler( - _base_nodes.MultiLineBlockNode, _base_nodes.AssignTypeNode, _base_nodes.Statement -): - """Class representing an :class:`ast.ExceptHandler`. node. - - An :class:`ExceptHandler` is an ``except`` block on a try-except. - - >>> import astroid - >>> node = astroid.extract_node(''' - try: - do_something() - except Exception as error: - print("Error!") - ''') - >>> node - - >>> node.handlers - [] - """ - - _astroid_fields = ("type", "name", "body") - _multi_line_block_fields = ("body",) - - type: NodeNG | None - """The types that the block handles.""" - - name: AssignName | None - """The name that the caught exception is assigned to.""" - - body: list[NodeNG] - """The contents of the block.""" - - assigned_stmts = protocols.excepthandler_assigned_stmts - """Returns the assigned statement (non inferred) according to the assignment type. - See astroid/protocols.py for actual implementation. - """ - - def postinit( - self, - type: NodeNG | None, # pylint: disable = redefined-builtin - name: AssignName | None, - body: list[NodeNG], - ) -> None: - self.type = type - self.name = name - self.body = body - - def get_children(self): - if self.type is not None: - yield self.type - - if self.name is not None: - yield self.name - - yield from self.body - - @cached_property - def blockstart_tolineno(self): - """The line on which the beginning of this block ends. - - :type: int - """ - if self.name: - return self.name.tolineno - if self.type: - return self.type.tolineno - return self.lineno - - def catch(self, exceptions: list[str] | None) -> bool: - """Check if this node handles any of the given - - :param exceptions: The names of the exceptions to check for. - """ - if self.type is None or exceptions is None: - return True - return any(node.name in exceptions for node in self.type._get_name_nodes()) - - -class For( - _base_nodes.MultiLineWithElseBlockNode, - _base_nodes.AssignTypeNode, - _base_nodes.Statement, -): - """Class representing an :class:`ast.For` node. - - >>> import astroid - >>> node = astroid.extract_node('for thing in things: print(thing)') - >>> node - - """ - - _astroid_fields = ("target", "iter", "body", "orelse") - _other_other_fields = ("type_annotation",) - _multi_line_block_fields = ("body", "orelse") - - optional_assign = True - """Whether this node optionally assigns a variable. - - This is always ``True`` for :class:`For` nodes. - """ - - target: NodeNG - """What the loop assigns to.""" - - iter: NodeNG - """What the loop iterates over.""" - - body: list[NodeNG] - """The contents of the body of the loop.""" - - orelse: list[NodeNG] - """The contents of the ``else`` block of the loop.""" - - type_annotation: NodeNG | None - """If present, this will contain the type annotation passed by a type comment""" - - def postinit( - self, - target: NodeNG, - iter: NodeNG, # pylint: disable = redefined-builtin - body: list[NodeNG], - orelse: list[NodeNG], - type_annotation: NodeNG | None, - ) -> None: - self.target = target - self.iter = iter - self.body = body - self.orelse = orelse - self.type_annotation = type_annotation - - assigned_stmts = protocols.for_assigned_stmts - """Returns the assigned statement (non inferred) according to the assignment type. - See astroid/protocols.py for actual implementation. - """ - - @cached_property - def blockstart_tolineno(self): - """The line on which the beginning of this block ends. - - :type: int - """ - return self.iter.tolineno - - def get_children(self): - yield self.target - yield self.iter - - yield from self.body - yield from self.orelse - - -class AsyncFor(For): - """Class representing an :class:`ast.AsyncFor` node. - - An :class:`AsyncFor` is an asynchronous :class:`For` built with - the ``async`` keyword. - - >>> import astroid - >>> node = astroid.extract_node(''' - async def func(things): - async for thing in things: - print(thing) - ''') - >>> node - - >>> node.body[0] - - """ - - -class Await(NodeNG): - """Class representing an :class:`ast.Await` node. - - An :class:`Await` is the ``await`` keyword. - - >>> import astroid - >>> node = astroid.extract_node(''' - async def func(things): - await other_func() - ''') - >>> node - - >>> node.body[0] - - >>> list(node.body[0].get_children())[0] - - """ - - _astroid_fields = ("value",) - - value: NodeNG - """What to wait for.""" - - def postinit(self, value: NodeNG) -> None: - self.value = value - - def get_children(self): - yield self.value - - -class ImportFrom(_base_nodes.ImportNode): - """Class representing an :class:`ast.ImportFrom` node. - - >>> import astroid - >>> node = astroid.extract_node('from my_package import my_module') - >>> node - - """ - - _other_fields = ("modname", "names", "level") - - def __init__( - self, - fromname: str | None, - names: list[tuple[str, str | None]], - level: int | None = 0, - lineno: int | None = None, - col_offset: int | None = None, - parent: NodeNG | None = None, - *, - end_lineno: int | None = None, - end_col_offset: int | None = None, - ) -> None: - """ - :param fromname: The module that is being imported from. - - :param names: What is being imported from the module. - - :param level: The level of relative import. - - :param lineno: The line that this node appears on in the source code. - - :param col_offset: The column that this node appears on in the - source code. - - :param parent: The parent node in the syntax tree. - - :param end_lineno: The last line this node appears on in the source code. - - :param end_col_offset: The end column this node appears on in the - source code. Note: This is after the last symbol. - """ - self.modname: str | None = fromname # can be None - """The module that is being imported from. - - This is ``None`` for relative imports. - """ - - self.names: list[tuple[str, str | None]] = names - """What is being imported from the module. - - Each entry is a :class:`tuple` of the name being imported, - and the alias that the name is assigned to (if any). - """ - - # TODO When is 'level' None? - self.level: int | None = level # can be None - """The level of relative import. - - Essentially this is the number of dots in the import. - This is always 0 for absolute imports. - """ - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - @decorators.raise_if_nothing_inferred - @decorators.path_wrapper - def _infer( - self, - context: InferenceContext | None = None, - asname: bool = True, - **kwargs: Any, - ) -> Generator[InferenceResult]: - """Infer a ImportFrom node: return the imported module/object.""" - context = context or InferenceContext() - name = context.lookupname - if name is None: - raise InferenceError(node=self, context=context) - if asname: - try: - name = self.real_name(name) - except AttributeInferenceError as exc: - # See https://github.com/pylint-dev/pylint/issues/4692 - raise InferenceError(node=self, context=context) from exc - try: - module = self.do_import_module() - except AstroidBuildingError as exc: - raise InferenceError(node=self, context=context) from exc - - try: - context = copy_context(context) - context.lookupname = name - stmts = module.getattr(name, ignore_locals=module is self.root()) - return _infer_stmts(stmts, context) - except AttributeInferenceError as error: - raise InferenceError( - str(error), target=self, attribute=name, context=context - ) from error - - -class Attribute(NodeNG): - """Class representing an :class:`ast.Attribute` node.""" - - expr: NodeNG - - _astroid_fields = ("expr",) - _other_fields = ("attrname",) - - def __init__( - self, - attrname: str, - lineno: int, - col_offset: int, - parent: NodeNG, - *, - end_lineno: int | None, - end_col_offset: int | None, - ) -> None: - self.attrname = attrname - """The name of the attribute.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit(self, expr: NodeNG) -> None: - self.expr = expr - - def get_children(self): - yield self.expr - - @decorators.raise_if_nothing_inferred - @decorators.path_wrapper - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[InferenceResult, None, InferenceErrorInfo]: - return _infer_attribute(self, context, **kwargs) - - -class Global(_base_nodes.NoChildrenNode, _base_nodes.Statement): - """Class representing an :class:`ast.Global` node. - - >>> import astroid - >>> node = astroid.extract_node('global a_global') - >>> node - - """ - - _other_fields = ("names",) - - def __init__( - self, - names: list[str], - lineno: int | None = None, - col_offset: int | None = None, - parent: NodeNG | None = None, - *, - end_lineno: int | None = None, - end_col_offset: int | None = None, - ) -> None: - """ - :param names: The names being declared as global. - - :param lineno: The line that this node appears on in the source code. - - :param col_offset: The column that this node appears on in the - source code. - - :param parent: The parent node in the syntax tree. - - :param end_lineno: The last line this node appears on in the source code. - - :param end_col_offset: The end column this node appears on in the - source code. Note: This is after the last symbol. - """ - self.names: list[str] = names - """The names being declared as global.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def _infer_name(self, frame, name): - return name - - @decorators.raise_if_nothing_inferred - @decorators.path_wrapper - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[InferenceResult]: - if context is None or context.lookupname is None: - raise InferenceError(node=self, context=context) - try: - # pylint: disable-next=no-member - return _infer_stmts(self.root().getattr(context.lookupname), context) - except AttributeInferenceError as error: - raise InferenceError( - str(error), target=self, attribute=context.lookupname, context=context - ) from error - - -class If(_base_nodes.MultiLineWithElseBlockNode, _base_nodes.Statement): - """Class representing an :class:`ast.If` node. - - >>> import astroid - >>> node = astroid.extract_node('if condition: print(True)') - >>> node - - """ - - _astroid_fields = ("test", "body", "orelse") - _multi_line_block_fields = ("body", "orelse") - - test: NodeNG - """The condition that the statement tests.""" - - body: list[NodeNG] - """The contents of the block.""" - - orelse: list[NodeNG] - """The contents of the ``else`` block.""" - - def postinit(self, test: NodeNG, body: list[NodeNG], orelse: list[NodeNG]) -> None: - self.test = test - self.body = body - self.orelse = orelse - - @cached_property - def blockstart_tolineno(self): - """The line on which the beginning of this block ends. - - :type: int - """ - return self.test.tolineno - - def block_range(self, lineno: int) -> tuple[int, int]: - """Get a range from the given line number to where this node ends. - - :param lineno: The line number to start the range at. - - :returns: The range of line numbers that this node belongs to, - starting at the given line number. - """ - if lineno == self.body[0].fromlineno: - return lineno, lineno - if lineno <= self.body[-1].tolineno: - return lineno, self.body[-1].tolineno - return self._elsed_block_range(lineno, self.orelse, self.body[0].fromlineno - 1) - - def get_children(self): - yield self.test - - yield from self.body - yield from self.orelse - - def has_elif_block(self) -> bool: - return len(self.orelse) == 1 and isinstance(self.orelse[0], If) - - def _get_yield_nodes_skip_functions(self): - """An If node can contain a Yield node in the test""" - yield from self.test._get_yield_nodes_skip_functions() - yield from super()._get_yield_nodes_skip_functions() - - def _get_yield_nodes_skip_lambdas(self): - """An If node can contain a Yield node in the test""" - yield from self.test._get_yield_nodes_skip_lambdas() - yield from super()._get_yield_nodes_skip_lambdas() - - -class IfExp(NodeNG): - """Class representing an :class:`ast.IfExp` node. - >>> import astroid - >>> node = astroid.extract_node('value if condition else other') - >>> node - - """ - - _astroid_fields = ("test", "body", "orelse") - - test: NodeNG - """The condition that the statement tests.""" - - body: NodeNG - """The contents of the block.""" - - orelse: NodeNG - """The contents of the ``else`` block.""" - - def postinit(self, test: NodeNG, body: NodeNG, orelse: NodeNG) -> None: - self.test = test - self.body = body - self.orelse = orelse - - def get_children(self): - yield self.test - yield self.body - yield self.orelse - - def op_left_associative(self) -> Literal[False]: - # `1 if True else 2 if False else 3` is parsed as - # `1 if True else (2 if False else 3)` - return False - - @decorators.raise_if_nothing_inferred - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[InferenceResult]: - """Support IfExp inference. - - If we can't infer the truthiness of the condition, we default - to inferring both branches. Otherwise, we infer either branch - depending on the condition. - """ - - # We use two separate contexts for evaluating lhs and rhs because - # evaluating lhs may leave some undesired entries in context.path - # which may not let us infer right value of rhs. - context = context or InferenceContext() - lhs_context = copy_context(context) - rhs_context = copy_context(context) - - # Infer bool condition. Stop inferring if in doubt and fallback to - # evaluating both branches. - condition: bool | None = None - try: - for test in self.test.infer(context=context.clone()): - if isinstance(test, util.UninferableBase): - condition = None - break - test_bool_value = test.bool_value() - if isinstance(test_bool_value, util.UninferableBase): - condition = None - break - if condition is None: - condition = test_bool_value - elif test_bool_value != condition: - condition = None - break - except InferenceError: - condition = None - - if condition is True or condition is None: - yield from self.body.infer(context=lhs_context) - if condition is False or condition is None: - yield from self.orelse.infer(context=rhs_context) - - -class Import(_base_nodes.ImportNode): - """Class representing an :class:`ast.Import` node. - >>> import astroid - >>> node = astroid.extract_node('import astroid') - >>> node - - """ - - _other_fields = ("names",) - - def __init__( - self, - names: list[tuple[str, str | None]], - lineno: int | None = None, - col_offset: int | None = None, - parent: NodeNG | None = None, - *, - end_lineno: int | None = None, - end_col_offset: int | None = None, - ) -> None: - """ - :param names: The names being imported. - - :param lineno: The line that this node appears on in the source code. - - :param col_offset: The column that this node appears on in the - source code. - - :param parent: The parent node in the syntax tree. - - :param end_lineno: The last line this node appears on in the source code. - - :param end_col_offset: The end column this node appears on in the - source code. Note: This is after the last symbol. - """ - self.names: list[tuple[str, str | None]] = names - """The names being imported. - - Each entry is a :class:`tuple` of the name being imported, - and the alias that the name is assigned to (if any). - """ - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - @decorators.raise_if_nothing_inferred - @decorators.path_wrapper - def _infer( - self, - context: InferenceContext | None = None, - asname: bool = True, - **kwargs: Any, - ) -> Generator[nodes.Module]: - """Infer an Import node: return the imported module/object.""" - context = context or InferenceContext() - name = context.lookupname - if name is None: - raise InferenceError(node=self, context=context) - - try: - if asname: - yield self.do_import_module(self.real_name(name)) - else: - yield self.do_import_module(name) - except AstroidBuildingError as exc: - raise InferenceError(node=self, context=context) from exc - - -class Keyword(NodeNG): - """Class representing an :class:`ast.keyword` node. - - >>> import astroid - >>> node = astroid.extract_node('function(a_kwarg=True)') - >>> node - - >>> node.keywords - [] - """ - - _astroid_fields = ("value",) - _other_fields = ("arg",) - - value: NodeNG - """The value being assigned to the keyword argument.""" - - def __init__( - self, - arg: str | None, - lineno: int | None, - col_offset: int | None, - parent: NodeNG, - *, - end_lineno: int | None, - end_col_offset: int | None, - ) -> None: - self.arg = arg - """The argument being assigned to.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit(self, value: NodeNG) -> None: - self.value = value - - def get_children(self): - yield self.value - - -class List(BaseContainer): - """Class representing an :class:`ast.List` node. - - >>> import astroid - >>> node = astroid.extract_node('[1, 2, 3]') - >>> node - - """ - - _other_fields = ("ctx",) - - def __init__( - self, - ctx: Context | None = None, - lineno: int | None = None, - col_offset: int | None = None, - parent: NodeNG | None = None, - *, - end_lineno: int | None = None, - end_col_offset: int | None = None, - ) -> None: - """ - :param ctx: Whether the list is assigned to or loaded from. - - :param lineno: The line that this node appears on in the source code. - - :param col_offset: The column that this node appears on in the - source code. - - :param parent: The parent node in the syntax tree. - - :param end_lineno: The last line this node appears on in the source code. - - :param end_col_offset: The end column this node appears on in the - source code. Note: This is after the last symbol. - """ - self.ctx: Context | None = ctx - """Whether the list is assigned to or loaded from.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - assigned_stmts = protocols.sequence_assigned_stmts - """Returns the assigned statement (non inferred) according to the assignment type. - See astroid/protocols.py for actual implementation. - """ - - infer_unary_op = protocols.list_infer_unary_op - infer_binary_op = protocols.tl_infer_binary_op - - def pytype(self) -> Literal["builtins.list"]: - """Get the name of the type that this node represents. - - :returns: The name of the type. - """ - return "builtins.list" - - def getitem(self, index, context: InferenceContext | None = None): - """Get an item from this node. - - :param index: The node to use as a subscript index. - :type index: Const or Slice - """ - return _container_getitem(self, self.elts, index, context=context) - - -class Nonlocal(_base_nodes.NoChildrenNode, _base_nodes.Statement): - """Class representing an :class:`ast.Nonlocal` node. - - >>> import astroid - >>> node = astroid.extract_node(''' - def function(): - nonlocal var - ''') - >>> node - - >>> node.body[0] - - """ - - _other_fields = ("names",) - - def __init__( - self, - names: list[str], - lineno: int | None = None, - col_offset: int | None = None, - parent: NodeNG | None = None, - *, - end_lineno: int | None = None, - end_col_offset: int | None = None, - ) -> None: - """ - :param names: The names being declared as not local. - - :param lineno: The line that this node appears on in the source code. - - :param col_offset: The column that this node appears on in the - source code. - - :param parent: The parent node in the syntax tree. - - :param end_lineno: The last line this node appears on in the source code. - - :param end_col_offset: The end column this node appears on in the - source code. Note: This is after the last symbol. - """ - self.names: list[str] = names - """The names being declared as not local.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def _infer_name(self, frame, name): - return name - - -class ParamSpec(_base_nodes.AssignTypeNode): - """Class representing a :class:`ast.ParamSpec` node. - - >>> import astroid - >>> node = astroid.extract_node('type Alias[**P] = Callable[P, int]') - >>> node.type_params[0] - - """ - - _astroid_fields = ("name", "default_value") - name: AssignName - default_value: NodeNG | None - - def __init__( - self, - lineno: int, - col_offset: int, - parent: NodeNG, - *, - end_lineno: int, - end_col_offset: int, - ) -> None: - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit(self, *, name: AssignName, default_value: NodeNG | None) -> None: - self.name = name - self.default_value = default_value - - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Iterator[ParamSpec]: - yield self - - assigned_stmts = protocols.generic_type_assigned_stmts - """Returns the assigned statement (non inferred) according to the assignment type. - See astroid/protocols.py for actual implementation. - """ - - -class Pass(_base_nodes.NoChildrenNode, _base_nodes.Statement): - """Class representing an :class:`ast.Pass` node. - - >>> import astroid - >>> node = astroid.extract_node('pass') - >>> node - - """ - - -class Raise(_base_nodes.Statement): - """Class representing an :class:`ast.Raise` node. - - >>> import astroid - >>> node = astroid.extract_node('raise RuntimeError("Something bad happened!")') - >>> node - - """ - - _astroid_fields = ("exc", "cause") - - exc: NodeNG | None - """What is being raised.""" - - cause: NodeNG | None - """The exception being used to raise this one.""" - - def postinit( - self, - exc: NodeNG | None, - cause: NodeNG | None, - ) -> None: - self.exc = exc - self.cause = cause - - def raises_not_implemented(self) -> bool: - """Check if this node raises a :class:`NotImplementedError`. - - :returns: Whether this node raises a :class:`NotImplementedError`. - """ - if not self.exc: - return False - return any( - name.name == "NotImplementedError" for name in self.exc._get_name_nodes() - ) - - def get_children(self): - if self.exc is not None: - yield self.exc - - if self.cause is not None: - yield self.cause - - -class Return(_base_nodes.Statement): - """Class representing an :class:`ast.Return` node. - - >>> import astroid - >>> node = astroid.extract_node('return True') - >>> node - - """ - - _astroid_fields = ("value",) - - value: NodeNG | None - """The value being returned.""" - - def postinit(self, value: NodeNG | None) -> None: - self.value = value - - def get_children(self): - if self.value is not None: - yield self.value - - def is_tuple_return(self) -> bool: - return isinstance(self.value, Tuple) - - def _get_return_nodes_skip_functions(self): - yield self - - -class Set(BaseContainer): - """Class representing an :class:`ast.Set` node. - - >>> import astroid - >>> node = astroid.extract_node('{1, 2, 3}') - >>> node - - """ - - infer_unary_op = protocols.set_infer_unary_op - - def pytype(self) -> Literal["builtins.set"]: - """Get the name of the type that this node represents. - - :returns: The name of the type. - """ - return "builtins.set" - - -class Slice(NodeNG): - """Class representing an :class:`ast.Slice` node. - - >>> import astroid - >>> node = astroid.extract_node('things[1:3]') - >>> node - - >>> node.slice - - """ - - _astroid_fields = ("lower", "upper", "step") - - lower: NodeNG | None - """The lower index in the slice.""" - - upper: NodeNG | None - """The upper index in the slice.""" - - step: NodeNG | None - """The step to take between indexes.""" - - def postinit( - self, - lower: NodeNG | None, - upper: NodeNG | None, - step: NodeNG | None, - ) -> None: - self.lower = lower - self.upper = upper - self.step = step - - def _wrap_attribute(self, attr): - """Wrap the empty attributes of the Slice in a Const node.""" - if not attr: - const = const_factory(attr) - const.parent = self - return const - return attr - - @cached_property - def _proxied(self) -> nodes.ClassDef: - builtins = AstroidManager().builtins_module - return builtins.getattr("slice")[0] - - def pytype(self) -> Literal["builtins.slice"]: - """Get the name of the type that this node represents. - - :returns: The name of the type. - """ - return "builtins.slice" - - def display_type(self) -> Literal["Slice"]: - """A human readable type of this node. - - :returns: The type of this node. - """ - return "Slice" - - def igetattr( - self, attrname: str, context: InferenceContext | None = None - ) -> Iterator[SuccessfulInferenceResult]: - """Infer the possible values of the given attribute on the slice. - - :param attrname: The name of the attribute to infer. - - :returns: The inferred possible values. - """ - if attrname == "start": - yield self._wrap_attribute(self.lower) - elif attrname == "stop": - yield self._wrap_attribute(self.upper) - elif attrname == "step": - yield self._wrap_attribute(self.step) - else: - yield from self.getattr(attrname, context=context) - - def getattr(self, attrname, context: InferenceContext | None = None): - return self._proxied.getattr(attrname, context) - - def get_children(self): - if self.lower is not None: - yield self.lower - - if self.upper is not None: - yield self.upper - - if self.step is not None: - yield self.step - - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Iterator[Slice]: - yield self - - -class Starred(_base_nodes.ParentAssignNode): - """Class representing an :class:`ast.Starred` node. - - >>> import astroid - >>> node = astroid.extract_node('*args') - >>> node - - """ - - _astroid_fields = ("value",) - _other_fields = ("ctx",) - - value: NodeNG - """What is being unpacked.""" - - def __init__( - self, - ctx: Context, - lineno: int, - col_offset: int, - parent: NodeNG, - *, - end_lineno: int | None, - end_col_offset: int | None, - ) -> None: - self.ctx = ctx - """Whether the starred item is assigned to or loaded from.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit(self, value: NodeNG) -> None: - self.value = value - - assigned_stmts = protocols.starred_assigned_stmts - """Returns the assigned statement (non inferred) according to the assignment type. - See astroid/protocols.py for actual implementation. - """ - - def get_children(self): - yield self.value - - -class Subscript(NodeNG): - """Class representing an :class:`ast.Subscript` node. - - >>> import astroid - >>> node = astroid.extract_node('things[1:3]') - >>> node - - """ - - _SUBSCRIPT_SENTINEL = object() - _astroid_fields = ("value", "slice") - _other_fields = ("ctx",) - - value: NodeNG - """What is being indexed.""" - - slice: NodeNG - """The slice being used to lookup.""" - - def __init__( - self, - ctx: Context, - lineno: int, - col_offset: int, - parent: NodeNG, - *, - end_lineno: int | None, - end_col_offset: int | None, - ) -> None: - self.ctx = ctx - """Whether the subscripted item is assigned to or loaded from.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - # pylint: disable=redefined-builtin; had to use the same name as builtin ast module. - def postinit(self, value: NodeNG, slice: NodeNG) -> None: - self.value = value - self.slice = slice - - def get_children(self): - yield self.value - yield self.slice - - def _infer_subscript( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[InferenceResult, None, InferenceErrorInfo | None]: - """Inference for subscripts. - - We're understanding if the index is a Const - or a slice, passing the result of inference - to the value's `getitem` method, which should - handle each supported index type accordingly. - """ - from astroid import helpers # pylint: disable=import-outside-toplevel - - found_one = False - for value in self.value.infer(context): - if isinstance(value, util.UninferableBase): - yield util.Uninferable - return None - for index in self.slice.infer(context): - if isinstance(index, util.UninferableBase): - yield util.Uninferable - return None - - # Try to deduce the index value. - index_value = self._SUBSCRIPT_SENTINEL - if value.__class__ == Instance: - index_value = index - elif index.__class__ == Instance: - instance_as_index = helpers.class_instance_as_index(index) - if instance_as_index: - index_value = instance_as_index - else: - index_value = index - - if index_value is self._SUBSCRIPT_SENTINEL: - raise InferenceError(node=self, context=context) - - try: - assigned = value.getitem(index_value, context) - except ( - AstroidTypeError, - AstroidIndexError, - AstroidValueError, - AttributeInferenceError, - AttributeError, - ) as exc: - raise InferenceError(node=self, context=context) from exc - - # Prevent inferring if the inferred subscript - # is the same as the original subscripted object. - if self is assigned or isinstance(assigned, util.UninferableBase): - yield util.Uninferable - return None - yield from assigned.infer(context) - found_one = True - - if found_one: - return InferenceErrorInfo(node=self, context=context) - return None - - @decorators.raise_if_nothing_inferred - @decorators.path_wrapper - def _infer(self, context: InferenceContext | None = None, **kwargs: Any): - return self._infer_subscript(context, **kwargs) - - @decorators.raise_if_nothing_inferred - def infer_lhs(self, context: InferenceContext | None = None, **kwargs: Any): - return self._infer_subscript(context, **kwargs) - - -class Try(_base_nodes.MultiLineWithElseBlockNode, _base_nodes.Statement): - """Class representing a :class:`ast.Try` node. - - >>> import astroid - >>> node = astroid.extract_node(''' - try: - do_something() - except Exception as error: - print("Error!") - finally: - print("Cleanup!") - ''') - >>> node - - """ - - _astroid_fields = ("body", "handlers", "orelse", "finalbody") - _multi_line_block_fields = ("body", "handlers", "orelse", "finalbody") - - def __init__( - self, - *, - lineno: int, - col_offset: int, - end_lineno: int, - end_col_offset: int, - parent: NodeNG, - ) -> None: - """ - :param lineno: The line that this node appears on in the source code. - - :param col_offset: The column that this node appears on in the - source code. - - :param parent: The parent node in the syntax tree. - - :param end_lineno: The last line this node appears on in the source code. - - :param end_col_offset: The end column this node appears on in the - source code. Note: This is after the last symbol. - """ - self.body: list[NodeNG] = [] - """The contents of the block to catch exceptions from.""" - - self.handlers: list[ExceptHandler] = [] - """The exception handlers.""" - - self.orelse: list[NodeNG] = [] - """The contents of the ``else`` block.""" - - self.finalbody: list[NodeNG] = [] - """The contents of the ``finally`` block.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit( - self, - *, - body: list[NodeNG], - handlers: list[ExceptHandler], - orelse: list[NodeNG], - finalbody: list[NodeNG], - ) -> None: - """Do some setup after initialisation. - - :param body: The contents of the block to catch exceptions from. - - :param handlers: The exception handlers. - - :param orelse: The contents of the ``else`` block. - - :param finalbody: The contents of the ``finally`` block. - """ - self.body = body - self.handlers = handlers - self.orelse = orelse - self.finalbody = finalbody - - def _infer_name(self, frame, name): - return name - - def block_range(self, lineno: int) -> tuple[int, int]: - """Get a range from a given line number to where this node ends.""" - if lineno == self.fromlineno: - return lineno, lineno - if self.body and self.body[0].fromlineno <= lineno <= self.body[-1].tolineno: - # Inside try body - return from lineno till end of try body - return lineno, self.body[-1].tolineno - for exhandler in self.handlers: - if exhandler.type and lineno == exhandler.type.fromlineno: - return lineno, lineno - if exhandler.body[0].fromlineno <= lineno <= exhandler.body[-1].tolineno: - return lineno, exhandler.body[-1].tolineno - if self.orelse: - if self.orelse[0].fromlineno - 1 == lineno: - return lineno, lineno - if self.orelse[0].fromlineno <= lineno <= self.orelse[-1].tolineno: - return lineno, self.orelse[-1].tolineno - if self.finalbody: - if self.finalbody[0].fromlineno - 1 == lineno: - return lineno, lineno - if self.finalbody[0].fromlineno <= lineno <= self.finalbody[-1].tolineno: - return lineno, self.finalbody[-1].tolineno - return lineno, self.tolineno - - def get_children(self): - yield from self.body - yield from self.handlers - yield from self.orelse - yield from self.finalbody - - -class TryStar(_base_nodes.MultiLineWithElseBlockNode, _base_nodes.Statement): - """Class representing an :class:`ast.TryStar` node.""" - - _astroid_fields = ("body", "handlers", "orelse", "finalbody") - _multi_line_block_fields = ("body", "handlers", "orelse", "finalbody") - - def __init__( - self, - *, - lineno: int | None = None, - col_offset: int | None = None, - end_lineno: int | None = None, - end_col_offset: int | None = None, - parent: NodeNG | None = None, - ) -> None: - """ - :param lineno: The line that this node appears on in the source code. - :param col_offset: The column that this node appears on in the - source code. - :param parent: The parent node in the syntax tree. - :param end_lineno: The last line this node appears on in the source code. - :param end_col_offset: The end column this node appears on in the - source code. Note: This is after the last symbol. - """ - self.body: list[NodeNG] = [] - """The contents of the block to catch exceptions from.""" - - self.handlers: list[ExceptHandler] = [] - """The exception handlers.""" - - self.orelse: list[NodeNG] = [] - """The contents of the ``else`` block.""" - - self.finalbody: list[NodeNG] = [] - """The contents of the ``finally`` block.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit( - self, - *, - body: list[NodeNG] | None = None, - handlers: list[ExceptHandler] | None = None, - orelse: list[NodeNG] | None = None, - finalbody: list[NodeNG] | None = None, - ) -> None: - """Do some setup after initialisation. - :param body: The contents of the block to catch exceptions from. - :param handlers: The exception handlers. - :param orelse: The contents of the ``else`` block. - :param finalbody: The contents of the ``finally`` block. - """ - if body: - self.body = body - if handlers: - self.handlers = handlers - if orelse: - self.orelse = orelse - if finalbody: - self.finalbody = finalbody - - def _infer_name(self, frame, name): - return name - - def block_range(self, lineno: int) -> tuple[int, int]: - """Get a range from a given line number to where this node ends.""" - if lineno == self.fromlineno: - return lineno, lineno - if self.body and self.body[0].fromlineno <= lineno <= self.body[-1].tolineno: - # Inside try body - return from lineno till end of try body - return lineno, self.body[-1].tolineno - for exhandler in self.handlers: - if exhandler.type and lineno == exhandler.type.fromlineno: - return lineno, lineno - if exhandler.body[0].fromlineno <= lineno <= exhandler.body[-1].tolineno: - return lineno, exhandler.body[-1].tolineno - if self.orelse: - if self.orelse[0].fromlineno - 1 == lineno: - return lineno, lineno - if self.orelse[0].fromlineno <= lineno <= self.orelse[-1].tolineno: - return lineno, self.orelse[-1].tolineno - if self.finalbody: - if self.finalbody[0].fromlineno - 1 == lineno: - return lineno, lineno - if self.finalbody[0].fromlineno <= lineno <= self.finalbody[-1].tolineno: - return lineno, self.finalbody[-1].tolineno - return lineno, self.tolineno - - def get_children(self): - yield from self.body - yield from self.handlers - yield from self.orelse - yield from self.finalbody - - -class Tuple(BaseContainer): - """Class representing an :class:`ast.Tuple` node. - - >>> import astroid - >>> node = astroid.extract_node('(1, 2, 3)') - >>> node - - """ - - _other_fields = ("ctx",) - - def __init__( - self, - ctx: Context | None = None, - lineno: int | None = None, - col_offset: int | None = None, - parent: NodeNG | None = None, - *, - end_lineno: int | None = None, - end_col_offset: int | None = None, - ) -> None: - """ - :param ctx: Whether the tuple is assigned to or loaded from. - - :param lineno: The line that this node appears on in the source code. - - :param col_offset: The column that this node appears on in the - source code. - - :param parent: The parent node in the syntax tree. - - :param end_lineno: The last line this node appears on in the source code. - - :param end_col_offset: The end column this node appears on in the - source code. Note: This is after the last symbol. - """ - self.ctx: Context | None = ctx - """Whether the tuple is assigned to or loaded from.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - assigned_stmts = protocols.sequence_assigned_stmts - """Returns the assigned statement (non inferred) according to the assignment type. - See astroid/protocols.py for actual implementation. - """ - - infer_unary_op = protocols.tuple_infer_unary_op - infer_binary_op = protocols.tl_infer_binary_op - - def pytype(self) -> Literal["builtins.tuple"]: - """Get the name of the type that this node represents. - - :returns: The name of the type. - """ - return "builtins.tuple" - - def getitem(self, index, context: InferenceContext | None = None): - """Get an item from this node. - - :param index: The node to use as a subscript index. - :type index: Const or Slice - """ - return _container_getitem(self, self.elts, index, context=context) - - -class TypeAlias(_base_nodes.AssignTypeNode, _base_nodes.Statement): - """Class representing a :class:`ast.TypeAlias` node. - - >>> import astroid - >>> node = astroid.extract_node('type Point = tuple[float, float]') - >>> node - - """ - - _astroid_fields = ("name", "type_params", "value") - - name: AssignName - type_params: list[TypeVar | ParamSpec | TypeVarTuple] - value: NodeNG - - def __init__( - self, - lineno: int, - col_offset: int, - parent: NodeNG, - *, - end_lineno: int, - end_col_offset: int, - ) -> None: - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit( - self, - *, - name: AssignName, - type_params: list[TypeVar | ParamSpec | TypeVarTuple], - value: NodeNG, - ) -> None: - self.name = name - self.type_params = type_params - self.value = value - - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Iterator[TypeAlias]: - yield self - - assigned_stmts: ClassVar[ - Callable[ - [ - TypeAlias, - AssignName, - InferenceContext | None, - None, - ], - Generator[NodeNG], - ] - ] = protocols.assign_assigned_stmts - - -class TypeVar(_base_nodes.AssignTypeNode): - """Class representing a :class:`ast.TypeVar` node. - - >>> import astroid - >>> node = astroid.extract_node('type Point[T] = tuple[float, float]') - >>> node.type_params[0] - - """ - - _astroid_fields = ("name", "bound", "default_value") - name: AssignName - bound: NodeNG | None - default_value: NodeNG | None - - def __init__( - self, - lineno: int, - col_offset: int, - parent: NodeNG, - *, - end_lineno: int, - end_col_offset: int, - ) -> None: - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit( - self, - *, - name: AssignName, - bound: NodeNG | None, - default_value: NodeNG | None = None, - ) -> None: - self.name = name - self.bound = bound - self.default_value = default_value - - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Iterator[TypeVar]: - yield self - - assigned_stmts = protocols.generic_type_assigned_stmts - """Returns the assigned statement (non inferred) according to the assignment type. - See astroid/protocols.py for actual implementation. - """ - - -class TypeVarTuple(_base_nodes.AssignTypeNode): - """Class representing a :class:`ast.TypeVarTuple` node. - - >>> import astroid - >>> node = astroid.extract_node('type Alias[*Ts] = tuple[*Ts]') - >>> node.type_params[0] - - """ - - _astroid_fields = ("name", "default_value") - name: AssignName - default_value: NodeNG | None - - def __init__( - self, - lineno: int, - col_offset: int, - parent: NodeNG, - *, - end_lineno: int, - end_col_offset: int, - ) -> None: - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit( - self, *, name: AssignName, default_value: NodeNG | None = None - ) -> None: - self.name = name - self.default_value = default_value - - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Iterator[TypeVarTuple]: - yield self - - assigned_stmts = protocols.generic_type_assigned_stmts - """Returns the assigned statement (non inferred) according to the assignment type. - See astroid/protocols.py for actual implementation. - """ - - -UNARY_OP_METHOD = { - "+": "__pos__", - "-": "__neg__", - "~": "__invert__", - "not": None, # XXX not '__nonzero__' -} - - -class UnaryOp(_base_nodes.OperatorNode): - """Class representing an :class:`ast.UnaryOp` node. - - >>> import astroid - >>> node = astroid.extract_node('-5') - >>> node - - """ - - _astroid_fields = ("operand",) - _other_fields = ("op",) - - operand: NodeNG - """What the unary operator is applied to.""" - - def __init__( - self, - op: str, - lineno: int, - col_offset: int, - parent: NodeNG, - *, - end_lineno: int | None, - end_col_offset: int | None, - ) -> None: - self.op = op - """The operator.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit(self, operand: NodeNG) -> None: - self.operand = operand - - def type_errors( - self, context: InferenceContext | None = None - ) -> list[util.BadUnaryOperationMessage]: - """Get a list of type errors which can occur during inference. - - Each TypeError is represented by a :class:`BadUnaryOperationMessage`, - which holds the original exception. - - If any inferred result is uninferable, an empty list is returned. - """ - bad = [] - try: - for result in self._infer_unaryop(context=context): - if result is util.Uninferable: - raise InferenceError - if isinstance(result, util.BadUnaryOperationMessage): - bad.append(result) - except InferenceError: - return [] - return bad - - def get_children(self): - yield self.operand - - def op_precedence(self) -> int: - if self.op == "not": - return OP_PRECEDENCE[self.op] - - return super().op_precedence() - - def _infer_unaryop( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[ - InferenceResult | util.BadUnaryOperationMessage, None, InferenceErrorInfo - ]: - """Infer what an UnaryOp should return when evaluated.""" - from astroid.nodes import ClassDef # pylint: disable=import-outside-toplevel - - for operand in self.operand.infer(context): - try: - yield operand.infer_unary_op(self.op) - except TypeError as exc: - # The operand doesn't support this operation. - yield util.BadUnaryOperationMessage(operand, self.op, exc) - except AttributeError as exc: - meth = UNARY_OP_METHOD[self.op] - if meth is None: - # `not node`. Determine node's boolean - # value and negate its result, unless it is - # Uninferable, which will be returned as is. - bool_value = operand.bool_value() - if not isinstance(bool_value, util.UninferableBase): - yield const_factory(not bool_value) - else: - yield util.Uninferable - else: - if not isinstance(operand, (Instance, ClassDef)): - # The operation was used on something which - # doesn't support it. - yield util.BadUnaryOperationMessage(operand, self.op, exc) - continue - - try: - try: - methods = dunder_lookup.lookup(operand, meth) - except AttributeInferenceError: - yield util.BadUnaryOperationMessage(operand, self.op, exc) - continue - - meth = methods[0] - inferred = next(meth.infer(context=context), None) - if ( - isinstance(inferred, util.UninferableBase) - or not inferred.callable() - ): - continue - - context = copy_context(context) - context.boundnode = operand - context.callcontext = CallContext(args=[], callee=inferred) - - call_results = inferred.infer_call_result(self, context=context) - result = next(call_results, None) - if result is None: - # Failed to infer, return the same type. - yield operand - else: - yield result - except AttributeInferenceError as inner_exc: - # The unary operation special method was not found. - yield util.BadUnaryOperationMessage(operand, self.op, inner_exc) - except InferenceError: - yield util.Uninferable - - @decorators.raise_if_nothing_inferred - @decorators.path_wrapper - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[InferenceResult, None, InferenceErrorInfo]: - """Infer what an UnaryOp should return when evaluated.""" - yield from self._filter_operation_errors( - self._infer_unaryop, context, util.BadUnaryOperationMessage - ) - return InferenceErrorInfo(node=self, context=context) - - -class While(_base_nodes.MultiLineWithElseBlockNode, _base_nodes.Statement): - """Class representing an :class:`ast.While` node. - - >>> import astroid - >>> node = astroid.extract_node(''' - while condition(): - print("True") - ''') - >>> node - - """ - - _astroid_fields = ("test", "body", "orelse") - _multi_line_block_fields = ("body", "orelse") - - test: NodeNG - """The condition that the loop tests.""" - - body: list[NodeNG] - """The contents of the loop.""" - - orelse: list[NodeNG] - """The contents of the ``else`` block.""" - - def postinit( - self, - test: NodeNG, - body: list[NodeNG], - orelse: list[NodeNG], - ) -> None: - self.test = test - self.body = body - self.orelse = orelse - - @cached_property - def blockstart_tolineno(self): - """The line on which the beginning of this block ends. - - :type: int - """ - return self.test.tolineno - - def block_range(self, lineno: int) -> tuple[int, int]: - """Get a range from the given line number to where this node ends. - - :param lineno: The line number to start the range at. - - :returns: The range of line numbers that this node belongs to, - starting at the given line number. - """ - return self._elsed_block_range(lineno, self.orelse) - - def get_children(self): - yield self.test - - yield from self.body - yield from self.orelse - - def _get_yield_nodes_skip_functions(self): - """A While node can contain a Yield node in the test""" - yield from self.test._get_yield_nodes_skip_functions() - yield from super()._get_yield_nodes_skip_functions() - - def _get_yield_nodes_skip_lambdas(self): - """A While node can contain a Yield node in the test""" - yield from self.test._get_yield_nodes_skip_lambdas() - yield from super()._get_yield_nodes_skip_lambdas() - - -class With( - _base_nodes.MultiLineWithElseBlockNode, - _base_nodes.AssignTypeNode, - _base_nodes.Statement, -): - """Class representing an :class:`ast.With` node. - - >>> import astroid - >>> node = astroid.extract_node(''' - with open(file_path) as file_: - print(file_.read()) - ''') - >>> node - - """ - - _astroid_fields = ("items", "body") - _other_other_fields = ("type_annotation",) - _multi_line_block_fields = ("body",) - - def __init__( - self, - lineno: int | None = None, - col_offset: int | None = None, - parent: NodeNG | None = None, - *, - end_lineno: int | None = None, - end_col_offset: int | None = None, - ) -> None: - """ - :param lineno: The line that this node appears on in the source code. - - :param col_offset: The column that this node appears on in the - source code. - - :param parent: The parent node in the syntax tree. - - :param end_lineno: The last line this node appears on in the source code. - - :param end_col_offset: The end column this node appears on in the - source code. Note: This is after the last symbol. - """ - self.items: list[tuple[NodeNG, NodeNG | None]] = [] - """The pairs of context managers and the names they are assigned to.""" - - self.body: list[NodeNG] = [] - """The contents of the ``with`` block.""" - - self.type_annotation: NodeNG | None = None # can be None - """If present, this will contain the type annotation passed by a type comment""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit( - self, - items: list[tuple[NodeNG, NodeNG | None]] | None = None, - body: list[NodeNG] | None = None, - type_annotation: NodeNG | None = None, - ) -> None: - """Do some setup after initialisation. - - :param items: The pairs of context managers and the names - they are assigned to. - - :param body: The contents of the ``with`` block. - """ - if items is not None: - self.items = items - if body is not None: - self.body = body - self.type_annotation = type_annotation - - assigned_stmts = protocols.with_assigned_stmts - """Returns the assigned statement (non inferred) according to the assignment type. - See astroid/protocols.py for actual implementation. - """ - - @cached_property - def blockstart_tolineno(self): - """The line on which the beginning of this block ends. - - :type: int - """ - return self.items[-1][0].tolineno - - def get_children(self): - """Get the child nodes below this node. - - :returns: The children. - :rtype: iterable(NodeNG) - """ - for expr, var in self.items: - yield expr - if var: - yield var - yield from self.body - - -class AsyncWith(With): - """Asynchronous ``with`` built with the ``async`` keyword.""" - - -class Yield(NodeNG): - """Class representing an :class:`ast.Yield` node. - - >>> import astroid - >>> node = astroid.extract_node('yield True') - >>> node - - """ - - _astroid_fields = ("value",) - - value: NodeNG | None - """The value to yield.""" - - def postinit(self, value: NodeNG | None) -> None: - self.value = value - - def get_children(self): - if self.value is not None: - yield self.value - - def _get_yield_nodes_skip_functions(self): - yield self - - def _get_yield_nodes_skip_lambdas(self): - yield self - - -class YieldFrom(Yield): # TODO value is required, not optional - """Class representing an :class:`ast.YieldFrom` node.""" - - -class DictUnpack(_base_nodes.NoChildrenNode): - """Represents the unpacking of dicts into dicts using :pep:`448`.""" - - -class FormattedValue(NodeNG): - """Class representing an :class:`ast.FormattedValue` node. - - Represents a :pep:`498` format string. - - >>> import astroid - >>> node = astroid.extract_node('f"Format {type_}"') - >>> node - - >>> node.values - [, ] - """ - - _astroid_fields = ("value", "format_spec") - _other_fields = ("conversion",) - - def __init__( - self, - lineno: int | None = None, - col_offset: int | None = None, - parent: NodeNG | None = None, - *, - end_lineno: int | None = None, - end_col_offset: int | None = None, - ) -> None: - """ - :param lineno: The line that this node appears on in the source code. - - :param col_offset: The column that this node appears on in the - source code. - - :param parent: The parent node in the syntax tree. - - :param end_lineno: The last line this node appears on in the source code. - - :param end_col_offset: The end column this node appears on in the - source code. Note: This is after the last symbol. - """ - self.value: NodeNG - """The value to be formatted into the string.""" - - self.conversion: int - """The type of formatting to be applied to the value. - - .. seealso:: - :class:`ast.FormattedValue` - """ - - self.format_spec: JoinedStr | None = None - """The formatting to be applied to the value. - - .. seealso:: - :class:`ast.FormattedValue` - """ - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit( - self, - *, - value: NodeNG, - conversion: int, - format_spec: JoinedStr | None = None, - ) -> None: - """Do some setup after initialisation. - - :param value: The value to be formatted into the string. - - :param conversion: The type of formatting to be applied to the value. - - :param format_spec: The formatting to be applied to the value. - :type format_spec: JoinedStr or None - """ - self.value = value - self.conversion = conversion - self.format_spec = format_spec - - def get_children(self): - yield self.value - - if self.format_spec is not None: - yield self.format_spec - - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[InferenceResult, None, InferenceErrorInfo | None]: - format_specs = Const("") if self.format_spec is None else self.format_spec - uninferable_already_generated = False - for format_spec in format_specs.infer(context, **kwargs): - if not isinstance(format_spec, Const): - if not uninferable_already_generated: - yield util.Uninferable - uninferable_already_generated = True - continue - for value in self.value.infer(context, **kwargs): - value_to_format = value - if isinstance(value, Const): - value_to_format = value.value - try: - formatted = format(value_to_format, format_spec.value) - yield Const( - formatted, - lineno=self.lineno, - col_offset=self.col_offset, - end_lineno=self.end_lineno, - end_col_offset=self.end_col_offset, - ) - continue - except (ValueError, TypeError): - # happens when format_spec.value is invalid - yield util.Uninferable - uninferable_already_generated = True - continue - - -UNINFERABLE_VALUE = "{Uninferable}" - - -class JoinedStr(NodeNG): - """Represents a list of string expressions to be joined. - - >>> import astroid - >>> node = astroid.extract_node('f"Format {type_}"') - >>> node - - """ - - _astroid_fields = ("values",) - - def __init__( - self, - lineno: int | None = None, - col_offset: int | None = None, - parent: NodeNG | None = None, - *, - end_lineno: int | None = None, - end_col_offset: int | None = None, - ) -> None: - """ - :param lineno: The line that this node appears on in the source code. - - :param col_offset: The column that this node appears on in the - source code. - - :param parent: The parent node in the syntax tree. - - :param end_lineno: The last line this node appears on in the source code. - - :param end_col_offset: The end column this node appears on in the - source code. Note: This is after the last symbol. - """ - self.values: list[NodeNG] = [] - """The string expressions to be joined. - - :type: list(FormattedValue or Const) - """ - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit(self, values: list[NodeNG] | None = None) -> None: - """Do some setup after initialisation. - - :param value: The string expressions to be joined. - - :type: list(FormattedValue or Const) - """ - if values is not None: - self.values = values - - def get_children(self): - yield from self.values - - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[InferenceResult, None, InferenceErrorInfo | None]: - if self.values: - yield from self._infer_with_values(context) - else: - yield Const("") - - def _infer_with_values( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[InferenceResult, None, InferenceErrorInfo | None]: - uninferable_already_generated = False - for inferred in self._infer_from_values(self.values, context): - failed = inferred is util.Uninferable or ( - isinstance(inferred, Const) and UNINFERABLE_VALUE in inferred.value - ) - if failed: - if not uninferable_already_generated: - uninferable_already_generated = True - yield util.Uninferable - continue - yield inferred - - @classmethod - def _infer_from_values( - cls, nodes: list[NodeNG], context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[InferenceResult, None, InferenceErrorInfo | None]: - if not nodes: - return - if len(nodes) == 1: - for node in cls._safe_infer_from_node(nodes[0], context, **kwargs): - if isinstance(node, Const): - yield node - continue - yield Const(UNINFERABLE_VALUE) - return - for prefix in cls._safe_infer_from_node(nodes[0], context, **kwargs): - for suffix in cls._infer_from_values(nodes[1:], context, **kwargs): - result = "" - for node in (prefix, suffix): - if isinstance(node, Const): - result += str(node.value) - continue - result += UNINFERABLE_VALUE - yield Const(result) - - @classmethod - def _safe_infer_from_node( - cls, node: NodeNG, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[InferenceResult, None, InferenceErrorInfo | None]: - try: - yield from node._infer(context, **kwargs) - except InferenceError: - yield util.Uninferable - - -class NamedExpr(_base_nodes.AssignTypeNode): - """Represents the assignment from the assignment expression - - >>> import astroid - >>> module = astroid.parse('if a := 1: pass') - >>> module.body[0].test - - """ - - _astroid_fields = ("target", "value") - - optional_assign = True - """Whether this node optionally assigns a variable. - - Since NamedExpr are not always called they do not always assign.""" - - def __init__( - self, - lineno: int | None = None, - col_offset: int | None = None, - parent: NodeNG | None = None, - *, - end_lineno: int | None = None, - end_col_offset: int | None = None, - ) -> None: - """ - :param lineno: The line that this node appears on in the source code. - - :param col_offset: The column that this node appears on in the - source code. - - :param parent: The parent node in the syntax tree. - - :param end_lineno: The last line this node appears on in the source code. - - :param end_col_offset: The end column this node appears on in the - source code. Note: This is after the last symbol. - """ - self.target: NodeNG - """The assignment target - - :type: Name - """ - - self.value: NodeNG - """The value that gets assigned in the expression""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit(self, target: NodeNG, value: NodeNG) -> None: - self.target = target - self.value = value - - assigned_stmts = protocols.named_expr_assigned_stmts - """Returns the assigned statement (non inferred) according to the assignment type. - See astroid/protocols.py for actual implementation. - """ - - def frame(self) -> nodes.FunctionDef | nodes.Module | nodes.ClassDef | nodes.Lambda: - """The first parent frame node. - - A frame node is a :class:`Module`, :class:`FunctionDef`, - or :class:`ClassDef`. - - :returns: The first parent frame node. - """ - if not self.parent: - raise ParentMissingError(target=self) - - # For certain parents NamedExpr evaluate to the scope of the parent - if isinstance(self.parent, (Arguments, Keyword, Comprehension)): - if not self.parent.parent: - raise ParentMissingError(target=self.parent) - if not self.parent.parent.parent: - raise ParentMissingError(target=self.parent.parent) - return self.parent.parent.parent.frame() - - return self.parent.frame() - - def scope(self) -> LocalsDictNodeNG: - """The first parent node defining a new scope. - These can be Module, FunctionDef, ClassDef, Lambda, or GeneratorExp nodes. - - :returns: The first parent scope node. - """ - if not self.parent: - raise ParentMissingError(target=self) - - # For certain parents NamedExpr evaluate to the scope of the parent - if isinstance(self.parent, (Arguments, Keyword, Comprehension)): - if not self.parent.parent: - raise ParentMissingError(target=self.parent) - if not self.parent.parent.parent: - raise ParentMissingError(target=self.parent.parent) - return self.parent.parent.parent.scope() - - return self.parent.scope() - - def set_local(self, name: str, stmt: NodeNG) -> None: - """Define that the given name is declared in the given statement node. - NamedExpr's in Arguments, Keyword or Comprehension are evaluated in their - parent's parent scope. So we add to their frame's locals. - - .. seealso:: :meth:`scope` - - :param name: The name that is being defined. - - :param stmt: The statement that defines the given name. - """ - self.frame().set_local(name, stmt) - - -class Unknown(_base_nodes.AssignTypeNode): - """This node represents a node in a constructed AST where - introspection is not possible. At the moment, it's only used in - the args attribute of FunctionDef nodes where function signature - introspection failed. - """ - - name = "Unknown" - - def __init__( - self, - parent: NodeNG, - lineno: None = None, - col_offset: None = None, - *, - end_lineno: None = None, - end_col_offset: None = None, - ) -> None: - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def qname(self) -> Literal["Unknown"]: - return "Unknown" - - def _infer(self, context: InferenceContext | None = None, **kwargs): - """Inference on an Unknown node immediately terminates.""" - yield util.Uninferable - - -UNATTACHED_UNKNOWN = Unknown(parent=SYNTHETIC_ROOT) - - -class EvaluatedObject(NodeNG): - """Contains an object that has already been inferred - - This class is useful to pre-evaluate a particular node, - with the resulting class acting as the non-evaluated node. - """ - - name = "EvaluatedObject" - _astroid_fields = ("original",) - _other_fields = ("value",) - - def __init__( - self, original: SuccessfulInferenceResult, value: InferenceResult - ) -> None: - self.original: SuccessfulInferenceResult = original - """The original node that has already been evaluated""" - - self.value: InferenceResult = value - """The inferred value""" - - super().__init__( - lineno=self.original.lineno, - col_offset=self.original.col_offset, - parent=self.original.parent, - end_lineno=self.original.end_lineno, - end_col_offset=self.original.end_col_offset, - ) - - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[NodeNG | util.UninferableBase]: - yield self.value - - -# Pattern matching ####################################################### - - -class Match(_base_nodes.Statement, _base_nodes.MultiLineBlockNode): - """Class representing a :class:`ast.Match` node. - - >>> import astroid - >>> node = astroid.extract_node(''' - match x: - case 200: - ... - case _: - ... - ''') - >>> node - - """ - - _astroid_fields = ("subject", "cases") - _multi_line_block_fields = ("cases",) - - def __init__( - self, - lineno: int | None = None, - col_offset: int | None = None, - parent: NodeNG | None = None, - *, - end_lineno: int | None = None, - end_col_offset: int | None = None, - ) -> None: - self.subject: NodeNG - self.cases: list[MatchCase] - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit( - self, - *, - subject: NodeNG, - cases: list[MatchCase], - ) -> None: - self.subject = subject - self.cases = cases - - -class Pattern(NodeNG): - """Base class for all Pattern nodes.""" - - -class MatchCase(_base_nodes.MultiLineBlockNode): - """Class representing a :class:`ast.match_case` node. - - >>> import astroid - >>> node = astroid.extract_node(''' - match x: - case 200: - ... - ''') - >>> node.cases[0] - - """ - - _astroid_fields = ("pattern", "guard", "body") - _multi_line_block_fields = ("body",) - - lineno: None - col_offset: None - end_lineno: None - end_col_offset: None - - def __init__(self, *, parent: NodeNG | None = None) -> None: - self.pattern: Pattern - self.guard: NodeNG | None - self.body: list[NodeNG] - super().__init__( - parent=parent, - lineno=None, - col_offset=None, - end_lineno=None, - end_col_offset=None, - ) - - def postinit( - self, - *, - pattern: Pattern, - guard: NodeNG | None, - body: list[NodeNG], - ) -> None: - self.pattern = pattern - self.guard = guard - self.body = body - - -class MatchValue(Pattern): - """Class representing a :class:`ast.MatchValue` node. - - >>> import astroid - >>> node = astroid.extract_node(''' - match x: - case 200: - ... - ''') - >>> node.cases[0].pattern - - """ - - _astroid_fields = ("value",) - - def __init__( - self, - lineno: int | None = None, - col_offset: int | None = None, - parent: NodeNG | None = None, - *, - end_lineno: int | None = None, - end_col_offset: int | None = None, - ) -> None: - self.value: NodeNG - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit(self, *, value: NodeNG) -> None: - self.value = value - - -class MatchSingleton(Pattern): - """Class representing a :class:`ast.MatchSingleton` node. - - >>> import astroid - >>> node = astroid.extract_node(''' - match x: - case True: - ... - case False: - ... - case None: - ... - ''') - >>> node.cases[0].pattern - - >>> node.cases[1].pattern - - >>> node.cases[2].pattern - - """ - - _other_fields = ("value",) - - def __init__( - self, - *, - value: Literal[True, False, None], - lineno: int | None = None, - col_offset: int | None = None, - end_lineno: int | None = None, - end_col_offset: int | None = None, - parent: NodeNG | None = None, - ) -> None: - self.value = value - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - -class MatchSequence(Pattern): - """Class representing a :class:`ast.MatchSequence` node. - - >>> import astroid - >>> node = astroid.extract_node(''' - match x: - case [1, 2]: - ... - case (1, 2, *_): - ... - ''') - >>> node.cases[0].pattern - - >>> node.cases[1].pattern - - """ - - _astroid_fields = ("patterns",) - - def __init__( - self, - lineno: int | None = None, - col_offset: int | None = None, - parent: NodeNG | None = None, - *, - end_lineno: int | None = None, - end_col_offset: int | None = None, - ) -> None: - self.patterns: list[Pattern] - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit(self, *, patterns: list[Pattern]) -> None: - self.patterns = patterns - - -class MatchMapping(_base_nodes.AssignTypeNode, Pattern): - """Class representing a :class:`ast.MatchMapping` node. - - >>> import astroid - >>> node = astroid.extract_node(''' - match x: - case {1: "Hello", 2: "World", 3: _, **rest}: - ... - ''') - >>> node.cases[0].pattern - - """ - - _astroid_fields = ("keys", "patterns", "rest") - - def __init__( - self, - lineno: int | None = None, - col_offset: int | None = None, - parent: NodeNG | None = None, - *, - end_lineno: int | None = None, - end_col_offset: int | None = None, - ) -> None: - self.keys: list[NodeNG] - self.patterns: list[Pattern] - self.rest: AssignName | None - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit( - self, - *, - keys: list[NodeNG], - patterns: list[Pattern], - rest: AssignName | None, - ) -> None: - self.keys = keys - self.patterns = patterns - self.rest = rest - - assigned_stmts = protocols.match_mapping_assigned_stmts - """Returns the assigned statement (non inferred) according to the assignment type. - See astroid/protocols.py for actual implementation. - """ - - -class MatchClass(Pattern): - """Class representing a :class:`ast.MatchClass` node. - - >>> import astroid - >>> node = astroid.extract_node(''' - match x: - case Point2D(0, 0): - ... - case Point3D(x=0, y=0, z=0): - ... - ''') - >>> node.cases[0].pattern - - >>> node.cases[1].pattern - - """ - - _astroid_fields = ("cls", "patterns", "kwd_patterns") - _other_fields = ("kwd_attrs",) - - def __init__( - self, - lineno: int | None = None, - col_offset: int | None = None, - parent: NodeNG | None = None, - *, - end_lineno: int | None = None, - end_col_offset: int | None = None, - ) -> None: - self.cls: NodeNG - self.patterns: list[Pattern] - self.kwd_attrs: list[str] - self.kwd_patterns: list[Pattern] - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit( - self, - *, - cls: NodeNG, - patterns: list[Pattern], - kwd_attrs: list[str], - kwd_patterns: list[Pattern], - ) -> None: - self.cls = cls - self.patterns = patterns - self.kwd_attrs = kwd_attrs - self.kwd_patterns = kwd_patterns - - -class MatchStar(_base_nodes.AssignTypeNode, Pattern): - """Class representing a :class:`ast.MatchStar` node. - - >>> import astroid - >>> node = astroid.extract_node(''' - match x: - case [1, *_]: - ... - ''') - >>> node.cases[0].pattern.patterns[1] - - """ - - _astroid_fields = ("name",) - - def __init__( - self, - lineno: int | None = None, - col_offset: int | None = None, - parent: NodeNG | None = None, - *, - end_lineno: int | None = None, - end_col_offset: int | None = None, - ) -> None: - self.name: AssignName | None - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit(self, *, name: AssignName | None) -> None: - self.name = name - - assigned_stmts = protocols.match_star_assigned_stmts - """Returns the assigned statement (non inferred) according to the assignment type. - See astroid/protocols.py for actual implementation. - """ - - -class MatchAs(_base_nodes.AssignTypeNode, Pattern): - """Class representing a :class:`ast.MatchAs` node. - - >>> import astroid - >>> node = astroid.extract_node(''' - match x: - case [1, a]: - ... - case {'key': b}: - ... - case Point2D(0, 0) as c: - ... - case d: - ... - ''') - >>> node.cases[0].pattern.patterns[1] - - >>> node.cases[1].pattern.patterns[0] - - >>> node.cases[2].pattern - - >>> node.cases[3].pattern - - """ - - _astroid_fields = ("pattern", "name") - - def __init__( - self, - lineno: int | None = None, - col_offset: int | None = None, - parent: NodeNG | None = None, - *, - end_lineno: int | None = None, - end_col_offset: int | None = None, - ) -> None: - self.pattern: Pattern | None - self.name: AssignName | None - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit( - self, - *, - pattern: Pattern | None, - name: AssignName | None, - ) -> None: - self.pattern = pattern - self.name = name - - assigned_stmts = protocols.match_as_assigned_stmts - """Returns the assigned statement (non inferred) according to the assignment type. - See astroid/protocols.py for actual implementation. - """ - - -class MatchOr(Pattern): - """Class representing a :class:`ast.MatchOr` node. - - >>> import astroid - >>> node = astroid.extract_node(''' - match x: - case 400 | 401 | 402: - ... - ''') - >>> node.cases[0].pattern - - """ - - _astroid_fields = ("patterns",) - - def __init__( - self, - lineno: int | None = None, - col_offset: int | None = None, - parent: NodeNG | None = None, - *, - end_lineno: int | None = None, - end_col_offset: int | None = None, - ) -> None: - self.patterns: list[Pattern] - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit(self, *, patterns: list[Pattern]) -> None: - self.patterns = patterns - - -class TemplateStr(NodeNG): - """Class representing an :class:`ast.TemplateStr` node. - - >>> import astroid - >>> node = astroid.extract_node('t"{name} finished {place!s}"') - >>> node - - """ - - _astroid_fields = ("values",) - - def __init__( - self, - lineno: int | None = None, - col_offset: int | None = None, - parent: NodeNG | None = None, - *, - end_lineno: int | None = None, - end_col_offset: int | None = None, - ) -> None: - self.values: list[NodeNG] - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit(self, *, values: list[NodeNG]) -> None: - self.values = values - - def get_children(self) -> Iterator[NodeNG]: - yield from self.values - - -class Interpolation(NodeNG): - """Class representing an :class:`ast.Interpolation` node. - - >>> import astroid - >>> node = astroid.extract_node('t"{name} finished {place!s}"') - >>> node - - >>> node.values[0] - - >>> node.values[2] - - """ - - _astroid_fields = ("value", "format_spec") - _other_fields = ("str", "conversion") - - def __init__( - self, - lineno: int | None = None, - col_offset: int | None = None, - parent: NodeNG | None = None, - *, - end_lineno: int | None = None, - end_col_offset: int | None = None, - ) -> None: - self.value: NodeNG - """Any expression node.""" - - self.str: str - """Text of the interpolation expression.""" - - self.conversion: int - """The type of formatting to be applied to the value. - - .. seealso:: - :class:`ast.Interpolation` - """ - - self.format_spec: JoinedStr | None = None - """The formatting to be applied to the value. - - .. seealso:: - :class:`ast.Interpolation` - """ - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit( - self, - *, - value: NodeNG, - str: str, # pylint: disable=redefined-builtin - conversion: int = -1, - format_spec: JoinedStr | None = None, - ) -> None: - self.value = value - self.str = str - self.conversion = conversion - self.format_spec = format_spec - - def get_children(self) -> Iterator[NodeNG]: - yield self.value - if self.format_spec: - yield self.format_spec - - -# constants ############################################################## - -# The _proxied attribute of all container types (List, Tuple, etc.) -# are set during bootstrapping by _astroid_bootstrapping(). -CONST_CLS: dict[type, type[NodeNG]] = { - list: List, - tuple: Tuple, - dict: Dict, - set: Set, - type(None): Const, - type(NotImplemented): Const, - type(...): Const, - bool: Const, - int: Const, - float: Const, - complex: Const, - str: Const, - bytes: Const, -} - - -def _create_basic_elements( - value: Iterable[Any], node: List | Set | Tuple -) -> list[NodeNG]: - """Create a list of nodes to function as the elements of a new node.""" - elements: list[NodeNG] = [] - for element in value: - # NOTE: avoid accessing any attributes of element in the loop. - element_node = const_factory(element) - element_node.parent = node - elements.append(element_node) - return elements - - -def _create_dict_items( - values: Mapping[Any, Any], node: Dict -) -> list[tuple[SuccessfulInferenceResult, SuccessfulInferenceResult]]: - """Create a list of node pairs to function as the items of a new dict node.""" - elements: list[tuple[SuccessfulInferenceResult, SuccessfulInferenceResult]] = [] - for key, value in values.items(): - # NOTE: avoid accessing any attributes of both key and value in the loop. - key_node = const_factory(key) - key_node.parent = node - value_node = const_factory(value) - value_node.parent = node - elements.append((key_node, value_node)) - return elements - - -def const_factory(value: Any) -> ConstFactoryResult: - """Return an astroid node for a python value.""" - # NOTE: avoid accessing any attributes of value until it is known that value - # is of a const type, to avoid possibly triggering code for a live object. - # Accesses include value.__class__ and isinstance(value, ...), but not type(value). - # See: https://github.com/pylint-dev/astroid/issues/2686 - value_type = type(value) - assert not issubclass(value_type, NodeNG) - - # This only handles instances of the CONST types. Any - # subclasses get inferred as EmptyNode. - # TODO: See if we should revisit these with the normal builder. - if value_type not in CONST_CLS: - node = EmptyNode() - node.object = value - return node - - instance: List | Set | Tuple | Dict - initializer_cls = CONST_CLS[value_type] - if issubclass(initializer_cls, (List, Set, Tuple)): - instance = initializer_cls( - lineno=None, - col_offset=None, - parent=SYNTHETIC_ROOT, - end_lineno=None, - end_col_offset=None, - ) - instance.postinit(_create_basic_elements(value, instance)) - return instance - if issubclass(initializer_cls, Dict): - instance = initializer_cls( - lineno=None, - col_offset=None, - parent=SYNTHETIC_ROOT, - end_lineno=None, - end_col_offset=None, - ) - instance.postinit(_create_dict_items(value, instance)) - return instance - return Const(value) diff --git a/venv/lib/python3.12/site-packages/astroid/nodes/node_ng.py b/venv/lib/python3.12/site-packages/astroid/nodes/node_ng.py deleted file mode 100644 index 1af39c2..0000000 --- a/venv/lib/python3.12/site-packages/astroid/nodes/node_ng.py +++ /dev/null @@ -1,771 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from __future__ import annotations - -import pprint -import sys -from collections.abc import Generator, Iterator -from functools import cached_property -from functools import singledispatch as _singledispatch -from typing import ( - TYPE_CHECKING, - Any, - ClassVar, - TypeVar, - cast, - overload, -) - -from astroid import nodes, util -from astroid.context import InferenceContext -from astroid.exceptions import ( - AstroidError, - InferenceError, - ParentMissingError, - StatementMissing, - UseInferenceDefault, -) -from astroid.manager import AstroidManager -from astroid.nodes.as_string import AsStringVisitor -from astroid.nodes.const import OP_PRECEDENCE -from astroid.nodes.utils import Position -from astroid.typing import InferenceErrorInfo, InferenceResult, InferFn - -if sys.version_info >= (3, 11): - from typing import Self -else: - from typing_extensions import Self - - -if TYPE_CHECKING: - from astroid.nodes import _base_nodes - - -# Types for 'NodeNG.nodes_of_class()' -_NodesT = TypeVar("_NodesT", bound="NodeNG") -_NodesT2 = TypeVar("_NodesT2", bound="NodeNG") -_NodesT3 = TypeVar("_NodesT3", bound="NodeNG") -SkipKlassT = None | type["NodeNG"] | tuple[type["NodeNG"], ...] - - -class NodeNG: - """A node of the new Abstract Syntax Tree (AST). - - This is the base class for all Astroid node classes. - """ - - is_statement: ClassVar[bool] = False - """Whether this node indicates a statement.""" - optional_assign: ClassVar[bool] = ( - False # True for For (and for Comprehension if py <3.0) - ) - """Whether this node optionally assigns a variable. - - This is for loop assignments because loop won't necessarily perform an - assignment if the loop has no iterations. - This is also the case from comprehensions in Python 2. - """ - is_function: ClassVar[bool] = False # True for FunctionDef nodes - """Whether this node indicates a function.""" - is_lambda: ClassVar[bool] = False - - # Attributes below are set by the builder module or by raw factories - _astroid_fields: ClassVar[tuple[str, ...]] = () - """Node attributes that contain child nodes. - - This is redefined in most concrete classes. - """ - _other_fields: ClassVar[tuple[str, ...]] = () - """Node attributes that do not contain child nodes.""" - _other_other_fields: ClassVar[tuple[str, ...]] = () - """Attributes that contain AST-dependent fields.""" - # instance specific inference function infer(node, context) - _explicit_inference: InferFn[Self] | None = None - - def __init__( - self, - lineno: int | None, - col_offset: int | None, - parent: NodeNG | None, - *, - end_lineno: int | None, - end_col_offset: int | None, - ) -> None: - self.lineno = lineno - """The line that this node appears on in the source code.""" - - self.col_offset = col_offset - """The column that this node appears on in the source code.""" - - self.parent = parent - """The parent node in the syntax tree.""" - - self.end_lineno = end_lineno - """The last line this node appears on in the source code.""" - - self.end_col_offset = end_col_offset - """The end column this node appears on in the source code. - - Note: This is after the last symbol. - """ - - self.position: Position | None = None - """Position of keyword(s) and name. - - Used as fallback for block nodes which might not provide good - enough positional information. E.g. ClassDef, FunctionDef. - """ - - def infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[InferenceResult]: - """Get a generator of the inferred values. - - This is the main entry point to the inference system. - - .. seealso:: :ref:`inference` - - If the instance has some explicit inference function set, it will be - called instead of the default interface. - - :returns: The inferred values. - :rtype: iterable - """ - if context is None: - context = InferenceContext() - else: - context = context.extra_context.get(self, context) - if self._explicit_inference is not None: - # explicit_inference is not bound, give it self explicitly - try: - for result in self._explicit_inference( - self, # type: ignore[arg-type] - context, - **kwargs, - ): - context.nodes_inferred += 1 - yield result - return - except UseInferenceDefault: - pass - - key = (self, context.lookupname, context.callcontext, context.boundnode) - if key in context.inferred: - yield from context.inferred[key] - return - - results = [] - - # Limit inference amount to help with performance issues with - # exponentially exploding possible results. - limit = AstroidManager().max_inferable_values - for i, result in enumerate(self._infer(context=context, **kwargs)): - if i >= limit or (context.nodes_inferred > context.max_inferred): - results.append(util.Uninferable) - yield util.Uninferable - break - results.append(result) - yield result - context.nodes_inferred += 1 - - # Cache generated results for subsequent inferences of the - # same node using the same context - context.inferred[key] = tuple(results) - return - - def repr_name(self) -> str: - """Get a name for nice representation. - - This is either :attr:`name`, :attr:`attrname`, or the empty string. - """ - if all(name not in self._astroid_fields for name in ("name", "attrname")): - return getattr(self, "name", "") or getattr(self, "attrname", "") - return "" - - def __str__(self) -> str: - rname = self.repr_name() - cname = type(self).__name__ - if rname: - string = "%(cname)s.%(rname)s(%(fields)s)" - alignment = len(cname) + len(rname) + 2 - else: - string = "%(cname)s(%(fields)s)" - alignment = len(cname) + 1 - result = [] - for field in self._other_fields + self._astroid_fields: - value = getattr(self, field, "Unknown") - width = 80 - len(field) - alignment - lines = pprint.pformat(value, indent=2, width=width).splitlines(True) - - inner = [lines[0]] - for line in lines[1:]: - inner.append(" " * alignment + line) - result.append(f"{field}={''.join(inner)}") - - return string % { - "cname": cname, - "rname": rname, - "fields": (",\n" + " " * alignment).join(result), - } - - def __repr__(self) -> str: - rname = self.repr_name() - # The dependencies used to calculate fromlineno (if not cached) may not exist at the time - try: - lineno = self.fromlineno - except AttributeError: - lineno = 0 - if rname: - string = "<%(cname)s.%(rname)s l.%(lineno)s at 0x%(id)x>" - else: - string = "<%(cname)s l.%(lineno)s at 0x%(id)x>" - return string % { - "cname": type(self).__name__, - "rname": rname, - "lineno": lineno, - "id": id(self), - } - - def accept(self, visitor: AsStringVisitor) -> str: - """Visit this node using the given visitor.""" - func = getattr(visitor, "visit_" + self.__class__.__name__.lower()) - return func(self) - - def get_children(self) -> Iterator[NodeNG]: - """Get the child nodes below this node.""" - for field in self._astroid_fields: - attr = getattr(self, field) - if attr is None: - continue - if isinstance(attr, (list, tuple)): - yield from attr - else: - yield attr - yield from () - - def last_child(self) -> NodeNG | None: - """An optimized version of list(get_children())[-1].""" - for field in self._astroid_fields[::-1]: - attr = getattr(self, field) - if not attr: # None or empty list / tuple - continue - if isinstance(attr, (list, tuple)): - return attr[-1] - return attr - return None - - def node_ancestors(self) -> Iterator[NodeNG]: - """Yield parent, grandparent, etc until there are no more.""" - parent = self.parent - while parent is not None: - yield parent - parent = parent.parent - - def parent_of(self, node) -> bool: - """Check if this node is the parent of the given node. - - :param node: The node to check if it is the child. - :type node: NodeNG - - :returns: Whether this node is the parent of the given node. - """ - return any(self is parent for parent in node.node_ancestors()) - - def statement(self) -> _base_nodes.Statement: - """The first parent node, including self, marked as statement node. - - :raises StatementMissing: If self has no parent attribute. - """ - if self.is_statement: - return cast("_base_nodes.Statement", self) - if not self.parent: - raise StatementMissing(target=self) - return self.parent.statement() - - def frame(self) -> nodes.FunctionDef | nodes.Module | nodes.ClassDef | nodes.Lambda: - """The first parent frame node. - - A frame node is a :class:`Module`, :class:`FunctionDef`, - :class:`ClassDef` or :class:`Lambda`. - - :returns: The first parent frame node. - :raises ParentMissingError: If self has no parent attribute. - """ - if self.parent is None: - raise ParentMissingError(target=self) - return self.parent.frame() - - def scope(self) -> nodes.LocalsDictNodeNG: - """The first parent node defining a new scope. - - These can be Module, FunctionDef, ClassDef, Lambda, or GeneratorExp nodes. - - :returns: The first parent scope node. - """ - if not self.parent: - raise ParentMissingError(target=self) - return self.parent.scope() - - def root(self) -> nodes.Module: - """Return the root node of the syntax tree. - - :returns: The root node. - """ - if not (parent := self.parent): - assert isinstance(self, nodes.Module) - return self - - while parent.parent: - parent = parent.parent - assert isinstance(parent, nodes.Module) - return parent - - def child_sequence(self, child): - """Search for the sequence that contains this child. - - :param child: The child node to search sequences for. - :type child: NodeNG - - :returns: The sequence containing the given child node. - :rtype: iterable(NodeNG) - - :raises AstroidError: If no sequence could be found that contains - the given child. - """ - for field in self._astroid_fields: - node_or_sequence = getattr(self, field) - if node_or_sequence is child: - return [node_or_sequence] - # /!\ compiler.ast Nodes have an __iter__ walking over child nodes - if ( - isinstance(node_or_sequence, (tuple, list)) - and child in node_or_sequence - ): - return node_or_sequence - - msg = "Could not find %s in %s's children" - raise AstroidError(msg % (repr(child), repr(self))) - - def locate_child(self, child): - """Find the field of this node that contains the given child. - - :param child: The child node to search fields for. - :type child: NodeNG - - :returns: A tuple of the name of the field that contains the child, - and the sequence or node that contains the child node. - :rtype: tuple(str, iterable(NodeNG) or NodeNG) - - :raises AstroidError: If no field could be found that contains - the given child. - """ - for field in self._astroid_fields: - node_or_sequence = getattr(self, field) - # /!\ compiler.ast Nodes have an __iter__ walking over child nodes - if child is node_or_sequence: - return field, child - if ( - isinstance(node_or_sequence, (tuple, list)) - and child in node_or_sequence - ): - return field, node_or_sequence - msg = "Could not find %s in %s's children" - raise AstroidError(msg % (repr(child), repr(self))) - - # FIXME : should we merge child_sequence and locate_child ? locate_child - # is only used in are_exclusive, child_sequence one time in pylint. - - def next_sibling(self): - """The next sibling statement node. - - :returns: The next sibling statement node. - :rtype: NodeNG or None - """ - return self.parent.next_sibling() - - def previous_sibling(self): - """The previous sibling statement. - - :returns: The previous sibling statement node. - :rtype: NodeNG or None - """ - return self.parent.previous_sibling() - - # these are lazy because they're relatively expensive to compute for every - # single node, and they rarely get looked at - - @cached_property - def fromlineno(self) -> int: - """The first line that this node appears on in the source code. - - Can also return 0 if the line can not be determined. - """ - if self.lineno is None: - return self._fixed_source_line() - return self.lineno - - @cached_property - def tolineno(self) -> int: - """The last line that this node appears on in the source code. - - Can also return 0 if the line can not be determined. - """ - if self.end_lineno is not None: - return self.end_lineno - if not self._astroid_fields: - # can't have children - last_child = None - else: - last_child = self.last_child() - if last_child is None: - return self.fromlineno - return last_child.tolineno - - def _fixed_source_line(self) -> int: - """Attempt to find the line that this node appears on. - - We need this method since not all nodes have :attr:`lineno` set. - Will return 0 if the line number can not be determined. - """ - line = self.lineno - _node = self - try: - while line is None: - _node = next(_node.get_children()) - line = _node.lineno - except StopIteration: - parent = self.parent - while parent and line is None: - line = parent.lineno - parent = parent.parent - return line or 0 - - def block_range(self, lineno: int) -> tuple[int, int]: - """Get a range from the given line number to where this node ends. - - :param lineno: The line number to start the range at. - - :returns: The range of line numbers that this node belongs to, - starting at the given line number. - """ - return lineno, self.tolineno - - def set_local(self, name: str, stmt: NodeNG) -> None: - """Define that the given name is declared in the given statement node. - - This definition is stored on the parent scope node. - - .. seealso:: :meth:`scope` - - :param name: The name that is being defined. - - :param stmt: The statement that defines the given name. - """ - assert self.parent - self.parent.set_local(name, stmt) - - @overload - def nodes_of_class( - self, - klass: type[_NodesT], - skip_klass: SkipKlassT = ..., - ) -> Iterator[_NodesT]: ... - - @overload - def nodes_of_class( - self, - klass: tuple[type[_NodesT], type[_NodesT2]], - skip_klass: SkipKlassT = ..., - ) -> Iterator[_NodesT] | Iterator[_NodesT2]: ... - - @overload - def nodes_of_class( - self, - klass: tuple[type[_NodesT], type[_NodesT2], type[_NodesT3]], - skip_klass: SkipKlassT = ..., - ) -> Iterator[_NodesT] | Iterator[_NodesT2] | Iterator[_NodesT3]: ... - - @overload - def nodes_of_class( - self, - klass: tuple[type[_NodesT], ...], - skip_klass: SkipKlassT = ..., - ) -> Iterator[_NodesT]: ... - - def nodes_of_class( # type: ignore[misc] # mypy doesn't correctly recognize the overloads - self, - klass: ( - type[_NodesT] - | tuple[type[_NodesT], type[_NodesT2]] - | tuple[type[_NodesT], type[_NodesT2], type[_NodesT3]] - | tuple[type[_NodesT], ...] - ), - skip_klass: SkipKlassT = None, - ) -> Iterator[_NodesT] | Iterator[_NodesT2] | Iterator[_NodesT3]: - """Get the nodes (including this one or below) of the given types. - - :param klass: The types of node to search for. - - :param skip_klass: The types of node to ignore. This is useful to ignore - subclasses of :attr:`klass`. - - :returns: The node of the given types. - """ - if isinstance(self, klass): - yield self - - if skip_klass is None: - for child_node in self.get_children(): - yield from child_node.nodes_of_class(klass, skip_klass) - - return - - for child_node in self.get_children(): - if isinstance(child_node, skip_klass): - continue - yield from child_node.nodes_of_class(klass, skip_klass) - - @cached_property - def _assign_nodes_in_scope(self) -> list[nodes.Assign]: - return [] - - def _get_name_nodes(self): - for child_node in self.get_children(): - yield from child_node._get_name_nodes() - - def _get_return_nodes_skip_functions(self): - yield from () - - def _get_yield_nodes_skip_functions(self): - yield from () - - def _get_yield_nodes_skip_lambdas(self): - yield from () - - def _infer_name(self, frame, name): - # overridden for ImportFrom, Import, Global, Try, TryStar and Arguments - pass - - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[InferenceResult, None, InferenceErrorInfo | None]: - """We don't know how to resolve a statement by default.""" - # this method is overridden by most concrete classes - raise InferenceError( - "No inference function for {node!r}.", node=self, context=context - ) - - def inferred(self): - """Get a list of the inferred values. - - .. seealso:: :ref:`inference` - - :returns: The inferred values. - :rtype: list - """ - return list(self.infer()) - - def instantiate_class(self): - """Instantiate an instance of the defined class. - - .. note:: - - On anything other than a :class:`ClassDef` this will return self. - - :returns: An instance of the defined class. - :rtype: object - """ - return self - - def has_base(self, node) -> bool: - """Check if this node inherits from the given type. - - :param node: The node defining the base to look for. - Usually this is a :class:`Name` node. - :type node: NodeNG - """ - return False - - def callable(self) -> bool: - """Whether this node defines something that is callable. - - :returns: Whether this defines something that is callable. - """ - return False - - def eq(self, value) -> bool: - return False - - def as_string(self) -> str: - """Get the source code that this node represents.""" - return AsStringVisitor()(self) - - def repr_tree( - self, - ids=False, - include_linenos=False, - ast_state=False, - indent=" ", - max_depth=0, - max_width=80, - ) -> str: - """Get a string representation of the AST from this node. - - :param ids: If true, includes the ids with the node type names. - :type ids: bool - - :param include_linenos: If true, includes the line numbers and - column offsets. - :type include_linenos: bool - - :param ast_state: If true, includes information derived from - the whole AST like local and global variables. - :type ast_state: bool - - :param indent: A string to use to indent the output string. - :type indent: str - - :param max_depth: If set to a positive integer, won't return - nodes deeper than max_depth in the string. - :type max_depth: int - - :param max_width: Attempt to format the output string to stay - within this number of characters, but can exceed it under some - circumstances. Only positive integer values are valid, the default is 80. - :type max_width: int - - :returns: The string representation of the AST. - :rtype: str - """ - - # pylint: disable = too-many-statements - - @_singledispatch - def _repr_tree(node, result, done, cur_indent="", depth=1): - """Outputs a representation of a non-tuple/list, non-node that's - contained within an AST, including strings. - """ - lines = pprint.pformat( - node, width=max(max_width - len(cur_indent), 1) - ).splitlines(True) - result.append(lines[0]) - result.extend([cur_indent + line for line in lines[1:]]) - return len(lines) != 1 - - # pylint: disable=unused-variable,useless-suppression; doesn't understand singledispatch - @_repr_tree.register(tuple) - @_repr_tree.register(list) - def _repr_seq(node, result, done, cur_indent="", depth=1): - """Outputs a representation of a sequence that's contained within an - AST. - """ - cur_indent += indent - result.append("[") - if not node: - broken = False - elif len(node) == 1: - broken = _repr_tree(node[0], result, done, cur_indent, depth) - elif len(node) == 2: - broken = _repr_tree(node[0], result, done, cur_indent, depth) - if not broken: - result.append(", ") - else: - result.append(",\n") - result.append(cur_indent) - broken = _repr_tree(node[1], result, done, cur_indent, depth) or broken - else: - result.append("\n") - result.append(cur_indent) - for child in node[:-1]: - _repr_tree(child, result, done, cur_indent, depth) - result.append(",\n") - result.append(cur_indent) - _repr_tree(node[-1], result, done, cur_indent, depth) - broken = True - result.append("]") - return broken - - # pylint: disable=unused-variable,useless-suppression; doesn't understand singledispatch - @_repr_tree.register(NodeNG) - def _repr_node(node, result, done, cur_indent="", depth=1): - """Outputs a strings representation of an astroid node.""" - if node in done: - result.append( - indent + f" max_depth: - result.append("...") - return False - depth += 1 - cur_indent += indent - if ids: - result.append(f"{type(node).__name__}<0x{id(node):x}>(\n") - else: - result.append(f"{type(node).__name__}(") - fields = [] - if include_linenos: - fields.extend(("lineno", "col_offset")) - fields.extend(node._other_fields) - fields.extend(node._astroid_fields) - if ast_state: - fields.extend(node._other_other_fields) - if not fields: - broken = False - elif len(fields) == 1: - result.append(f"{fields[0]}=") - broken = _repr_tree( - getattr(node, fields[0]), result, done, cur_indent, depth - ) - else: - result.append("\n") - result.append(cur_indent) - for field in fields[:-1]: - # TODO: Remove this after removal of the 'doc' attribute - if field == "doc": - continue - result.append(f"{field}=") - _repr_tree(getattr(node, field), result, done, cur_indent, depth) - result.append(",\n") - result.append(cur_indent) - result.append(f"{fields[-1]}=") - _repr_tree(getattr(node, fields[-1]), result, done, cur_indent, depth) - broken = True - result.append(")") - return broken - - result: list[str] = [] - _repr_tree(self, result, set()) - return "".join(result) - - def bool_value(self, context: InferenceContext | None = None): - """Determine the boolean value of this node. - - The boolean value of a node can have three - possible values: - - * False: For instance, empty data structures, - False, empty strings, instances which return - explicitly False from the __nonzero__ / __bool__ - method. - * True: Most of constructs are True by default: - classes, functions, modules etc - * Uninferable: The inference engine is uncertain of the - node's value. - - :returns: The boolean value of this node. - :rtype: bool or Uninferable - """ - return util.Uninferable - - def op_precedence(self) -> int: - # Look up by class name or default to highest precedence - return OP_PRECEDENCE.get(self.__class__.__name__, len(OP_PRECEDENCE)) - - def op_left_associative(self) -> bool: - # Everything is left associative except `**` and IfExp - return True diff --git a/venv/lib/python3.12/site-packages/astroid/nodes/scoped_nodes/__init__.py b/venv/lib/python3.12/site-packages/astroid/nodes/scoped_nodes/__init__.py deleted file mode 100644 index 01f99fa..0000000 --- a/venv/lib/python3.12/site-packages/astroid/nodes/scoped_nodes/__init__.py +++ /dev/null @@ -1,47 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""This module contains all classes that are considered a "scoped" node and anything -related. - -A scope node is a node that opens a new local scope in the language definition: -Module, ClassDef, FunctionDef (and Lambda, GeneratorExp, DictComp and SetComp to some extent). -""" - -from astroid.nodes.scoped_nodes.mixin import ComprehensionScope, LocalsDictNodeNG -from astroid.nodes.scoped_nodes.scoped_nodes import ( - SYNTHETIC_ROOT, - AsyncFunctionDef, - ClassDef, - DictComp, - FunctionDef, - GeneratorExp, - Lambda, - ListComp, - Module, - SetComp, - _is_metaclass, - function_to_method, - get_wrapping_class, -) -from astroid.nodes.scoped_nodes.utils import builtin_lookup - -__all__ = ( - "SYNTHETIC_ROOT", - "AsyncFunctionDef", - "ClassDef", - "ComprehensionScope", - "DictComp", - "FunctionDef", - "GeneratorExp", - "Lambda", - "ListComp", - "LocalsDictNodeNG", - "Module", - "SetComp", - "_is_metaclass", - "builtin_lookup", - "function_to_method", - "get_wrapping_class", -) diff --git a/venv/lib/python3.12/site-packages/astroid/nodes/scoped_nodes/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/nodes/scoped_nodes/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 55679b2..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/nodes/scoped_nodes/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/nodes/scoped_nodes/__pycache__/mixin.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/nodes/scoped_nodes/__pycache__/mixin.cpython-312.pyc deleted file mode 100644 index 91bcd66..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/nodes/scoped_nodes/__pycache__/mixin.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/nodes/scoped_nodes/__pycache__/scoped_nodes.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/nodes/scoped_nodes/__pycache__/scoped_nodes.cpython-312.pyc deleted file mode 100644 index 0cdc420..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/nodes/scoped_nodes/__pycache__/scoped_nodes.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/nodes/scoped_nodes/__pycache__/utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/astroid/nodes/scoped_nodes/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index 03881c2..0000000 Binary files a/venv/lib/python3.12/site-packages/astroid/nodes/scoped_nodes/__pycache__/utils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/astroid/nodes/scoped_nodes/mixin.py b/venv/lib/python3.12/site-packages/astroid/nodes/scoped_nodes/mixin.py deleted file mode 100644 index d10d317..0000000 --- a/venv/lib/python3.12/site-packages/astroid/nodes/scoped_nodes/mixin.py +++ /dev/null @@ -1,205 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""This module contains mixin classes for scoped nodes.""" - -from __future__ import annotations - -import sys -from typing import TYPE_CHECKING, overload - -from astroid.exceptions import ParentMissingError -from astroid.filter_statements import _filter_stmts -from astroid.nodes import _base_nodes, scoped_nodes -from astroid.nodes.scoped_nodes.utils import builtin_lookup -from astroid.typing import InferenceResult, SuccessfulInferenceResult - -if sys.version_info >= (3, 11): - from typing import Self -else: - from typing_extensions import Self -if TYPE_CHECKING: - from astroid import nodes - - -class LocalsDictNodeNG(_base_nodes.LookupMixIn): - """this class provides locals handling common to Module, FunctionDef - and ClassDef nodes, including a dict like interface for direct access - to locals information - """ - - # attributes below are set by the builder module or by raw factories - locals: dict[str, list[InferenceResult]] - """A map of the name of a local variable to the node defining the local.""" - - def qname(self) -> str: - """Get the 'qualified' name of the node. - - For example: module.name, module.class.name ... - - :returns: The qualified name. - :rtype: str - """ - # pylint: disable=no-member; github.com/pylint-dev/astroid/issues/278 - if self.parent is None: - return self.name - try: - return f"{self.parent.frame().qname()}.{self.name}" - except ParentMissingError: - return self.name - - def scope(self) -> Self: - """The first parent node defining a new scope. - - :returns: The first parent scope node. - :rtype: Module or FunctionDef or ClassDef or Lambda or GenExpr - """ - return self - - def scope_lookup( - self, node: _base_nodes.LookupMixIn, name: str, offset: int = 0 - ) -> tuple[LocalsDictNodeNG, list[nodes.NodeNG]]: - """Lookup where the given variable is assigned. - - :param node: The node to look for assignments up to. - Any assignments after the given node are ignored. - - :param name: The name of the variable to find assignments for. - - :param offset: The line offset to filter statements up to. - - :returns: This scope node and the list of assignments associated to the - given name according to the scope where it has been found (locals, - globals or builtin). - """ - raise NotImplementedError - - def _scope_lookup( - self, node: _base_nodes.LookupMixIn, name: str, offset: int = 0 - ) -> tuple[LocalsDictNodeNG, list[nodes.NodeNG]]: - """XXX method for interfacing the scope lookup""" - try: - stmts = _filter_stmts(node, self.locals[name], self, offset) - except KeyError: - stmts = () - if stmts: - return self, stmts - - # Handle nested scopes: since class names do not extend to nested - # scopes (e.g., methods), we find the next enclosing non-class scope - pscope = self.parent and self.parent.scope() - while pscope is not None: - if not isinstance(pscope, scoped_nodes.ClassDef): - return pscope.scope_lookup(node, name) - pscope = pscope.parent and pscope.parent.scope() - - # self is at the top level of a module, or is enclosed only by ClassDefs - return builtin_lookup(name) - - def set_local(self, name: str, stmt: nodes.NodeNG) -> None: - """Define that the given name is declared in the given statement node. - - .. seealso:: :meth:`scope` - - :param name: The name that is being defined. - - :param stmt: The statement that defines the given name. - """ - # assert not stmt in self.locals.get(name, ()), (self, stmt) - self.locals.setdefault(name, []).append(stmt) - - __setitem__ = set_local - - def _append_node(self, child: nodes.NodeNG) -> None: - """append a child, linking it in the tree""" - # pylint: disable=no-member; depending by the class - # which uses the current class as a mixin or base class. - # It's rewritten in 2.0, so it makes no sense for now - # to spend development time on it. - self.body.append(child) # type: ignore[attr-defined] - child.parent = self - - @overload - def add_local_node( - self, child_node: nodes.ClassDef, name: str | None = ... - ) -> None: ... - - @overload - def add_local_node(self, child_node: nodes.NodeNG, name: str) -> None: ... - - def add_local_node(self, child_node: nodes.NodeNG, name: str | None = None) -> None: - """Append a child that should alter the locals of this scope node. - - :param child_node: The child node that will alter locals. - - :param name: The name of the local that will be altered by - the given child node. - """ - if name != "__class__": - # add __class__ node as a child will cause infinite recursion later! - self._append_node(child_node) - self.set_local(name or child_node.name, child_node) # type: ignore[attr-defined] - - def __getitem__(self, item: str) -> SuccessfulInferenceResult: - """The first node the defines the given local. - - :param item: The name of the locally defined object. - - :raises KeyError: If the name is not defined. - """ - return self.locals[item][0] - - def __iter__(self): - """Iterate over the names of locals defined in this scoped node. - - :returns: The names of the defined locals. - :rtype: iterable(str) - """ - return iter(self.keys()) - - def keys(self): - """The names of locals defined in this scoped node. - - :returns: The names of the defined locals. - :rtype: list(str) - """ - return list(self.locals.keys()) - - def values(self): - """The nodes that define the locals in this scoped node. - - :returns: The nodes that define locals. - :rtype: list(NodeNG) - """ - # pylint: disable=consider-using-dict-items - # It look like this class override items/keys/values, - # probably not worth the headache - return [self[key] for key in self.keys()] - - def items(self): - """Get the names of the locals and the node that defines the local. - - :returns: The names of locals and their associated node. - :rtype: list(tuple(str, NodeNG)) - """ - return list(zip(self.keys(), self.values())) - - def __contains__(self, name) -> bool: - """Check if a local is defined in this scope. - - :param name: The name of the local to check for. - :type name: str - - :returns: Whether this node has a local of the given name, - """ - return name in self.locals - - -class ComprehensionScope(LocalsDictNodeNG): - """Scoping for different types of comprehensions.""" - - scope_lookup = LocalsDictNodeNG._scope_lookup - - generators: list[nodes.Comprehension] - """The generators that are looped through.""" diff --git a/venv/lib/python3.12/site-packages/astroid/nodes/scoped_nodes/scoped_nodes.py b/venv/lib/python3.12/site-packages/astroid/nodes/scoped_nodes/scoped_nodes.py deleted file mode 100644 index f9b06bf..0000000 --- a/venv/lib/python3.12/site-packages/astroid/nodes/scoped_nodes/scoped_nodes.py +++ /dev/null @@ -1,2904 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -""" -This module contains the classes for "scoped" node, i.e. which are opening a -new local scope in the language definition : Module, ClassDef, FunctionDef (and -Lambda, GeneratorExp, DictComp and SetComp to some extent). -""" - -from __future__ import annotations - -import io -import itertools -import os -import sys -from collections.abc import Generator, Iterable, Iterator, Sequence -from functools import cached_property, lru_cache -from typing import TYPE_CHECKING, Any, ClassVar, Literal, NoReturn - -from astroid import bases, protocols, util -from astroid.context import ( - CallContext, - InferenceContext, - bind_context_to_node, - copy_context, -) -from astroid.exceptions import ( - AstroidBuildingError, - AstroidTypeError, - AttributeInferenceError, - DuplicateBasesError, - InconsistentMroError, - InferenceError, - MroError, - ParentMissingError, - StatementMissing, - TooManyLevelsError, -) -from astroid.interpreter.dunder_lookup import lookup -from astroid.interpreter.objectmodel import ClassModel, FunctionModel, ModuleModel -from astroid.manager import AstroidManager -from astroid.nodes import _base_nodes, node_classes -from astroid.nodes.scoped_nodes.mixin import ComprehensionScope, LocalsDictNodeNG -from astroid.nodes.scoped_nodes.utils import builtin_lookup -from astroid.nodes.utils import Position -from astroid.typing import ( - InferBinaryOp, - InferenceErrorInfo, - InferenceResult, - SuccessfulInferenceResult, -) - -if sys.version_info >= (3, 11): - from typing import Self -else: - from typing_extensions import Self - -if TYPE_CHECKING: - from astroid import nodes, objects - from astroid.nodes import Arguments, Const, NodeNG - from astroid.nodes._base_nodes import LookupMixIn - - -ITER_METHODS = ("__iter__", "__getitem__") -EXCEPTION_BASE_CLASSES = frozenset({"Exception", "BaseException"}) -BUILTIN_DESCRIPTORS = frozenset( - {"classmethod", "staticmethod", "builtins.classmethod", "builtins.staticmethod"} -) - - -def _c3_merge(sequences, cls, context): - """Merges MROs in *sequences* to a single MRO using the C3 algorithm. - - Adapted from http://www.python.org/download/releases/2.3/mro/. - - """ - result = [] - while True: - sequences = [s for s in sequences if s] # purge empty sequences - if not sequences: - return result - for s1 in sequences: # find merge candidates among seq heads - candidate = s1[0] - for s2 in sequences: - if candidate in s2[1:]: - candidate = None - break # reject the current head, it appears later - else: - break - if not candidate: - # Show all the remaining bases, which were considered as - # candidates for the next mro sequence. - raise InconsistentMroError( - message="Cannot create a consistent method resolution order " - "for MROs {mros} of class {cls!r}.", - mros=sequences, - cls=cls, - context=context, - ) - - result.append(candidate) - # remove the chosen candidate - for seq in sequences: - if seq[0] == candidate: - del seq[0] - return None - - -def clean_typing_generic_mro(sequences: list[list[ClassDef]]) -> None: - """A class can inherit from typing.Generic directly, as base, - and as base of bases. The merged MRO must however only contain the last entry. - To prepare for _c3_merge, remove some typing.Generic entries from - sequences if multiple are present. - - This method will check if Generic is in inferred_bases and also - part of bases_mro. If true, remove it from inferred_bases - as well as its entry the bases_mro. - - Format sequences: [[self]] + bases_mro + [inferred_bases] - """ - bases_mro = sequences[1:-1] - inferred_bases = sequences[-1] - # Check if Generic is part of inferred_bases - for i, base in enumerate(inferred_bases): - if base.qname() == "typing.Generic": - position_in_inferred_bases = i - break - else: - return - # Check if also part of bases_mro - # Ignore entry for typing.Generic - for i, seq in enumerate(bases_mro): - if i == position_in_inferred_bases: - continue - if any(base.qname() == "typing.Generic" for base in seq): - break - else: - return - # Found multiple Generics in mro, remove entry from inferred_bases - # and the corresponding one from bases_mro - inferred_bases.pop(position_in_inferred_bases) - bases_mro.pop(position_in_inferred_bases) - - -def clean_duplicates_mro( - sequences: list[list[ClassDef]], - cls: ClassDef, - context: InferenceContext | None, -) -> list[list[ClassDef]]: - for sequence in sequences: - seen = set() - for node in sequence: - lineno_and_qname = (node.lineno, node.qname()) - if lineno_and_qname in seen: - raise DuplicateBasesError( - message="Duplicates found in MROs {mros} for {cls!r}.", - mros=sequences, - cls=cls, - context=context, - ) - seen.add(lineno_and_qname) - return sequences - - -def function_to_method(n, klass): - if isinstance(n, FunctionDef): - if n.type == "classmethod": - return bases.BoundMethod(n, klass) - if n.type == "property": - return n - if n.type != "staticmethod": - return bases.UnboundMethod(n) - return n - - -def _infer_last( - arg: SuccessfulInferenceResult, context: InferenceContext -) -> InferenceResult: - res = util.Uninferable - for b in arg.infer(context=context.clone()): - res = b - return res - - -class Module(LocalsDictNodeNG): - """Class representing an :class:`ast.Module` node. - - >>> import astroid - >>> node = astroid.extract_node('import astroid') - >>> node - - >>> node.parent - - """ - - _astroid_fields = ("doc_node", "body") - - doc_node: Const | None - """The doc node associated with this node.""" - - # attributes below are set by the builder module or by raw factories - - file_bytes: str | bytes | None = None - """The string/bytes that this ast was built from.""" - - file_encoding: str | None = None - """The encoding of the source file. - - This is used to get unicode out of a source file. - Python 2 only. - """ - - special_attributes = ModuleModel() - """The names of special attributes that this module has.""" - - # names of module attributes available through the global scope - scope_attrs: ClassVar[set[str]] = { - "__name__", - "__doc__", - "__file__", - "__path__", - "__package__", - } - """The names of module attributes available through the global scope.""" - - _other_fields = ( - "name", - "file", - "path", - "package", - "pure_python", - "future_imports", - ) - _other_other_fields = ("locals", "globals") - - def __init__( - self, - name: str, - file: str | None = None, - path: Sequence[str] | None = None, - package: bool = False, - pure_python: bool = True, - ) -> None: - self.name = name - """The name of the module.""" - - self.file = file - """The path to the file that this ast has been extracted from. - - This will be ``None`` when the representation has been built from a - built-in module. - """ - - self.path = path - - self.package = package - """Whether the node represents a package or a module.""" - - self.pure_python = pure_python - """Whether the ast was built from source.""" - - self.globals: dict[str, list[InferenceResult]] - """A map of the name of a global variable to the node defining the global.""" - - self.locals = self.globals = {} - """A map of the name of a local variable to the node defining the local.""" - - self.body: list[node_classes.NodeNG] = [] - """The contents of the module.""" - - self.future_imports: set[str] = set() - """The imports from ``__future__``.""" - - super().__init__( - lineno=0, parent=None, col_offset=0, end_lineno=None, end_col_offset=None - ) - - # pylint: enable=redefined-builtin - - def postinit( - self, body: list[node_classes.NodeNG], *, doc_node: Const | None = None - ): - self.body = body - self.doc_node = doc_node - - def _get_stream(self): - if self.file_bytes is not None: - return io.BytesIO(self.file_bytes) - if self.file is not None: - # pylint: disable=consider-using-with - stream = open(self.file, "rb") - return stream - return None - - def stream(self): - """Get a stream to the underlying file or bytes. - - :type: file or io.BytesIO or None - """ - return self._get_stream() - - def block_range(self, lineno: int) -> tuple[int, int]: - """Get a range from where this node starts to where this node ends. - - :param lineno: Unused. - - :returns: The range of line numbers that this node belongs to. - """ - return self.fromlineno, self.tolineno - - def scope_lookup( - self, node: LookupMixIn, name: str, offset: int = 0 - ) -> tuple[LocalsDictNodeNG, list[node_classes.NodeNG]]: - """Lookup where the given variable is assigned. - - :param node: The node to look for assignments up to. - Any assignments after the given node are ignored. - - :param name: The name of the variable to find assignments for. - - :param offset: The line offset to filter statements up to. - - :returns: This scope node and the list of assignments associated to the - given name according to the scope where it has been found (locals, - globals or builtin). - """ - if name in self.scope_attrs and name not in self.locals: - try: - return self, self.getattr(name) - except AttributeInferenceError: - return self, [] - return self._scope_lookup(node, name, offset) - - def pytype(self) -> Literal["builtins.module"]: - """Get the name of the type that this node represents. - - :returns: The name of the type. - """ - return "builtins.module" - - def display_type(self) -> str: - """A human readable type of this node. - - :returns: The type of this node. - :rtype: str - """ - return "Module" - - def getattr( - self, name, context: InferenceContext | None = None, ignore_locals=False - ): - if not name: - raise AttributeInferenceError(target=self, attribute=name, context=context) - - result = [] - name_in_locals = name in self.locals - - if name in self.special_attributes and not ignore_locals and not name_in_locals: - result = [self.special_attributes.lookup(name)] - if name == "__name__": - main_const = node_classes.const_factory("__main__") - main_const.parent = AstroidManager().builtins_module - result.append(main_const) - elif not ignore_locals and name_in_locals: - result = self.locals[name] - elif self.package: - try: - result = [self.import_module(name, relative_only=True)] - except (AstroidBuildingError, SyntaxError) as exc: - raise AttributeInferenceError( - target=self, attribute=name, context=context - ) from exc - result = [n for n in result if not isinstance(n, node_classes.DelName)] - if result: - return result - raise AttributeInferenceError(target=self, attribute=name, context=context) - - def igetattr( - self, name: str, context: InferenceContext | None = None - ) -> Iterator[InferenceResult]: - """Infer the possible values of the given variable. - - :param name: The name of the variable to infer. - - :returns: The inferred possible values. - """ - # set lookup name since this is necessary to infer on import nodes for - # instance - context = copy_context(context) - context.lookupname = name - try: - return bases._infer_stmts(self.getattr(name, context), context, frame=self) - except AttributeInferenceError as error: - raise InferenceError( - str(error), target=self, attribute=name, context=context - ) from error - - def fully_defined(self) -> bool: - """Check if this module has been build from a .py file. - - If so, the module contains a complete representation, - including the code. - - :returns: Whether the module has been built from a .py file. - """ - return self.file is not None and self.file.endswith(".py") - - def statement(self) -> NoReturn: - """The first parent node, including self, marked as statement node. - - When called on a :class:`Module` this raises a StatementMissing. - """ - raise StatementMissing(target=self) - - def previous_sibling(self): - """The previous sibling statement. - - :returns: The previous sibling statement node. - :rtype: NodeNG or None - """ - - def next_sibling(self): - """The next sibling statement node. - - :returns: The next sibling statement node. - :rtype: NodeNG or None - """ - - _absolute_import_activated = True - - def absolute_import_activated(self) -> bool: - """Whether :pep:`328` absolute import behaviour has been enabled. - - :returns: Whether :pep:`328` has been enabled. - """ - return self._absolute_import_activated - - def import_module( - self, - modname: str, - relative_only: bool = False, - level: int | None = None, - use_cache: bool = True, - ) -> Module: - """Get the ast for a given module as if imported from this module. - - :param modname: The name of the module to "import". - - :param relative_only: Whether to only consider relative imports. - - :param level: The level of relative import. - - :param use_cache: Whether to use the astroid_cache of modules. - - :returns: The imported module ast. - """ - if relative_only and level is None: - level = 0 - absmodname = self.relative_to_absolute_name(modname, level) - - try: - return AstroidManager().ast_from_module_name( - absmodname, use_cache=use_cache - ) - except AstroidBuildingError: - # we only want to import a sub module or package of this module, - # skip here - if relative_only: - raise - # Don't repeat the same operation, e.g. for missing modules - # like "_winapi" or "nt" on POSIX systems. - if modname == absmodname: - raise - return AstroidManager().ast_from_module_name(modname, use_cache=use_cache) - - def relative_to_absolute_name(self, modname: str, level: int | None) -> str: - """Get the absolute module name for a relative import. - - The relative import can be implicit or explicit. - - :param modname: The module name to convert. - - :param level: The level of relative import. - - :returns: The absolute module name. - - :raises TooManyLevelsError: When the relative import refers to a - module too far above this one. - """ - # XXX this returns non sens when called on an absolute import - # like 'pylint.checkers.astroid.utils' - # XXX doesn't return absolute name if self.name isn't absolute name - if self.absolute_import_activated() and level is None: - return modname - if level: - if self.package: - level = level - 1 - package_name = self.name.rsplit(".", level)[0] - elif ( - self.path - and not os.path.exists(os.path.dirname(self.path[0]) + "/__init__.py") - and os.path.exists( - os.path.dirname(self.path[0]) + "/" + modname.split(".")[0] - ) - ): - level = level - 1 - package_name = "" - else: - package_name = self.name.rsplit(".", level)[0] - if level and self.name.count(".") < level: - raise TooManyLevelsError(level=level, name=self.name) - - elif self.package: - package_name = self.name - else: - package_name = self.name.rsplit(".", 1)[0] - - if package_name: - if not modname: - return package_name - return f"{package_name}.{modname}" - return modname - - def wildcard_import_names(self): - """The list of imported names when this module is 'wildcard imported'. - - It doesn't include the '__builtins__' name which is added by the - current CPython implementation of wildcard imports. - - :returns: The list of imported names. - :rtype: list(str) - """ - # We separate the different steps of lookup in try/excepts - # to avoid catching too many Exceptions - default = [name for name in self.keys() if not name.startswith("_")] - try: - all_values = self["__all__"] - except KeyError: - return default - - try: - explicit = next(all_values.assigned_stmts()) - except (InferenceError, StopIteration): - return default - except AttributeError: - # not an assignment node - # XXX infer? - return default - - # Try our best to detect the exported name. - inferred = [] - try: - explicit = next(explicit.infer()) - except (InferenceError, StopIteration): - return default - if not isinstance(explicit, (node_classes.Tuple, node_classes.List)): - return default - - def str_const(node) -> bool: - return isinstance(node, node_classes.Const) and isinstance(node.value, str) - - for node in explicit.elts: - if str_const(node): - inferred.append(node.value) - else: - try: - inferred_node = next(node.infer()) - except (InferenceError, StopIteration): - continue - if str_const(inferred_node): - inferred.append(inferred_node.value) - return inferred - - def public_names(self): - """The list of the names that are publicly available in this module. - - :returns: The list of public names. - :rtype: list(str) - """ - return [name for name in self.keys() if not name.startswith("_")] - - def bool_value(self, context: InferenceContext | None = None) -> bool: - """Determine the boolean value of this node. - - :returns: The boolean value of this node. - For a :class:`Module` this is always ``True``. - """ - return True - - def get_children(self): - yield from self.body - - def frame(self, *, future: Literal[None, True] = None) -> Self: - """The node's frame node. - - A frame node is a :class:`Module`, :class:`FunctionDef`, - :class:`ClassDef` or :class:`Lambda`. - - :returns: The node itself. - """ - return self - - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[Module]: - yield self - - -class __SyntheticRoot(Module): - def __init__(self): - super().__init__("__astroid_synthetic", pure_python=False) - - -SYNTHETIC_ROOT = __SyntheticRoot() - - -class GeneratorExp(ComprehensionScope): - """Class representing an :class:`ast.GeneratorExp` node. - - >>> import astroid - >>> node = astroid.extract_node('(thing for thing in things if thing)') - >>> node - - """ - - _astroid_fields = ("elt", "generators") - _other_other_fields = ("locals",) - elt: NodeNG - """The element that forms the output of the expression.""" - - def __init__( - self, - lineno: int, - col_offset: int, - parent: NodeNG, - *, - end_lineno: int | None, - end_col_offset: int | None, - ) -> None: - self.locals = {} - """A map of the name of a local variable to the node defining the local.""" - - self.generators: list[nodes.Comprehension] = [] - """The generators that are looped through.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit(self, elt: NodeNG, generators: list[nodes.Comprehension]) -> None: - self.elt = elt - self.generators = generators - - def bool_value(self, context: InferenceContext | None = None) -> Literal[True]: - """Determine the boolean value of this node. - - :returns: The boolean value of this node. - For a :class:`GeneratorExp` this is always ``True``. - """ - return True - - def get_children(self): - yield self.elt - - yield from self.generators - - -class DictComp(ComprehensionScope): - """Class representing an :class:`ast.DictComp` node. - - >>> import astroid - >>> node = astroid.extract_node('{k:v for k, v in things if k > v}') - >>> node - - """ - - _astroid_fields = ("key", "value", "generators") - _other_other_fields = ("locals",) - key: NodeNG - """What produces the keys.""" - - value: NodeNG - """What produces the values.""" - - def __init__( - self, - lineno: int, - col_offset: int, - parent: NodeNG, - *, - end_lineno: int | None, - end_col_offset: int | None, - ) -> None: - self.locals = {} - """A map of the name of a local variable to the node defining the local.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit( - self, key: NodeNG, value: NodeNG, generators: list[nodes.Comprehension] - ) -> None: - self.key = key - self.value = value - self.generators = generators - - def bool_value(self, context: InferenceContext | None = None): - """Determine the boolean value of this node. - - :returns: The boolean value of this node. - For a :class:`DictComp` this is always :class:`Uninferable`. - :rtype: Uninferable - """ - return util.Uninferable - - def get_children(self): - yield self.key - yield self.value - - yield from self.generators - - -class SetComp(ComprehensionScope): - """Class representing an :class:`ast.SetComp` node. - - >>> import astroid - >>> node = astroid.extract_node('{thing for thing in things if thing}') - >>> node - - """ - - _astroid_fields = ("elt", "generators") - _other_other_fields = ("locals",) - elt: NodeNG - """The element that forms the output of the expression.""" - - def __init__( - self, - lineno: int, - col_offset: int, - parent: NodeNG, - *, - end_lineno: int | None, - end_col_offset: int | None, - ) -> None: - self.locals = {} - """A map of the name of a local variable to the node defining the local.""" - - self.generators: list[nodes.Comprehension] = [] - """The generators that are looped through.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit(self, elt: NodeNG, generators: list[nodes.Comprehension]) -> None: - self.elt = elt - self.generators = generators - - def bool_value(self, context: InferenceContext | None = None): - """Determine the boolean value of this node. - - :returns: The boolean value of this node. - For a :class:`SetComp` this is always :class:`Uninferable`. - :rtype: Uninferable - """ - return util.Uninferable - - def get_children(self): - yield self.elt - - yield from self.generators - - -class ListComp(ComprehensionScope): - """Class representing an :class:`ast.ListComp` node. - - >>> import astroid - >>> node = astroid.extract_node('[thing for thing in things if thing]') - >>> node - - """ - - _astroid_fields = ("elt", "generators") - _other_other_fields = ("locals",) - - elt: NodeNG - """The element that forms the output of the expression.""" - - def __init__( - self, - lineno: int, - col_offset: int, - parent: NodeNG, - *, - end_lineno: int | None, - end_col_offset: int | None, - ) -> None: - self.locals = {} - """A map of the name of a local variable to the node defining it.""" - - self.generators: list[nodes.Comprehension] = [] - """The generators that are looped through.""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit(self, elt: NodeNG, generators: list[nodes.Comprehension]): - self.elt = elt - self.generators = generators - - def bool_value(self, context: InferenceContext | None = None): - """Determine the boolean value of this node. - - :returns: The boolean value of this node. - For a :class:`ListComp` this is always :class:`Uninferable`. - :rtype: Uninferable - """ - return util.Uninferable - - def get_children(self): - yield self.elt - - yield from self.generators - - -def _infer_decorator_callchain(node): - """Detect decorator call chaining and see if the end result is a - static or a classmethod. - """ - if not isinstance(node, FunctionDef): - return None - if not node.parent: - return None - try: - result = next(node.infer_call_result(node.parent), None) - except InferenceError: - return None - if isinstance(result, bases.Instance): - result = result._proxied - if isinstance(result, ClassDef): - if result.is_subtype_of("builtins.classmethod"): - return "classmethod" - if result.is_subtype_of("builtins.staticmethod"): - return "staticmethod" - if isinstance(result, FunctionDef): - if not result.decorators: - return None - # Determine if this function is decorated with one of the builtin descriptors we want. - for decorator in result.decorators.nodes: - if isinstance(decorator, node_classes.Name): - if decorator.name in BUILTIN_DESCRIPTORS: - return decorator.name - if ( - isinstance(decorator, node_classes.Attribute) - and isinstance(decorator.expr, node_classes.Name) - and decorator.expr.name == "builtins" - and decorator.attrname in BUILTIN_DESCRIPTORS - ): - return decorator.attrname - return None - - -class Lambda(_base_nodes.FilterStmtsBaseNode, LocalsDictNodeNG): - """Class representing an :class:`ast.Lambda` node. - - >>> import astroid - >>> node = astroid.extract_node('lambda arg: arg + 1') - >>> node - l.1 at 0x7f23b2e41518> - """ - - _astroid_fields: ClassVar[tuple[str, ...]] = ("args", "body") - _other_other_fields: ClassVar[tuple[str, ...]] = ("locals",) - name = "" - is_lambda = True - special_attributes = FunctionModel() - """The names of special attributes that this function has.""" - - args: Arguments - """The arguments that the function takes.""" - - body: NodeNG - """The contents of the function body.""" - - def implicit_parameters(self) -> Literal[0]: - return 0 - - @property - def type(self) -> Literal["method", "function"]: - """Whether this is a method or function. - - :returns: 'method' if this is a method, 'function' otherwise. - """ - if self.args.arguments and self.args.arguments[0].name == "self": - if self.parent and isinstance(self.parent.scope(), ClassDef): - return "method" - return "function" - - def __init__( - self, - lineno: int, - col_offset: int, - parent: NodeNG, - *, - end_lineno: int | None, - end_col_offset: int | None, - ): - self.locals = {} - """A map of the name of a local variable to the node defining it.""" - - self.instance_attrs: dict[str, list[NodeNG]] = {} - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit(self, args: Arguments, body: NodeNG) -> None: - self.args = args - self.body = body - - def pytype(self) -> Literal["builtins.instancemethod", "builtins.function"]: - """Get the name of the type that this node represents. - - :returns: The name of the type. - """ - if "method" in self.type: - return "builtins.instancemethod" - return "builtins.function" - - def display_type(self) -> str: - """A human readable type of this node. - - :returns: The type of this node. - :rtype: str - """ - if "method" in self.type: - return "Method" - return "Function" - - def callable(self) -> Literal[True]: - """Whether this node defines something that is callable. - - :returns: Whether this defines something that is callable - For a :class:`Lambda` this is always ``True``. - """ - return True - - def argnames(self) -> list[str]: - """Get the names of each of the arguments, including that - of the collections of variable-length arguments ("args", "kwargs", - etc.), as well as positional-only and keyword-only arguments. - - :returns: The names of the arguments. - :rtype: list(str) - """ - if self.args.arguments: # maybe None with builtin functions - names = [elt.name for elt in self.args.arguments] - else: - names = [] - - return names - - def infer_call_result( - self, - caller: SuccessfulInferenceResult | None, - context: InferenceContext | None = None, - ) -> Iterator[InferenceResult]: - """Infer what the function returns when called.""" - return self.body.infer(context) - - def scope_lookup( - self, node: LookupMixIn, name: str, offset: int = 0 - ) -> tuple[LocalsDictNodeNG, list[NodeNG]]: - """Lookup where the given names is assigned. - - :param node: The node to look for assignments up to. - Any assignments after the given node are ignored. - - :param name: The name to find assignments for. - - :param offset: The line offset to filter statements up to. - - :returns: This scope node and the list of assignments associated to the - given name according to the scope where it has been found (locals, - globals or builtin). - """ - if (self.args.defaults and node in self.args.defaults) or ( - self.args.kw_defaults and node in self.args.kw_defaults - ): - if not self.parent: - raise ParentMissingError(target=self) - frame = self.parent.frame() - # line offset to avoid that def func(f=func) resolve the default - # value to the defined function - offset = -1 - else: - # check this is not used in function decorators - frame = self - return frame._scope_lookup(node, name, offset) - - def bool_value(self, context: InferenceContext | None = None) -> Literal[True]: - """Determine the boolean value of this node. - - :returns: The boolean value of this node. - For a :class:`Lambda` this is always ``True``. - """ - return True - - def get_children(self): - yield self.args - yield self.body - - def frame(self, *, future: Literal[None, True] = None) -> Self: - """The node's frame node. - - A frame node is a :class:`Module`, :class:`FunctionDef`, - :class:`ClassDef` or :class:`Lambda`. - - :returns: The node itself. - """ - return self - - def getattr( - self, name: str, context: InferenceContext | None = None - ) -> list[NodeNG]: - if not name: - raise AttributeInferenceError(target=self, attribute=name, context=context) - - found_attrs = [] - if name in self.instance_attrs: - found_attrs = self.instance_attrs[name] - if name in self.special_attributes: - found_attrs.append(self.special_attributes.lookup(name)) - if found_attrs: - return found_attrs - raise AttributeInferenceError(target=self, attribute=name) - - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[Lambda]: - yield self - - def _get_yield_nodes_skip_functions(self): - """A Lambda node can contain a Yield node in the body.""" - yield from self.body._get_yield_nodes_skip_functions() - - -class FunctionDef( - _base_nodes.MultiLineBlockNode, - _base_nodes.FilterStmtsBaseNode, - _base_nodes.Statement, - LocalsDictNodeNG, -): - """Class representing an :class:`ast.FunctionDef`. - - >>> import astroid - >>> node = astroid.extract_node(''' - ... def my_func(arg): - ... return arg + 1 - ... ''') - >>> node - - """ - - _astroid_fields = ( - "decorators", - "args", - "returns", - "type_params", - "doc_node", - "body", - ) - _multi_line_block_fields = ("body",) - returns = None - - decorators: node_classes.Decorators | None - """The decorators that are applied to this method or function.""" - - doc_node: Const | None - """The doc node associated with this node.""" - - args: Arguments - """The arguments that the function takes.""" - - is_function = True - """Whether this node indicates a function. - - For a :class:`FunctionDef` this is always ``True``. - - :type: bool - """ - type_annotation = None - """If present, this will contain the type annotation passed by a type comment - - :type: NodeNG or None - """ - type_comment_args = None - """ - If present, this will contain the type annotation for arguments - passed by a type comment - """ - type_comment_returns = None - """If present, this will contain the return type annotation, passed by a type comment""" - # attributes below are set by the builder module or by raw factories - _other_fields = ("name", "position") - _other_other_fields = ( - "locals", - "_type", - "type_comment_returns", - "type_comment_args", - ) - _type = None - - name = "" - - special_attributes = FunctionModel() - """The names of special attributes that this function has.""" - - def __init__( - self, - name: str, - lineno: int, - col_offset: int, - parent: NodeNG, - *, - end_lineno: int | None, - end_col_offset: int | None, - ) -> None: - self.name = name - """The name of the function.""" - - self.locals = {} - """A map of the name of a local variable to the node defining it.""" - - self.body: list[NodeNG] = [] - """The contents of the function body.""" - - self.type_params: list[nodes.TypeVar | nodes.ParamSpec | nodes.TypeVarTuple] = ( - [] - ) - """PEP 695 (Python 3.12+) type params, e.g. first 'T' in def func[T]() -> T: ...""" - - self.instance_attrs: dict[str, list[NodeNG]] = {} - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - - def postinit( - self, - args: Arguments, - body: list[NodeNG], - decorators: node_classes.Decorators | None = None, - returns=None, - type_comment_returns=None, - type_comment_args=None, - *, - position: Position | None = None, - doc_node: Const | None = None, - type_params: ( - list[nodes.TypeVar | nodes.ParamSpec | nodes.TypeVarTuple] | None - ) = None, - ): - """Do some setup after initialisation. - - :param args: The arguments that the function takes. - - :param body: The contents of the function body. - - :param decorators: The decorators that are applied to this - method or function. - :params type_comment_returns: - The return type annotation passed via a type comment. - :params type_comment_args: - The args type annotation passed via a type comment. - :params position: - Position of function keyword(s) and name. - :param doc_node: - The doc node associated with this node. - :param type_params: - The type_params associated with this node. - """ - self.args = args - self.body = body - self.decorators = decorators - self.returns = returns - self.type_comment_returns = type_comment_returns - self.type_comment_args = type_comment_args - self.position = position - self.doc_node = doc_node - self.type_params = type_params or [] - - @cached_property - def extra_decorators(self) -> list[node_classes.Call]: - """The extra decorators that this function can have. - - Additional decorators are considered when they are used as - assignments, as in ``method = staticmethod(method)``. - The property will return all the callables that are used for - decoration. - """ - if not (self.parent and isinstance(frame := self.parent.frame(), ClassDef)): - return [] - - decorators: list[node_classes.Call] = [] - for assign in frame._assign_nodes_in_scope: - if isinstance(assign.value, node_classes.Call) and isinstance( - assign.value.func, node_classes.Name - ): - for assign_node in assign.targets: - if not isinstance(assign_node, node_classes.AssignName): - # Support only `name = callable(name)` - continue - - if assign_node.name != self.name: - # Interested only in the assignment nodes that - # decorates the current method. - continue - try: - meth = frame[self.name] - except KeyError: - continue - else: - # Must be a function and in the same frame as the - # original method. - if ( - isinstance(meth, FunctionDef) - and assign_node.frame() == frame - ): - decorators.append(assign.value) - return decorators - - def pytype(self) -> Literal["builtins.instancemethod", "builtins.function"]: - """Get the name of the type that this node represents. - - :returns: The name of the type. - """ - if "method" in self.type: - return "builtins.instancemethod" - return "builtins.function" - - def display_type(self) -> str: - """A human readable type of this node. - - :returns: The type of this node. - :rtype: str - """ - if "method" in self.type: - return "Method" - return "Function" - - def callable(self) -> Literal[True]: - return True - - def argnames(self) -> list[str]: - """Get the names of each of the arguments, including that - of the collections of variable-length arguments ("args", "kwargs", - etc.), as well as positional-only and keyword-only arguments. - - :returns: The names of the arguments. - :rtype: list(str) - """ - if self.args.arguments: # maybe None with builtin functions - names = [elt.name for elt in self.args.arguments] - else: - names = [] - - return names - - def getattr( - self, name: str, context: InferenceContext | None = None - ) -> list[NodeNG]: - if not name: - raise AttributeInferenceError(target=self, attribute=name, context=context) - - found_attrs = [] - if name in self.instance_attrs: - found_attrs = self.instance_attrs[name] - if name in self.special_attributes: - found_attrs.append(self.special_attributes.lookup(name)) - if found_attrs: - return found_attrs - raise AttributeInferenceError(target=self, attribute=name) - - @cached_property - def type(self) -> str: # pylint: disable=too-many-return-statements # noqa: C901 - """The function type for this node. - - Possible values are: method, function, staticmethod, classmethod. - """ - for decorator in self.extra_decorators: - if decorator.func.name in BUILTIN_DESCRIPTORS: - return decorator.func.name - - if not self.parent: - raise ParentMissingError(target=self) - - frame = self.parent.frame() - type_name = "function" - if isinstance(frame, ClassDef): - if self.name == "__new__": - return "classmethod" - if self.name == "__init_subclass__": - return "classmethod" - if self.name == "__class_getitem__": - return "classmethod" - - type_name = "method" - - if not self.decorators: - return type_name - - for node in self.decorators.nodes: - if isinstance(node, node_classes.Name): - if node.name in BUILTIN_DESCRIPTORS: - return node.name - if ( - isinstance(node, node_classes.Attribute) - and isinstance(node.expr, node_classes.Name) - and node.expr.name == "builtins" - and node.attrname in BUILTIN_DESCRIPTORS - ): - return node.attrname - - if isinstance(node, node_classes.Call): - # Handle the following case: - # @some_decorator(arg1, arg2) - # def func(...) - # - try: - current = next(node.func.infer()) - except (InferenceError, StopIteration): - continue - _type = _infer_decorator_callchain(current) - if _type is not None: - return _type - - try: - for inferred in node.infer(): - # Check to see if this returns a static or a class method. - _type = _infer_decorator_callchain(inferred) - if _type is not None: - return _type - - if not isinstance(inferred, ClassDef): - continue - for ancestor in inferred.ancestors(): - if not isinstance(ancestor, ClassDef): - continue - if ancestor.is_subtype_of("builtins.classmethod"): - return "classmethod" - if ancestor.is_subtype_of("builtins.staticmethod"): - return "staticmethod" - except InferenceError: - pass - return type_name - - @cached_property - def fromlineno(self) -> int: - """The first line that this node appears on in the source code. - - Can also return 0 if the line can not be determined. - """ - # lineno is the line number of the first decorator, we want the def - # statement lineno. Similar to 'ClassDef.fromlineno' - lineno = self.lineno or 0 - if self.decorators is not None: - lineno += sum( - node.tolineno - (node.lineno or 0) + 1 for node in self.decorators.nodes - ) - - return lineno or 0 - - @cached_property - def blockstart_tolineno(self): - """The line on which the beginning of this block ends. - - :type: int - """ - if self.returns: - return self.returns.tolineno - return self.args.tolineno - - def implicit_parameters(self) -> Literal[0, 1]: - return 1 if self.is_bound() else 0 - - def block_range(self, lineno: int) -> tuple[int, int]: - """Get a range from the given line number to where this node ends. - - :param lineno: Unused. - - :returns: The range of line numbers that this node belongs to, - """ - return self.fromlineno, self.tolineno - - def igetattr( - self, name: str, context: InferenceContext | None = None - ) -> Iterator[InferenceResult]: - """Inferred getattr, which returns an iterator of inferred statements.""" - try: - return bases._infer_stmts(self.getattr(name, context), context, frame=self) - except AttributeInferenceError as error: - raise InferenceError( - str(error), target=self, attribute=name, context=context - ) from error - - def is_method(self) -> bool: - """Check if this function node represents a method. - - :returns: Whether this is a method. - """ - # check we are defined in a ClassDef, because this is usually expected - # (e.g. pylint...) when is_method() return True - return ( - self.type != "function" - and self.parent is not None - and isinstance(self.parent.frame(), ClassDef) - ) - - def decoratornames(self, context: InferenceContext | None = None) -> set[str]: - """Get the qualified names of each of the decorators on this function. - - :param context: - An inference context that can be passed to inference functions - :returns: The names of the decorators. - """ - result = set() - decoratornodes = [] - if self.decorators is not None: - decoratornodes += self.decorators.nodes - decoratornodes += self.extra_decorators - for decnode in decoratornodes: - try: - for infnode in decnode.infer(context=context): - result.add(infnode.qname()) - except InferenceError: - continue - return result - - def is_bound(self) -> bool: - """Check if the function is bound to an instance or class. - - :returns: Whether the function is bound to an instance or class. - """ - return self.type in {"method", "classmethod"} - - def is_abstract(self, pass_is_abstract=True, any_raise_is_abstract=False) -> bool: - """Check if the method is abstract. - - A method is considered abstract if any of the following is true: - * The only statement is 'raise NotImplementedError' - * The only statement is 'raise ' and any_raise_is_abstract is True - * The only statement is 'pass' and pass_is_abstract is True - * The method is annotated with abc.astractproperty/abc.abstractmethod - - :returns: Whether the method is abstract. - """ - if self.decorators: - for node in self.decorators.nodes: - try: - inferred = next(node.infer()) - except (InferenceError, StopIteration): - continue - if inferred and inferred.qname() in { - "abc.abstractproperty", - "abc.abstractmethod", - }: - return True - - for child_node in self.body: - if isinstance(child_node, node_classes.Raise): - if any_raise_is_abstract: - return True - if child_node.raises_not_implemented(): - return True - return pass_is_abstract and isinstance(child_node, node_classes.Pass) - # empty function is the same as function with a single "pass" statement - if pass_is_abstract: - return True - - return False - - def is_generator(self) -> bool: - """Check if this is a generator function. - - :returns: Whether this is a generator function. - """ - yields_without_lambdas = set(self._get_yield_nodes_skip_lambdas()) - yields_without_functions = set(self._get_yield_nodes_skip_functions()) - # Want an intersecting member that is neither in a lambda nor a function - return bool(yields_without_lambdas & yields_without_functions) - - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[objects.Property | FunctionDef, None, InferenceErrorInfo]: - from astroid import objects # pylint: disable=import-outside-toplevel - - if not (self.decorators and bases._is_property(self)): - yield self - return InferenceErrorInfo(node=self, context=context) - - if not self.parent: - raise ParentMissingError(target=self) - prop_func = objects.Property( - function=self, - name=self.name, - lineno=self.lineno, - parent=self.parent, - col_offset=self.col_offset, - ) - prop_func.postinit(body=[], args=self.args, doc_node=self.doc_node) - yield prop_func - return InferenceErrorInfo(node=self, context=context) - - def infer_yield_result(self, context: InferenceContext | None = None): - """Infer what the function yields when called - - :returns: What the function yields - :rtype: iterable(NodeNG or Uninferable) or None - """ - for yield_ in self.nodes_of_class(node_classes.Yield): - if yield_.value is None: - yield node_classes.Const(None, parent=yield_, lineno=yield_.lineno) - elif yield_.scope() == self: - yield from yield_.value.infer(context=context) - - def infer_call_result( - self, - caller: SuccessfulInferenceResult | None, - context: InferenceContext | None = None, - ) -> Iterator[InferenceResult]: - """Infer what the function returns when called.""" - if context is None: - context = InferenceContext() - if self.is_generator(): - if isinstance(self, AsyncFunctionDef): - generator_cls: type[bases.Generator] = bases.AsyncGenerator - else: - generator_cls = bases.Generator - result = generator_cls(self, generator_initial_context=context) - yield result - return - # This is really a gigantic hack to work around metaclass generators - # that return transient class-generating functions. Pylint's AST structure - # cannot handle a base class object that is only used for calling __new__, - # but does not contribute to the inheritance structure itself. We inject - # a fake class into the hierarchy here for several well-known metaclass - # generators, and filter it out later. - if ( - self.name == "with_metaclass" - and caller is not None - and self.args.args - and len(self.args.args) == 1 - and self.args.vararg is not None - ): - if isinstance(caller.args, node_classes.Arguments): - assert caller.args.args is not None - metaclass = next(caller.args.args[0].infer(context), None) - elif isinstance(caller.args, list): - metaclass = next(caller.args[0].infer(context), None) - else: - raise TypeError( # pragma: no cover - f"caller.args was neither Arguments nor list; got {type(caller.args)}" - ) - if isinstance(metaclass, ClassDef): - class_bases = [_infer_last(x, context) for x in caller.args[1:]] - new_class = ClassDef( - name="temporary_class", - lineno=0, - col_offset=0, - end_lineno=0, - end_col_offset=0, - parent=SYNTHETIC_ROOT, - ) - new_class.hide = True - new_class.postinit( - bases=[ - base - for base in class_bases - if not isinstance(base, util.UninferableBase) - ], - body=[], - decorators=None, - metaclass=metaclass, - ) - yield new_class - return - returns = self._get_return_nodes_skip_functions() - - first_return = next(returns, None) - if not first_return: - if self.body: - if self.is_abstract(pass_is_abstract=True, any_raise_is_abstract=True): - yield util.Uninferable - else: - yield node_classes.Const(None) - return - - raise InferenceError("The function does not have any return statements") - - for returnnode in itertools.chain((first_return,), returns): - if returnnode.value is None: - yield node_classes.Const(None) - else: - try: - yield from returnnode.value.infer(context) - except InferenceError: - yield util.Uninferable - - def bool_value(self, context: InferenceContext | None = None) -> bool: - """Determine the boolean value of this node. - - :returns: The boolean value of this node. - For a :class:`FunctionDef` this is always ``True``. - """ - return True - - def get_children(self): - if self.decorators is not None: - yield self.decorators - - yield self.args - - if self.returns is not None: - yield self.returns - yield from self.type_params - - yield from self.body - - def scope_lookup( - self, node: LookupMixIn, name: str, offset: int = 0 - ) -> tuple[LocalsDictNodeNG, list[nodes.NodeNG]]: - """Lookup where the given name is assigned.""" - if name == "__class__": - # __class__ is an implicit closure reference created by the compiler - # if any methods in a class body refer to either __class__ or super. - # In our case, we want to be able to look it up in the current scope - # when `__class__` is being used. - if self.parent and isinstance(frame := self.parent.frame(), ClassDef): - return self, [frame] - - if (self.args.defaults and node in self.args.defaults) or ( - self.args.kw_defaults and node in self.args.kw_defaults - ): - if not self.parent: - raise ParentMissingError(target=self) - frame = self.parent.frame() - # line offset to avoid that def func(f=func) resolve the default - # value to the defined function - offset = -1 - else: - # check this is not used in function decorators - frame = self - return frame._scope_lookup(node, name, offset) - - def frame(self, *, future: Literal[None, True] = None) -> Self: - """The node's frame node. - - A frame node is a :class:`Module`, :class:`FunctionDef`, - :class:`ClassDef` or :class:`Lambda`. - - :returns: The node itself. - """ - return self - - -class AsyncFunctionDef(FunctionDef): - """Class representing an :class:`ast.FunctionDef` node. - - A :class:`AsyncFunctionDef` is an asynchronous function - created with the `async` keyword. - - >>> import astroid - >>> node = astroid.extract_node(''' - async def func(things): - async for thing in things: - print(thing) - ''') - >>> node - - >>> node.body[0] - - """ - - -def _is_metaclass( - klass: ClassDef, - seen: set[str] | None = None, - context: InferenceContext | None = None, -) -> bool: - """Return if the given class can be - used as a metaclass. - """ - if klass.name == "type": - return True - if seen is None: - seen = set() - for base in klass.bases: - try: - for baseobj in base.infer(context=context): - baseobj_name = baseobj.qname() - if baseobj_name in seen: - continue - - seen.add(baseobj_name) - if isinstance(baseobj, bases.Instance): - # not abstract - return False - if baseobj is klass: - continue - if not isinstance(baseobj, ClassDef): - continue - if baseobj._type == "metaclass": - return True - if _is_metaclass(baseobj, seen, context=context): - return True - except InferenceError: - continue - return False - - -def _class_type( - klass: ClassDef, - ancestors: set[str] | None = None, - context: InferenceContext | None = None, -) -> Literal["class", "exception", "metaclass"]: - """return a ClassDef node type to differ metaclass and exception - from 'regular' classes - """ - # XXX we have to store ancestors in case we have an ancestor loop - if klass._type is not None: - return klass._type - if _is_metaclass(klass, context=context): - klass._type = "metaclass" - elif klass.name.endswith("Exception"): - klass._type = "exception" - else: - if ancestors is None: - ancestors = set() - klass_name = klass.qname() - if klass_name in ancestors: - # XXX we are in loop ancestors, and have found no type - klass._type = "class" - return "class" - ancestors.add(klass_name) - for base in klass.ancestors(recurs=False): - name = _class_type(base, ancestors) - if name != "class": - if name == "metaclass" and klass._type != "metaclass": - # don't propagate it if the current class - # can't be a metaclass - continue - klass._type = base.type - break - if klass._type is None: - klass._type = "class" - return klass._type - - -def get_wrapping_class(node): - """Get the class that wraps the given node. - - We consider that a class wraps a node if the class - is a parent for the said node. - - :returns: The class that wraps the given node - :rtype: ClassDef or None - """ - - klass = node.frame() - while klass is not None and not isinstance(klass, ClassDef): - if klass.parent is None: - klass = None - else: - klass = klass.parent.frame() - return klass - - -class ClassDef( - _base_nodes.FilterStmtsBaseNode, LocalsDictNodeNG, _base_nodes.Statement -): - """Class representing an :class:`ast.ClassDef` node. - - >>> import astroid - >>> node = astroid.extract_node(''' - class Thing: - def my_meth(self, arg): - return arg + self.offset - ''') - >>> node - - """ - - # some of the attributes below are set by the builder module or - # by a raw factories - - # a dictionary of class instances attributes - _astroid_fields = ( - "decorators", - "bases", - "keywords", - "doc_node", - "body", - "type_params", - ) # name - - decorators = None - """The decorators that are applied to this class. - - :type: Decorators or None - """ - special_attributes = ClassModel() - """The names of special attributes that this class has. - - :type: objectmodel.ClassModel - """ - - _type: Literal["class", "exception", "metaclass"] | None = None - _metaclass: NodeNG | None = None - _metaclass_hack = False - hide = False - type = property( - _class_type, - doc=( - "The class type for this node.\n\n" - "Possible values are: class, metaclass, exception.\n\n" - ":type: str" - ), - ) - _other_fields = ("name", "is_dataclass", "position") - _other_other_fields = "locals" - - def __init__( - self, - name: str, - lineno: int, - col_offset: int, - parent: NodeNG, - *, - end_lineno: int | None, - end_col_offset: int | None, - ) -> None: - self.instance_attrs: dict[str, NodeNG] = {} - self.locals = {} - """A map of the name of a local variable to the node defining it.""" - - self.keywords: list[node_classes.Keyword] = [] - """The keywords given to the class definition. - - This is usually for :pep:`3115` style metaclass declaration. - """ - - self.bases: list[SuccessfulInferenceResult] = [] - """What the class inherits from.""" - - self.body: list[NodeNG] = [] - """The contents of the class body.""" - - self.name = name - """The name of the class.""" - - self.decorators = None - """The decorators that are applied to this class.""" - - self.doc_node: Const | None = None - """The doc node associated with this node.""" - - self.is_dataclass: bool = False - """Whether this class is a dataclass.""" - - self.type_params: list[nodes.TypeVar | nodes.ParamSpec | nodes.TypeVarTuple] = ( - [] - ) - """PEP 695 (Python 3.12+) type params, e.g. class MyClass[T]: ...""" - - super().__init__( - lineno=lineno, - col_offset=col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - for local_name, node in self.implicit_locals(): - self.add_local_node(node, local_name) - - infer_binary_op: ClassVar[InferBinaryOp[ClassDef]] = ( - protocols.instance_class_infer_binary_op - ) - - def implicit_parameters(self) -> Literal[1]: - return 1 - - def implicit_locals(self): - """Get implicitly defined class definition locals. - - :returns: the the name and Const pair for each local - :rtype: tuple(tuple(str, node_classes.Const), ...) - """ - locals_ = (("__module__", self.special_attributes.attr___module__),) - # __qualname__ is defined in PEP3155 - locals_ += ( - ("__qualname__", self.special_attributes.attr___qualname__), - ("__annotations__", self.special_attributes.attr___annotations__), - ) - return locals_ - - # pylint: disable=redefined-outer-name - def postinit( - self, - bases: list[SuccessfulInferenceResult], - body: list[NodeNG], - decorators: node_classes.Decorators | None, - newstyle: bool | None = None, - metaclass: NodeNG | None = None, - keywords: list[node_classes.Keyword] | None = None, - *, - position: Position | None = None, - doc_node: Const | None = None, - type_params: ( - list[nodes.TypeVar | nodes.ParamSpec | nodes.TypeVarTuple] | None - ) = None, - ) -> None: - if keywords is not None: - self.keywords = keywords - self.bases = bases - self.body = body - self.decorators = decorators - self._metaclass = metaclass - self.position = position - self.doc_node = doc_node - self.type_params = type_params or [] - - @cached_property - def blockstart_tolineno(self): - """The line on which the beginning of this block ends. - - :type: int - """ - if self.bases: - return self.bases[-1].tolineno - - return self.fromlineno - - def block_range(self, lineno: int) -> tuple[int, int]: - """Get a range from the given line number to where this node ends. - - :param lineno: Unused. - - :returns: The range of line numbers that this node belongs to, - """ - return self.fromlineno, self.tolineno - - def pytype(self) -> Literal["builtins.type"]: - """Get the name of the type that this node represents. - - :returns: The name of the type. - """ - return "builtins.type" - - def display_type(self) -> str: - """A human readable type of this node. - - :returns: The type of this node. - :rtype: str - """ - return "Class" - - def callable(self) -> bool: - """Whether this node defines something that is callable. - - :returns: Whether this defines something that is callable. - For a :class:`ClassDef` this is always ``True``. - """ - return True - - def is_subtype_of(self, type_name, context: InferenceContext | None = None) -> bool: - """Whether this class is a subtype of the given type. - - :param type_name: The name of the type of check against. - :type type_name: str - - :returns: Whether this class is a subtype of the given type. - """ - if self.qname() == type_name: - return True - - return any(anc.qname() == type_name for anc in self.ancestors(context=context)) - - def _infer_type_call(self, caller, context): - try: - name_node = next(caller.args[0].infer(context)) - except StopIteration as e: - raise InferenceError(node=caller.args[0], context=context) from e - if isinstance(name_node, node_classes.Const) and isinstance( - name_node.value, str - ): - name = name_node.value - else: - return util.Uninferable - - result = ClassDef( - name, - lineno=0, - col_offset=0, - end_lineno=0, - end_col_offset=0, - parent=caller.parent, - ) - - # Get the bases of the class. - try: - class_bases = next(caller.args[1].infer(context)) - except StopIteration as e: - raise InferenceError(node=caller.args[1], context=context) from e - if isinstance(class_bases, (node_classes.Tuple, node_classes.List)): - bases = [] - for base in class_bases.itered(): - inferred = next(base.infer(context=context), None) - if inferred: - bases.append( - node_classes.EvaluatedObject(original=base, value=inferred) - ) - result.bases = bases - else: - # There is currently no AST node that can represent an 'unknown' - # node (Uninferable is not an AST node), therefore we simply return Uninferable here - # although we know at least the name of the class. - return util.Uninferable - - # Get the members of the class - try: - members = next(caller.args[2].infer(context)) - except (InferenceError, StopIteration): - members = None - - if members and isinstance(members, node_classes.Dict): - for attr, value in members.items: - if isinstance(attr, node_classes.Const) and isinstance(attr.value, str): - result.locals[attr.value] = [value] - - return result - - def infer_call_result( - self, - caller: SuccessfulInferenceResult | None, - context: InferenceContext | None = None, - ) -> Iterator[InferenceResult]: - """infer what a class is returning when called""" - if self.is_subtype_of("builtins.type", context) and len(caller.args) == 3: - result = self._infer_type_call(caller, context) - yield result - return - - dunder_call = None - try: - metaclass = self.metaclass(context=context) - if metaclass is not None: - # Only get __call__ if it's defined locally for the metaclass. - # Otherwise we will find ObjectModel.__call__ which will - # return an instance of the metaclass. Instantiating the class is - # handled later. - if "__call__" in metaclass.locals: - dunder_call = next(metaclass.igetattr("__call__", context)) - except (AttributeInferenceError, StopIteration): - pass - - if dunder_call and dunder_call.qname() != "builtins.type.__call__": - # Call type.__call__ if not set metaclass - # (since type is the default metaclass) - context = bind_context_to_node(context, self) - context.callcontext.callee = dunder_call - yield from dunder_call.infer_call_result(caller, context) - else: - yield self.instantiate_class() - - def scope_lookup( - self, node: LookupMixIn, name: str, offset: int = 0 - ) -> tuple[LocalsDictNodeNG, list[nodes.NodeNG]]: - """Lookup where the given name is assigned. - - :param node: The node to look for assignments up to. - Any assignments after the given node are ignored. - - :param name: The name to find assignments for. - - :param offset: The line offset to filter statements up to. - - :returns: This scope node and the list of assignments associated to the - given name according to the scope where it has been found (locals, - globals or builtin). - """ - # If the name looks like a builtin name, just try to look - # into the upper scope of this class. We might have a - # decorator that it's poorly named after a builtin object - # inside this class. - lookup_upper_frame = ( - isinstance(node.parent, node_classes.Decorators) - and name in AstroidManager().builtins_module - ) - if ( - any( - node == base or (base.parent_of(node) and not self.type_params) - for base in self.bases - ) - or lookup_upper_frame - ): - # Handle the case where we have either a name - # in the bases of a class, which exists before - # the actual definition or the case where we have - # a Getattr node, with that name. - # - # name = ... - # class A(name): - # def name(self): ... - # - # import name - # class A(name.Name): - # def name(self): ... - if not self.parent: - raise ParentMissingError(target=self) - frame = self.parent.frame() - # line offset to avoid that class A(A) resolve the ancestor to - # the defined class - offset = -1 - else: - frame = self - return frame._scope_lookup(node, name, offset) - - @property - def basenames(self): - """The names of the parent classes - - Names are given in the order they appear in the class definition. - - :type: list(str) - """ - return [bnode.as_string() for bnode in self.bases] - - def ancestors( - self, recurs: bool = True, context: InferenceContext | None = None - ) -> Generator[ClassDef]: - """Iterate over the base classes in prefixed depth first order. - - :param recurs: Whether to recurse or return direct ancestors only. - - :returns: The base classes - """ - # FIXME: should be possible to choose the resolution order - # FIXME: inference make infinite loops possible here - yielded = {self} - if context is None: - context = InferenceContext() - if not self.bases and self.qname() != "builtins.object": - # This should always be a ClassDef (which we don't assert for) - yield builtin_lookup("object")[1][0] # type: ignore[misc] - return - - for stmt in self.bases: - with context.restore_path(): - try: - for baseobj in stmt.infer(context): - if not isinstance(baseobj, ClassDef): - if isinstance(baseobj, bases.Instance): - baseobj = baseobj._proxied - else: - continue - if not baseobj.hide: - if baseobj in yielded: - continue - yielded.add(baseobj) - yield baseobj - if not recurs: - continue - for grandpa in baseobj.ancestors(recurs=True, context=context): - if grandpa is self: - # This class is the ancestor of itself. - break - if grandpa in yielded: - continue - yielded.add(grandpa) - yield grandpa - except InferenceError: - continue - - def local_attr_ancestors(self, name, context: InferenceContext | None = None): - """Iterate over the parents that define the given name. - - :param name: The name to find definitions for. - :type name: str - - :returns: The parents that define the given name. - :rtype: iterable(NodeNG) - """ - # Look up in the mro if we can. This will result in the - # attribute being looked up just as Python does it. - try: - ancestors: Iterable[ClassDef] = self.mro(context)[1:] - except MroError: - # Fallback to use ancestors, we can't determine - # a sane MRO. - ancestors = self.ancestors(context=context) - for astroid in ancestors: - if name in astroid: - yield astroid - - def instance_attr_ancestors(self, name, context: InferenceContext | None = None): - """Iterate over the parents that define the given name as an attribute. - - :param name: The name to find definitions for. - :type name: str - - :returns: The parents that define the given name as - an instance attribute. - :rtype: iterable(NodeNG) - """ - for astroid in self.ancestors(context=context): - if name in astroid.instance_attrs: - yield astroid - - def has_base(self, node) -> bool: - """Whether this class directly inherits from the given node. - - :param node: The node to check for. - :type node: NodeNG - - :returns: Whether this class directly inherits from the given node. - """ - return node in self.bases - - def local_attr(self, name, context: InferenceContext | None = None): - """Get the list of assign nodes associated to the given name. - - Assignments are looked for in both this class and in parents. - - :returns: The list of assignments to the given name. - :rtype: list(NodeNG) - - :raises AttributeInferenceError: If no attribute with this name - can be found in this class or parent classes. - """ - result = [] - if name in self.locals: - result = self.locals[name] - else: - class_node = next(self.local_attr_ancestors(name, context), None) - if class_node: - result = class_node.locals[name] - result = [n for n in result if not isinstance(n, node_classes.DelAttr)] - if result: - return result - raise AttributeInferenceError(target=self, attribute=name, context=context) - - def instance_attr(self, name, context: InferenceContext | None = None): - """Get the list of nodes associated to the given attribute name. - - Assignments are looked for in both this class and in parents. - - :returns: The list of assignments to the given name. - :rtype: list(NodeNG) - - :raises AttributeInferenceError: If no attribute with this name - can be found in this class or parent classes. - """ - # Return a copy, so we don't modify self.instance_attrs, - # which could lead to infinite loop. - values = list(self.instance_attrs.get(name, [])) - # get all values from parents - for class_node in self.instance_attr_ancestors(name, context): - values += class_node.instance_attrs[name] - values = [n for n in values if not isinstance(n, node_classes.DelAttr)] - if values: - return values - raise AttributeInferenceError(target=self, attribute=name, context=context) - - def instantiate_class(self) -> bases.Instance: - """Get an :class:`Instance` of the :class:`ClassDef` node. - - :returns: An :class:`Instance` of the :class:`ClassDef` node - """ - from astroid import objects # pylint: disable=import-outside-toplevel - - try: - if any(cls.name in EXCEPTION_BASE_CLASSES for cls in self.mro()): - # Subclasses of exceptions can be exception instances - return objects.ExceptionInstance(self) - except MroError: - pass - return bases.Instance(self) - - def getattr( - self, - name: str, - context: InferenceContext | None = None, - class_context: bool = True, - ) -> list[InferenceResult]: - """Get an attribute from this class, using Python's attribute semantic. - - This method doesn't look in the :attr:`instance_attrs` dictionary - since it is done by an :class:`Instance` proxy at inference time. - It may return an :class:`Uninferable` object if - the attribute has not been - found, but a ``__getattr__`` or ``__getattribute__`` method is defined. - If ``class_context`` is given, then it is considered that the - attribute is accessed from a class context, - e.g. ClassDef.attribute, otherwise it might have been accessed - from an instance as well. If ``class_context`` is used in that - case, then a lookup in the implicit metaclass and the explicit - metaclass will be done. - - :param name: The attribute to look for. - - :param class_context: Whether the attribute can be accessed statically. - - :returns: The attribute. - - :raises AttributeInferenceError: If the attribute cannot be inferred. - """ - if not name: - raise AttributeInferenceError(target=self, attribute=name, context=context) - - # don't modify the list in self.locals! - values: list[InferenceResult] = list(self.locals.get(name, [])) - for classnode in self.ancestors(recurs=True, context=context): - values += classnode.locals.get(name, []) - - if name in self.special_attributes and class_context and not values: - result = [self.special_attributes.lookup(name)] - return result - - if class_context: - values += self._metaclass_lookup_attribute(name, context) - - result: list[InferenceResult] = [] - for value in values: - if isinstance(value, node_classes.AssignName): - stmt = value.statement() - # Ignore AnnAssigns without value, which are not attributes in the purest sense. - if isinstance(stmt, node_classes.AnnAssign) and stmt.value is None: - continue - result.append(value) - - if not result: - raise AttributeInferenceError(target=self, attribute=name, context=context) - - return result - - @lru_cache(maxsize=1024) # noqa - def _metaclass_lookup_attribute(self, name, context): - """Search the given name in the implicit and the explicit metaclass.""" - attrs = set() - implicit_meta = self.implicit_metaclass() - context = copy_context(context) - metaclass = self.metaclass(context=context) - for cls in (implicit_meta, metaclass): - if cls and cls != self and isinstance(cls, ClassDef): - cls_attributes = self._get_attribute_from_metaclass(cls, name, context) - attrs.update(cls_attributes) - return attrs - - def _get_attribute_from_metaclass(self, cls, name, context): - from astroid import objects # pylint: disable=import-outside-toplevel - - try: - attrs = cls.getattr(name, context=context, class_context=True) - except AttributeInferenceError: - return - - for attr in bases._infer_stmts(attrs, context, frame=cls): - if not isinstance(attr, FunctionDef): - yield attr - continue - - if isinstance(attr, objects.Property): - yield attr - continue - if attr.type == "classmethod": - # If the method is a classmethod, then it will - # be bound to the metaclass, not to the class - # from where the attribute is retrieved. - # get_wrapping_class could return None, so just - # default to the current class. - frame = get_wrapping_class(attr) or self - yield bases.BoundMethod(attr, frame) - elif attr.type == "staticmethod": - yield attr - else: - yield bases.BoundMethod(attr, self) - - def igetattr( - self, - name: str, - context: InferenceContext | None = None, - class_context: bool = True, - ) -> Iterator[InferenceResult]: - """Infer the possible values of the given variable. - - :param name: The name of the variable to infer. - - :returns: The inferred possible values. - """ - from astroid import objects # pylint: disable=import-outside-toplevel - - # set lookup name since this is necessary to infer on import nodes for - # instance - context = copy_context(context) - context.lookupname = name - - metaclass = self.metaclass(context=context) - try: - attributes = self.getattr(name, context, class_context=class_context) - # If we have more than one attribute, make sure that those starting from - # the second one are from the same scope. This is to account for modifications - # to the attribute happening *after* the attribute's definition (e.g. AugAssigns on lists) - if len(attributes) > 1: - first_attr, attributes = attributes[0], attributes[1:] - first_scope = first_attr.parent.scope() - attributes = [first_attr] + [ - attr - for attr in attributes - if attr.parent and attr.parent.scope() == first_scope - ] - functions = [attr for attr in attributes if isinstance(attr, FunctionDef)] - setter = None - for function in functions: - dec_names = function.decoratornames(context=context) - for dec_name in dec_names: - if dec_name is util.Uninferable: - continue - if dec_name.split(".")[-1] == "setter": - setter = function - if setter: - break - if functions: - # Prefer only the last function, unless a property is involved. - last_function = functions[-1] - attributes = [ - a - for a in attributes - if a not in functions or a is last_function or bases._is_property(a) - ] - - for inferred in bases._infer_stmts(attributes, context, frame=self): - # yield Uninferable object instead of descriptors when necessary - if not isinstance(inferred, node_classes.Const) and isinstance( - inferred, bases.Instance - ): - try: - inferred._proxied.getattr("__get__", context) - except AttributeInferenceError: - yield inferred - else: - yield util.Uninferable - elif isinstance(inferred, objects.Property): - function = inferred.function - if not class_context: - if not context.callcontext and not setter: - context.callcontext = CallContext( - args=function.args.arguments, callee=function - ) - # Through an instance so we can solve the property - yield from function.infer_call_result( - caller=self, context=context - ) - # If we're in a class context, we need to determine if the property - # was defined in the metaclass (a derived class must be a subclass of - # the metaclass of all its bases), in which case we can resolve the - # property. If not, i.e. the property is defined in some base class - # instead, then we return the property object - elif metaclass and function.parent.scope() is metaclass: - # Resolve a property as long as it is not accessed through - # the class itself. - yield from function.infer_call_result( - caller=self, context=context - ) - else: - yield inferred - else: - yield function_to_method(inferred, self) - except AttributeInferenceError as error: - if not name.startswith("__") and self.has_dynamic_getattr(context): - # class handle some dynamic attributes, return a Uninferable object - yield util.Uninferable - else: - raise InferenceError( - str(error), target=self, attribute=name, context=context - ) from error - - def has_dynamic_getattr(self, context: InferenceContext | None = None) -> bool: - """Check if the class has a custom __getattr__ or __getattribute__. - - If any such method is found and it is not from - builtins, nor from an extension module, then the function - will return True. - - :returns: Whether the class has a custom __getattr__ or __getattribute__. - """ - - def _valid_getattr(node): - root = node.root() - return root.name != "builtins" and getattr(root, "pure_python", None) - - try: - return _valid_getattr(self.getattr("__getattr__", context)[0]) - except AttributeInferenceError: - try: - getattribute = self.getattr("__getattribute__", context)[0] - return _valid_getattr(getattribute) - except AttributeInferenceError: - pass - return False - - def getitem(self, index, context: InferenceContext | None = None): - """Return the inference of a subscript. - - This is basically looking up the method in the metaclass and calling it. - - :returns: The inferred value of a subscript to this class. - :rtype: NodeNG - - :raises AstroidTypeError: If this class does not define a - ``__getitem__`` method. - """ - try: - methods = lookup(self, "__getitem__", context=context) - except AttributeInferenceError as exc: - if isinstance(self, ClassDef): - # subscripting a class definition may be - # achieved thanks to __class_getitem__ method - # which is a classmethod defined in the class - # that supports subscript and not in the metaclass - try: - methods = self.getattr("__class_getitem__") - # Here it is assumed that the __class_getitem__ node is - # a FunctionDef. One possible improvement would be to deal - # with more generic inference. - except AttributeInferenceError: - raise AstroidTypeError(node=self, context=context) from exc - else: - raise AstroidTypeError(node=self, context=context) from exc - - method = methods[0] - - # Create a new callcontext for providing index as an argument. - new_context = bind_context_to_node(context, self) - new_context.callcontext = CallContext(args=[index], callee=method) - - try: - return next(method.infer_call_result(self, new_context), util.Uninferable) - except AttributeError: - # Starting with python3.9, builtin types list, dict etc... - # are subscriptable thanks to __class_getitem___ classmethod. - # However in such case the method is bound to an EmptyNode and - # EmptyNode doesn't have infer_call_result method yielding to - # AttributeError - if ( - isinstance(method, node_classes.EmptyNode) - and self.pytype() == "builtins.type" - ): - return self - raise - except InferenceError: - return util.Uninferable - - def methods(self): - """Iterate over all of the method defined in this class and its parents. - - :returns: The methods defined on the class. - :rtype: iterable(FunctionDef) - """ - done = {} - for astroid in itertools.chain(iter((self,)), self.ancestors()): - for meth in astroid.mymethods(): - if meth.name in done: - continue - done[meth.name] = None - yield meth - - def mymethods(self): - """Iterate over all of the method defined in this class only. - - :returns: The methods defined on the class. - :rtype: iterable(FunctionDef) - """ - for member in self.values(): - if isinstance(member, FunctionDef): - yield member - - def implicit_metaclass(self): - """Get the implicit metaclass of the current class. - - This will return an instance of builtins.type. - - :returns: The metaclass. - :rtype: builtins.type - """ - return builtin_lookup("type")[1][0] - - def declared_metaclass( - self, context: InferenceContext | None = None - ) -> SuccessfulInferenceResult | None: - """Return the explicit declared metaclass for the current class. - - An explicit declared metaclass is defined - either by passing the ``metaclass`` keyword argument - in the class definition line (Python 3) or (Python 2) by - having a ``__metaclass__`` class attribute, or if there are - no explicit bases but there is a global ``__metaclass__`` variable. - - :returns: The metaclass of this class, - or None if one could not be found. - """ - for base in self.bases: - try: - for baseobj in base.infer(context=context): - if isinstance(baseobj, ClassDef) and baseobj.hide: - self._metaclass = baseobj._metaclass - self._metaclass_hack = True - break - except InferenceError: - pass - - if self._metaclass: - # Expects this from Py3k TreeRebuilder - try: - return next( - node - for node in self._metaclass.infer(context=context) - if not isinstance(node, util.UninferableBase) - ) - except (InferenceError, StopIteration): - return None - - return None - - def _find_metaclass( - self, seen: set[ClassDef] | None = None, context: InferenceContext | None = None - ) -> SuccessfulInferenceResult | None: - if seen is None: - seen = set() - seen.add(self) - - klass = self.declared_metaclass(context=context) - if klass is None: - for parent in self.ancestors(context=context): - if parent not in seen: - klass = parent._find_metaclass(seen) - if klass is not None: - break - return klass - - def metaclass( - self, context: InferenceContext | None = None - ) -> SuccessfulInferenceResult | None: - """Get the metaclass of this class. - - If this class does not define explicitly a metaclass, - then the first defined metaclass in ancestors will be used - instead. - - :returns: The metaclass of this class. - """ - return self._find_metaclass(context=context) - - def has_metaclass_hack(self) -> bool: - return self._metaclass_hack - - def _islots(self): - """Return an iterator with the inferred slots.""" - if "__slots__" not in self.locals: - return None - for slots in self.igetattr("__slots__"): - # check if __slots__ is a valid type - for meth in ITER_METHODS: - try: - slots.getattr(meth) - break - except AttributeInferenceError: - continue - else: - continue - - if isinstance(slots, node_classes.Const): - # a string. Ignore the following checks, - # but yield the node, only if it has a value - if slots.value: - yield slots - continue - if not hasattr(slots, "itered"): - # we can't obtain the values, maybe a .deque? - continue - - if isinstance(slots, node_classes.Dict): - values = [item[0] for item in slots.items] - else: - values = slots.itered() - if isinstance(values, util.UninferableBase): - continue - if not values: - # Stop the iteration, because the class - # has an empty list of slots. - return values - - for elt in values: - try: - for inferred in elt.infer(): - if not ( - isinstance(inferred, node_classes.Const) - and isinstance(inferred.value, str) - ): - continue - if not inferred.value: - continue - yield inferred - except InferenceError: - continue - - return None - - def _slots(self): - - slots = self._islots() - try: - first = next(slots) - except StopIteration as exc: - # The class doesn't have a __slots__ definition or empty slots. - if exc.args and exc.args[0] not in ("", None): - return exc.args[0] - return None - return [first, *slots] - - # Cached, because inferring them all the time is expensive - @cached_property - def _all_slots(self): - """Get all the slots for this node. - - :returns: The names of slots for this class. - If the class doesn't define any slot, through the ``__slots__`` - variable, then this function will return a None. - Also, it will return None in the case the slots were not inferred. - :rtype: list(str) or None - """ - - def grouped_slots( - mro: list[ClassDef], - ) -> Iterator[node_classes.NodeNG | None]: - for cls in mro: - # Not interested in object, since it can't have slots. - if cls.qname() == "builtins.object": - continue - try: - cls_slots = cls._slots() - except NotImplementedError: - continue - if cls_slots is not None: - yield from cls_slots - else: - yield None - - try: - mro = self.mro() - except MroError as e: - raise NotImplementedError( - "Cannot get slots while parsing mro fails." - ) from e - - slots = list(grouped_slots(mro)) - if not all(slot is not None for slot in slots): - return None - - return sorted(set(slots), key=lambda item: item.value) - - def slots(self): - return self._all_slots - - def _inferred_bases(self, context: InferenceContext | None = None): - # Similar with .ancestors, but the difference is when one base is inferred, - # only the first object is wanted. That's because - # we aren't interested in superclasses, as in the following - # example: - # - # class SomeSuperClass(object): pass - # class SomeClass(SomeSuperClass): pass - # class Test(SomeClass): pass - # - # Inferring SomeClass from the Test's bases will give - # us both SomeClass and SomeSuperClass, but we are interested - # only in SomeClass. - - if context is None: - context = InferenceContext() - if not self.bases and self.qname() != "builtins.object": - yield builtin_lookup("object")[1][0] - return - - for stmt in self.bases: - try: - baseobj = _infer_last(stmt, context) - except InferenceError: - continue - if isinstance(baseobj, bases.Instance): - baseobj = baseobj._proxied - if not isinstance(baseobj, ClassDef): - continue - if not baseobj.hide: - yield baseobj - else: - yield from baseobj.bases - - def _compute_mro(self, context: InferenceContext | None = None): - if self.qname() == "builtins.object": - return [self] - - inferred_bases = list(self._inferred_bases(context=context)) - bases_mro = [] - for base in inferred_bases: - if base is self: - continue - - mro = base._compute_mro(context=context) - bases_mro.append(mro) - - unmerged_mro: list[list[ClassDef]] = [[self], *bases_mro, inferred_bases] - unmerged_mro = clean_duplicates_mro(unmerged_mro, self, context) - clean_typing_generic_mro(unmerged_mro) - return _c3_merge(unmerged_mro, self, context) - - def mro(self, context: InferenceContext | None = None) -> list[ClassDef]: - """Get the method resolution order, using C3 linearization. - - :returns: The list of ancestors, sorted by the mro. - :rtype: list(NodeNG) - :raises DuplicateBasesError: Duplicate bases in the same class base - :raises InconsistentMroError: A class' MRO is inconsistent - """ - return self._compute_mro(context=context) - - def bool_value(self, context: InferenceContext | None = None) -> Literal[True]: - """Determine the boolean value of this node. - - :returns: The boolean value of this node. - For a :class:`ClassDef` this is always ``True``. - """ - return True - - def get_children(self): - if self.decorators is not None: - yield self.decorators - - yield from self.bases - if self.keywords is not None: - yield from self.keywords - yield from self.type_params - - yield from self.body - - @cached_property - def _assign_nodes_in_scope(self): - children_assign_nodes = ( - child_node._assign_nodes_in_scope for child_node in self.body - ) - return list(itertools.chain.from_iterable(children_assign_nodes)) - - def frame(self, *, future: Literal[None, True] = None) -> Self: - """The node's frame node. - - A frame node is a :class:`Module`, :class:`FunctionDef`, - :class:`ClassDef` or :class:`Lambda`. - - :returns: The node itself. - """ - return self - - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[ClassDef]: - yield self diff --git a/venv/lib/python3.12/site-packages/astroid/nodes/scoped_nodes/utils.py b/venv/lib/python3.12/site-packages/astroid/nodes/scoped_nodes/utils.py deleted file mode 100644 index 8892008..0000000 --- a/venv/lib/python3.12/site-packages/astroid/nodes/scoped_nodes/utils.py +++ /dev/null @@ -1,35 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""This module contains utility functions for scoped nodes.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -from astroid.manager import AstroidManager - -if TYPE_CHECKING: - from astroid import nodes - - -def builtin_lookup(name: str) -> tuple[nodes.Module, list[nodes.NodeNG]]: - """Lookup a name in the builtin module. - - Return the list of matching statements and the ast for the builtin module - """ - manager = AstroidManager() - try: - _builtin_astroid = manager.builtins_module - except KeyError: - # User manipulated the astroid cache directly! Rebuild everything. - manager.clear_cache() - _builtin_astroid = manager.builtins_module - if name == "__dict__": - return _builtin_astroid, () - try: - stmts: list[nodes.NodeNG] = _builtin_astroid.locals[name] # type: ignore[assignment] - except KeyError: - stmts = [] - return _builtin_astroid, stmts diff --git a/venv/lib/python3.12/site-packages/astroid/nodes/utils.py b/venv/lib/python3.12/site-packages/astroid/nodes/utils.py deleted file mode 100644 index 6dc4828..0000000 --- a/venv/lib/python3.12/site-packages/astroid/nodes/utils.py +++ /dev/null @@ -1,14 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from typing import NamedTuple - - -class Position(NamedTuple): - """Position with line and column information.""" - - lineno: int - col_offset: int - end_lineno: int - end_col_offset: int diff --git a/venv/lib/python3.12/site-packages/astroid/objects.py b/venv/lib/python3.12/site-packages/astroid/objects.py deleted file mode 100644 index 2c96815..0000000 --- a/venv/lib/python3.12/site-packages/astroid/objects.py +++ /dev/null @@ -1,364 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -""" -Inference objects are a way to represent composite AST nodes, -which are used only as inference results, so they can't be found in the -original AST tree. For instance, inferring the following frozenset use, -leads to an inferred FrozenSet: - - Call(func=Name('frozenset'), args=Tuple(...)) -""" - -from __future__ import annotations - -import sys -from collections.abc import Generator, Iterator -from functools import cached_property -from typing import Any, Literal, NoReturn - -from astroid import bases, util -from astroid.context import InferenceContext -from astroid.exceptions import ( - AttributeInferenceError, - InferenceError, - MroError, - SuperError, -) -from astroid.interpreter import objectmodel -from astroid.manager import AstroidManager -from astroid.nodes import node_classes, scoped_nodes -from astroid.typing import InferenceResult, SuccessfulInferenceResult - -if sys.version_info >= (3, 11): - from typing import Self -else: - from typing_extensions import Self - - -class FrozenSet(node_classes.BaseContainer): - """Class representing a FrozenSet composite node.""" - - def pytype(self) -> Literal["builtins.frozenset"]: - return "builtins.frozenset" - - def _infer(self, context: InferenceContext | None = None, **kwargs: Any): - yield self - - @cached_property - def _proxied(self): # pylint: disable=method-hidden - ast_builtins = AstroidManager().builtins_module - return ast_builtins.getattr("frozenset")[0] - - -class Super(node_classes.NodeNG): - """Proxy class over a super call. - - This class offers almost the same behaviour as Python's super, - which is MRO lookups for retrieving attributes from the parents. - - The *mro_pointer* is the place in the MRO from where we should - start looking, not counting it. *mro_type* is the object which - provides the MRO, it can be both a type or an instance. - *self_class* is the class where the super call is, while - *scope* is the function where the super call is. - """ - - special_attributes = objectmodel.SuperModel() - - def __init__( - self, - mro_pointer: SuccessfulInferenceResult, - mro_type: SuccessfulInferenceResult, - self_class: scoped_nodes.ClassDef, - scope: scoped_nodes.FunctionDef, - call: node_classes.Call, - ) -> None: - self.type = mro_type - self.mro_pointer = mro_pointer - self._class_based = False - self._self_class = self_class - self._scope = scope - super().__init__( - parent=scope, - lineno=scope.lineno, - col_offset=scope.col_offset, - end_lineno=scope.end_lineno, - end_col_offset=scope.end_col_offset, - ) - - def _infer(self, context: InferenceContext | None = None, **kwargs: Any): - yield self - - def super_mro(self): - """Get the MRO which will be used to lookup attributes in this super.""" - if not isinstance(self.mro_pointer, scoped_nodes.ClassDef): - raise SuperError( - "The first argument to super must be a subtype of " - "type, not {mro_pointer}.", - super_=self, - ) - - if isinstance(self.type, scoped_nodes.ClassDef): - # `super(type, type)`, most likely in a class method. - self._class_based = True - mro_type = self.type - else: - mro_type = getattr(self.type, "_proxied", None) - if not isinstance(mro_type, (bases.Instance, scoped_nodes.ClassDef)): - raise SuperError( - "The second argument to super must be an " - "instance or subtype of type, not {type}.", - super_=self, - ) - - mro = mro_type.mro() - if self.mro_pointer not in mro: - raise SuperError( - "The second argument to super must be an " - "instance or subtype of type, not {type}.", - super_=self, - ) - - index = mro.index(self.mro_pointer) - return mro[index + 1 :] - - @cached_property - def _proxied(self): - ast_builtins = AstroidManager().builtins_module - return ast_builtins.getattr("super")[0] - - def pytype(self) -> Literal["builtins.super"]: - return "builtins.super" - - def display_type(self) -> str: - return "Super of" - - @property - def name(self): - """Get the name of the MRO pointer.""" - return self.mro_pointer.name - - def qname(self) -> Literal["super"]: - return "super" - - def igetattr( # noqa: C901 - self, name: str, context: InferenceContext | None = None - ) -> Iterator[InferenceResult]: - """Retrieve the inferred values of the given attribute name.""" - # '__class__' is a special attribute that should be taken directly - # from the special attributes dict - if name == "__class__": - yield self.special_attributes.lookup(name) - return - - try: - mro = self.super_mro() - # Don't let invalid MROs or invalid super calls - # leak out as is from this function. - except SuperError as exc: - raise AttributeInferenceError( - ( - "Lookup for {name} on {target!r} because super call {super!r} " - "is invalid." - ), - target=self, - attribute=name, - context=context, - super_=exc.super_, - ) from exc - except MroError as exc: - raise AttributeInferenceError( - ( - "Lookup for {name} on {target!r} failed because {cls!r} has an " - "invalid MRO." - ), - target=self, - attribute=name, - context=context, - mros=exc.mros, - cls=exc.cls, - ) from exc - found = False - for cls in mro: - if name not in cls.locals: - continue - - found = True - for inferred in bases._infer_stmts([cls[name]], context, frame=self): - if not isinstance(inferred, scoped_nodes.FunctionDef): - yield inferred - continue - - # We can obtain different descriptors from a super depending - # on what we are accessing and where the super call is. - if inferred.type == "classmethod": - yield bases.BoundMethod(inferred, cls) - elif self._scope.type == "classmethod" and inferred.type == "method": - yield inferred - elif self._class_based or inferred.type == "staticmethod": - yield inferred - elif isinstance(inferred, Property): - function = inferred.function - try: - yield from function.infer_call_result( - caller=self, context=context - ) - except InferenceError: - yield util.Uninferable - elif bases._is_property(inferred): - # TODO: support other descriptors as well. - try: - yield from inferred.infer_call_result(self, context) - except InferenceError: - yield util.Uninferable - else: - yield bases.BoundMethod(inferred, cls) - - # Only if we haven't found any explicit overwrites for the - # attribute we look it up in the special attributes - if not found and name in self.special_attributes: - yield self.special_attributes.lookup(name) - return - - if not found: - raise AttributeInferenceError(target=self, attribute=name, context=context) - - def getattr(self, name, context: InferenceContext | None = None): - return list(self.igetattr(name, context=context)) - - -class ExceptionInstance(bases.Instance): - """Class for instances of exceptions. - - It has special treatment for some of the exceptions's attributes, - which are transformed at runtime into certain concrete objects, such as - the case of .args. - """ - - @cached_property - def special_attributes(self): - qname = self.qname() - instance = objectmodel.BUILTIN_EXCEPTIONS.get( - qname, objectmodel.ExceptionInstanceModel - ) - return instance()(self) - - -class DictInstance(bases.Instance): - """Special kind of instances for dictionaries. - - This instance knows the underlying object model of the dictionaries, which means - that methods such as .values or .items can be properly inferred. - """ - - special_attributes = objectmodel.DictModel() - - -# Custom objects tailored for dictionaries, which are used to -# disambiguate between the types of Python 2 dict's method returns -# and Python 3 (where they return set like objects). -class DictItems(bases.Proxy): - __str__ = node_classes.NodeNG.__str__ - __repr__ = node_classes.NodeNG.__repr__ - - -class DictKeys(bases.Proxy): - __str__ = node_classes.NodeNG.__str__ - __repr__ = node_classes.NodeNG.__repr__ - - -class DictValues(bases.Proxy): - __str__ = node_classes.NodeNG.__str__ - __repr__ = node_classes.NodeNG.__repr__ - - -class PartialFunction(scoped_nodes.FunctionDef): - """A class representing partial function obtained via functools.partial.""" - - def __init__(self, call, name=None, lineno=None, col_offset=None, parent=None): - # TODO: Pass end_lineno, end_col_offset as well - super().__init__( - name, - lineno=lineno, - col_offset=col_offset, - end_col_offset=0, - end_lineno=0, - parent=parent, - ) - self.filled_args = call.positional_arguments[1:] - self.filled_keywords = call.keyword_arguments - - wrapped_function = call.positional_arguments[0] - inferred_wrapped_function = next(wrapped_function.infer()) - if isinstance(inferred_wrapped_function, PartialFunction): - self.filled_args = inferred_wrapped_function.filled_args + self.filled_args - self.filled_keywords = { - **inferred_wrapped_function.filled_keywords, - **self.filled_keywords, - } - - self.filled_positionals = len(self.filled_args) - - def infer_call_result( - self, - caller: SuccessfulInferenceResult | None, - context: InferenceContext | None = None, - ) -> Iterator[InferenceResult]: - if context: - assert ( - context.callcontext - ), "CallContext should be set before inferring call result" - current_passed_keywords = { - keyword for (keyword, _) in context.callcontext.keywords - } - for keyword, value in self.filled_keywords.items(): - if keyword not in current_passed_keywords: - context.callcontext.keywords.append((keyword, value)) - - call_context_args = context.callcontext.args or [] - context.callcontext.args = self.filled_args + call_context_args - - return super().infer_call_result(caller=caller, context=context) - - def qname(self) -> str: - return self.__class__.__name__ - - -# TODO: Hack to solve the circular import problem between node_classes and objects -# This is not needed in 2.0, which has a cleaner design overall -node_classes.Dict.__bases__ = (node_classes.NodeNG, DictInstance) - - -class Property(scoped_nodes.FunctionDef): - """Class representing a Python property.""" - - def __init__(self, function, name=None, lineno=None, col_offset=None, parent=None): - self.function = function - super().__init__( - name, - lineno=lineno, - col_offset=col_offset, - parent=parent, - end_col_offset=function.end_col_offset, - end_lineno=function.end_lineno, - ) - - special_attributes = objectmodel.PropertyModel() - type = "property" - - def pytype(self) -> Literal["builtins.property"]: - return "builtins.property" - - def infer_call_result( - self, - caller: SuccessfulInferenceResult | None, - context: InferenceContext | None = None, - ) -> NoReturn: - raise InferenceError("Properties are not callable") - - def _infer( - self, context: InferenceContext | None = None, **kwargs: Any - ) -> Generator[Self]: - yield self diff --git a/venv/lib/python3.12/site-packages/astroid/protocols.py b/venv/lib/python3.12/site-packages/astroid/protocols.py deleted file mode 100644 index 50e5cfa..0000000 --- a/venv/lib/python3.12/site-packages/astroid/protocols.py +++ /dev/null @@ -1,958 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""This module contains a set of functions to handle python protocols for nodes -where it makes sense. -""" - -from __future__ import annotations - -import collections -import itertools -import operator as operator_mod -from collections.abc import Callable, Generator, Iterator, Sequence -from typing import TYPE_CHECKING, Any, TypeVar - -from astroid import bases, decorators, nodes, util -from astroid.builder import extract_node -from astroid.const import Context -from astroid.context import InferenceContext, copy_context -from astroid.exceptions import ( - AstroidIndexError, - AstroidTypeError, - AttributeInferenceError, - InferenceError, - NoDefault, -) -from astroid.nodes import node_classes -from astroid.typing import ( - ConstFactoryResult, - InferenceResult, - SuccessfulInferenceResult, -) - -if TYPE_CHECKING: - _TupleListNodeT = TypeVar("_TupleListNodeT", nodes.Tuple, nodes.List) - -_CONTEXTLIB_MGR = "contextlib.contextmanager" - -_UNARY_OPERATORS: dict[str, Callable[[Any], Any]] = { - "+": operator_mod.pos, - "-": operator_mod.neg, - "~": operator_mod.invert, - "not": operator_mod.not_, -} - - -def _infer_unary_op(obj: Any, op: str) -> ConstFactoryResult: - """Perform unary operation on `obj`, unless it is `NotImplemented`. - - Can raise TypeError if operation is unsupported. - """ - if obj is NotImplemented: - value = obj - else: - func = _UNARY_OPERATORS[op] - value = func(obj) - return nodes.const_factory(value) - - -def tuple_infer_unary_op(self, op): - return _infer_unary_op(tuple(self.elts), op) - - -def list_infer_unary_op(self, op): - return _infer_unary_op(self.elts, op) - - -def set_infer_unary_op(self, op): - return _infer_unary_op(set(self.elts), op) - - -def const_infer_unary_op(self, op): - return _infer_unary_op(self.value, op) - - -def dict_infer_unary_op(self, op): - return _infer_unary_op(dict(self.items), op) - - -# Binary operations - -BIN_OP_IMPL = { - "+": lambda a, b: a + b, - "-": lambda a, b: a - b, - "/": lambda a, b: a / b, - "//": lambda a, b: a // b, - "*": lambda a, b: a * b, - "**": lambda a, b: a**b, - "%": lambda a, b: a % b, - "&": lambda a, b: a & b, - "|": lambda a, b: a | b, - "^": lambda a, b: a ^ b, - "<<": lambda a, b: a << b, - ">>": lambda a, b: a >> b, - "@": operator_mod.matmul, -} -for _KEY, _IMPL in list(BIN_OP_IMPL.items()): - BIN_OP_IMPL[_KEY + "="] = _IMPL - - -@decorators.yes_if_nothing_inferred -def const_infer_binary_op( - self: nodes.Const, - opnode: nodes.AugAssign | nodes.BinOp, - operator: str, - other: InferenceResult, - context: InferenceContext, - _: SuccessfulInferenceResult, -) -> Generator[ConstFactoryResult | util.UninferableBase]: - not_implemented = nodes.Const(NotImplemented) - if isinstance(other, nodes.Const): - if ( - operator == "**" - and isinstance(self.value, (int, float)) - and isinstance(other.value, (int, float)) - and (self.value > 1e5 or other.value > 1e5) - ): - yield not_implemented - return - try: - impl = BIN_OP_IMPL[operator] - try: - yield nodes.const_factory(impl(self.value, other.value)) - except TypeError: - # ArithmeticError is not enough: float >> float is a TypeError - yield not_implemented - except Exception: # pylint: disable=broad-except - yield util.Uninferable - except TypeError: - yield not_implemented - elif isinstance(self.value, str) and operator == "%": - # TODO(cpopa): implement string interpolation later on. - yield util.Uninferable - else: - yield not_implemented - - -def _multiply_seq_by_int( - self: _TupleListNodeT, - opnode: nodes.AugAssign | nodes.BinOp, - value: int, - context: InferenceContext, -) -> _TupleListNodeT: - node = self.__class__(parent=opnode) - if not (value > 0 and self.elts): - node.elts = [] - return node - if len(self.elts) * value > 1e8: - node.elts = [util.Uninferable] - return node - filtered_elts = ( - util.safe_infer(elt, context) or util.Uninferable - for elt in self.elts - if not isinstance(elt, util.UninferableBase) - ) - node.elts = list(filtered_elts) * value - return node - - -def _filter_uninferable_nodes( - elts: Sequence[InferenceResult], context: InferenceContext -) -> Iterator[SuccessfulInferenceResult]: - for elt in elts: - if isinstance(elt, util.UninferableBase): - yield node_classes.UNATTACHED_UNKNOWN - else: - for inferred in elt.infer(context): - if not isinstance(inferred, util.UninferableBase): - yield inferred - else: - yield node_classes.UNATTACHED_UNKNOWN - - -@decorators.yes_if_nothing_inferred -def tl_infer_binary_op( - self: _TupleListNodeT, - opnode: nodes.AugAssign | nodes.BinOp, - operator: str, - other: InferenceResult, - context: InferenceContext, - method: SuccessfulInferenceResult, -) -> Generator[_TupleListNodeT | nodes.Const | util.UninferableBase]: - """Infer a binary operation on a tuple or list. - - The instance on which the binary operation is performed is a tuple - or list. This refers to the left-hand side of the operation, so: - 'tuple() + 1' or '[] + A()' - """ - from astroid import helpers # pylint: disable=import-outside-toplevel - - # For tuples and list the boundnode is no longer the tuple or list instance - context.boundnode = None - not_implemented = nodes.Const(NotImplemented) - if isinstance(other, self.__class__) and operator == "+": - node = self.__class__(parent=opnode) - node.elts = list( - itertools.chain( - _filter_uninferable_nodes(self.elts, context), - _filter_uninferable_nodes(other.elts, context), - ) - ) - yield node - elif isinstance(other, nodes.Const) and operator == "*": - if not isinstance(other.value, int): - yield not_implemented - return - yield _multiply_seq_by_int(self, opnode, other.value, context) - elif isinstance(other, bases.Instance) and operator == "*": - # Verify if the instance supports __index__. - as_index = helpers.class_instance_as_index(other) - if not as_index: - yield util.Uninferable - elif not isinstance(as_index.value, int): # pragma: no cover - # already checked by class_instance_as_index() but faster than casting - raise AssertionError("Please open a bug report.") - else: - yield _multiply_seq_by_int(self, opnode, as_index.value, context) - else: - yield not_implemented - - -@decorators.yes_if_nothing_inferred -def instance_class_infer_binary_op( - self: nodes.ClassDef, - opnode: nodes.AugAssign | nodes.BinOp, - operator: str, - other: InferenceResult, - context: InferenceContext, - method: SuccessfulInferenceResult, -) -> Generator[InferenceResult]: - return method.infer_call_result(self, context) - - -# assignment ################################################################## -# pylint: disable-next=pointless-string-statement -"""The assigned_stmts method is responsible to return the assigned statement -(e.g. not inferred) according to the assignment type. - -The `assign_path` argument is used to record the lhs path of the original node. -For instance if we want assigned statements for 'c' in 'a, (b,c)', assign_path -will be [1, 1] once arrived to the Assign node. - -The `context` argument is the current inference context which should be given -to any intermediary inference necessary. -""" - - -def _resolve_looppart(parts, assign_path, context): - """Recursive function to resolve multiple assignments on loops.""" - assign_path = assign_path[:] - index = assign_path.pop(0) - for part in parts: - if isinstance(part, util.UninferableBase): - continue - if not hasattr(part, "itered"): - continue - try: - itered = part.itered() - except TypeError: - continue - try: - if isinstance(itered[index], (nodes.Const, nodes.Name)): - itered = [part] - except IndexError: - pass - for stmt in itered: - index_node = nodes.Const(index) - try: - assigned = stmt.getitem(index_node, context) - except (AttributeError, AstroidTypeError, AstroidIndexError): - continue - if not assign_path: - # we achieved to resolved the assignment path, - # don't infer the last part - yield assigned - elif isinstance(assigned, util.UninferableBase): - break - else: - # we are not yet on the last part of the path - # search on each possibly inferred value - try: - yield from _resolve_looppart( - assigned.infer(context), assign_path, context - ) - except InferenceError: - break - - -@decorators.raise_if_nothing_inferred -def for_assigned_stmts( - self: nodes.For | nodes.Comprehension, - node: node_classes.AssignedStmtsPossibleNode = None, - context: InferenceContext | None = None, - assign_path: list[int] | None = None, -) -> Any: - if isinstance(self, nodes.AsyncFor) or getattr(self, "is_async", False): - # Skip inferring of async code for now - return { - "node": self, - "unknown": node, - "assign_path": assign_path, - "context": context, - } - if assign_path is None: - for lst in self.iter.infer(context): - if isinstance(lst, (nodes.Tuple, nodes.List)): - yield from lst.elts - else: - yield from _resolve_looppart(self.iter.infer(context), assign_path, context) - return { - "node": self, - "unknown": node, - "assign_path": assign_path, - "context": context, - } - - -def sequence_assigned_stmts( - self: nodes.Tuple | nodes.List, - node: node_classes.AssignedStmtsPossibleNode = None, - context: InferenceContext | None = None, - assign_path: list[int] | None = None, -) -> Any: - if assign_path is None: - assign_path = [] - try: - index = self.elts.index(node) # type: ignore[arg-type] - except ValueError as exc: - raise InferenceError( - "Tried to retrieve a node {node!r} which does not exist", - node=self, - assign_path=assign_path, - context=context, - ) from exc - - assign_path.insert(0, index) - return self.parent.assigned_stmts( - node=self, context=context, assign_path=assign_path - ) - - -def assend_assigned_stmts( - self: nodes.AssignName | nodes.AssignAttr, - node: node_classes.AssignedStmtsPossibleNode = None, - context: InferenceContext | None = None, - assign_path: list[int] | None = None, -) -> Any: - return self.parent.assigned_stmts(node=self, context=context) - - -def _arguments_infer_argname( - self, name: str | None, context: InferenceContext -) -> Generator[InferenceResult]: - # arguments information may be missing, in which case we can't do anything - # more - from astroid import arguments # pylint: disable=import-outside-toplevel - - if not self.arguments: - yield util.Uninferable - return - - args = [arg for arg in self.arguments if arg.name not in [self.vararg, self.kwarg]] - functype = self.parent.type - # first argument of instance/class method - if ( - args - and getattr(self.arguments[0], "name", None) == name - and functype != "staticmethod" - ): - cls = self.parent.parent.scope() - is_metaclass = isinstance(cls, nodes.ClassDef) and cls.type == "metaclass" - # If this is a metaclass, then the first argument will always - # be the class, not an instance. - if context.boundnode and isinstance(context.boundnode, bases.Instance): - cls = context.boundnode._proxied - if is_metaclass or functype == "classmethod": - yield cls - return - if functype == "method": - yield cls.instantiate_class() - return - - if context and context.callcontext: - callee = context.callcontext.callee - while hasattr(callee, "_proxied"): - callee = callee._proxied - if getattr(callee, "name", None) == self.parent.name: - call_site = arguments.CallSite(context.callcontext, context.extra_context) - yield from call_site.infer_argument(self.parent, name, context) - return - - if name == self.vararg: - vararg = nodes.const_factory(()) - vararg.parent = self - if not args and self.parent.name == "__init__": - cls = self.parent.parent.scope() - vararg.elts = [cls.instantiate_class()] - yield vararg - return - if name == self.kwarg: - kwarg = nodes.const_factory({}) - kwarg.parent = self - yield kwarg - return - # if there is a default value, yield it. And then yield Uninferable to reflect - # we can't guess given argument value - try: - context = copy_context(context) - yield from self.default_value(name).infer(context) - yield util.Uninferable - except NoDefault: - yield util.Uninferable - - -def arguments_assigned_stmts( - self: nodes.Arguments, - node: node_classes.AssignedStmtsPossibleNode = None, - context: InferenceContext | None = None, - assign_path: list[int] | None = None, -) -> Any: - from astroid import arguments # pylint: disable=import-outside-toplevel - - try: - node_name = node.name # type: ignore[union-attr] - except AttributeError: - # Added to handle edge cases where node.name is not defined. - # https://github.com/pylint-dev/astroid/pull/1644#discussion_r901545816 - node_name = None # pragma: no cover - - if context and context.callcontext: - callee = context.callcontext.callee - while hasattr(callee, "_proxied"): - callee = callee._proxied - else: - return _arguments_infer_argname(self, node_name, context) - if node and getattr(callee, "name", None) == node.frame().name: - # reset call context/name - callcontext = context.callcontext - context = copy_context(context) - context.callcontext = None - args = arguments.CallSite(callcontext, context=context) - return args.infer_argument(self.parent, node_name, context) - return _arguments_infer_argname(self, node_name, context) - - -@decorators.raise_if_nothing_inferred -def assign_assigned_stmts( - self: nodes.AugAssign | nodes.Assign | nodes.AnnAssign | nodes.TypeAlias, - node: node_classes.AssignedStmtsPossibleNode = None, - context: InferenceContext | None = None, - assign_path: list[int] | None = None, -) -> Any: - if not assign_path: - yield self.value - return None - yield from _resolve_assignment_parts( - self.value.infer(context), assign_path, context - ) - - return { - "node": self, - "unknown": node, - "assign_path": assign_path, - "context": context, - } - - -def assign_annassigned_stmts( - self: nodes.AnnAssign, - node: node_classes.AssignedStmtsPossibleNode = None, - context: InferenceContext | None = None, - assign_path: list[int] | None = None, -) -> Any: - for inferred in assign_assigned_stmts(self, node, context, assign_path): - if inferred is None: - yield util.Uninferable - else: - yield inferred - - -def _resolve_assignment_parts(parts, assign_path, context): - """Recursive function to resolve multiple assignments.""" - assign_path = assign_path[:] - index = assign_path.pop(0) - for part in parts: - assigned = None - if isinstance(part, nodes.Dict): - # A dictionary in an iterating context - try: - assigned, _ = part.items[index] - except IndexError: - return - - elif hasattr(part, "getitem"): - index_node = nodes.Const(index) - try: - assigned = part.getitem(index_node, context) - except (AstroidTypeError, AstroidIndexError): - return - - if not assigned: - return - - if not assign_path: - # we achieved to resolved the assignment path, don't infer the - # last part - yield assigned - elif isinstance(assigned, util.UninferableBase): - return - else: - # we are not yet on the last part of the path search on each - # possibly inferred value - try: - yield from _resolve_assignment_parts( - assigned.infer(context), assign_path, context - ) - except InferenceError: - return - - -@decorators.raise_if_nothing_inferred -def excepthandler_assigned_stmts( - self: nodes.ExceptHandler, - node: node_classes.AssignedStmtsPossibleNode = None, - context: InferenceContext | None = None, - assign_path: list[int] | None = None, -) -> Any: - from astroid import objects # pylint: disable=import-outside-toplevel - - def _generate_assigned(): - for assigned in node_classes.unpack_infer(self.type): - if isinstance(assigned, nodes.ClassDef): - assigned = objects.ExceptionInstance(assigned) - - yield assigned - - if isinstance(self.parent, node_classes.TryStar): - # except * handler has assigned ExceptionGroup with caught - # exceptions under exceptions attribute - # pylint: disable-next=stop-iteration-return - eg = next( - node_classes.unpack_infer( - extract_node( - """ -from builtins import ExceptionGroup -ExceptionGroup -""" - ) - ) - ) - assigned = objects.ExceptionInstance(eg) - assigned.instance_attrs["exceptions"] = [ - nodes.List.from_elements(_generate_assigned()) - ] - yield assigned - else: - yield from _generate_assigned() - return { - "node": self, - "unknown": node, - "assign_path": assign_path, - "context": context, - } - - -def _infer_context_manager(self, mgr, context): - try: - inferred = next(mgr.infer(context=context)) - except StopIteration as e: - raise InferenceError(node=mgr) from e - if isinstance(inferred, bases.Generator): - # Check if it is decorated with contextlib.contextmanager. - func = inferred.parent - if not func.decorators: - raise InferenceError( - "No decorators found on inferred generator %s", node=func - ) - - for decorator_node in func.decorators.nodes: - decorator = next(decorator_node.infer(context=context), None) - if isinstance(decorator, nodes.FunctionDef): - if decorator.qname() == _CONTEXTLIB_MGR: - break - else: - # It doesn't interest us. - raise InferenceError(node=func) - try: - yield next(inferred.infer_yield_types()) - except StopIteration as e: - raise InferenceError(node=func) from e - - elif isinstance(inferred, bases.Instance): - try: - enter = next(inferred.igetattr("__enter__", context=context)) - except (InferenceError, AttributeInferenceError, StopIteration) as exc: - raise InferenceError(node=inferred) from exc - if not isinstance(enter, bases.BoundMethod): - raise InferenceError(node=enter) - yield from enter.infer_call_result(self, context) - else: - raise InferenceError(node=mgr) - - -@decorators.raise_if_nothing_inferred -def with_assigned_stmts( - self: nodes.With, - node: node_classes.AssignedStmtsPossibleNode = None, - context: InferenceContext | None = None, - assign_path: list[int] | None = None, -) -> Any: - """Infer names and other nodes from a *with* statement. - - This enables only inference for name binding in a *with* statement. - For instance, in the following code, inferring `func` will return - the `ContextManager` class, not whatever ``__enter__`` returns. - We are doing this intentionally, because we consider that the context - manager result is whatever __enter__ returns and what it is binded - using the ``as`` keyword. - - class ContextManager(object): - def __enter__(self): - return 42 - with ContextManager() as f: - pass - - # ContextManager().infer() will return ContextManager - # f.infer() will return 42. - - Arguments: - self: nodes.With - node: The target of the assignment, `as (a, b)` in `with foo as (a, b)`. - context: Inference context used for caching already inferred objects - assign_path: - A list of indices, where each index specifies what item to fetch from - the inference results. - """ - try: - mgr = next(mgr for (mgr, vars) in self.items if vars == node) - except StopIteration: - return None - if assign_path is None: - yield from _infer_context_manager(self, mgr, context) - else: - for result in _infer_context_manager(self, mgr, context): - # Walk the assign_path and get the item at the final index. - obj = result - for index in assign_path: - if not hasattr(obj, "elts"): - raise InferenceError( - "Wrong type ({targets!r}) for {node!r} assignment", - node=self, - targets=node, - assign_path=assign_path, - context=context, - ) - try: - obj = obj.elts[index] - except IndexError as exc: - raise InferenceError( - "Tried to infer a nonexistent target with index {index} " - "in {node!r}.", - node=self, - targets=node, - assign_path=assign_path, - context=context, - ) from exc - except TypeError as exc: - raise InferenceError( - "Tried to unpack a non-iterable value in {node!r}.", - node=self, - targets=node, - assign_path=assign_path, - context=context, - ) from exc - yield obj - return { - "node": self, - "unknown": node, - "assign_path": assign_path, - "context": context, - } - - -@decorators.raise_if_nothing_inferred -def named_expr_assigned_stmts( - self: nodes.NamedExpr, - node: node_classes.AssignedStmtsPossibleNode, - context: InferenceContext | None = None, - assign_path: list[int] | None = None, -) -> Any: - """Infer names and other nodes from an assignment expression.""" - if self.target == node: - yield from self.value.infer(context=context) - else: - raise InferenceError( - "Cannot infer NamedExpr node {node!r}", - node=self, - assign_path=assign_path, - context=context, - ) - - -@decorators.yes_if_nothing_inferred -def starred_assigned_stmts( # noqa: C901 - self: nodes.Starred, - node: node_classes.AssignedStmtsPossibleNode = None, - context: InferenceContext | None = None, - assign_path: list[int] | None = None, -) -> Any: - """ - Arguments: - self: nodes.Starred - node: a node related to the current underlying Node. - context: Inference context used for caching already inferred objects - assign_path: - A list of indices, where each index specifies what item to fetch from - the inference results. - """ - - # pylint: disable = too-many-locals, too-many-statements, too-many-branches - - def _determine_starred_iteration_lookups( - starred: nodes.Starred, target: nodes.Tuple, lookups: list[tuple[int, int]] - ) -> None: - # Determine the lookups for the rhs of the iteration - itered = target.itered() - for index, element in enumerate(itered): - if ( - isinstance(element, nodes.Starred) - and element.value.name == starred.value.name - ): - lookups.append((index, len(itered))) - break - if isinstance(element, nodes.Tuple): - lookups.append((index, len(element.itered()))) - _determine_starred_iteration_lookups(starred, element, lookups) - - stmt = self.statement() - if not isinstance(stmt, (nodes.Assign, nodes.For)): - raise InferenceError( - "Statement {stmt!r} enclosing {node!r} must be an Assign or For node.", - node=self, - stmt=stmt, - unknown=node, - context=context, - ) - - if context is None: - context = InferenceContext() - - if isinstance(stmt, nodes.Assign): - value = stmt.value - lhs = stmt.targets[0] - if not isinstance(lhs, nodes.BaseContainer): - yield util.Uninferable - return - - if sum(1 for _ in lhs.nodes_of_class(nodes.Starred)) > 1: - raise InferenceError( - "Too many starred arguments in the assignment targets {lhs!r}.", - node=self, - targets=lhs, - unknown=node, - context=context, - ) - - try: - rhs = next(value.infer(context)) - except (InferenceError, StopIteration): - yield util.Uninferable - return - if isinstance(rhs, util.UninferableBase) or not hasattr(rhs, "itered"): - yield util.Uninferable - return - - try: - elts = collections.deque(rhs.itered()) # type: ignore[union-attr] - except TypeError: - yield util.Uninferable - return - - # Unpack iteratively the values from the rhs of the assignment, - # until the find the starred node. What will remain will - # be the list of values which the Starred node will represent - # This is done in two steps, from left to right to remove - # anything before the starred node and from right to left - # to remove anything after the starred node. - - for index, left_node in enumerate(lhs.elts): - if not isinstance(left_node, nodes.Starred): - if not elts: - break - elts.popleft() - continue - lhs_elts = collections.deque(reversed(lhs.elts[index:])) - for right_node in lhs_elts: - if not isinstance(right_node, nodes.Starred): - if not elts: - break - elts.pop() - continue - - # We're done unpacking. - packed = nodes.List( - ctx=Context.Store, - parent=self, - lineno=lhs.lineno, - col_offset=lhs.col_offset, - ) - packed.postinit(elts=list(elts)) - yield packed - break - - if isinstance(stmt, nodes.For): - try: - inferred_iterable = next(stmt.iter.infer(context=context)) - except (InferenceError, StopIteration): - yield util.Uninferable - return - if isinstance(inferred_iterable, util.UninferableBase) or not hasattr( - inferred_iterable, "itered" - ): - yield util.Uninferable - return - try: - itered = inferred_iterable.itered() # type: ignore[union-attr] - except TypeError: - yield util.Uninferable - return - - target = stmt.target - - if not isinstance(target, nodes.Tuple): - raise InferenceError( - f"Could not make sense of this, the target must be a tuple, not {type(target)!r}", - context=context, - ) - - lookups: list[tuple[int, int]] = [] - _determine_starred_iteration_lookups(self, target, lookups) - if not lookups: - raise InferenceError( - "Could not make sense of this, needs at least a lookup", context=context - ) - - # Make the last lookup a slice, since that what we want for a Starred node - last_element_index, last_element_length = lookups[-1] - is_starred_last = last_element_index == (last_element_length - 1) - - lookup_slice = slice( - last_element_index, - None if is_starred_last else (last_element_length - last_element_index), - ) - last_lookup = lookup_slice - - for element in itered: - # We probably want to infer the potential values *for each* element in an - # iterable, but we can't infer a list of all values, when only a list of - # step values are expected: - # - # for a, *b in [...]: - # b - # - # *b* should now point to just the elements at that particular iteration step, - # which astroid can't know about. - - found_element = None - for index, lookup in enumerate(lookups): - if not hasattr(element, "itered"): - break - if index + 1 is len(lookups): - cur_lookup: slice | int = last_lookup - else: - # Grab just the index, not the whole length - cur_lookup = lookup[0] - try: - itered_inner_element = element.itered() - element = itered_inner_element[cur_lookup] - except IndexError: - break - except TypeError: - # Most likely the itered() call failed, cannot make sense of this - yield util.Uninferable - return - else: - found_element = element - - unpacked = nodes.List( - ctx=Context.Store, - parent=self, - lineno=self.lineno, - col_offset=self.col_offset, - ) - unpacked.postinit(elts=found_element or []) - yield unpacked - return - - yield util.Uninferable - - -@decorators.yes_if_nothing_inferred -def match_mapping_assigned_stmts( - self: nodes.MatchMapping, - node: nodes.AssignName, - context: InferenceContext | None = None, - assign_path: None = None, -) -> Generator[nodes.NodeNG]: - """Return empty generator (return -> raises StopIteration) so inferred value - is Uninferable. - """ - return - yield - - -@decorators.yes_if_nothing_inferred -def match_star_assigned_stmts( - self: nodes.MatchStar, - node: nodes.AssignName, - context: InferenceContext | None = None, - assign_path: None = None, -) -> Generator[nodes.NodeNG]: - """Return empty generator (return -> raises StopIteration) so inferred value - is Uninferable. - """ - return - yield - - -@decorators.yes_if_nothing_inferred -def match_as_assigned_stmts( - self: nodes.MatchAs, - node: nodes.AssignName, - context: InferenceContext | None = None, - assign_path: None = None, -) -> Generator[nodes.NodeNG]: - """Infer MatchAs as the Match subject if it's the only MatchCase pattern - else raise StopIteration to yield Uninferable. - """ - if ( - isinstance(self.parent, nodes.MatchCase) - and isinstance(self.parent.parent, nodes.Match) - and self.pattern is None - ): - yield self.parent.parent.subject - - -@decorators.yes_if_nothing_inferred -def generic_type_assigned_stmts( - self: nodes.TypeVar | nodes.TypeVarTuple | nodes.ParamSpec, - node: nodes.AssignName, - context: InferenceContext | None = None, - assign_path: None = None, -) -> Generator[nodes.NodeNG]: - """Hack. Return any Node so inference doesn't fail - when evaluating __class_getitem__. Revert if it's causing issues. - """ - yield nodes.Const(None) diff --git a/venv/lib/python3.12/site-packages/astroid/raw_building.py b/venv/lib/python3.12/site-packages/astroid/raw_building.py deleted file mode 100644 index d1bbbd5..0000000 --- a/venv/lib/python3.12/site-packages/astroid/raw_building.py +++ /dev/null @@ -1,735 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""this module contains a set of functions to create astroid trees from scratch -(build_* functions) or from living object (object_build_* functions) -""" - -from __future__ import annotations - -import builtins -import inspect -import io -import logging -import os -import sys -import types -import warnings -from collections.abc import Iterable -from contextlib import redirect_stderr, redirect_stdout -from typing import TYPE_CHECKING, Any - -from astroid import bases, nodes -from astroid.const import _EMPTY_OBJECT_MARKER, IS_PYPY -from astroid.nodes import node_classes - -if TYPE_CHECKING: - from astroid.manager import AstroidManager - -logger = logging.getLogger(__name__) - - -_FunctionTypes = ( - types.FunctionType - | types.MethodType - | types.BuiltinFunctionType - | types.WrapperDescriptorType - | types.MethodDescriptorType - | types.ClassMethodDescriptorType -) - -TYPE_NONE = type(None) -TYPE_NOTIMPLEMENTED = type(NotImplemented) -TYPE_ELLIPSIS = type(...) - - -def _attach_local_node(parent, node, name: str) -> None: - node.name = name # needed by add_local_node - parent.add_local_node(node) - - -def _add_dunder_class(func, parent: nodes.NodeNG, member) -> None: - """Add a __class__ member to the given func node, if we can determine it.""" - python_cls = member.__class__ - cls_name = getattr(python_cls, "__name__", None) - if not cls_name: - return - cls_bases = [ancestor.__name__ for ancestor in python_cls.__bases__] - doc = python_cls.__doc__ if isinstance(python_cls.__doc__, str) else None - ast_klass = build_class(cls_name, parent, cls_bases, doc) - func.instance_attrs["__class__"] = [ast_klass] - - -def build_dummy(runtime_object) -> nodes.EmptyNode: - enode = nodes.EmptyNode() - enode.object = runtime_object - return enode - - -def attach_dummy_node(node, name: str, runtime_object=_EMPTY_OBJECT_MARKER) -> None: - """create a dummy node and register it in the locals of the given - node with the specified name - """ - _attach_local_node(node, build_dummy(runtime_object), name) - - -def attach_const_node(node, name: str, value) -> None: - """create a Const node and register it in the locals of the given - node with the specified name - """ - if name not in node.special_attributes: - _attach_local_node(node, nodes.const_factory(value), name) - - -def attach_import_node(node, modname: str, membername: str) -> None: - """create a ImportFrom node and register it in the locals of the given - node with the specified name - """ - from_node = nodes.ImportFrom(modname, [(membername, None)]) - _attach_local_node(node, from_node, membername) - - -def build_module(name: str, doc: str | None = None) -> nodes.Module: - """create and initialize an astroid Module node""" - node = nodes.Module(name, pure_python=False, package=False) - node.postinit( - body=[], - doc_node=nodes.Const(value=doc) if doc else None, - ) - return node - - -def build_class( - name: str, - parent: nodes.NodeNG, - basenames: Iterable[str] = (), - doc: str | None = None, -) -> nodes.ClassDef: - """Create and initialize an astroid ClassDef node.""" - node = nodes.ClassDef( - name, - lineno=0, - col_offset=0, - end_lineno=0, - end_col_offset=0, - parent=parent, - ) - node.postinit( - bases=[ - nodes.Name( - name=base, - lineno=0, - col_offset=0, - parent=node, - end_lineno=None, - end_col_offset=None, - ) - for base in basenames - ], - body=[], - decorators=None, - doc_node=nodes.Const(value=doc) if doc else None, - ) - return node - - -def build_function( - name: str, - parent: nodes.NodeNG, - args: list[str] | None = None, - posonlyargs: list[str] | None = None, - defaults: list[Any] | None = None, - doc: str | None = None, - kwonlyargs: list[str] | None = None, - kwonlydefaults: list[Any] | None = None, -) -> nodes.FunctionDef: - """create and initialize an astroid FunctionDef node""" - # first argument is now a list of decorators - func = nodes.FunctionDef( - name, - lineno=0, - col_offset=0, - parent=parent, - end_col_offset=0, - end_lineno=0, - ) - argsnode = nodes.Arguments(parent=func, vararg=None, kwarg=None) - - # If args is None we don't have any information about the signature - # (in contrast to when there are no arguments and args == []). We pass - # this to the builder to indicate this. - if args is not None: - # We set the lineno and col_offset to 0 because we don't have any - # information about the location of the function definition. - arguments = [ - nodes.AssignName( - name=arg, - parent=argsnode, - lineno=0, - col_offset=0, - end_lineno=None, - end_col_offset=None, - ) - for arg in args - ] - else: - arguments = None - - default_nodes: list[nodes.NodeNG] | None - if defaults is None: - default_nodes = None - else: - default_nodes = [] - for default in defaults: - default_node = nodes.const_factory(default) - default_node.parent = argsnode - default_nodes.append(default_node) - - kwonlydefault_nodes: list[nodes.NodeNG | None] | None - if kwonlydefaults is None: - kwonlydefault_nodes = None - else: - kwonlydefault_nodes = [] - for kwonlydefault in kwonlydefaults: - kwonlydefault_node = nodes.const_factory(kwonlydefault) - kwonlydefault_node.parent = argsnode - kwonlydefault_nodes.append(kwonlydefault_node) - - # We set the lineno and col_offset to 0 because we don't have any - # information about the location of the kwonly and posonlyargs. - argsnode.postinit( - args=arguments, - defaults=default_nodes, - kwonlyargs=[ - nodes.AssignName( - name=arg, - parent=argsnode, - lineno=0, - col_offset=0, - end_lineno=None, - end_col_offset=None, - ) - for arg in kwonlyargs or () - ], - kw_defaults=kwonlydefault_nodes, - annotations=[], - posonlyargs=[ - nodes.AssignName( - name=arg, - parent=argsnode, - lineno=0, - col_offset=0, - end_lineno=None, - end_col_offset=None, - ) - for arg in posonlyargs or () - ], - kwonlyargs_annotations=[], - posonlyargs_annotations=[], - ) - func.postinit( - args=argsnode, - body=[], - doc_node=nodes.Const(value=doc) if doc else None, - ) - if args: - register_arguments(func) - return func - - -def build_from_import(fromname: str, names: list[str]) -> nodes.ImportFrom: - """create and initialize an astroid ImportFrom import statement""" - return nodes.ImportFrom(fromname, [(name, None) for name in names]) - - -def register_arguments(func: nodes.FunctionDef, args: list | None = None) -> None: - """add given arguments to local - - args is a list that may contains nested lists - (i.e. def func(a, (b, c, d)): ...) - """ - # If no args are passed in, get the args from the function. - if args is None: - if func.args.vararg: - func.set_local(func.args.vararg, func.args) - if func.args.kwarg: - func.set_local(func.args.kwarg, func.args) - args = func.args.args - # If the function has no args, there is nothing left to do. - if args is None: - return - for arg in args: - if isinstance(arg, nodes.AssignName): - func.set_local(arg.name, arg) - else: - register_arguments(func, arg.elts) - - -def object_build_class( - node: nodes.Module | nodes.ClassDef, member: type -) -> nodes.ClassDef: - """create astroid for a living class object""" - basenames = [base.__name__ for base in member.__bases__] - return _base_class_object_build(node, member, basenames) - - -def _get_args_info_from_callable( - member: _FunctionTypes, -) -> tuple[list[str], list[str], list[Any], list[str], list[Any]]: - """Returns args, posonlyargs, defaults, kwonlyargs. - - :note: currently ignores the return annotation. - """ - signature = inspect.signature(member) - args: list[str] = [] - defaults: list[Any] = [] - posonlyargs: list[str] = [] - kwonlyargs: list[str] = [] - kwonlydefaults: list[Any] = [] - - for param_name, param in signature.parameters.items(): - if param.kind == inspect.Parameter.POSITIONAL_ONLY: - posonlyargs.append(param_name) - elif param.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD: - args.append(param_name) - elif param.kind == inspect.Parameter.VAR_POSITIONAL: - args.append(param_name) - elif param.kind == inspect.Parameter.VAR_KEYWORD: - args.append(param_name) - elif param.kind == inspect.Parameter.KEYWORD_ONLY: - kwonlyargs.append(param_name) - if param.default is not inspect.Parameter.empty: - kwonlydefaults.append(param.default) - continue - if param.default is not inspect.Parameter.empty: - defaults.append(param.default) - - return args, posonlyargs, defaults, kwonlyargs, kwonlydefaults - - -def object_build_function( - node: nodes.Module | nodes.ClassDef, member: _FunctionTypes -) -> nodes.FunctionDef: - """create astroid for a living function object""" - ( - args, - posonlyargs, - defaults, - kwonlyargs, - kwonly_defaults, - ) = _get_args_info_from_callable(member) - - return build_function( - getattr(member, "__name__", ""), - node, - args, - posonlyargs, - defaults, - member.__doc__ if isinstance(member.__doc__, str) else None, - kwonlyargs=kwonlyargs, - kwonlydefaults=kwonly_defaults, - ) - - -def object_build_datadescriptor( - node: nodes.Module | nodes.ClassDef, member: type -) -> nodes.ClassDef: - """create astroid for a living data descriptor object""" - return _base_class_object_build(node, member, []) - - -def object_build_methoddescriptor( - node: nodes.Module | nodes.ClassDef, - member: _FunctionTypes, -) -> nodes.FunctionDef: - """create astroid for a living method descriptor object""" - # FIXME get arguments ? - name = getattr(member, "__name__", "") - func = build_function(name, node, doc=member.__doc__) - _add_dunder_class(func, node, member) - return func - - -def _base_class_object_build( - node: nodes.Module | nodes.ClassDef, - member: type, - basenames: list[str], -) -> nodes.ClassDef: - """create astroid for a living class object, with a given set of base names - (e.g. ancestors) - """ - name = getattr(member, "__name__", "") - doc = member.__doc__ if isinstance(member.__doc__, str) else None - klass = build_class(name, node, basenames, doc) - klass._newstyle = isinstance(member, type) - try: - # limit the instantiation trick since it's too dangerous - # (such as infinite test execution...) - # this at least resolves common case such as Exception.args, - # OSError.errno - if issubclass(member, Exception): - member_object = member() - if hasattr(member_object, "__dict__"): - instdict = member_object.__dict__ - else: - raise TypeError - else: - raise TypeError - except TypeError: - pass - else: - for item_name, obj in instdict.items(): - valnode = nodes.EmptyNode() - valnode.object = obj - valnode.parent = klass - valnode.lineno = 1 - klass.instance_attrs[item_name] = [valnode] - return klass - - -def _build_from_function( - node: nodes.Module | nodes.ClassDef, - member: _FunctionTypes, - module: types.ModuleType, -) -> nodes.FunctionDef | nodes.EmptyNode: - # verify this is not an imported function - try: - code = member.__code__ # type: ignore[union-attr] - except AttributeError: - # Some implementations don't provide the code object, - # such as Jython. - code = None - filename = getattr(code, "co_filename", None) - if filename is None: - return object_build_methoddescriptor(node, member) - if filename == getattr(module, "__file__", None): - return object_build_function(node, member) - return build_dummy(member) - - -def _safe_has_attribute(obj, member: str) -> bool: - """Required because unexpected RunTimeError can be raised. - - See https://github.com/pylint-dev/astroid/issues/1958 - """ - try: - return hasattr(obj, member) - except Exception: # pylint: disable=broad-except - return False - - -class InspectBuilder: - """class for building nodes from living object - - this is actually a really minimal representation, including only Module, - FunctionDef and ClassDef nodes and some others as guessed. - """ - - bootstrapped: bool = False - - def __init__(self, manager_instance: AstroidManager) -> None: - self._manager = manager_instance - self._done: dict[types.ModuleType | type, nodes.Module | nodes.ClassDef] = {} - self._module: types.ModuleType - - def inspect_build( - self, - module: types.ModuleType, - modname: str | None = None, - path: str | None = None, - ) -> nodes.Module: - """build astroid from a living module (i.e. using inspect) - this is used when there is no python source code available (either - because it's a built-in module or because the .py is not available) - """ - self._module = module - if modname is None: - modname = module.__name__ - try: - node = build_module(modname, module.__doc__) - except AttributeError: - # in jython, java modules have no __doc__ (see #109562) - node = build_module(modname) - if path is None: - node.path = node.file = path - else: - node.path = [os.path.abspath(path)] - node.file = node.path[0] - node.name = modname - self._manager.cache_module(node) - node.package = hasattr(module, "__path__") - self._done = {} - self.object_build(node, module) - return node - - def object_build( - self, node: nodes.Module | nodes.ClassDef, obj: types.ModuleType | type - ) -> None: - """recursive method which create a partial ast from real objects - (only function, class, and method are handled) - """ - if obj in self._done: - return None - self._done[obj] = node - for alias in dir(obj): - # inspect.ismethod() and inspect.isbuiltin() in PyPy return - # the opposite of what they do in CPython for __class_getitem__. - pypy__class_getitem__ = IS_PYPY and alias == "__class_getitem__" - try: - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - member = getattr(obj, alias) - except AttributeError: - # damned ExtensionClass.Base, I know you're there ! - attach_dummy_node(node, alias) - continue - if inspect.ismethod(member) and not pypy__class_getitem__: - member = member.__func__ - if inspect.isfunction(member): - child = _build_from_function(node, member, self._module) - elif inspect.isbuiltin(member) or pypy__class_getitem__: - if self.imported_member(node, member, alias): - continue - child = object_build_methoddescriptor(node, member) - elif inspect.isclass(member): - if self.imported_member(node, member, alias): - continue - if member in self._done: - child = self._done[member] - assert isinstance(child, nodes.ClassDef) - else: - child = object_build_class(node, member) - # recursion - self.object_build(child, member) - elif inspect.ismethoddescriptor(member): - child: nodes.NodeNG = object_build_methoddescriptor(node, member) - elif inspect.isdatadescriptor(member): - child = object_build_datadescriptor(node, member) - elif isinstance(member, tuple(node_classes.CONST_CLS)): - if alias in node.special_attributes: - continue - child = nodes.const_factory(member) - elif inspect.isroutine(member): - # This should be called for Jython, where some builtin - # methods aren't caught by isbuiltin branch. - child = _build_from_function(node, member, self._module) - elif _safe_has_attribute(member, "__all__"): - child: nodes.NodeNG = build_module(alias) - # recursion - self.object_build(child, member) - else: - # create an empty node so that the name is actually defined - child: nodes.NodeNG = build_dummy(member) - if child not in node.locals.get(alias, ()): - node.add_local_node(child, alias) - return None - - def imported_member(self, node, member, name: str) -> bool: - """verify this is not an imported class or handle it""" - # /!\ some classes like ExtensionClass doesn't have a __module__ - # attribute ! Also, this may trigger an exception on badly built module - # (see http://www.logilab.org/ticket/57299 for instance) - try: - modname = getattr(member, "__module__", None) - except TypeError: - modname = None - if modname is None: - if name in {"__new__", "__subclasshook__"}: - # Python 2.5.1 (r251:54863, Sep 1 2010, 22:03:14) - # >>> print object.__new__.__module__ - # None - modname = builtins.__name__ - else: - attach_dummy_node(node, name, member) - return True - - # On PyPy during bootstrapping we infer _io while _module is - # builtins. In CPython _io names itself io, see http://bugs.python.org/issue18602 - # Therefore, this basically checks whether we are not in PyPy. - if modname == "_io" and not self._module.__name__ == "builtins": - return False - - real_name = {"gtk": "gtk_gtk"}.get(modname, modname) - - if real_name != self._module.__name__: - # check if it sounds valid and then add an import node, else use a - # dummy node - try: - with ( - redirect_stderr(io.StringIO()) as stderr, - redirect_stdout(io.StringIO()) as stdout, - ): - getattr(sys.modules[modname], name) - stderr_value = stderr.getvalue() - if stderr_value: - logger.error( - "Captured stderr while getting %s from %s:\n%s", - name, - sys.modules[modname], - stderr_value, - ) - stdout_value = stdout.getvalue() - if stdout_value: - logger.info( - "Captured stdout while getting %s from %s:\n%s", - name, - sys.modules[modname], - stdout_value, - ) - except (KeyError, AttributeError): - attach_dummy_node(node, name, member) - else: - attach_import_node(node, modname, name) - return True - return False - - -# astroid bootstrapping ###################################################### - -_CONST_PROXY: dict[type, nodes.ClassDef] = {} - - -def _set_proxied(const) -> nodes.ClassDef: - # TODO : find a nicer way to handle this situation; - return _CONST_PROXY[const.value.__class__] - - -def _astroid_bootstrapping() -> None: - """astroid bootstrapping the builtins module""" - # this boot strapping is necessary since we need the Const nodes to - # inspect_build builtins, and then we can proxy Const - # pylint: disable-next=import-outside-toplevel - from astroid.manager import AstroidManager - - builder = InspectBuilder(AstroidManager()) - astroid_builtin = builder.inspect_build(builtins) - - for cls, node_cls in node_classes.CONST_CLS.items(): - if cls is TYPE_NONE: - proxy = build_class("NoneType", astroid_builtin) - elif cls is TYPE_NOTIMPLEMENTED: - proxy = build_class("NotImplementedType", astroid_builtin) - elif cls is TYPE_ELLIPSIS: - proxy = build_class("Ellipsis", astroid_builtin) - else: - proxy = astroid_builtin.getattr(cls.__name__)[0] - assert isinstance(proxy, nodes.ClassDef) - if cls in (dict, list, set, tuple): - node_cls._proxied = proxy - else: - _CONST_PROXY[cls] = proxy - - # Set the builtin module as parent for some builtins. - nodes.Const._proxied = property(_set_proxied) - - _GeneratorType = nodes.ClassDef( - types.GeneratorType.__name__, - lineno=0, - col_offset=0, - end_lineno=0, - end_col_offset=0, - parent=astroid_builtin, - ) - astroid_builtin.set_local(_GeneratorType.name, _GeneratorType) - generator_doc_node = ( - nodes.Const(value=types.GeneratorType.__doc__) - if types.GeneratorType.__doc__ - else None - ) - _GeneratorType.postinit( - bases=[], - body=[], - decorators=None, - doc_node=generator_doc_node, - ) - bases.Generator._proxied = _GeneratorType - builder.object_build(bases.Generator._proxied, types.GeneratorType) - - if hasattr(types, "AsyncGeneratorType"): - _AsyncGeneratorType = nodes.ClassDef( - types.AsyncGeneratorType.__name__, - lineno=0, - col_offset=0, - end_lineno=0, - end_col_offset=0, - parent=astroid_builtin, - ) - astroid_builtin.set_local(_AsyncGeneratorType.name, _AsyncGeneratorType) - async_generator_doc_node = ( - nodes.Const(value=types.AsyncGeneratorType.__doc__) - if types.AsyncGeneratorType.__doc__ - else None - ) - _AsyncGeneratorType.postinit( - bases=[], - body=[], - decorators=None, - doc_node=async_generator_doc_node, - ) - bases.AsyncGenerator._proxied = _AsyncGeneratorType - builder.object_build(bases.AsyncGenerator._proxied, types.AsyncGeneratorType) - - if hasattr(types, "UnionType"): - _UnionTypeType = nodes.ClassDef( - types.UnionType.__name__, - lineno=0, - col_offset=0, - end_lineno=0, - end_col_offset=0, - parent=astroid_builtin, - ) - union_type_doc_node = ( - nodes.Const(value=types.UnionType.__doc__) - if types.UnionType.__doc__ - else None - ) - _UnionTypeType.postinit( - bases=[], - body=[], - decorators=None, - doc_node=union_type_doc_node, - ) - bases.UnionType._proxied = _UnionTypeType - builder.object_build(bases.UnionType._proxied, types.UnionType) - - builtin_types = ( - types.GetSetDescriptorType, - types.GeneratorType, - types.MemberDescriptorType, - TYPE_NONE, - TYPE_NOTIMPLEMENTED, - types.FunctionType, - types.MethodType, - types.BuiltinFunctionType, - types.ModuleType, - types.TracebackType, - ) - for _type in builtin_types: - if _type.__name__ not in astroid_builtin: - klass = nodes.ClassDef( - _type.__name__, - lineno=0, - col_offset=0, - end_lineno=0, - end_col_offset=0, - parent=astroid_builtin, - ) - doc = _type.__doc__ if isinstance(_type.__doc__, str) else None - klass.postinit( - bases=[], - body=[], - decorators=None, - doc_node=nodes.Const(doc) if doc else None, - ) - builder.object_build(klass, _type) - astroid_builtin[_type.__name__] = klass - - InspectBuilder.bootstrapped = True - - # pylint: disable-next=import-outside-toplevel - from astroid.brain.brain_builtin_inference import on_bootstrap - - # Instantiates an AstroidBuilder(), which is where - # InspectBuilder.bootstrapped is checked, so place after bootstrapped=True. - on_bootstrap() diff --git a/venv/lib/python3.12/site-packages/astroid/rebuilder.py b/venv/lib/python3.12/site-packages/astroid/rebuilder.py deleted file mode 100644 index 97f3a39..0000000 --- a/venv/lib/python3.12/site-packages/astroid/rebuilder.py +++ /dev/null @@ -1,1996 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""This module contains utilities for rebuilding an _ast tree in -order to get a single Astroid representation. -""" - -from __future__ import annotations - -import ast -import sys -import token -from collections.abc import Callable, Collection, Generator -from io import StringIO -from tokenize import TokenInfo, generate_tokens -from typing import TYPE_CHECKING, Final, TypeVar, cast, overload - -from astroid import nodes -from astroid._ast import ParserModule, get_parser_module, parse_function_type_comment -from astroid.const import PY312_PLUS, PY313_PLUS, Context -from astroid.nodes.utils import Position -from astroid.typing import InferenceResult - -if TYPE_CHECKING: - from astroid.manager import AstroidManager - - T_Doc = TypeVar( - "T_Doc", - ast.Module, - ast.ClassDef, - ast.FunctionDef | ast.AsyncFunctionDef, - ) - _FunctionT = TypeVar("_FunctionT", nodes.FunctionDef, nodes.AsyncFunctionDef) - _ForT = TypeVar("_ForT", nodes.For, nodes.AsyncFor) - _WithT = TypeVar("_WithT", nodes.With, nodes.AsyncWith) - NodesWithDocsType = nodes.Module | nodes.ClassDef | nodes.FunctionDef - - -REDIRECT: Final[dict[str, str]] = { - "arguments": "Arguments", - "comprehension": "Comprehension", - "ListCompFor": "Comprehension", - "GenExprFor": "Comprehension", - "excepthandler": "ExceptHandler", - "keyword": "Keyword", - "match_case": "MatchCase", -} - - -# noinspection PyMethodMayBeStatic -class TreeRebuilder: - """Rebuilds the _ast tree to become an Astroid tree.""" - - def __init__( - self, - manager: AstroidManager, - parser_module: ParserModule | None = None, - data: str | None = None, - ) -> None: - self._manager = manager - self._data = data.split("\n") if data else None - self._global_names: list[dict[str, list[nodes.Global]]] = [] - self._import_from_nodes: list[tuple[nodes.ImportFrom, Collection[str]]] = [] - self._delayed_assattr: list[nodes.AssignAttr] = [] - self._visit_meths: dict[ - type[ast.AST], Callable[[ast.AST, nodes.NodeNG], nodes.NodeNG] - ] = {} - - if parser_module is None: - self._parser_module = get_parser_module() - else: - self._parser_module = parser_module - - def _get_doc(self, node: T_Doc) -> tuple[T_Doc, ast.Constant | None]: - """Return the doc ast node.""" - try: - if node.body and isinstance(node.body[0], ast.Expr): - first_value = node.body[0].value - if isinstance(first_value, ast.Constant) and isinstance( - first_value.value, str - ): - doc_ast_node = first_value - node.body = node.body[1:] - return node, doc_ast_node - except IndexError: - pass # ast built from scratch - return node, None - - def _get_context( - self, - node: ( - ast.Attribute - | ast.List - | ast.Name - | ast.Subscript - | ast.Starred - | ast.Tuple - ), - ) -> Context: - return self._parser_module.context_classes.get(type(node.ctx), Context.Load) - - def _get_position_info( - self, - node: ast.ClassDef | ast.FunctionDef | ast.AsyncFunctionDef, - parent: nodes.ClassDef | nodes.FunctionDef | nodes.AsyncFunctionDef, - ) -> Position | None: - """Return position information for ClassDef and FunctionDef nodes. - - In contrast to AST positions, these only include the actual keyword(s) - and the class / function name. - - >>> @decorator - >>> async def some_func(var: int) -> None: - >>> ^^^^^^^^^^^^^^^^^^^ - """ - if not self._data: - return None - end_lineno = node.end_lineno - if node.body: - end_lineno = node.body[0].lineno - # pylint: disable-next=unsubscriptable-object - data = "\n".join(self._data[node.lineno - 1 : end_lineno]) - - start_token: TokenInfo | None = None - keyword_tokens: tuple[int, ...] = (token.NAME,) - if isinstance(parent, nodes.AsyncFunctionDef): - search_token = "async" - elif isinstance(parent, nodes.FunctionDef): - search_token = "def" - else: - search_token = "class" - - for t in generate_tokens(StringIO(data).readline): - if ( - start_token is not None - and t.type == token.NAME - and t.string == node.name - ): - break - if t.type in keyword_tokens: - if t.string == search_token: - start_token = t - continue - if t.string in {"def"}: - continue - start_token = None - else: - return None - - return Position( - lineno=node.lineno + start_token.start[0] - 1, - col_offset=start_token.start[1], - end_lineno=node.lineno + t.end[0] - 1, - end_col_offset=t.end[1], - ) - - def visit_module( - self, node: ast.Module, modname: str, modpath: str, package: bool - ) -> nodes.Module: - """Visit a Module node by returning a fresh instance of it. - - Note: Method not called by 'visit' - """ - node, doc_ast_node = self._get_doc(node) - newnode = nodes.Module( - name=modname, - file=modpath, - path=[modpath], - package=package, - ) - newnode.postinit( - [self.visit(child, newnode) for child in node.body], - doc_node=self.visit(doc_ast_node, newnode), - ) - return newnode - - if TYPE_CHECKING: # noqa: C901 - - @overload - def visit(self, node: ast.arg, parent: nodes.NodeNG) -> nodes.AssignName: ... - - @overload - def visit( - self, node: ast.arguments, parent: nodes.NodeNG - ) -> nodes.Arguments: ... - - @overload - def visit(self, node: ast.Assert, parent: nodes.NodeNG) -> nodes.Assert: ... - - @overload - def visit( - self, node: ast.AsyncFunctionDef, parent: nodes.NodeNG - ) -> nodes.AsyncFunctionDef: ... - - @overload - def visit(self, node: ast.AsyncFor, parent: nodes.NodeNG) -> nodes.AsyncFor: ... - - @overload - def visit(self, node: ast.Await, parent: nodes.NodeNG) -> nodes.Await: ... - - @overload - def visit( - self, node: ast.AsyncWith, parent: nodes.NodeNG - ) -> nodes.AsyncWith: ... - - @overload - def visit(self, node: ast.Assign, parent: nodes.NodeNG) -> nodes.Assign: ... - - @overload - def visit( - self, node: ast.AnnAssign, parent: nodes.NodeNG - ) -> nodes.AnnAssign: ... - - @overload - def visit( - self, node: ast.AugAssign, parent: nodes.NodeNG - ) -> nodes.AugAssign: ... - - @overload - def visit(self, node: ast.BinOp, parent: nodes.NodeNG) -> nodes.BinOp: ... - - @overload - def visit(self, node: ast.BoolOp, parent: nodes.NodeNG) -> nodes.BoolOp: ... - - @overload - def visit(self, node: ast.Break, parent: nodes.NodeNG) -> nodes.Break: ... - - @overload - def visit(self, node: ast.Call, parent: nodes.NodeNG) -> nodes.Call: ... - - @overload - def visit(self, node: ast.ClassDef, parent: nodes.NodeNG) -> nodes.ClassDef: ... - - @overload - def visit(self, node: ast.Continue, parent: nodes.NodeNG) -> nodes.Continue: ... - - @overload - def visit(self, node: ast.Compare, parent: nodes.NodeNG) -> nodes.Compare: ... - - @overload - def visit( - self, node: ast.comprehension, parent: nodes.NodeNG - ) -> nodes.Comprehension: ... - - @overload - def visit(self, node: ast.Delete, parent: nodes.NodeNG) -> nodes.Delete: ... - - @overload - def visit(self, node: ast.Dict, parent: nodes.NodeNG) -> nodes.Dict: ... - - @overload - def visit(self, node: ast.DictComp, parent: nodes.NodeNG) -> nodes.DictComp: ... - - @overload - def visit(self, node: ast.Expr, parent: nodes.NodeNG) -> nodes.Expr: ... - - @overload - def visit( - self, node: ast.ExceptHandler, parent: nodes.NodeNG - ) -> nodes.ExceptHandler: ... - - @overload - def visit(self, node: ast.For, parent: nodes.NodeNG) -> nodes.For: ... - - @overload - def visit( - self, node: ast.ImportFrom, parent: nodes.NodeNG - ) -> nodes.ImportFrom: ... - - @overload - def visit( - self, node: ast.FunctionDef, parent: nodes.NodeNG - ) -> nodes.FunctionDef: ... - - @overload - def visit( - self, node: ast.GeneratorExp, parent: nodes.NodeNG - ) -> nodes.GeneratorExp: ... - - @overload - def visit( - self, node: ast.Attribute, parent: nodes.NodeNG - ) -> nodes.Attribute: ... - - @overload - def visit(self, node: ast.Global, parent: nodes.NodeNG) -> nodes.Global: ... - - @overload - def visit(self, node: ast.If, parent: nodes.NodeNG) -> nodes.If: ... - - @overload - def visit(self, node: ast.IfExp, parent: nodes.NodeNG) -> nodes.IfExp: ... - - @overload - def visit(self, node: ast.Import, parent: nodes.NodeNG) -> nodes.Import: ... - - @overload - def visit( - self, node: ast.JoinedStr, parent: nodes.NodeNG - ) -> nodes.JoinedStr: ... - - @overload - def visit( - self, node: ast.FormattedValue, parent: nodes.NodeNG - ) -> nodes.FormattedValue: ... - - @overload - def visit( - self, node: ast.NamedExpr, parent: nodes.NodeNG - ) -> nodes.NamedExpr: ... - - @overload - def visit(self, node: ast.keyword, parent: nodes.NodeNG) -> nodes.Keyword: ... - - @overload - def visit(self, node: ast.Lambda, parent: nodes.NodeNG) -> nodes.Lambda: ... - - @overload - def visit(self, node: ast.List, parent: nodes.NodeNG) -> nodes.List: ... - - @overload - def visit(self, node: ast.ListComp, parent: nodes.NodeNG) -> nodes.ListComp: ... - - @overload - def visit( - self, node: ast.Name, parent: nodes.NodeNG - ) -> nodes.Name | nodes.Const | nodes.AssignName | nodes.DelName: ... - - @overload - def visit(self, node: ast.Nonlocal, parent: nodes.NodeNG) -> nodes.Nonlocal: ... - - @overload - def visit(self, node: ast.Constant, parent: nodes.NodeNG) -> nodes.Const: ... - - if sys.version_info >= (3, 12): - - @overload - def visit( - self, node: ast.ParamSpec, parent: nodes.NodeNG - ) -> nodes.ParamSpec: ... - - @overload - def visit(self, node: ast.Pass, parent: nodes.NodeNG) -> nodes.Pass: ... - - @overload - def visit(self, node: ast.Raise, parent: nodes.NodeNG) -> nodes.Raise: ... - - @overload - def visit(self, node: ast.Return, parent: nodes.NodeNG) -> nodes.Return: ... - - @overload - def visit(self, node: ast.Set, parent: nodes.NodeNG) -> nodes.Set: ... - - @overload - def visit(self, node: ast.SetComp, parent: nodes.NodeNG) -> nodes.SetComp: ... - - @overload - def visit(self, node: ast.Slice, parent: nodes.Subscript) -> nodes.Slice: ... - - @overload - def visit( - self, node: ast.Subscript, parent: nodes.NodeNG - ) -> nodes.Subscript: ... - - @overload - def visit(self, node: ast.Starred, parent: nodes.NodeNG) -> nodes.Starred: ... - - @overload - def visit(self, node: ast.Try, parent: nodes.NodeNG) -> nodes.Try: ... - - if sys.version_info >= (3, 11): - - @overload - def visit( - self, node: ast.TryStar, parent: nodes.NodeNG - ) -> nodes.TryStar: ... - - @overload - def visit(self, node: ast.Tuple, parent: nodes.NodeNG) -> nodes.Tuple: ... - - if sys.version_info >= (3, 12): - - @overload - def visit( - self, node: ast.TypeAlias, parent: nodes.NodeNG - ) -> nodes.TypeAlias: ... - - @overload - def visit( - self, node: ast.TypeVar, parent: nodes.NodeNG - ) -> nodes.TypeVar: ... - - @overload - def visit( - self, node: ast.TypeVarTuple, parent: nodes.NodeNG - ) -> nodes.TypeVarTuple: ... - - @overload - def visit(self, node: ast.UnaryOp, parent: nodes.NodeNG) -> nodes.UnaryOp: ... - - @overload - def visit(self, node: ast.While, parent: nodes.NodeNG) -> nodes.While: ... - - @overload - def visit(self, node: ast.With, parent: nodes.NodeNG) -> nodes.With: ... - - @overload - def visit(self, node: ast.Yield, parent: nodes.NodeNG) -> nodes.Yield: ... - - @overload - def visit( - self, node: ast.YieldFrom, parent: nodes.NodeNG - ) -> nodes.YieldFrom: ... - - @overload - def visit(self, node: ast.Match, parent: nodes.NodeNG) -> nodes.Match: ... - - @overload - def visit( - self, node: ast.match_case, parent: nodes.NodeNG - ) -> nodes.MatchCase: ... - - @overload - def visit( - self, node: ast.MatchValue, parent: nodes.NodeNG - ) -> nodes.MatchValue: ... - - @overload - def visit( - self, node: ast.MatchSingleton, parent: nodes.NodeNG - ) -> nodes.MatchSingleton: ... - - @overload - def visit( - self, node: ast.MatchSequence, parent: nodes.NodeNG - ) -> nodes.MatchSequence: ... - - @overload - def visit( - self, node: ast.MatchMapping, parent: nodes.NodeNG - ) -> nodes.MatchMapping: ... - - @overload - def visit( - self, node: ast.MatchClass, parent: nodes.NodeNG - ) -> nodes.MatchClass: ... - - @overload - def visit( - self, node: ast.MatchStar, parent: nodes.NodeNG - ) -> nodes.MatchStar: ... - - @overload - def visit(self, node: ast.MatchAs, parent: nodes.NodeNG) -> nodes.MatchAs: ... - - @overload - def visit(self, node: ast.MatchOr, parent: nodes.NodeNG) -> nodes.MatchOr: ... - - @overload - def visit(self, node: ast.pattern, parent: nodes.NodeNG) -> nodes.Pattern: ... - - if sys.version_info >= (3, 14): - - @overload - def visit( - self, node: ast.TemplateStr, parent: nodes.NodeNG - ) -> nodes.TemplateStr: ... - - @overload - def visit( - self, node: ast.Interpolation, parent: nodes.NodeNG - ) -> nodes.Interpolation: ... - - @overload - def visit(self, node: ast.AST, parent: nodes.NodeNG) -> nodes.NodeNG: ... - - @overload - def visit(self, node: None, parent: nodes.NodeNG) -> None: ... - - def visit(self, node: ast.AST | None, parent: nodes.NodeNG) -> nodes.NodeNG | None: - if node is None: - return None - cls = node.__class__ - if cls in self._visit_meths: - visit_method = self._visit_meths[cls] - else: - cls_name = cls.__name__ - visit_name = "visit_" + REDIRECT.get(cls_name, cls_name).lower() - visit_method = getattr(self, visit_name) - self._visit_meths[cls] = visit_method - return visit_method(node, parent) - - def _save_assignment(self, node: nodes.AssignName | nodes.DelName) -> None: - """Save assignment situation since node.parent is not available yet.""" - if self._global_names and node.name in self._global_names[-1]: - node.root().set_local(node.name, node) - else: - assert node.parent - assert node.name - node.parent.set_local(node.name, node) - - def visit_arg(self, node: ast.arg, parent: nodes.NodeNG) -> nodes.AssignName: - """Visit an arg node by returning a fresh AssignName instance.""" - return self.visit_assignname(node, parent, node.arg) - - def visit_arguments( - self, node: ast.arguments, parent: nodes.NodeNG - ) -> nodes.Arguments: - """Visit an Arguments node by returning a fresh instance of it.""" - vararg: str | None = None - kwarg: str | None = None - vararg_node = node.vararg - kwarg_node = node.kwarg - - newnode = nodes.Arguments( - node.vararg.arg if node.vararg else None, - node.kwarg.arg if node.kwarg else None, - parent, - ( - nodes.AssignName( - vararg_node.arg, - vararg_node.lineno, - vararg_node.col_offset, - parent, - end_lineno=vararg_node.end_lineno, - end_col_offset=vararg_node.end_col_offset, - ) - if vararg_node - else None - ), - ( - nodes.AssignName( - kwarg_node.arg, - kwarg_node.lineno, - kwarg_node.col_offset, - parent, - end_lineno=kwarg_node.end_lineno, - end_col_offset=kwarg_node.end_col_offset, - ) - if kwarg_node - else None - ), - ) - args = [self.visit(child, newnode) for child in node.args] - defaults = [self.visit(child, newnode) for child in node.defaults] - varargannotation: nodes.NodeNG | None = None - kwargannotation: nodes.NodeNG | None = None - if node.vararg: - vararg = node.vararg.arg - varargannotation = self.visit(node.vararg.annotation, newnode) - if node.kwarg: - kwarg = node.kwarg.arg - kwargannotation = self.visit(node.kwarg.annotation, newnode) - - kwonlyargs = [self.visit(child, newnode) for child in node.kwonlyargs] - kw_defaults = [self.visit(child, newnode) for child in node.kw_defaults] - annotations = [self.visit(arg.annotation, newnode) for arg in node.args] - kwonlyargs_annotations = [ - self.visit(arg.annotation, newnode) for arg in node.kwonlyargs - ] - - posonlyargs = [self.visit(child, newnode) for child in node.posonlyargs] - posonlyargs_annotations = [ - self.visit(arg.annotation, newnode) for arg in node.posonlyargs - ] - type_comment_args = [ - self.check_type_comment(child, parent=newnode) for child in node.args - ] - type_comment_kwonlyargs = [ - self.check_type_comment(child, parent=newnode) for child in node.kwonlyargs - ] - type_comment_posonlyargs = [ - self.check_type_comment(child, parent=newnode) for child in node.posonlyargs - ] - - newnode.postinit( - args=args, - defaults=defaults, - kwonlyargs=kwonlyargs, - posonlyargs=posonlyargs, - kw_defaults=kw_defaults, - annotations=annotations, - kwonlyargs_annotations=kwonlyargs_annotations, - posonlyargs_annotations=posonlyargs_annotations, - varargannotation=varargannotation, - kwargannotation=kwargannotation, - type_comment_args=type_comment_args, - type_comment_kwonlyargs=type_comment_kwonlyargs, - type_comment_posonlyargs=type_comment_posonlyargs, - ) - # save argument names in locals: - assert newnode.parent - if vararg: - newnode.parent.set_local(vararg, newnode) - if kwarg: - newnode.parent.set_local(kwarg, newnode) - return newnode - - def visit_assert(self, node: ast.Assert, parent: nodes.NodeNG) -> nodes.Assert: - """Visit a Assert node by returning a fresh instance of it.""" - newnode = nodes.Assert( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - msg: nodes.NodeNG | None = None - if node.msg: - msg = self.visit(node.msg, newnode) - newnode.postinit(self.visit(node.test, newnode), msg) - return newnode - - def check_type_comment( - self, - node: ast.Assign | ast.arg | ast.For | ast.AsyncFor | ast.With | ast.AsyncWith, - parent: ( - nodes.Assign - | nodes.Arguments - | nodes.For - | nodes.AsyncFor - | nodes.With - | nodes.AsyncWith - ), - ) -> nodes.NodeNG | None: - if not node.type_comment: - return None - - try: - type_comment_ast = self._parser_module.parse(node.type_comment) - except SyntaxError: - # Invalid type comment, just skip it. - return None - - # For '# type: # any comment' ast.parse returns a Module node, - # without any nodes in the body. - if not type_comment_ast.body: - return None - - type_object = self.visit(type_comment_ast.body[0], parent=parent) - if not isinstance(type_object, nodes.Expr): - return None - - return type_object.value - - def check_function_type_comment( - self, node: ast.FunctionDef | ast.AsyncFunctionDef, parent: nodes.NodeNG - ) -> tuple[nodes.NodeNG | None, list[nodes.NodeNG]] | None: - if not node.type_comment: - return None - - try: - type_comment_ast = parse_function_type_comment(node.type_comment) - except SyntaxError: - # Invalid type comment, just skip it. - return None - - if not type_comment_ast: - return None - - returns: nodes.NodeNG | None = None - argtypes: list[nodes.NodeNG] = [ - self.visit(elem, parent) for elem in (type_comment_ast.argtypes or []) - ] - if type_comment_ast.returns: - returns = self.visit(type_comment_ast.returns, parent) - - return returns, argtypes - - def visit_asyncfunctiondef( - self, node: ast.AsyncFunctionDef, parent: nodes.NodeNG - ) -> nodes.AsyncFunctionDef: - return self._visit_functiondef(nodes.AsyncFunctionDef, node, parent) - - def visit_asyncfor( - self, node: ast.AsyncFor, parent: nodes.NodeNG - ) -> nodes.AsyncFor: - return self._visit_for(nodes.AsyncFor, node, parent) - - def visit_await(self, node: ast.Await, parent: nodes.NodeNG) -> nodes.Await: - newnode = nodes.Await( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit(value=self.visit(node.value, newnode)) - return newnode - - def visit_asyncwith( - self, node: ast.AsyncWith, parent: nodes.NodeNG - ) -> nodes.AsyncWith: - return self._visit_with(nodes.AsyncWith, node, parent) - - def visit_assign(self, node: ast.Assign, parent: nodes.NodeNG) -> nodes.Assign: - """Visit a Assign node by returning a fresh instance of it.""" - newnode = nodes.Assign( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - type_annotation = self.check_type_comment(node, parent=newnode) - newnode.postinit( - targets=[self.visit(child, newnode) for child in node.targets], - value=self.visit(node.value, newnode), - type_annotation=type_annotation, - ) - return newnode - - def visit_annassign( - self, node: ast.AnnAssign, parent: nodes.NodeNG - ) -> nodes.AnnAssign: - """Visit an AnnAssign node by returning a fresh instance of it.""" - newnode = nodes.AnnAssign( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - target=self.visit(node.target, newnode), - annotation=self.visit(node.annotation, newnode), - simple=node.simple, - value=self.visit(node.value, newnode), - ) - return newnode - - @overload - def visit_assignname( - self, node: ast.AST, parent: nodes.NodeNG, node_name: str - ) -> nodes.AssignName: ... - - @overload - def visit_assignname( - self, node: ast.AST, parent: nodes.NodeNG, node_name: None - ) -> None: ... - - def visit_assignname( - self, node: ast.AST, parent: nodes.NodeNG, node_name: str | None - ) -> nodes.AssignName | None: - """Visit a node and return a AssignName node. - - Note: Method not called by 'visit' - """ - if node_name is None: - return None - newnode = nodes.AssignName( - name=node_name, - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - self._save_assignment(newnode) - return newnode - - def visit_augassign( - self, node: ast.AugAssign, parent: nodes.NodeNG - ) -> nodes.AugAssign: - """Visit a AugAssign node by returning a fresh instance of it.""" - newnode = nodes.AugAssign( - op=self._parser_module.bin_op_classes[type(node.op)] + "=", - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - self.visit(node.target, newnode), self.visit(node.value, newnode) - ) - return newnode - - def visit_binop(self, node: ast.BinOp, parent: nodes.NodeNG) -> nodes.BinOp: - """Visit a BinOp node by returning a fresh instance of it.""" - newnode = nodes.BinOp( - op=self._parser_module.bin_op_classes[type(node.op)], - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - self.visit(node.left, newnode), self.visit(node.right, newnode) - ) - return newnode - - def visit_boolop(self, node: ast.BoolOp, parent: nodes.NodeNG) -> nodes.BoolOp: - """Visit a BoolOp node by returning a fresh instance of it.""" - newnode = nodes.BoolOp( - op=self._parser_module.bool_op_classes[type(node.op)], - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit([self.visit(child, newnode) for child in node.values]) - return newnode - - def visit_break(self, node: ast.Break, parent: nodes.NodeNG) -> nodes.Break: - """Visit a Break node by returning a fresh instance of it.""" - return nodes.Break( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - - def visit_call(self, node: ast.Call, parent: nodes.NodeNG) -> nodes.Call: - """Visit a CallFunc node by returning a fresh instance of it.""" - newnode = nodes.Call( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - func=self.visit(node.func, newnode), - args=[self.visit(child, newnode) for child in node.args], - keywords=[self.visit(child, newnode) for child in node.keywords], - ) - return newnode - - def visit_classdef( - self, node: ast.ClassDef, parent: nodes.NodeNG, newstyle: bool = True - ) -> nodes.ClassDef: - """Visit a ClassDef node to become astroid.""" - node, doc_ast_node = self._get_doc(node) - newnode = nodes.ClassDef( - name=node.name, - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - metaclass = None - for keyword in node.keywords: - if keyword.arg == "metaclass": - metaclass = self.visit(keyword, newnode).value - break - decorators = self.visit_decorators(node, newnode) - newnode.postinit( - [self.visit(child, newnode) for child in node.bases], - [self.visit(child, newnode) for child in node.body], - decorators, - newstyle, - metaclass, - [ - self.visit(kwd, newnode) - for kwd in node.keywords - if kwd.arg != "metaclass" - ], - position=self._get_position_info(node, newnode), - doc_node=self.visit(doc_ast_node, newnode), - type_params=( - [self.visit(param, newnode) for param in node.type_params] - if PY312_PLUS - else [] - ), - ) - parent.set_local(newnode.name, newnode) - return newnode - - def visit_continue( - self, node: ast.Continue, parent: nodes.NodeNG - ) -> nodes.Continue: - """Visit a Continue node by returning a fresh instance of it.""" - return nodes.Continue( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - - def visit_compare(self, node: ast.Compare, parent: nodes.NodeNG) -> nodes.Compare: - """Visit a Compare node by returning a fresh instance of it.""" - newnode = nodes.Compare( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - self.visit(node.left, newnode), - [ - ( - self._parser_module.cmp_op_classes[op.__class__], - self.visit(expr, newnode), - ) - for (op, expr) in zip(node.ops, node.comparators) - ], - ) - return newnode - - def visit_comprehension( - self, node: ast.comprehension, parent: nodes.NodeNG - ) -> nodes.Comprehension: - """Visit a Comprehension node by returning a fresh instance of it.""" - newnode = nodes.Comprehension( - parent=parent, - # Comprehension nodes don't have these attributes - # see https://docs.python.org/3/library/ast.html#abstract-grammar - lineno=None, - col_offset=None, - end_lineno=None, - end_col_offset=None, - ) - newnode.postinit( - self.visit(node.target, newnode), - self.visit(node.iter, newnode), - [self.visit(child, newnode) for child in node.ifs], - bool(node.is_async), - ) - return newnode - - def visit_decorators( - self, - node: ast.ClassDef | ast.FunctionDef | ast.AsyncFunctionDef, - parent: nodes.NodeNG, - ) -> nodes.Decorators | None: - """Visit a Decorators node by returning a fresh instance of it. - - Note: Method not called by 'visit' - """ - if not node.decorator_list: - return None - # /!\ node is actually an _ast.FunctionDef node while - # parent is an astroid.nodes.FunctionDef node - - # Set the line number of the first decorator for Python 3.8+. - lineno = node.decorator_list[0].lineno - end_lineno = node.decorator_list[-1].end_lineno - end_col_offset = node.decorator_list[-1].end_col_offset - - newnode = nodes.Decorators( - lineno=lineno, - col_offset=node.col_offset, - end_lineno=end_lineno, - end_col_offset=end_col_offset, - parent=parent, - ) - newnode.postinit([self.visit(child, newnode) for child in node.decorator_list]) - return newnode - - def visit_delete(self, node: ast.Delete, parent: nodes.NodeNG) -> nodes.Delete: - """Visit a Delete node by returning a fresh instance of it.""" - newnode = nodes.Delete( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit([self.visit(child, newnode) for child in node.targets]) - return newnode - - def _visit_dict_items( - self, node: ast.Dict, parent: nodes.NodeNG, newnode: nodes.Dict - ) -> Generator[tuple[nodes.NodeNG, nodes.NodeNG]]: - for key, value in zip(node.keys, node.values): - rebuilt_key: nodes.NodeNG - rebuilt_value = self.visit(value, newnode) - if not key: - # Extended unpacking - rebuilt_key = nodes.DictUnpack( - lineno=rebuilt_value.lineno, - col_offset=rebuilt_value.col_offset, - end_lineno=rebuilt_value.end_lineno, - end_col_offset=rebuilt_value.end_col_offset, - parent=parent, - ) - else: - rebuilt_key = self.visit(key, newnode) - yield rebuilt_key, rebuilt_value - - def visit_dict(self, node: ast.Dict, parent: nodes.NodeNG) -> nodes.Dict: - """Visit a Dict node by returning a fresh instance of it.""" - newnode = nodes.Dict( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - items: list[tuple[InferenceResult, InferenceResult]] = list( - self._visit_dict_items(node, parent, newnode) - ) - newnode.postinit(items) - return newnode - - def visit_dictcomp( - self, node: ast.DictComp, parent: nodes.NodeNG - ) -> nodes.DictComp: - """Visit a DictComp node by returning a fresh instance of it.""" - newnode = nodes.DictComp( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - self.visit(node.key, newnode), - self.visit(node.value, newnode), - [self.visit(child, newnode) for child in node.generators], - ) - return newnode - - def visit_expr(self, node: ast.Expr, parent: nodes.NodeNG) -> nodes.Expr: - """Visit a Expr node by returning a fresh instance of it.""" - newnode = nodes.Expr( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit(self.visit(node.value, newnode)) - return newnode - - def visit_excepthandler( - self, node: ast.ExceptHandler, parent: nodes.NodeNG - ) -> nodes.ExceptHandler: - """Visit an ExceptHandler node by returning a fresh instance of it.""" - newnode = nodes.ExceptHandler( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - self.visit(node.type, newnode), - self.visit_assignname(node, newnode, node.name), - [self.visit(child, newnode) for child in node.body], - ) - return newnode - - @overload - def _visit_for( - self, cls: type[nodes.For], node: ast.For, parent: nodes.NodeNG - ) -> nodes.For: ... - - @overload - def _visit_for( - self, cls: type[nodes.AsyncFor], node: ast.AsyncFor, parent: nodes.NodeNG - ) -> nodes.AsyncFor: ... - - def _visit_for( - self, cls: type[_ForT], node: ast.For | ast.AsyncFor, parent: nodes.NodeNG - ) -> _ForT: - """Visit a For node by returning a fresh instance of it.""" - newnode = cls( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - type_annotation = self.check_type_comment(node, parent=newnode) - newnode.postinit( - target=self.visit(node.target, newnode), - iter=self.visit(node.iter, newnode), - body=[self.visit(child, newnode) for child in node.body], - orelse=[self.visit(child, newnode) for child in node.orelse], - type_annotation=type_annotation, - ) - return newnode - - def visit_for(self, node: ast.For, parent: nodes.NodeNG) -> nodes.For: - return self._visit_for(nodes.For, node, parent) - - def visit_importfrom( - self, node: ast.ImportFrom, parent: nodes.NodeNG - ) -> nodes.ImportFrom: - """Visit an ImportFrom node by returning a fresh instance of it.""" - names = [(alias.name, alias.asname) for alias in node.names] - newnode = nodes.ImportFrom( - fromname=node.module or "", - names=names, - level=node.level or None, - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - # store From names to add them to locals after building - self._import_from_nodes.append( - (newnode, self._global_names[-1].keys() if self._global_names else ()) - ) - return newnode - - @overload - def _visit_functiondef( - self, cls: type[nodes.FunctionDef], node: ast.FunctionDef, parent: nodes.NodeNG - ) -> nodes.FunctionDef: ... - - @overload - def _visit_functiondef( - self, - cls: type[nodes.AsyncFunctionDef], - node: ast.AsyncFunctionDef, - parent: nodes.NodeNG, - ) -> nodes.AsyncFunctionDef: ... - - def _visit_functiondef( - self, - cls: type[_FunctionT], - node: ast.FunctionDef | ast.AsyncFunctionDef, - parent: nodes.NodeNG, - ) -> _FunctionT: - """Visit an FunctionDef node to become astroid.""" - self._global_names.append({}) - node, doc_ast_node = self._get_doc(node) - - lineno = node.lineno - if node.decorator_list: - # Python 3.8 sets the line number of a decorated function - # to be the actual line number of the function, but the - # previous versions expected the decorator's line number instead. - # We reset the function's line number to that of the - # first decorator to maintain backward compatibility. - # It's not ideal but this discrepancy was baked into - # the framework for *years*. - lineno = node.decorator_list[0].lineno - - newnode = cls( - name=node.name, - lineno=lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - decorators = self.visit_decorators(node, newnode) - returns: nodes.NodeNG | None - if node.returns: - returns = self.visit(node.returns, newnode) - else: - returns = None - - type_comment_args = type_comment_returns = None - type_comment_annotation = self.check_function_type_comment(node, newnode) - if type_comment_annotation: - type_comment_returns, type_comment_args = type_comment_annotation - newnode.postinit( - args=self.visit(node.args, newnode), - body=[self.visit(child, newnode) for child in node.body], - decorators=decorators, - returns=returns, - type_comment_returns=type_comment_returns, - type_comment_args=type_comment_args, - position=self._get_position_info(node, newnode), - doc_node=self.visit(doc_ast_node, newnode), - type_params=( - [self.visit(param, newnode) for param in node.type_params] - if PY312_PLUS - else [] - ), - ) - self._global_names.pop() - parent.set_local(newnode.name, newnode) - return newnode - - def visit_functiondef( - self, node: ast.FunctionDef, parent: nodes.NodeNG - ) -> nodes.FunctionDef: - return self._visit_functiondef(nodes.FunctionDef, node, parent) - - def visit_generatorexp( - self, node: ast.GeneratorExp, parent: nodes.NodeNG - ) -> nodes.GeneratorExp: - """Visit a GeneratorExp node by returning a fresh instance of it.""" - newnode = nodes.GeneratorExp( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - self.visit(node.elt, newnode), - [self.visit(child, newnode) for child in node.generators], - ) - return newnode - - def visit_attribute( - self, node: ast.Attribute, parent: nodes.NodeNG - ) -> nodes.Attribute | nodes.AssignAttr | nodes.DelAttr: - """Visit an Attribute node by returning a fresh instance of it.""" - context = self._get_context(node) - newnode: nodes.Attribute | nodes.AssignAttr | nodes.DelAttr - if context == Context.Del: - # FIXME : maybe we should reintroduce and visit_delattr ? - # for instance, deactivating assign_ctx - newnode = nodes.DelAttr( - attrname=node.attr, - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - elif context == Context.Store: - newnode = nodes.AssignAttr( - attrname=node.attr, - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - # Prohibit a local save if we are in an ExceptHandler. - if not isinstance(parent, nodes.ExceptHandler): - # mypy doesn't recognize that newnode has to be AssignAttr because it - # doesn't support ParamSpec - # See https://github.com/python/mypy/issues/8645 - self._delayed_assattr.append(newnode) # type: ignore[arg-type] - else: - newnode = nodes.Attribute( - attrname=node.attr, - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit(self.visit(node.value, newnode)) - return newnode - - def visit_global(self, node: ast.Global, parent: nodes.NodeNG) -> nodes.Global: - """Visit a Global node to become astroid.""" - newnode = nodes.Global( - names=node.names, - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - if self._global_names: # global at the module level, no effect - for name in node.names: - self._global_names[-1].setdefault(name, []).append(newnode) - return newnode - - def visit_if(self, node: ast.If, parent: nodes.NodeNG) -> nodes.If: - """Visit an If node by returning a fresh instance of it.""" - newnode = nodes.If( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - self.visit(node.test, newnode), - [self.visit(child, newnode) for child in node.body], - [self.visit(child, newnode) for child in node.orelse], - ) - return newnode - - def visit_ifexp(self, node: ast.IfExp, parent: nodes.NodeNG) -> nodes.IfExp: - """Visit a IfExp node by returning a fresh instance of it.""" - newnode = nodes.IfExp( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - self.visit(node.test, newnode), - self.visit(node.body, newnode), - self.visit(node.orelse, newnode), - ) - return newnode - - def visit_import(self, node: ast.Import, parent: nodes.NodeNG) -> nodes.Import: - """Visit a Import node by returning a fresh instance of it.""" - names = [(alias.name, alias.asname) for alias in node.names] - newnode = nodes.Import( - names=names, - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - # save import names in parent's locals: - for name, asname in newnode.names: - name = (asname or name).split(".")[0] - if self._global_names and name in self._global_names[-1]: - parent.root().set_local(name, newnode) - else: - parent.set_local(name, newnode) - return newnode - - def visit_joinedstr( - self, node: ast.JoinedStr, parent: nodes.NodeNG - ) -> nodes.JoinedStr: - newnode = nodes.JoinedStr( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit([self.visit(child, newnode) for child in node.values]) - return newnode - - def visit_formattedvalue( - self, node: ast.FormattedValue, parent: nodes.NodeNG - ) -> nodes.FormattedValue: - newnode = nodes.FormattedValue( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - value=self.visit(node.value, newnode), - conversion=node.conversion, - format_spec=self.visit(node.format_spec, newnode), - ) - return newnode - - def visit_namedexpr( - self, node: ast.NamedExpr, parent: nodes.NodeNG - ) -> nodes.NamedExpr: - newnode = nodes.NamedExpr( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - self.visit(node.target, newnode), self.visit(node.value, newnode) - ) - return newnode - - def visit_keyword(self, node: ast.keyword, parent: nodes.NodeNG) -> nodes.Keyword: - """Visit a Keyword node by returning a fresh instance of it.""" - newnode = nodes.Keyword( - arg=node.arg, - # position attributes added in 3.9 - lineno=getattr(node, "lineno", None), - col_offset=getattr(node, "col_offset", None), - end_lineno=getattr(node, "end_lineno", None), - end_col_offset=getattr(node, "end_col_offset", None), - parent=parent, - ) - newnode.postinit(self.visit(node.value, newnode)) - return newnode - - def visit_lambda(self, node: ast.Lambda, parent: nodes.NodeNG) -> nodes.Lambda: - """Visit a Lambda node by returning a fresh instance of it.""" - newnode = nodes.Lambda( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit(self.visit(node.args, newnode), self.visit(node.body, newnode)) - return newnode - - def visit_list(self, node: ast.List, parent: nodes.NodeNG) -> nodes.List: - """Visit a List node by returning a fresh instance of it.""" - context = self._get_context(node) - newnode = nodes.List( - ctx=context, - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit([self.visit(child, newnode) for child in node.elts]) - return newnode - - def visit_listcomp( - self, node: ast.ListComp, parent: nodes.NodeNG - ) -> nodes.ListComp: - """Visit a ListComp node by returning a fresh instance of it.""" - newnode = nodes.ListComp( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - self.visit(node.elt, newnode), - [self.visit(child, newnode) for child in node.generators], - ) - return newnode - - def visit_name( - self, node: ast.Name, parent: nodes.NodeNG - ) -> nodes.Name | nodes.AssignName | nodes.DelName: - """Visit a Name node by returning a fresh instance of it.""" - context = self._get_context(node) - newnode: nodes.Name | nodes.AssignName | nodes.DelName - if context == Context.Del: - newnode = nodes.DelName( - name=node.id, - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - elif context == Context.Store: - newnode = nodes.AssignName( - name=node.id, - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - else: - newnode = nodes.Name( - name=node.id, - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - # XXX REMOVE me : - if context in (Context.Del, Context.Store): # 'Aug' ?? - newnode = cast((nodes.AssignName | nodes.DelName), newnode) - self._save_assignment(newnode) - return newnode - - def visit_nonlocal( - self, node: ast.Nonlocal, parent: nodes.NodeNG - ) -> nodes.Nonlocal: - """Visit a Nonlocal node and return a new instance of it.""" - return nodes.Nonlocal( - names=node.names, - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - - def visit_constant(self, node: ast.Constant, parent: nodes.NodeNG) -> nodes.Const: - """Visit a Constant node by returning a fresh instance of Const.""" - return nodes.Const( - value=node.value, - kind=node.kind, - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - - def visit_paramspec( - self, node: ast.ParamSpec, parent: nodes.NodeNG - ) -> nodes.ParamSpec: - """Visit a ParamSpec node by returning a fresh instance of it.""" - newnode = nodes.ParamSpec( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - # Add AssignName node for 'node.name' - # https://bugs.python.org/issue43994 - newnode.postinit( - name=self.visit_assignname(node, newnode, node.name), - default_value=( - self.visit(node.default_value, newnode) if PY313_PLUS else None - ), - ) - return newnode - - def visit_pass(self, node: ast.Pass, parent: nodes.NodeNG) -> nodes.Pass: - """Visit a Pass node by returning a fresh instance of it.""" - return nodes.Pass( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - - def visit_raise(self, node: ast.Raise, parent: nodes.NodeNG) -> nodes.Raise: - """Visit a Raise node by returning a fresh instance of it.""" - newnode = nodes.Raise( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - # no traceback; anyway it is not used in Pylint - newnode.postinit( - exc=self.visit(node.exc, newnode), - cause=self.visit(node.cause, newnode), - ) - return newnode - - def visit_return(self, node: ast.Return, parent: nodes.NodeNG) -> nodes.Return: - """Visit a Return node by returning a fresh instance of it.""" - newnode = nodes.Return( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit(self.visit(node.value, newnode)) - return newnode - - def visit_set(self, node: ast.Set, parent: nodes.NodeNG) -> nodes.Set: - """Visit a Set node by returning a fresh instance of it.""" - newnode = nodes.Set( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit([self.visit(child, newnode) for child in node.elts]) - return newnode - - def visit_setcomp(self, node: ast.SetComp, parent: nodes.NodeNG) -> nodes.SetComp: - """Visit a SetComp node by returning a fresh instance of it.""" - newnode = nodes.SetComp( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - self.visit(node.elt, newnode), - [self.visit(child, newnode) for child in node.generators], - ) - return newnode - - def visit_slice(self, node: ast.Slice, parent: nodes.Subscript) -> nodes.Slice: - """Visit a Slice node by returning a fresh instance of it.""" - newnode = nodes.Slice( - # position attributes added in 3.9 - lineno=getattr(node, "lineno", None), - col_offset=getattr(node, "col_offset", None), - end_lineno=getattr(node, "end_lineno", None), - end_col_offset=getattr(node, "end_col_offset", None), - parent=parent, - ) - newnode.postinit( - lower=self.visit(node.lower, newnode), - upper=self.visit(node.upper, newnode), - step=self.visit(node.step, newnode), - ) - return newnode - - def visit_subscript( - self, node: ast.Subscript, parent: nodes.NodeNG - ) -> nodes.Subscript: - """Visit a Subscript node by returning a fresh instance of it.""" - context = self._get_context(node) - newnode = nodes.Subscript( - ctx=context, - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - self.visit(node.value, newnode), self.visit(node.slice, newnode) - ) - return newnode - - def visit_starred(self, node: ast.Starred, parent: nodes.NodeNG) -> nodes.Starred: - """Visit a Starred node and return a new instance of it.""" - context = self._get_context(node) - newnode = nodes.Starred( - ctx=context, - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit(self.visit(node.value, newnode)) - return newnode - - def visit_try(self, node: ast.Try, parent: nodes.NodeNG) -> nodes.Try: - """Visit a Try node by returning a fresh instance of it""" - newnode = nodes.Try( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - body=[self.visit(child, newnode) for child in node.body], - handlers=[self.visit(child, newnode) for child in node.handlers], - orelse=[self.visit(child, newnode) for child in node.orelse], - finalbody=[self.visit(child, newnode) for child in node.finalbody], - ) - return newnode - - def visit_trystar(self, node: ast.TryStar, parent: nodes.NodeNG) -> nodes.TryStar: - newnode = nodes.TryStar( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - body=[self.visit(n, newnode) for n in node.body], - handlers=[self.visit(n, newnode) for n in node.handlers], - orelse=[self.visit(n, newnode) for n in node.orelse], - finalbody=[self.visit(n, newnode) for n in node.finalbody], - ) - return newnode - - def visit_tuple(self, node: ast.Tuple, parent: nodes.NodeNG) -> nodes.Tuple: - """Visit a Tuple node by returning a fresh instance of it.""" - context = self._get_context(node) - newnode = nodes.Tuple( - ctx=context, - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit([self.visit(child, newnode) for child in node.elts]) - return newnode - - def visit_typealias( - self, node: ast.TypeAlias, parent: nodes.NodeNG - ) -> nodes.TypeAlias: - """Visit a TypeAlias node by returning a fresh instance of it.""" - newnode = nodes.TypeAlias( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - name=self.visit(node.name, newnode), - type_params=[self.visit(p, newnode) for p in node.type_params], - value=self.visit(node.value, newnode), - ) - return newnode - - def visit_typevar(self, node: ast.TypeVar, parent: nodes.NodeNG) -> nodes.TypeVar: - """Visit a TypeVar node by returning a fresh instance of it.""" - newnode = nodes.TypeVar( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - # Add AssignName node for 'node.name' - # https://bugs.python.org/issue43994 - newnode.postinit( - name=self.visit_assignname(node, newnode, node.name), - bound=self.visit(node.bound, newnode), - default_value=( - self.visit(node.default_value, newnode) if PY313_PLUS else None - ), - ) - return newnode - - def visit_typevartuple( - self, node: ast.TypeVarTuple, parent: nodes.NodeNG - ) -> nodes.TypeVarTuple: - """Visit a TypeVarTuple node by returning a fresh instance of it.""" - newnode = nodes.TypeVarTuple( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - # Add AssignName node for 'node.name' - # https://bugs.python.org/issue43994 - newnode.postinit( - name=self.visit_assignname(node, newnode, node.name), - default_value=( - self.visit(node.default_value, newnode) if PY313_PLUS else None - ), - ) - return newnode - - def visit_unaryop(self, node: ast.UnaryOp, parent: nodes.NodeNG) -> nodes.UnaryOp: - """Visit a UnaryOp node by returning a fresh instance of it.""" - newnode = nodes.UnaryOp( - op=self._parser_module.unary_op_classes[node.op.__class__], - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit(self.visit(node.operand, newnode)) - return newnode - - def visit_while(self, node: ast.While, parent: nodes.NodeNG) -> nodes.While: - """Visit a While node by returning a fresh instance of it.""" - newnode = nodes.While( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - self.visit(node.test, newnode), - [self.visit(child, newnode) for child in node.body], - [self.visit(child, newnode) for child in node.orelse], - ) - return newnode - - @overload - def _visit_with( - self, cls: type[nodes.With], node: ast.With, parent: nodes.NodeNG - ) -> nodes.With: ... - - @overload - def _visit_with( - self, cls: type[nodes.AsyncWith], node: ast.AsyncWith, parent: nodes.NodeNG - ) -> nodes.AsyncWith: ... - - def _visit_with( - self, - cls: type[_WithT], - node: ast.With | ast.AsyncWith, - parent: nodes.NodeNG, - ) -> _WithT: - newnode = cls( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - - def visit_child( - child: ast.withitem, - ) -> tuple[nodes.NodeNG, nodes.NodeNG | None]: - expr = self.visit(child.context_expr, newnode) - var = self.visit(child.optional_vars, newnode) - return expr, var - - type_annotation = self.check_type_comment(node, parent=newnode) - newnode.postinit( - items=[visit_child(child) for child in node.items], - body=[self.visit(child, newnode) for child in node.body], - type_annotation=type_annotation, - ) - return newnode - - def visit_with(self, node: ast.With, parent: nodes.NodeNG) -> nodes.NodeNG: - return self._visit_with(nodes.With, node, parent) - - def visit_yield(self, node: ast.Yield, parent: nodes.NodeNG) -> nodes.NodeNG: - """Visit a Yield node by returning a fresh instance of it.""" - newnode = nodes.Yield( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit(self.visit(node.value, newnode)) - return newnode - - def visit_yieldfrom( - self, node: ast.YieldFrom, parent: nodes.NodeNG - ) -> nodes.NodeNG: - newnode = nodes.YieldFrom( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit(self.visit(node.value, newnode)) - return newnode - - def visit_match(self, node: ast.Match, parent: nodes.NodeNG) -> nodes.Match: - newnode = nodes.Match( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - subject=self.visit(node.subject, newnode), - cases=[self.visit(case, newnode) for case in node.cases], - ) - return newnode - - def visit_matchcase( - self, node: ast.match_case, parent: nodes.NodeNG - ) -> nodes.MatchCase: - newnode = nodes.MatchCase(parent=parent) - newnode.postinit( - pattern=self.visit(node.pattern, newnode), - guard=self.visit(node.guard, newnode), - body=[self.visit(child, newnode) for child in node.body], - ) - return newnode - - def visit_matchvalue( - self, node: ast.MatchValue, parent: nodes.NodeNG - ) -> nodes.MatchValue: - newnode = nodes.MatchValue( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit(value=self.visit(node.value, newnode)) - return newnode - - def visit_matchsingleton( - self, node: ast.MatchSingleton, parent: nodes.NodeNG - ) -> nodes.MatchSingleton: - return nodes.MatchSingleton( - value=node.value, - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - - def visit_matchsequence( - self, node: ast.MatchSequence, parent: nodes.NodeNG - ) -> nodes.MatchSequence: - newnode = nodes.MatchSequence( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - patterns=[self.visit(pattern, newnode) for pattern in node.patterns] - ) - return newnode - - def visit_matchmapping( - self, node: ast.MatchMapping, parent: nodes.NodeNG - ) -> nodes.MatchMapping: - newnode = nodes.MatchMapping( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - # Add AssignName node for 'node.name' - # https://bugs.python.org/issue43994 - newnode.postinit( - keys=[self.visit(child, newnode) for child in node.keys], - patterns=[self.visit(pattern, newnode) for pattern in node.patterns], - rest=self.visit_assignname(node, newnode, node.rest), - ) - return newnode - - def visit_matchclass( - self, node: ast.MatchClass, parent: nodes.NodeNG - ) -> nodes.MatchClass: - newnode = nodes.MatchClass( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - cls=self.visit(node.cls, newnode), - patterns=[self.visit(pattern, newnode) for pattern in node.patterns], - kwd_attrs=node.kwd_attrs, - kwd_patterns=[ - self.visit(pattern, newnode) for pattern in node.kwd_patterns - ], - ) - return newnode - - def visit_matchstar( - self, node: ast.MatchStar, parent: nodes.NodeNG - ) -> nodes.MatchStar: - newnode = nodes.MatchStar( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - # Add AssignName node for 'node.name' - # https://bugs.python.org/issue43994 - newnode.postinit(name=self.visit_assignname(node, newnode, node.name)) - return newnode - - def visit_matchas(self, node: ast.MatchAs, parent: nodes.NodeNG) -> nodes.MatchAs: - newnode = nodes.MatchAs( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - # Add AssignName node for 'node.name' - # https://bugs.python.org/issue43994 - newnode.postinit( - pattern=self.visit(node.pattern, newnode), - name=self.visit_assignname(node, newnode, node.name), - ) - return newnode - - def visit_matchor(self, node: ast.MatchOr, parent: nodes.NodeNG) -> nodes.MatchOr: - newnode = nodes.MatchOr( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - patterns=[self.visit(pattern, newnode) for pattern in node.patterns] - ) - return newnode - - if sys.version_info >= (3, 14): - - def visit_templatestr( - self, node: ast.TemplateStr, parent: nodes.NodeNG - ) -> nodes.TemplateStr: - newnode = nodes.TemplateStr( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - values=[self.visit(value, newnode) for value in node.values] - ) - return newnode - - def visit_interpolation( - self, node: ast.Interpolation, parent: nodes.NodeNG - ) -> nodes.Interpolation: - newnode = nodes.Interpolation( - lineno=node.lineno, - col_offset=node.col_offset, - end_lineno=node.end_lineno, - end_col_offset=node.end_col_offset, - parent=parent, - ) - newnode.postinit( - value=self.visit(node.value, parent), - str=node.str, - conversion=node.conversion, - format_spec=self.visit(node.format_spec, parent), - ) - return newnode diff --git a/venv/lib/python3.12/site-packages/astroid/test_utils.py b/venv/lib/python3.12/site-packages/astroid/test_utils.py deleted file mode 100644 index afddb1a..0000000 --- a/venv/lib/python3.12/site-packages/astroid/test_utils.py +++ /dev/null @@ -1,78 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -"""Utility functions for test code that uses astroid ASTs as input.""" - -from __future__ import annotations - -import contextlib -import functools -import sys -import warnings -from collections.abc import Callable - -import pytest - -from astroid import manager, nodes, transforms - - -def require_version(minver: str = "0.0.0", maxver: str = "4.0.0") -> Callable: - """Compare version of python interpreter to the given one and skips the test if older.""" - - def parse(python_version: str) -> tuple[int, ...]: - try: - return tuple(int(v) for v in python_version.split(".")) - except ValueError as e: - msg = f"{python_version} is not a correct version : should be X.Y[.Z]." - raise ValueError(msg) from e - - min_version = parse(minver) - max_version = parse(maxver) - - def check_require_version(f): - current: tuple[int, int, int] = sys.version_info[:3] - if min_version < current <= max_version: - return f - - version: str = ".".join(str(v) for v in sys.version_info) - - @functools.wraps(f) - def new_f(*args, **kwargs): - if current <= min_version: - pytest.skip(f"Needs Python > {minver}. Current version is {version}.") - elif current > max_version: - pytest.skip(f"Needs Python <= {maxver}. Current version is {version}.") - - return new_f - - return check_require_version - - -def get_name_node(start_from, name, index=0): - return [n for n in start_from.nodes_of_class(nodes.Name) if n.name == name][index] - - -@contextlib.contextmanager -def enable_warning(warning): - warnings.simplefilter("always", warning) - try: - yield - finally: - # Reset it to default value, so it will take - # into account the values from the -W flag. - warnings.simplefilter("default", warning) - - -def brainless_manager(): - m = manager.AstroidManager() - # avoid caching into the AstroidManager borg since we get problems - # with other tests : - m.__dict__ = {} - m._failed_import_hooks = [] - m.astroid_cache = {} - m._mod_file_cache = {} - m._transform = transforms.TransformVisitor() - m.extension_package_whitelist = set() - m.module_denylist = set() - return m diff --git a/venv/lib/python3.12/site-packages/astroid/transforms.py b/venv/lib/python3.12/site-packages/astroid/transforms.py deleted file mode 100644 index d44ec3d..0000000 --- a/venv/lib/python3.12/site-packages/astroid/transforms.py +++ /dev/null @@ -1,163 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from __future__ import annotations - -import warnings -from collections import defaultdict -from collections.abc import Callable -from typing import TYPE_CHECKING, TypeVar, Union, cast, overload - -from astroid.context import _invalidate_cache -from astroid.typing import SuccessfulInferenceResult, TransformFn - -if TYPE_CHECKING: - from astroid import nodes - - _SuccessfulInferenceResultT = TypeVar( - "_SuccessfulInferenceResultT", bound=SuccessfulInferenceResult - ) - _Predicate = Callable[[_SuccessfulInferenceResultT], bool] | None - -# pylint: disable-next=consider-alternative-union-syntax -_Vistables = Union[ - "nodes.NodeNG", list["nodes.NodeNG"], tuple["nodes.NodeNG", ...], str, None -] -_VisitReturns = ( - SuccessfulInferenceResult - | list[SuccessfulInferenceResult] - | tuple[SuccessfulInferenceResult, ...] - | str - | None -) - - -class TransformVisitor: - """A visitor for handling transforms. - - The standard approach of using it is to call - :meth:`~visit` with an *astroid* module and the class - will take care of the rest, walking the tree and running the - transforms for each encountered node. - - Based on its usage in AstroidManager.brain, it should not be reinstantiated. - """ - - def __init__(self) -> None: - # The typing here is incorrect, but it's the best we can do - # Refer to register_transform and unregister_transform for the correct types - self.transforms: defaultdict[ - type[SuccessfulInferenceResult], - list[ - tuple[ - TransformFn[SuccessfulInferenceResult], - _Predicate[SuccessfulInferenceResult], - ] - ], - ] = defaultdict(list) - - def _transform(self, node: SuccessfulInferenceResult) -> SuccessfulInferenceResult: - """Call matching transforms for the given node if any and return the - transformed node. - """ - cls = node.__class__ - - for transform_func, predicate in self.transforms[cls]: - if predicate is None or predicate(node): - ret = transform_func(node) - # if the transformation function returns something, it's - # expected to be a replacement for the node - if ret is not None: - _invalidate_cache() - node = ret - if ret.__class__ != cls: - # Can no longer apply the rest of the transforms. - break - return node - - def _visit(self, node: nodes.NodeNG) -> SuccessfulInferenceResult: - for name in node._astroid_fields: - value = getattr(node, name) - if TYPE_CHECKING: - value = cast(_Vistables, value) - - visited = self._visit_generic(value) - if visited != value: - setattr(node, name, visited) - return self._transform(node) - - @overload - def _visit_generic(self, node: None) -> None: ... - - @overload - def _visit_generic(self, node: str) -> str: ... - - @overload - def _visit_generic( - self, node: list[nodes.NodeNG] - ) -> list[SuccessfulInferenceResult]: ... - - @overload - def _visit_generic( - self, node: tuple[nodes.NodeNG, ...] - ) -> tuple[SuccessfulInferenceResult, ...]: ... - - @overload - def _visit_generic(self, node: nodes.NodeNG) -> SuccessfulInferenceResult: ... - - def _visit_generic(self, node: _Vistables) -> _VisitReturns: - if not node: - return node - if isinstance(node, list): - return [self._visit_generic(child) for child in node] - if isinstance(node, tuple): - return tuple(self._visit_generic(child) for child in node) - if isinstance(node, str): - return node - - try: - return self._visit(node) - except RecursionError: - # Returning the node untransformed is better than giving up. - warnings.warn( - f"Astroid was unable to transform {node}.\n" - "Some functionality will be missing unless the system recursion limit is lifted.\n" - "From pylint, try: --init-hook='import sys; sys.setrecursionlimit(2000)' or higher.", - UserWarning, - stacklevel=0, - ) - return node - - def register_transform( - self, - node_class: type[_SuccessfulInferenceResultT], - transform: TransformFn[_SuccessfulInferenceResultT], - predicate: _Predicate[_SuccessfulInferenceResultT] | None = None, - ) -> None: - """Register `transform(node)` function to be applied on the given node. - - The transform will only be applied if `predicate` is None or returns true - when called with the node as argument. - - The transform function may return a value which is then used to - substitute the original node in the tree. - """ - self.transforms[node_class].append((transform, predicate)) # type: ignore[index, arg-type] - - def unregister_transform( - self, - node_class: type[_SuccessfulInferenceResultT], - transform: TransformFn[_SuccessfulInferenceResultT], - predicate: _Predicate[_SuccessfulInferenceResultT] | None = None, - ) -> None: - """Unregister the given transform.""" - self.transforms[node_class].remove((transform, predicate)) # type: ignore[index, arg-type] - - def visit(self, node: nodes.NodeNG) -> SuccessfulInferenceResult: - """Walk the given astroid *tree* and transform each encountered node. - - Only the nodes which have transforms registered will actually - be replaced or changed. - """ - return self._visit(node) diff --git a/venv/lib/python3.12/site-packages/astroid/typing.py b/venv/lib/python3.12/site-packages/astroid/typing.py deleted file mode 100644 index 37ea434..0000000 --- a/venv/lib/python3.12/site-packages/astroid/typing.py +++ /dev/null @@ -1,98 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - -from __future__ import annotations - -from collections.abc import Callable, Generator -from typing import ( - TYPE_CHECKING, - Any, - Generic, - Protocol, - TypedDict, - TypeVar, - Union, -) - -if TYPE_CHECKING: - from collections.abc import Iterator - - from astroid import bases, exceptions, nodes, transforms, util - from astroid.context import InferenceContext - from astroid.interpreter._import import spec - - -class InferenceErrorInfo(TypedDict): - """Store additional Inference error information - raised with StopIteration exception. - """ - - node: nodes.NodeNG - context: InferenceContext | None - - -class AstroidManagerBrain(TypedDict): - """Dictionary to store relevant information for a AstroidManager class.""" - - astroid_cache: dict[str, nodes.Module] - _mod_file_cache: dict[ - tuple[str, str | None], spec.ModuleSpec | exceptions.AstroidImportError - ] - _failed_import_hooks: list[Callable[[str], nodes.Module]] - always_load_extensions: bool - optimize_ast: bool - max_inferable_values: int - extension_package_whitelist: set[str] - _transform: transforms.TransformVisitor - - -# pylint: disable=consider-alternative-union-syntax -InferenceResult = Union["nodes.NodeNG", "util.UninferableBase", "bases.Proxy"] -SuccessfulInferenceResult = Union["nodes.NodeNG", "bases.Proxy"] -_SuccessfulInferenceResultT = TypeVar( - "_SuccessfulInferenceResultT", bound=SuccessfulInferenceResult -) -_SuccessfulInferenceResultT_contra = TypeVar( - "_SuccessfulInferenceResultT_contra", - bound=SuccessfulInferenceResult, - contravariant=True, -) - -ConstFactoryResult = Union[ - "nodes.List", - "nodes.Set", - "nodes.Tuple", - "nodes.Dict", - "nodes.Const", - "nodes.EmptyNode", -] - -InferBinaryOp = Callable[ - [ - _SuccessfulInferenceResultT, - Union["nodes.AugAssign", "nodes.BinOp"], - str, - InferenceResult, - "InferenceContext", - SuccessfulInferenceResult, - ], - Generator[InferenceResult], -] - - -class InferFn(Protocol, Generic[_SuccessfulInferenceResultT_contra]): - def __call__( - self, - node: _SuccessfulInferenceResultT_contra, - context: InferenceContext | None = None, - **kwargs: Any, - ) -> Iterator[InferenceResult]: ... # pragma: no cover - - -class TransformFn(Protocol, Generic[_SuccessfulInferenceResultT]): - def __call__( - self, - node: _SuccessfulInferenceResultT, - infer_function: InferFn[_SuccessfulInferenceResultT] = ..., - ) -> _SuccessfulInferenceResultT | None: ... # pragma: no cover diff --git a/venv/lib/python3.12/site-packages/astroid/util.py b/venv/lib/python3.12/site-packages/astroid/util.py deleted file mode 100644 index 510b81c..0000000 --- a/venv/lib/python3.12/site-packages/astroid/util.py +++ /dev/null @@ -1,159 +0,0 @@ -# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html -# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE -# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt - - -from __future__ import annotations - -import warnings -from typing import TYPE_CHECKING, Any, Final, Literal - -from astroid.exceptions import InferenceError - -if TYPE_CHECKING: - from astroid import bases, nodes - from astroid.context import InferenceContext - from astroid.typing import InferenceResult - - -class UninferableBase: - """Special inference object, which is returned when inference fails. - - This is meant to be used as a singleton. Use astroid.util.Uninferable to access it. - """ - - def __repr__(self) -> Literal["Uninferable"]: - return "Uninferable" - - __str__ = __repr__ - - def __getattribute__(self, name: str) -> Any: - if name == "next": - raise AttributeError("next method should not be called") - if name.startswith("__") and name.endswith("__"): - return object.__getattribute__(self, name) - if name == "accept": - return object.__getattribute__(self, name) - return self - - def __call__(self, *args: Any, **kwargs: Any) -> UninferableBase: - return self - - def __bool__(self) -> Literal[False]: - return False - - __nonzero__ = __bool__ - - def accept(self, visitor): - return visitor.visit_uninferable(self) - - -Uninferable: Final = UninferableBase() - - -class BadOperationMessage: - """Object which describes a TypeError occurred somewhere in the inference chain. - - This is not an exception, but a container object which holds the types and - the error which occurred. - """ - - -class BadUnaryOperationMessage(BadOperationMessage): - """Object which describes operational failures on UnaryOps.""" - - def __init__(self, operand, op, error): - self.operand = operand - self.op = op - self.error = error - - @property - def _object_type_helper(self): - from astroid import helpers # pylint: disable=import-outside-toplevel - - return helpers.object_type - - def _object_type(self, obj): - objtype = self._object_type_helper(obj) - if isinstance(objtype, UninferableBase): - return None - - return objtype - - def __str__(self) -> str: - if hasattr(self.operand, "name"): - operand_type = self.operand.name - else: - object_type = self._object_type(self.operand) - if hasattr(object_type, "name"): - operand_type = object_type.name - else: - # Just fallback to as_string - operand_type = object_type.as_string() - - msg = "bad operand type for unary {}: {}" - return msg.format(self.op, operand_type) - - -class BadBinaryOperationMessage(BadOperationMessage): - """Object which describes type errors for BinOps.""" - - def __init__(self, left_type, op, right_type): - self.left_type = left_type - self.right_type = right_type - self.op = op - - def __str__(self) -> str: - msg = "unsupported operand type(s) for {}: {!r} and {!r}" - return msg.format(self.op, self.left_type.name, self.right_type.name) - - -def _instancecheck(cls, other) -> bool: - wrapped = cls.__wrapped__ - other_cls = other.__class__ - is_instance_of = wrapped is other_cls or issubclass(other_cls, wrapped) - warnings.warn( - "%r is deprecated and slated for removal in astroid " - "2.0, use %r instead" % (cls.__class__.__name__, wrapped.__name__), - PendingDeprecationWarning, - stacklevel=2, - ) - return is_instance_of - - -def check_warnings_filter() -> bool: - """Return True if any other than the default DeprecationWarning filter is enabled. - - https://docs.python.org/3/library/warnings.html#default-warning-filter - """ - return any( - issubclass(DeprecationWarning, filter[2]) - and filter[0] != "ignore" - and filter[3] != "__main__" - for filter in warnings.filters - ) - - -def safe_infer( - node: nodes.NodeNG | bases.Proxy | UninferableBase, - context: InferenceContext | None = None, -) -> InferenceResult | None: - """Return the inferred value for the given node. - - Return None if inference failed or if there is some ambiguity (more than - one node has been inferred). - """ - if isinstance(node, UninferableBase): - return node - try: - inferit = node.infer(context=context) - value = next(inferit) - except (InferenceError, StopIteration): - return None - try: - next(inferit) - return None # None if there is ambiguity on the inferred node - except InferenceError: - return None # there is some kind of ambiguity - except StopIteration: - return value diff --git a/venv/lib/python3.12/site-packages/autopep8-2.0.4.dist-info/AUTHORS.rst b/venv/lib/python3.12/site-packages/autopep8-2.0.4.dist-info/AUTHORS.rst deleted file mode 100644 index e2781e4..0000000 --- a/venv/lib/python3.12/site-packages/autopep8-2.0.4.dist-info/AUTHORS.rst +++ /dev/null @@ -1,48 +0,0 @@ -Main contributors ------------------ -- Hideo Hattori (https://github.com/hhatto) -- Steven Myint (https://github.com/myint) -- Bill Wendling (https://github.com/gwelymernans) - -Patches -------- -- Fraser Tweedale (https://github.com/frasertweedale) -- clach04 (https://github.com/clach04) -- Marc Abramowitz (https://github.com/msabramo) -- dellis23 (https://github.com/dellis23) -- Sam Vilain (https://github.com/samv) -- Florent Xicluna (https://github.com/florentx) -- Andras Tim (https://github.com/andras-tim) -- tomscytale (https://github.com/tomscytale) -- Filip Noetzel (https://github.com/peritus) -- Erik Bray (https://github.com/iguananaut) -- Christopher Medrela (https://github.com/chrismedrela) -- 小明 (https://github.com/dongweiming) -- Andy Hayden (https://github.com/hayd) -- Fabio Zadrozny (https://github.com/fabioz) -- Alex Chernetz (https://github.com/achernet) -- Marc Schlaich (https://github.com/schlamar) -- E. M. Bray (https://github.com/embray) -- Thomas Hisch (https://github.com/thisch) -- Florian Best (https://github.com/spaceone) -- Ian Clark (https://github.com/evenicoulddoit) -- Khairi Hafsham (https://github.com/khairihafsham) -- Neil Halelamien (https://github.com/neilsh) -- Hashem Nasarat (https://github.com/Hnasar) -- Hugo van Kemenade (https://github.com/hugovk) -- gmbnomis (https://github.com/gmbnomis) -- Samuel Lelièvre (https://github.com/slel) -- bigredengineer (https://github.com/bigredengineer) -- Kai Chen (https://github.com/kx-chen) -- Anthony Sottile (https://github.com/asottile) -- 秋葉 (https://github.com/Hanaasagi) -- Christian Clauss (https://github.com/cclauss) -- tobixx (https://github.com/tobixx) -- bigredengineer (https://github.com/bigredengineer) -- Bastien Gérard (https://github.com/bagerard) -- nicolasbonifas (https://github.com/nicolasbonifas) -- Andrii Yurchuk (https://github.com/Ch00k) -- José M. Guisado (https://github.com/pvxe) -- Dai Truong (https://github.com/NovaDev94) -- jnozsc (https://github.com/jnozsc) -- Edwin Shepherd (https://github.com/shardros) diff --git a/venv/lib/python3.12/site-packages/autopep8-2.0.4.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/autopep8-2.0.4.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/autopep8-2.0.4.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/autopep8-2.0.4.dist-info/LICENSE b/venv/lib/python3.12/site-packages/autopep8-2.0.4.dist-info/LICENSE deleted file mode 100644 index df9738f..0000000 --- a/venv/lib/python3.12/site-packages/autopep8-2.0.4.dist-info/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright (C) 2010-2011 Hideo Hattori -Copyright (C) 2011-2013 Hideo Hattori, Steven Myint -Copyright (C) 2013-2016 Hideo Hattori, Steven Myint, Bill Wendling - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/venv/lib/python3.12/site-packages/autopep8-2.0.4.dist-info/METADATA b/venv/lib/python3.12/site-packages/autopep8-2.0.4.dist-info/METADATA deleted file mode 100644 index 826d19e..0000000 --- a/venv/lib/python3.12/site-packages/autopep8-2.0.4.dist-info/METADATA +++ /dev/null @@ -1,477 +0,0 @@ -Metadata-Version: 2.1 -Name: autopep8 -Version: 2.0.4 -Summary: A tool that automatically formats Python code to conform to the PEP 8 style guide -Home-page: https://github.com/hhatto/autopep8 -Author: Hideo Hattori -Author-email: hhatto.jp@gmail.com -License: Expat License -Keywords: automation,pep8,format,pycodestyle -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Console -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Software Development :: Quality Assurance -Requires-Python: >=3.6 -License-File: LICENSE -License-File: AUTHORS.rst -Requires-Dist: pycodestyle >=2.10.0 -Requires-Dist: tomli ; python_version < "3.11" - -======== -autopep8 -======== - -.. image:: https://img.shields.io/pypi/v/autopep8.svg - :target: https://pypi.org/project/autopep8/ - :alt: PyPI Version - -.. image:: https://github.com/hhatto/autopep8/workflows/Python%20package/badge.svg - :target: https://github.com/hhatto/autopep8/actions - :alt: Build status - -.. image:: https://codecov.io/gh/hhatto/autopep8/branch/main/graph/badge.svg - :target: https://codecov.io/gh/hhatto/autopep8 - :alt: Code Coverage - -autopep8 automatically formats Python code to conform to the `PEP 8`_ style -guide. It uses the pycodestyle_ utility to determine what parts of the code -needs to be formatted. autopep8 is capable of fixing most of the formatting -issues_ that can be reported by pycodestyle. - -.. _PEP 8: https://www.python.org/dev/peps/pep-0008/ -.. _issues: https://pycodestyle.readthedocs.org/en/latest/intro.html#error-codes - -.. contents:: - - -Installation -============ - -From pip:: - - $ pip install --upgrade autopep8 - -Consider using the ``--user`` option_. - -.. _option: https://pip.pypa.io/en/latest/user_guide/#user-installs - - -Requirements -============ - -autopep8 requires pycodestyle_. - -.. _pycodestyle: https://github.com/PyCQA/pycodestyle - - -Usage -===== - -To modify a file in place (with aggressive level 2):: - - $ autopep8 --in-place --aggressive --aggressive - -Before running autopep8. - -.. code-block:: python - - import math, sys; - - def example1(): - ####This is a long comment. This should be wrapped to fit within 72 characters. - some_tuple=( 1,2, 3,'a' ); - some_variable={'long':'Long code lines should be wrapped within 79 characters.', - 'other':[math.pi, 100,200,300,9876543210,'This is a long string that goes on'], - 'more':{'inner':'This whole logical line should be wrapped.',some_tuple:[1, - 20,300,40000,500000000,60000000000000000]}} - return (some_tuple, some_variable) - def example2(): return {'has_key() is deprecated':True}.has_key({'f':2}.has_key('')); - class Example3( object ): - def __init__ ( self, bar ): - #Comments should have a space after the hash. - if bar : bar+=1; bar=bar* bar ; return bar - else: - some_string = """ - Indentation in multiline strings should not be touched. - Only actual code should be reindented. - """ - return (sys.path, some_string) - -After running autopep8. - -.. code-block:: python - - import math - import sys - - - def example1(): - # This is a long comment. This should be wrapped to fit within 72 - # characters. - some_tuple = (1, 2, 3, 'a') - some_variable = { - 'long': 'Long code lines should be wrapped within 79 characters.', - 'other': [ - math.pi, - 100, - 200, - 300, - 9876543210, - 'This is a long string that goes on'], - 'more': { - 'inner': 'This whole logical line should be wrapped.', - some_tuple: [ - 1, - 20, - 300, - 40000, - 500000000, - 60000000000000000]}} - return (some_tuple, some_variable) - - - def example2(): return ('' in {'f': 2}) in {'has_key() is deprecated': True} - - - class Example3(object): - def __init__(self, bar): - # Comments should have a space after the hash. - if bar: - bar += 1 - bar = bar * bar - return bar - else: - some_string = """ - Indentation in multiline strings should not be touched. - Only actual code should be reindented. - """ - return (sys.path, some_string) - -Options:: - - usage: autopep8 [-h] [--version] [-v] [-d] [-i] [--global-config filename] - [--ignore-local-config] [-r] [-j n] [-p n] [-a] - [--experimental] [--exclude globs] [--list-fixes] - [--ignore errors] [--select errors] [--max-line-length n] - [--line-range line line] [--hang-closing] [--exit-code] - [files [files ...]] - - Automatically formats Python code to conform to the PEP 8 style guide. - - positional arguments: - files files to format or '-' for standard in - - optional arguments: - -h, --help show this help message and exit - --version show program's version number and exit - -v, --verbose print verbose messages; multiple -v result in more - verbose messages - -d, --diff print the diff for the fixed source - -i, --in-place make changes to files in place - --global-config filename - path to a global pep8 config file; if this file does - not exist then this is ignored (default: - ~/.config/pep8) - --ignore-local-config - don't look for and apply local config files; if not - passed, defaults are updated with any config files in - the project's root directory - -r, --recursive run recursively over directories; must be used with - --in-place or --diff - -j n, --jobs n number of parallel jobs; match CPU count if value is - less than 1 - -p n, --pep8-passes n - maximum number of additional pep8 passes (default: - infinite) - -a, --aggressive enable non-whitespace changes; multiple -a result in - more aggressive changes - --experimental enable experimental fixes - --exclude globs exclude file/directory names that match these comma- - separated globs - --list-fixes list codes for fixes; used by --ignore and --select - --ignore errors do not fix these errors/warnings (default: - E226,E24,W50,W690) - --select errors fix only these errors/warnings (e.g. E4,W) - --max-line-length n set maximum allowed line length (default: 79) - --line-range line line, --range line line - only fix errors found within this inclusive range of - line numbers (e.g. 1 99); line numbers are indexed at - 1 - --hang-closing hang-closing option passed to pycodestyle - --exit-code change to behavior of exit code. default behavior of - return value, 0 is no differences, 1 is error exit. - return 2 when add this option. 2 is exists - differences. - - -Features -======== - -autopep8 fixes the following issues_ reported by pycodestyle_:: - - E101 - Reindent all lines. - E11 - Fix indentation. - E121 - Fix indentation to be a multiple of four. - E122 - Add absent indentation for hanging indentation. - E123 - Align closing bracket to match opening bracket. - E124 - Align closing bracket to match visual indentation. - E125 - Indent to distinguish line from next logical line. - E126 - Fix over-indented hanging indentation. - E127 - Fix visual indentation. - E128 - Fix visual indentation. - E129 - Fix visual indentation. - E131 - Fix hanging indent for unaligned continuation line. - E133 - Fix missing indentation for closing bracket. - E20 - Remove extraneous whitespace. - E211 - Remove extraneous whitespace. - E22 - Fix extraneous whitespace around keywords. - E224 - Remove extraneous whitespace around operator. - E225 - Fix missing whitespace around operator. - E226 - Fix missing whitespace around arithmetic operator. - E227 - Fix missing whitespace around bitwise/shift operator. - E228 - Fix missing whitespace around modulo operator. - E231 - Add missing whitespace. - E241 - Fix extraneous whitespace around keywords. - E242 - Remove extraneous whitespace around operator. - E251 - Remove whitespace around parameter '=' sign. - E252 - Missing whitespace around parameter equals. - E26 - Fix spacing after comment hash for inline comments. - E265 - Fix spacing after comment hash for block comments. - E266 - Fix too many leading '#' for block comments. - E27 - Fix extraneous whitespace around keywords. - E301 - Add missing blank line. - E302 - Add missing 2 blank lines. - E303 - Remove extra blank lines. - E304 - Remove blank line following function decorator. - E305 - Expected 2 blank lines after end of function or class. - E306 - Expected 1 blank line before a nested definition. - E401 - Put imports on separate lines. - E402 - Fix module level import not at top of file - E501 - Try to make lines fit within --max-line-length characters. - E502 - Remove extraneous escape of newline. - E701 - Put colon-separated compound statement on separate lines. - E70 - Put semicolon-separated compound statement on separate lines. - E711 - Fix comparison with None. - E712 - Fix comparison with boolean. - E713 - Use 'not in' for test for membership. - E714 - Use 'is not' test for object identity. - E721 - Use "isinstance()" instead of comparing types directly. - E722 - Fix bare except. - E731 - Use a def when use do not assign a lambda expression. - W291 - Remove trailing whitespace. - W292 - Add a single newline at the end of the file. - W293 - Remove trailing whitespace on blank line. - W391 - Remove trailing blank lines. - W503 - Fix line break before binary operator. - W504 - Fix line break after binary operator. - W605 - Fix invalid escape sequence 'x'. - W690 - Fix various deprecated code (via lib2to3). - -autopep8 also fixes some issues not found by pycodestyle_. - -- Correct deprecated or non-idiomatic Python code (via ``lib2to3``). Use this - for making Python 2.7 code more compatible with Python 3. (This is triggered - if ``W690`` is enabled.) -- Normalize files with mixed line endings. -- Put a blank line between a class docstring and its first method - declaration. (Enabled with ``E301``.) -- Remove blank lines between a function declaration and its docstring. (Enabled - with ``E303``.) - -autopep8 avoids fixing some issues found by pycodestyle_. - -- ``E112``/``E113`` for non comments are reports of bad indentation that break - syntax rules. These should not be modified at all. -- ``E265``, which refers to spacing after comment hash, is ignored if the - comment looks like code. autopep8 avoids modifying these since they are not - real comments. If you really want to get rid of the pycodestyle_ warning, - consider just removing the commented-out code. (This can be automated via - eradicate_.) - -.. _eradicate: https://github.com/myint/eradicate - - -More advanced usage -=================== - -By default autopep8 only makes whitespace changes. Thus, by default, it does -not fix ``E711`` and ``E712``. (Changing ``x == None`` to ``x is None`` may -change the meaning of the program if ``x`` has its ``__eq__`` method -overridden.) Nor does it correct deprecated code ``W6``. To enable these -more aggressive fixes, use the ``--aggressive`` option:: - - $ autopep8 --aggressive - -Use multiple ``--aggressive`` to increase the aggressiveness level. For -example, ``E712`` requires aggressiveness level 2 (since ``x == True`` could be -changed to either ``x`` or ``x is True``, but autopep8 chooses the former). - -``--aggressive`` will also shorten lines more aggressively. It will also remove -trailing whitespace more aggressively. (Usually, we don't touch trailing -whitespace in docstrings and other multiline strings. And to do even more -aggressive changes to docstrings, use docformatter_.) - -.. _docformatter: https://github.com/myint/docformatter - -To enable only a subset of the fixes, use the ``--select`` option. For example, -to fix various types of indentation issues:: - - $ autopep8 --select=E1,W1 - -If the file being fixed is large, you may want to enable verbose progress -messages:: - - $ autopep8 -v - -Passing in ``--experimental`` enables the following functionality: - -- Shortens code lines by taking its length into account - -:: - -$ autopep8 --experimental - -Disabling line-by-line ----------------------- - -It is possible to disable autopep8 untill it it turned back on again in the file, using ``autopep8: off`` and then renabling ``autopep8: on``. - -.. code-block:: python - - # autopep8: off - [ - [23, 23, 13, 43], - [32, 34, 34, 34], - [56, 34, 34, 11], - [10, 10, 10, 10], - ] - # autopep8: on - -``fmt: off`` and ``fmt: on`` are also valid. - -Use as a module -=============== - -The simplest way of using autopep8 as a module is via the ``fix_code()`` -function: - - >>> import autopep8 - >>> autopep8.fix_code('x= 123\n') - 'x = 123\n' - -Or with options: - - >>> import autopep8 - >>> autopep8.fix_code('print( 123 )\n', - ... options={'ignore': ['E']}) - 'print( 123 )\n' - - -Configuration -============= - -By default, if ``$HOME/.config/pycodestyle`` (``~\.pycodestyle`` in Windows -environment) exists, it will be used as global configuration file. -Alternatively, you can specify the global configuration file with the -``--global-config`` option. - -Also, if ``setup.cfg``, ``tox.ini``, ``.pep8`` and ``.flake8`` files exist -in the directory where the target file exists, it will be used as the -configuration file. - -``pep8``, ``pycodestyle``, and ``flake8`` can be used as a section. - -configuration file example:: - - [pycodestyle] - max_line_length = 120 - ignore = E501 - -pyproject.toml --------------- - -autopep8 can also use ``pyproject.toml``. -The section must be ``[tool.autopep8]``, and ``pyproject.toml`` takes precedence -over any other configuration files. - -configuration file example:: - - [tool.autopep8] - max_line_length = 120 - ignore = "E501,W6" # or ["E501", "W6"] - in-place = true - recursive = true - aggressive = 3 - -Usage with pre-commit -===================== - -autopep8 can be used as a hook for pre-commit_. - -To add autopep8 as a plugin, add this repo definition to your configuration: - -.. code-block:: yaml - - repos: - - repo: https://github.com/hhatto/autopep8 - rev: ... # select the tag or revision you want, or run `pre-commit autoupdate` - hooks: - - id: autopep8 - -.. _`pre-commit`: https://pre-commit.com - - -Testing -======= - -Test cases are in ``test/test_autopep8.py``. They can be run directly via -``python test/test_autopep8.py`` or via tox_. The latter is useful for -testing against multiple Python interpreters. (We currently test against -CPython versions 3.7, 3.8, 3.9 and 3.10. We also test against PyPy.) - -.. _`tox`: https://pypi.org/project/tox/ - -Broad spectrum testing is available via ``test/acid.py``. This script runs -autopep8 against Python code and checks for correctness and completeness of the -code fixes. It can check that the bytecode remains identical. -``test/acid_pypi.py`` makes use of ``acid.py`` to test against the latest -released packages on PyPI. - - -Troubleshooting -=============== - -``pkg_resources.DistributionNotFound`` --------------------------------------- - -If you are using an ancient version of ``setuptools``, you might encounter -``pkg_resources.DistributionNotFound`` when trying to run ``autopep8``. Try -upgrading ``setuptools`` to workaround this ``setuptools`` problem:: - - $ pip install --upgrade setuptools - -Use ``sudo`` if you are installing to the system. - - -Links -===== - -* PyPI_ -* GitHub_ -* `Travis CI`_ -* Coveralls_ - -.. _PyPI: https://pypi.org/project/autopep8/ -.. _GitHub: https://github.com/hhatto/autopep8 -.. _`Travis CI`: https://travis-ci.org/hhatto/autopep8 -.. _`Coveralls`: https://coveralls.io/r/hhatto/autopep8 diff --git a/venv/lib/python3.12/site-packages/autopep8-2.0.4.dist-info/RECORD b/venv/lib/python3.12/site-packages/autopep8-2.0.4.dist-info/RECORD deleted file mode 100644 index d831d0b..0000000 --- a/venv/lib/python3.12/site-packages/autopep8-2.0.4.dist-info/RECORD +++ /dev/null @@ -1,11 +0,0 @@ -../../../bin/autopep8,sha256=cL1avZ9-q3zeUq3HIWb_gAP9WhOG7Omhk6XmyawavYs,240 -__pycache__/autopep8.cpython-312.pyc,, -autopep8-2.0.4.dist-info/AUTHORS.rst,sha256=tiTPsbzGl9dtXCMEWXbWSV1zan1M-BoWtiixs46GIWk,2003 -autopep8-2.0.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -autopep8-2.0.4.dist-info/LICENSE,sha256=jR0COOSFQ0QZFMqwdB1N4-Bwobg2f3h69fIJr7YLCWo,1181 -autopep8-2.0.4.dist-info/METADATA,sha256=9es_wzTPtLtNEZmunFzdZR-5xkQhYlB1IzXGFP6R2lY,17176 -autopep8-2.0.4.dist-info/RECORD,, -autopep8-2.0.4.dist-info/WHEEL,sha256=iYlv5fX357PQyRT2o6tw1bN-YcKFFHKqB_LwHO5wP-g,110 -autopep8-2.0.4.dist-info/entry_points.txt,sha256=zEduLXzN3YzTTZBwxjhEKW7PVLqSqVG8-ocCaCR3P4A,43 -autopep8-2.0.4.dist-info/top_level.txt,sha256=s2x-di3QBwGxr7kd5xErt2pom8dsFRdINbmwsOEgLfU,9 -autopep8.py,sha256=uM_xMjYu0zNHjCP46y5LUOcYCX_rxniBU3icBpNbwBE,155690 diff --git a/venv/lib/python3.12/site-packages/autopep8-2.0.4.dist-info/WHEEL b/venv/lib/python3.12/site-packages/autopep8-2.0.4.dist-info/WHEEL deleted file mode 100644 index c34f116..0000000 --- a/venv/lib/python3.12/site-packages/autopep8-2.0.4.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.41.2) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/venv/lib/python3.12/site-packages/autopep8-2.0.4.dist-info/entry_points.txt b/venv/lib/python3.12/site-packages/autopep8-2.0.4.dist-info/entry_points.txt deleted file mode 100644 index 2d14c50..0000000 --- a/venv/lib/python3.12/site-packages/autopep8-2.0.4.dist-info/entry_points.txt +++ /dev/null @@ -1,2 +0,0 @@ -[console_scripts] -autopep8 = autopep8:main diff --git a/venv/lib/python3.12/site-packages/autopep8-2.0.4.dist-info/top_level.txt b/venv/lib/python3.12/site-packages/autopep8-2.0.4.dist-info/top_level.txt deleted file mode 100644 index d81c0c2..0000000 --- a/venv/lib/python3.12/site-packages/autopep8-2.0.4.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -autopep8 diff --git a/venv/lib/python3.12/site-packages/autopep8.py b/venv/lib/python3.12/site-packages/autopep8.py deleted file mode 100644 index 6b28b8a..0000000 --- a/venv/lib/python3.12/site-packages/autopep8.py +++ /dev/null @@ -1,4578 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2010-2011 Hideo Hattori -# Copyright (C) 2011-2013 Hideo Hattori, Steven Myint -# Copyright (C) 2013-2016 Hideo Hattori, Steven Myint, Bill Wendling -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -# Copyright (C) 2006-2009 Johann C. Rocholl -# Copyright (C) 2009-2013 Florent Xicluna -# -# Permission is hereby granted, free of charge, to any person -# obtaining a copy of this software and associated documentation files -# (the "Software"), to deal in the Software without restriction, -# including without limitation the rights to use, copy, modify, merge, -# publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, -# subject to the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -"""Automatically formats Python code to conform to the PEP 8 style guide. - -Fixes that only need be done once can be added by adding a function of the form -"fix_(source)" to this module. They should return the fixed source code. -These fixes are picked up by apply_global_fixes(). - -Fixes that depend on pycodestyle should be added as methods to FixPEP8. See the -class documentation for more information. - -""" - -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals - -import argparse -import codecs -import collections -import copy -import difflib -import fnmatch -import inspect -import io -import itertools -import keyword -import locale -import os -import re -import signal -import sys -import textwrap -import token -import tokenize -import warnings -import ast -from configparser import ConfigParser as SafeConfigParser, Error - -import pycodestyle -from pycodestyle import STARTSWITH_INDENT_STATEMENT_REGEX - - -__version__ = '2.0.4' - - -CR = '\r' -LF = '\n' -CRLF = '\r\n' - - -PYTHON_SHEBANG_REGEX = re.compile(r'^#!.*\bpython[23]?\b\s*$') -LAMBDA_REGEX = re.compile(r'([\w.]+)\s=\slambda\s*([)(=\w,\s.]*):') -COMPARE_NEGATIVE_REGEX = re.compile(r'\b(not)\s+([^][)(}{]+?)\s+(in|is)\s') -COMPARE_NEGATIVE_REGEX_THROUGH = re.compile(r'\b(not\s+in|is\s+not)\s') -BARE_EXCEPT_REGEX = re.compile(r'except\s*:') -STARTSWITH_DEF_REGEX = re.compile(r'^(async\s+def|def)\s.*\):') -DOCSTRING_START_REGEX = re.compile(r'^u?r?(?P["\']{3})') -ENABLE_REGEX = re.compile(r'# *(fmt|autopep8): *on') -DISABLE_REGEX = re.compile(r'# *(fmt|autopep8): *off') - -EXIT_CODE_OK = 0 -EXIT_CODE_ERROR = 1 -EXIT_CODE_EXISTS_DIFF = 2 -EXIT_CODE_ARGPARSE_ERROR = 99 - -# For generating line shortening candidates. -SHORTEN_OPERATOR_GROUPS = frozenset([ - frozenset([',']), - frozenset(['%']), - frozenset([',', '(', '[', '{']), - frozenset(['%', '(', '[', '{']), - frozenset([',', '(', '[', '{', '%', '+', '-', '*', '/', '//']), - frozenset(['%', '+', '-', '*', '/', '//']), -]) - - -DEFAULT_IGNORE = 'E226,E24,W50,W690' # TODO: use pycodestyle.DEFAULT_IGNORE -DEFAULT_INDENT_SIZE = 4 -# these fixes conflict with each other, if the `--ignore` setting causes both -# to be enabled, disable both of them -CONFLICTING_CODES = ('W503', 'W504') - -# W602 is handled separately due to the need to avoid "with_traceback". -CODE_TO_2TO3 = { - 'E231': ['ws_comma'], - 'E721': ['idioms'], - 'W690': ['apply', - 'except', - 'exitfunc', - 'numliterals', - 'operator', - 'paren', - 'reduce', - 'renames', - 'standarderror', - 'sys_exc', - 'throw', - 'tuple_params', - 'xreadlines']} - - -if sys.platform == 'win32': # pragma: no cover - DEFAULT_CONFIG = os.path.expanduser(r'~\.pycodestyle') -else: - DEFAULT_CONFIG = os.path.join(os.getenv('XDG_CONFIG_HOME') or - os.path.expanduser('~/.config'), - 'pycodestyle') -# fallback, use .pep8 -if not os.path.exists(DEFAULT_CONFIG): # pragma: no cover - if sys.platform == 'win32': - DEFAULT_CONFIG = os.path.expanduser(r'~\.pep8') - else: - DEFAULT_CONFIG = os.path.join(os.path.expanduser('~/.config'), 'pep8') -PROJECT_CONFIG = ('setup.cfg', 'tox.ini', '.pep8', '.flake8') - - -MAX_PYTHON_FILE_DETECTION_BYTES = 1024 - - -def open_with_encoding(filename, mode='r', encoding=None, limit_byte_check=-1): - """Return opened file with a specific encoding.""" - if not encoding: - encoding = detect_encoding(filename, limit_byte_check=limit_byte_check) - - return io.open(filename, mode=mode, encoding=encoding, - newline='') # Preserve line endings - - -def detect_encoding(filename, limit_byte_check=-1): - """Return file encoding.""" - try: - with open(filename, 'rb') as input_file: - from lib2to3.pgen2 import tokenize as lib2to3_tokenize - encoding = lib2to3_tokenize.detect_encoding(input_file.readline)[0] - - with open_with_encoding(filename, encoding=encoding) as test_file: - test_file.read(limit_byte_check) - - return encoding - except (LookupError, SyntaxError, UnicodeDecodeError): - return 'latin-1' - - -def readlines_from_file(filename): - """Return contents of file.""" - with open_with_encoding(filename) as input_file: - return input_file.readlines() - - -def extended_blank_lines(logical_line, - blank_lines, - blank_before, - indent_level, - previous_logical): - """Check for missing blank lines after class declaration.""" - if previous_logical.startswith('def '): - if blank_lines and pycodestyle.DOCSTRING_REGEX.match(logical_line): - yield (0, 'E303 too many blank lines ({})'.format(blank_lines)) - elif pycodestyle.DOCSTRING_REGEX.match(previous_logical): - # Missing blank line between class docstring and method declaration. - if ( - indent_level and - not blank_lines and - not blank_before and - logical_line.startswith(('def ')) and - '(self' in logical_line - ): - yield (0, 'E301 expected 1 blank line, found 0') - - -pycodestyle.register_check(extended_blank_lines) - - -def continued_indentation(logical_line, tokens, indent_level, hang_closing, - indent_char, noqa): - """Override pycodestyle's function to provide indentation information.""" - first_row = tokens[0][2][0] - nrows = 1 + tokens[-1][2][0] - first_row - if noqa or nrows == 1: - return - - # indent_next tells us whether the next block is indented. Assuming - # that it is indented by 4 spaces, then we should not allow 4-space - # indents on the final continuation line. In turn, some other - # indents are allowed to have an extra 4 spaces. - indent_next = logical_line.endswith(':') - - row = depth = 0 - valid_hangs = ( - (DEFAULT_INDENT_SIZE,) - if indent_char != '\t' else (DEFAULT_INDENT_SIZE, - 2 * DEFAULT_INDENT_SIZE) - ) - - # Remember how many brackets were opened on each line. - parens = [0] * nrows - - # Relative indents of physical lines. - rel_indent = [0] * nrows - - # For each depth, collect a list of opening rows. - open_rows = [[0]] - # For each depth, memorize the hanging indentation. - hangs = [None] - - # Visual indents. - indent_chances = {} - last_indent = tokens[0][2] - indent = [last_indent[1]] - - last_token_multiline = None - line = None - last_line = '' - last_line_begins_with_multiline = False - for token_type, text, start, end, line in tokens: - - newline = row < start[0] - first_row - if newline: - row = start[0] - first_row - newline = (not last_token_multiline and - token_type not in (tokenize.NL, tokenize.NEWLINE)) - last_line_begins_with_multiline = last_token_multiline - - if newline: - # This is the beginning of a continuation line. - last_indent = start - - # Record the initial indent. - rel_indent[row] = pycodestyle.expand_indent(line) - indent_level - - # Identify closing bracket. - close_bracket = (token_type == tokenize.OP and text in ']})') - - # Is the indent relative to an opening bracket line? - for open_row in reversed(open_rows[depth]): - hang = rel_indent[row] - rel_indent[open_row] - hanging_indent = hang in valid_hangs - if hanging_indent: - break - if hangs[depth]: - hanging_indent = (hang == hangs[depth]) - - visual_indent = (not close_bracket and hang > 0 and - indent_chances.get(start[1])) - - if close_bracket and indent[depth]: - # Closing bracket for visual indent. - if start[1] != indent[depth]: - yield (start, 'E124 {}'.format(indent[depth])) - elif close_bracket and not hang: - # closing bracket matches indentation of opening bracket's line - if hang_closing: - yield (start, 'E133 {}'.format(indent[depth])) - elif indent[depth] and start[1] < indent[depth]: - if visual_indent is not True: - # Visual indent is broken. - yield (start, 'E128 {}'.format(indent[depth])) - elif (hanging_indent or - (indent_next and - rel_indent[row] == 2 * DEFAULT_INDENT_SIZE)): - # Hanging indent is verified. - if close_bracket and not hang_closing: - yield (start, 'E123 {}'.format(indent_level + - rel_indent[open_row])) - hangs[depth] = hang - elif visual_indent is True: - # Visual indent is verified. - indent[depth] = start[1] - elif visual_indent in (text, str): - # Ignore token lined up with matching one from a previous line. - pass - else: - one_indented = (indent_level + rel_indent[open_row] + - DEFAULT_INDENT_SIZE) - # Indent is broken. - if hang <= 0: - error = ('E122', one_indented) - elif indent[depth]: - error = ('E127', indent[depth]) - elif not close_bracket and hangs[depth]: - error = ('E131', one_indented) - elif hang > DEFAULT_INDENT_SIZE: - error = ('E126', one_indented) - else: - hangs[depth] = hang - error = ('E121', one_indented) - - yield (start, '{} {}'.format(*error)) - - # Look for visual indenting. - if ( - parens[row] and - token_type not in (tokenize.NL, tokenize.COMMENT) and - not indent[depth] - ): - indent[depth] = start[1] - indent_chances[start[1]] = True - # Deal with implicit string concatenation. - elif (token_type in (tokenize.STRING, tokenize.COMMENT) or - text in ('u', 'ur', 'b', 'br')): - indent_chances[start[1]] = str - # Special case for the "if" statement because len("if (") is equal to - # 4. - elif not indent_chances and not row and not depth and text == 'if': - indent_chances[end[1] + 1] = True - elif text == ':' and line[end[1]:].isspace(): - open_rows[depth].append(row) - - # Keep track of bracket depth. - if token_type == tokenize.OP: - if text in '([{': - depth += 1 - indent.append(0) - hangs.append(None) - if len(open_rows) == depth: - open_rows.append([]) - open_rows[depth].append(row) - parens[row] += 1 - elif text in ')]}' and depth > 0: - # Parent indents should not be more than this one. - prev_indent = indent.pop() or last_indent[1] - hangs.pop() - for d in range(depth): - if indent[d] > prev_indent: - indent[d] = 0 - for ind in list(indent_chances): - if ind >= prev_indent: - del indent_chances[ind] - del open_rows[depth + 1:] - depth -= 1 - if depth: - indent_chances[indent[depth]] = True - for idx in range(row, -1, -1): - if parens[idx]: - parens[idx] -= 1 - break - assert len(indent) == depth + 1 - if ( - start[1] not in indent_chances and - # This is for purposes of speeding up E121 (GitHub #90). - not last_line.rstrip().endswith(',') - ): - # Allow to line up tokens. - indent_chances[start[1]] = text - - last_token_multiline = (start[0] != end[0]) - if last_token_multiline: - rel_indent[end[0] - first_row] = rel_indent[row] - - last_line = line - - if ( - indent_next and - not last_line_begins_with_multiline and - pycodestyle.expand_indent(line) == indent_level + DEFAULT_INDENT_SIZE - ): - pos = (start[0], indent[0] + 4) - desired_indent = indent_level + 2 * DEFAULT_INDENT_SIZE - if visual_indent: - yield (pos, 'E129 {}'.format(desired_indent)) - else: - yield (pos, 'E125 {}'.format(desired_indent)) - - -del pycodestyle._checks['logical_line'][pycodestyle.continued_indentation] -pycodestyle.register_check(continued_indentation) - - -class FixPEP8(object): - - """Fix invalid code. - - Fixer methods are prefixed "fix_". The _fix_source() method looks for these - automatically. - - The fixer method can take either one or two arguments (in addition to - self). The first argument is "result", which is the error information from - pycodestyle. The second argument, "logical", is required only for - logical-line fixes. - - The fixer method can return the list of modified lines or None. An empty - list would mean that no changes were made. None would mean that only the - line reported in the pycodestyle error was modified. Note that the modified - line numbers that are returned are indexed at 1. This typically would - correspond with the line number reported in the pycodestyle error - information. - - [fixed method list] - - e111,e114,e115,e116 - - e121,e122,e123,e124,e125,e126,e127,e128,e129 - - e201,e202,e203 - - e211 - - e221,e222,e223,e224,e225 - - e231 - - e251,e252 - - e261,e262 - - e271,e272,e273,e274,e275 - - e301,e302,e303,e304,e305,e306 - - e401,e402 - - e502 - - e701,e702,e703,e704 - - e711,e712,e713,e714 - - e722 - - e731 - - w291 - - w503,504 - - """ - - def __init__(self, filename, - options, - contents=None, - long_line_ignore_cache=None): - self.filename = filename - if contents is None: - self.source = readlines_from_file(filename) - else: - sio = io.StringIO(contents) - self.source = sio.readlines() - self.options = options - self.indent_word = _get_indentword(''.join(self.source)) - - # collect imports line - self.imports = {} - for i, line in enumerate(self.source): - if (line.find("import ") == 0 or line.find("from ") == 0) and \ - line not in self.imports: - # collect only import statements that first appeared - self.imports[line] = i - - self.long_line_ignore_cache = ( - set() if long_line_ignore_cache is None - else long_line_ignore_cache) - - # Many fixers are the same even though pycodestyle categorizes them - # differently. - self.fix_e115 = self.fix_e112 - self.fix_e121 = self._fix_reindent - self.fix_e122 = self._fix_reindent - self.fix_e123 = self._fix_reindent - self.fix_e124 = self._fix_reindent - self.fix_e126 = self._fix_reindent - self.fix_e127 = self._fix_reindent - self.fix_e128 = self._fix_reindent - self.fix_e129 = self._fix_reindent - self.fix_e133 = self.fix_e131 - self.fix_e202 = self.fix_e201 - self.fix_e203 = self.fix_e201 - self.fix_e211 = self.fix_e201 - self.fix_e221 = self.fix_e271 - self.fix_e222 = self.fix_e271 - self.fix_e223 = self.fix_e271 - self.fix_e226 = self.fix_e225 - self.fix_e227 = self.fix_e225 - self.fix_e228 = self.fix_e225 - self.fix_e241 = self.fix_e271 - self.fix_e242 = self.fix_e224 - self.fix_e252 = self.fix_e225 - self.fix_e261 = self.fix_e262 - self.fix_e272 = self.fix_e271 - self.fix_e273 = self.fix_e271 - self.fix_e274 = self.fix_e271 - self.fix_e275 = self.fix_e271 - self.fix_e306 = self.fix_e301 - self.fix_e501 = ( - self.fix_long_line_logically if - options and (options.aggressive >= 2 or options.experimental) else - self.fix_long_line_physically) - self.fix_e703 = self.fix_e702 - self.fix_w292 = self.fix_w291 - self.fix_w293 = self.fix_w291 - - def _fix_source(self, results): - try: - (logical_start, logical_end) = _find_logical(self.source) - logical_support = True - except (SyntaxError, tokenize.TokenError): # pragma: no cover - logical_support = False - - completed_lines = set() - for result in sorted(results, key=_priority_key): - if result['line'] in completed_lines: - continue - - fixed_methodname = 'fix_' + result['id'].lower() - if hasattr(self, fixed_methodname): - fix = getattr(self, fixed_methodname) - - line_index = result['line'] - 1 - original_line = self.source[line_index] - - is_logical_fix = len(_get_parameters(fix)) > 2 - if is_logical_fix: - logical = None - if logical_support: - logical = _get_logical(self.source, - result, - logical_start, - logical_end) - if logical and set(range( - logical[0][0] + 1, - logical[1][0] + 1)).intersection( - completed_lines): - continue - - modified_lines = fix(result, logical) - else: - modified_lines = fix(result) - - if modified_lines is None: - # Force logical fixes to report what they modified. - assert not is_logical_fix - - if self.source[line_index] == original_line: - modified_lines = [] - - if modified_lines: - completed_lines.update(modified_lines) - elif modified_lines == []: # Empty list means no fix - if self.options.verbose >= 2: - print( - '---> Not fixing {error} on line {line}'.format( - error=result['id'], line=result['line']), - file=sys.stderr) - else: # We assume one-line fix when None. - completed_lines.add(result['line']) - else: - if self.options.verbose >= 3: - print( - "---> '{}' is not defined.".format(fixed_methodname), - file=sys.stderr) - - info = result['info'].strip() - print('---> {}:{}:{}:{}'.format(self.filename, - result['line'], - result['column'], - info), - file=sys.stderr) - - def fix(self): - """Return a version of the source code with PEP 8 violations fixed.""" - pep8_options = { - 'ignore': self.options.ignore, - 'select': self.options.select, - 'max_line_length': self.options.max_line_length, - 'hang_closing': self.options.hang_closing, - } - results = _execute_pep8(pep8_options, self.source) - - if self.options.verbose: - progress = {} - for r in results: - if r['id'] not in progress: - progress[r['id']] = set() - progress[r['id']].add(r['line']) - print('---> {n} issue(s) to fix {progress}'.format( - n=len(results), progress=progress), file=sys.stderr) - - if self.options.line_range: - start, end = self.options.line_range - results = [r for r in results - if start <= r['line'] <= end] - - self._fix_source(filter_results(source=''.join(self.source), - results=results, - aggressive=self.options.aggressive)) - - if self.options.line_range: - # If number of lines has changed then change line_range. - count = sum(sline.count('\n') - for sline in self.source[start - 1:end]) - self.options.line_range[1] = start + count - 1 - - return ''.join(self.source) - - def _fix_reindent(self, result): - """Fix a badly indented line. - - This is done by adding or removing from its initial indent only. - - """ - num_indent_spaces = int(result['info'].split()[1]) - line_index = result['line'] - 1 - target = self.source[line_index] - - self.source[line_index] = ' ' * num_indent_spaces + target.lstrip() - - def fix_e112(self, result): - """Fix under-indented comments.""" - line_index = result['line'] - 1 - target = self.source[line_index] - - if not target.lstrip().startswith('#'): - # Don't screw with invalid syntax. - return [] - - self.source[line_index] = self.indent_word + target - - def fix_e113(self, result): - """Fix unexpected indentation.""" - line_index = result['line'] - 1 - target = self.source[line_index] - indent = _get_indentation(target) - stripped = target.lstrip() - self.source[line_index] = indent[1:] + stripped - - def fix_e116(self, result): - """Fix over-indented comments.""" - line_index = result['line'] - 1 - target = self.source[line_index] - - indent = _get_indentation(target) - stripped = target.lstrip() - - if not stripped.startswith('#'): - # Don't screw with invalid syntax. - return [] - - self.source[line_index] = indent[1:] + stripped - - def fix_e117(self, result): - """Fix over-indented.""" - line_index = result['line'] - 1 - target = self.source[line_index] - - indent = _get_indentation(target) - if indent == '\t': - return [] - - stripped = target.lstrip() - - self.source[line_index] = indent[1:] + stripped - - def fix_e125(self, result): - """Fix indentation undistinguish from the next logical line.""" - num_indent_spaces = int(result['info'].split()[1]) - line_index = result['line'] - 1 - target = self.source[line_index] - - spaces_to_add = num_indent_spaces - len(_get_indentation(target)) - indent = len(_get_indentation(target)) - modified_lines = [] - - while len(_get_indentation(self.source[line_index])) >= indent: - self.source[line_index] = (' ' * spaces_to_add + - self.source[line_index]) - modified_lines.append(1 + line_index) # Line indexed at 1. - line_index -= 1 - - return modified_lines - - def fix_e131(self, result): - """Fix indentation undistinguish from the next logical line.""" - num_indent_spaces = int(result['info'].split()[1]) - line_index = result['line'] - 1 - target = self.source[line_index] - - spaces_to_add = num_indent_spaces - len(_get_indentation(target)) - - indent_length = len(_get_indentation(target)) - spaces_to_add = num_indent_spaces - indent_length - if num_indent_spaces == 0 and indent_length == 0: - spaces_to_add = 4 - - if spaces_to_add >= 0: - self.source[line_index] = (' ' * spaces_to_add + - self.source[line_index]) - else: - offset = abs(spaces_to_add) - self.source[line_index] = self.source[line_index][offset:] - - def fix_e201(self, result): - """Remove extraneous whitespace.""" - line_index = result['line'] - 1 - target = self.source[line_index] - offset = result['column'] - 1 - - fixed = fix_whitespace(target, - offset=offset, - replacement='') - - self.source[line_index] = fixed - - def fix_e224(self, result): - """Remove extraneous whitespace around operator.""" - target = self.source[result['line'] - 1] - offset = result['column'] - 1 - fixed = target[:offset] + target[offset:].replace('\t', ' ') - self.source[result['line'] - 1] = fixed - - def fix_e225(self, result): - """Fix missing whitespace around operator.""" - target = self.source[result['line'] - 1] - offset = result['column'] - 1 - fixed = target[:offset] + ' ' + target[offset:] - - # Only proceed if non-whitespace characters match. - # And make sure we don't break the indentation. - if ( - fixed.replace(' ', '') == target.replace(' ', '') and - _get_indentation(fixed) == _get_indentation(target) - ): - self.source[result['line'] - 1] = fixed - error_code = result.get('id', 0) - try: - ts = generate_tokens(fixed) - except (SyntaxError, tokenize.TokenError): - return - if not check_syntax(fixed.lstrip()): - return - try: - _missing_whitespace = ( - pycodestyle.missing_whitespace_around_operator - ) - except AttributeError: - # pycodestyle >= 2.11.0 - _missing_whitespace = pycodestyle.missing_whitespace - errors = list(_missing_whitespace(fixed, ts)) - for e in reversed(errors): - if error_code != e[1].split()[0]: - continue - offset = e[0][1] - fixed = fixed[:offset] + ' ' + fixed[offset:] - self.source[result['line'] - 1] = fixed - else: - return [] - - def fix_e231(self, result): - """Add missing whitespace.""" - line_index = result['line'] - 1 - target = self.source[line_index] - offset = result['column'] - fixed = target[:offset].rstrip() + ' ' + target[offset:].lstrip() - self.source[line_index] = fixed - - def fix_e251(self, result): - """Remove whitespace around parameter '=' sign.""" - line_index = result['line'] - 1 - target = self.source[line_index] - - # This is necessary since pycodestyle sometimes reports columns that - # goes past the end of the physical line. This happens in cases like, - # foo(bar\n=None) - c = min(result['column'] - 1, - len(target) - 1) - - if target[c].strip(): - fixed = target - else: - fixed = target[:c].rstrip() + target[c:].lstrip() - - # There could be an escaped newline - # - # def foo(a=\ - # 1) - if fixed.endswith(('=\\\n', '=\\\r\n', '=\\\r')): - self.source[line_index] = fixed.rstrip('\n\r \t\\') - self.source[line_index + 1] = self.source[line_index + 1].lstrip() - return [line_index + 1, line_index + 2] # Line indexed at 1 - - self.source[result['line'] - 1] = fixed - - def fix_e262(self, result): - """Fix spacing after inline comment hash.""" - target = self.source[result['line'] - 1] - offset = result['column'] - - code = target[:offset].rstrip(' \t#') - comment = target[offset:].lstrip(' \t#') - - fixed = code + (' # ' + comment if comment.strip() else '\n') - - self.source[result['line'] - 1] = fixed - - def fix_e265(self, result): - """Fix spacing after block comment hash.""" - target = self.source[result['line'] - 1] - - indent = _get_indentation(target) - line = target.lstrip(' \t') - pos = next((index for index, c in enumerate(line) if c != '#')) - hashes = line[:pos] - comment = line[pos:].lstrip(' \t') - - # Ignore special comments, even in the middle of the file. - if comment.startswith('!'): - return - - fixed = indent + hashes + (' ' + comment if comment.strip() else '\n') - - self.source[result['line'] - 1] = fixed - - def fix_e266(self, result): - """Fix too many block comment hashes.""" - target = self.source[result['line'] - 1] - - # Leave stylistic outlined blocks alone. - if target.strip().endswith('#'): - return - - indentation = _get_indentation(target) - fixed = indentation + '# ' + target.lstrip('# \t') - - self.source[result['line'] - 1] = fixed - - def fix_e271(self, result): - """Fix extraneous whitespace around keywords.""" - line_index = result['line'] - 1 - target = self.source[line_index] - offset = result['column'] - 1 - - fixed = fix_whitespace(target, - offset=offset, - replacement=' ') - - if fixed == target: - return [] - else: - self.source[line_index] = fixed - - def fix_e301(self, result): - """Add missing blank line.""" - cr = '\n' - self.source[result['line'] - 1] = cr + self.source[result['line'] - 1] - - def fix_e302(self, result): - """Add missing 2 blank lines.""" - add_linenum = 2 - int(result['info'].split()[-1]) - offset = 1 - if self.source[result['line'] - 2].strip() == "\\": - offset = 2 - cr = '\n' * add_linenum - self.source[result['line'] - offset] = ( - cr + self.source[result['line'] - offset] - ) - - def fix_e303(self, result): - """Remove extra blank lines.""" - delete_linenum = int(result['info'].split('(')[1].split(')')[0]) - 2 - delete_linenum = max(1, delete_linenum) - - # We need to count because pycodestyle reports an offset line number if - # there are comments. - cnt = 0 - line = result['line'] - 2 - modified_lines = [] - while cnt < delete_linenum and line >= 0: - if not self.source[line].strip(): - self.source[line] = '' - modified_lines.append(1 + line) # Line indexed at 1 - cnt += 1 - line -= 1 - - return modified_lines - - def fix_e304(self, result): - """Remove blank line following function decorator.""" - line = result['line'] - 2 - if not self.source[line].strip(): - self.source[line] = '' - - def fix_e305(self, result): - """Add missing 2 blank lines after end of function or class.""" - add_delete_linenum = 2 - int(result['info'].split()[-1]) - cnt = 0 - offset = result['line'] - 2 - modified_lines = [] - if add_delete_linenum < 0: - # delete cr - add_delete_linenum = abs(add_delete_linenum) - while cnt < add_delete_linenum and offset >= 0: - if not self.source[offset].strip(): - self.source[offset] = '' - modified_lines.append(1 + offset) # Line indexed at 1 - cnt += 1 - offset -= 1 - else: - # add cr - cr = '\n' - # check comment line - while True: - if offset < 0: - break - line = self.source[offset].lstrip() - if not line: - break - if line[0] != '#': - break - offset -= 1 - offset += 1 - self.source[offset] = cr + self.source[offset] - modified_lines.append(1 + offset) # Line indexed at 1. - return modified_lines - - def fix_e401(self, result): - """Put imports on separate lines.""" - line_index = result['line'] - 1 - target = self.source[line_index] - offset = result['column'] - 1 - - if not target.lstrip().startswith('import'): - return [] - - indentation = re.split(pattern=r'\bimport\b', - string=target, maxsplit=1)[0] - fixed = (target[:offset].rstrip('\t ,') + '\n' + - indentation + 'import ' + target[offset:].lstrip('\t ,')) - self.source[line_index] = fixed - - def fix_e402(self, result): - (line_index, offset, target) = get_index_offset_contents(result, - self.source) - for i in range(1, 100): - line = "".join(self.source[line_index:line_index+i]) - try: - generate_tokens("".join(line)) - except (SyntaxError, tokenize.TokenError): - continue - break - if not (target in self.imports and self.imports[target] != line_index): - mod_offset = get_module_imports_on_top_of_file(self.source, - line_index) - self.source[mod_offset] = line + self.source[mod_offset] - for offset in range(i): - self.source[line_index+offset] = '' - - def fix_long_line_logically(self, result, logical): - """Try to make lines fit within --max-line-length characters.""" - if ( - not logical or - len(logical[2]) == 1 or - self.source[result['line'] - 1].lstrip().startswith('#') - ): - return self.fix_long_line_physically(result) - - start_line_index = logical[0][0] - end_line_index = logical[1][0] - logical_lines = logical[2] - - previous_line = get_item(self.source, start_line_index - 1, default='') - next_line = get_item(self.source, end_line_index + 1, default='') - - single_line = join_logical_line(''.join(logical_lines)) - - try: - fixed = self.fix_long_line( - target=single_line, - previous_line=previous_line, - next_line=next_line, - original=''.join(logical_lines)) - except (SyntaxError, tokenize.TokenError): - return self.fix_long_line_physically(result) - - if fixed: - for line_index in range(start_line_index, end_line_index + 1): - self.source[line_index] = '' - self.source[start_line_index] = fixed - return range(start_line_index + 1, end_line_index + 1) - - return [] - - def fix_long_line_physically(self, result): - """Try to make lines fit within --max-line-length characters.""" - line_index = result['line'] - 1 - target = self.source[line_index] - - previous_line = get_item(self.source, line_index - 1, default='') - next_line = get_item(self.source, line_index + 1, default='') - - try: - fixed = self.fix_long_line( - target=target, - previous_line=previous_line, - next_line=next_line, - original=target) - except (SyntaxError, tokenize.TokenError): - return [] - - if fixed: - self.source[line_index] = fixed - return [line_index + 1] - - return [] - - def fix_long_line(self, target, previous_line, - next_line, original): - cache_entry = (target, previous_line, next_line) - if cache_entry in self.long_line_ignore_cache: - return [] - - if target.lstrip().startswith('#'): - if self.options.aggressive: - # Wrap commented lines. - return shorten_comment( - line=target, - max_line_length=self.options.max_line_length, - last_comment=not next_line.lstrip().startswith('#')) - return [] - - fixed = get_fixed_long_line( - target=target, - previous_line=previous_line, - original=original, - indent_word=self.indent_word, - max_line_length=self.options.max_line_length, - aggressive=self.options.aggressive, - experimental=self.options.experimental, - verbose=self.options.verbose) - - if fixed and not code_almost_equal(original, fixed): - return fixed - - self.long_line_ignore_cache.add(cache_entry) - return None - - def fix_e502(self, result): - """Remove extraneous escape of newline.""" - (line_index, _, target) = get_index_offset_contents(result, - self.source) - self.source[line_index] = target.rstrip('\n\r \t\\') + '\n' - - def fix_e701(self, result): - """Put colon-separated compound statement on separate lines.""" - line_index = result['line'] - 1 - target = self.source[line_index] - c = result['column'] - - fixed_source = (target[:c] + '\n' + - _get_indentation(target) + self.indent_word + - target[c:].lstrip('\n\r \t\\')) - self.source[result['line'] - 1] = fixed_source - return [result['line'], result['line'] + 1] - - def fix_e702(self, result, logical): - """Put semicolon-separated compound statement on separate lines.""" - if not logical: - return [] # pragma: no cover - logical_lines = logical[2] - - # Avoid applying this when indented. - # https://docs.python.org/reference/compound_stmts.html - for line in logical_lines: - if (result['id'] == 'E702' and ':' in line - and STARTSWITH_INDENT_STATEMENT_REGEX.match(line)): - if self.options.verbose: - print( - '---> avoid fixing {error} with ' - 'other compound statements'.format(error=result['id']), - file=sys.stderr - ) - return [] - - line_index = result['line'] - 1 - target = self.source[line_index] - - if target.rstrip().endswith('\\'): - # Normalize '1; \\\n2' into '1; 2'. - self.source[line_index] = target.rstrip('\n \r\t\\') - self.source[line_index + 1] = self.source[line_index + 1].lstrip() - return [line_index + 1, line_index + 2] - - if target.rstrip().endswith(';'): - self.source[line_index] = target.rstrip('\n \r\t;') + '\n' - return [line_index + 1] - - offset = result['column'] - 1 - first = target[:offset].rstrip(';').rstrip() - second = (_get_indentation(logical_lines[0]) + - target[offset:].lstrip(';').lstrip()) - - # Find inline comment. - inline_comment = None - if target[offset:].lstrip(';').lstrip()[:2] == '# ': - inline_comment = target[offset:].lstrip(';') - - if inline_comment: - self.source[line_index] = first + inline_comment - else: - self.source[line_index] = first + '\n' + second - return [line_index + 1] - - def fix_e704(self, result): - """Fix multiple statements on one line def""" - (line_index, _, target) = get_index_offset_contents(result, - self.source) - match = STARTSWITH_DEF_REGEX.match(target) - if match: - self.source[line_index] = '{}\n{}{}'.format( - match.group(0), - _get_indentation(target) + self.indent_word, - target[match.end(0):].lstrip()) - - def fix_e711(self, result): - """Fix comparison with None.""" - (line_index, offset, target) = get_index_offset_contents(result, - self.source) - - right_offset = offset + 2 - if right_offset >= len(target): - return [] - - left = target[:offset].rstrip() - center = target[offset:right_offset] - right = target[right_offset:].lstrip() - - if center.strip() == '==': - new_center = 'is' - elif center.strip() == '!=': - new_center = 'is not' - else: - return [] - - self.source[line_index] = ' '.join([left, new_center, right]) - - def fix_e712(self, result): - """Fix (trivial case of) comparison with boolean.""" - (line_index, offset, target) = get_index_offset_contents(result, - self.source) - - # Handle very easy "not" special cases. - if re.match(r'^\s*if [\w."\'\[\]]+ == False:$', target): - self.source[line_index] = re.sub(r'if ([\w."\'\[\]]+) == False:', - r'if not \1:', target, count=1) - elif re.match(r'^\s*if [\w."\'\[\]]+ != True:$', target): - self.source[line_index] = re.sub(r'if ([\w."\'\[\]]+) != True:', - r'if not \1:', target, count=1) - else: - right_offset = offset + 2 - if right_offset >= len(target): - return [] - - left = target[:offset].rstrip() - center = target[offset:right_offset] - right = target[right_offset:].lstrip() - - # Handle simple cases only. - new_right = None - if center.strip() == '==': - if re.match(r'\bTrue\b', right): - new_right = re.sub(r'\bTrue\b *', '', right, count=1) - elif center.strip() == '!=': - if re.match(r'\bFalse\b', right): - new_right = re.sub(r'\bFalse\b *', '', right, count=1) - - if new_right is None: - return [] - - if new_right[0].isalnum(): - new_right = ' ' + new_right - - self.source[line_index] = left + new_right - - def fix_e713(self, result): - """Fix (trivial case of) non-membership check.""" - (line_index, offset, target) = get_index_offset_contents(result, - self.source) - - # to convert once 'not in' -> 'in' - before_target = target[:offset] - target = target[offset:] - match_notin = COMPARE_NEGATIVE_REGEX_THROUGH.search(target) - notin_pos_start, notin_pos_end = 0, 0 - if match_notin: - notin_pos_start = match_notin.start(1) - notin_pos_end = match_notin.end() - target = '{}{} {}'.format( - target[:notin_pos_start], 'in', target[notin_pos_end:]) - - # fix 'not in' - match = COMPARE_NEGATIVE_REGEX.search(target) - if match: - if match.group(3) == 'in': - pos_start = match.start(1) - new_target = '{5}{0}{1} {2} {3} {4}'.format( - target[:pos_start], match.group(2), match.group(1), - match.group(3), target[match.end():], before_target) - if match_notin: - # revert 'in' -> 'not in' - pos_start = notin_pos_start + offset - pos_end = notin_pos_end + offset - 4 # len('not ') - new_target = '{}{} {}'.format( - new_target[:pos_start], 'not in', new_target[pos_end:]) - self.source[line_index] = new_target - - def fix_e714(self, result): - """Fix object identity should be 'is not' case.""" - (line_index, offset, target) = get_index_offset_contents(result, - self.source) - - # to convert once 'is not' -> 'is' - before_target = target[:offset] - target = target[offset:] - match_isnot = COMPARE_NEGATIVE_REGEX_THROUGH.search(target) - isnot_pos_start, isnot_pos_end = 0, 0 - if match_isnot: - isnot_pos_start = match_isnot.start(1) - isnot_pos_end = match_isnot.end() - target = '{}{} {}'.format( - target[:isnot_pos_start], 'in', target[isnot_pos_end:]) - - match = COMPARE_NEGATIVE_REGEX.search(target) - if match: - if match.group(3).startswith('is'): - pos_start = match.start(1) - new_target = '{5}{0}{1} {2} {3} {4}'.format( - target[:pos_start], match.group(2), match.group(3), - match.group(1), target[match.end():], before_target) - if match_isnot: - # revert 'is' -> 'is not' - pos_start = isnot_pos_start + offset - pos_end = isnot_pos_end + offset - 4 # len('not ') - new_target = '{}{} {}'.format( - new_target[:pos_start], 'is not', new_target[pos_end:]) - self.source[line_index] = new_target - - def fix_e722(self, result): - """fix bare except""" - (line_index, _, target) = get_index_offset_contents(result, - self.source) - match = BARE_EXCEPT_REGEX.search(target) - if match: - self.source[line_index] = '{}{}{}'.format( - target[:result['column'] - 1], "except BaseException:", - target[match.end():]) - - def fix_e731(self, result): - """Fix do not assign a lambda expression check.""" - (line_index, _, target) = get_index_offset_contents(result, - self.source) - match = LAMBDA_REGEX.search(target) - if match: - end = match.end() - self.source[line_index] = '{}def {}({}): return {}'.format( - target[:match.start(0)], match.group(1), match.group(2), - target[end:].lstrip()) - - def fix_w291(self, result): - """Remove trailing whitespace.""" - fixed_line = self.source[result['line'] - 1].rstrip() - self.source[result['line'] - 1] = fixed_line + '\n' - - def fix_w391(self, _): - """Remove trailing blank lines.""" - blank_count = 0 - for line in reversed(self.source): - line = line.rstrip() - if line: - break - else: - blank_count += 1 - - original_length = len(self.source) - self.source = self.source[:original_length - blank_count] - return range(1, 1 + original_length) - - def fix_w503(self, result): - (line_index, _, target) = get_index_offset_contents(result, - self.source) - one_string_token = target.split()[0] - try: - ts = generate_tokens(one_string_token) - except (SyntaxError, tokenize.TokenError): - return - if not _is_binary_operator(ts[0][0], one_string_token): - return - # find comment - comment_index = 0 - found_not_comment_only_line = False - comment_only_linenum = 0 - for i in range(5): - # NOTE: try to parse code in 5 times - if (line_index - i) < 0: - break - from_index = line_index - i - 1 - if from_index < 0 or len(self.source) <= from_index: - break - to_index = line_index + 1 - strip_line = self.source[from_index].lstrip() - if ( - not found_not_comment_only_line and - strip_line and strip_line[0] == '#' - ): - comment_only_linenum += 1 - continue - found_not_comment_only_line = True - try: - ts = generate_tokens("".join(self.source[from_index:to_index])) - except (SyntaxError, tokenize.TokenError): - continue - newline_count = 0 - newline_index = [] - for index, t in enumerate(ts): - if t[0] in (tokenize.NEWLINE, tokenize.NL): - newline_index.append(index) - newline_count += 1 - if newline_count > 2: - tts = ts[newline_index[-3]:] - else: - tts = ts - old = [] - for t in tts: - if t[0] in (tokenize.NEWLINE, tokenize.NL): - newline_count -= 1 - if newline_count <= 1: - break - if tokenize.COMMENT == t[0] and old and old[0] != tokenize.NL: - comment_index = old[3][1] - break - old = t - break - i = target.index(one_string_token) - fix_target_line = line_index - 1 - comment_only_linenum - self.source[line_index] = '{}{}'.format( - target[:i], target[i + len(one_string_token):].lstrip()) - nl = find_newline(self.source[fix_target_line:line_index]) - before_line = self.source[fix_target_line] - bl = before_line.index(nl) - if comment_index: - self.source[fix_target_line] = '{} {} {}'.format( - before_line[:comment_index], one_string_token, - before_line[comment_index + 1:]) - else: - if before_line[:bl].endswith("#"): - # special case - # see: https://github.com/hhatto/autopep8/issues/503 - self.source[fix_target_line] = '{}{} {}'.format( - before_line[:bl-2], one_string_token, before_line[bl-2:]) - else: - self.source[fix_target_line] = '{} {}{}'.format( - before_line[:bl], one_string_token, before_line[bl:]) - - def fix_w504(self, result): - (line_index, _, target) = get_index_offset_contents(result, - self.source) - # NOTE: is not collect pointed out in pycodestyle==2.4.0 - comment_index = 0 - operator_position = None # (start_position, end_position) - for i in range(1, 6): - to_index = line_index + i - try: - ts = generate_tokens("".join(self.source[line_index:to_index])) - except (SyntaxError, tokenize.TokenError): - continue - newline_count = 0 - newline_index = [] - for index, t in enumerate(ts): - if _is_binary_operator(t[0], t[1]): - if t[2][0] == 1 and t[3][0] == 1: - operator_position = (t[2][1], t[3][1]) - elif t[0] == tokenize.NAME and t[1] in ("and", "or"): - if t[2][0] == 1 and t[3][0] == 1: - operator_position = (t[2][1], t[3][1]) - elif t[0] in (tokenize.NEWLINE, tokenize.NL): - newline_index.append(index) - newline_count += 1 - if newline_count > 2: - tts = ts[:newline_index[-3]] - else: - tts = ts - old = [] - for t in tts: - if tokenize.COMMENT == t[0] and old: - comment_row, comment_index = old[3] - break - old = t - break - if not operator_position: - return - target_operator = target[operator_position[0]:operator_position[1]] - - if comment_index and comment_row == 1: - self.source[line_index] = '{}{}'.format( - target[:operator_position[0]].rstrip(), - target[comment_index:]) - else: - self.source[line_index] = '{}{}{}'.format( - target[:operator_position[0]].rstrip(), - target[operator_position[1]:].lstrip(), - target[operator_position[1]:]) - - next_line = self.source[line_index + 1] - next_line_indent = 0 - m = re.match(r'\s*', next_line) - if m: - next_line_indent = m.span()[1] - self.source[line_index + 1] = '{}{} {}'.format( - next_line[:next_line_indent], target_operator, - next_line[next_line_indent:]) - - def fix_w605(self, result): - (line_index, offset, target) = get_index_offset_contents(result, - self.source) - self.source[line_index] = '{}\\{}'.format( - target[:offset + 1], target[offset + 1:]) - - -def get_module_imports_on_top_of_file(source, import_line_index): - """return import or from keyword position - - example: - > 0: import sys - 1: import os - 2: - 3: def function(): - """ - def is_string_literal(line): - if line[0] in 'uUbB': - line = line[1:] - if line and line[0] in 'rR': - line = line[1:] - return line and (line[0] == '"' or line[0] == "'") - - def is_future_import(line): - nodes = ast.parse(line) - for n in nodes.body: - if isinstance(n, ast.ImportFrom) and n.module == '__future__': - return True - return False - - def has_future_import(source): - offset = 0 - line = '' - for _, next_line in source: - for line_part in next_line.strip().splitlines(True): - line = line + line_part - try: - return is_future_import(line), offset - except SyntaxError: - continue - offset += 1 - return False, offset - - allowed_try_keywords = ('try', 'except', 'else', 'finally') - in_docstring = False - docstring_kind = '"""' - source_stream = iter(enumerate(source)) - for cnt, line in source_stream: - if not in_docstring: - m = DOCSTRING_START_REGEX.match(line.lstrip()) - if m is not None: - in_docstring = True - docstring_kind = m.group('kind') - remain = line[m.end(): m.endpos].rstrip() - if remain[-3:] == docstring_kind: # one line doc - in_docstring = False - continue - if in_docstring: - if line.rstrip()[-3:] == docstring_kind: - in_docstring = False - continue - - if not line.rstrip(): - continue - elif line.startswith('#'): - continue - - if line.startswith('import '): - if cnt == import_line_index: - continue - return cnt - elif line.startswith('from '): - if cnt == import_line_index: - continue - hit, offset = has_future_import( - itertools.chain([(cnt, line)], source_stream) - ) - if hit: - # move to the back - return cnt + offset + 1 - return cnt - elif pycodestyle.DUNDER_REGEX.match(line): - return cnt - elif any(line.startswith(kw) for kw in allowed_try_keywords): - continue - elif is_string_literal(line): - return cnt - else: - return cnt - return 0 - - -def get_index_offset_contents(result, source): - """Return (line_index, column_offset, line_contents).""" - line_index = result['line'] - 1 - return (line_index, - result['column'] - 1, - source[line_index]) - - -def get_fixed_long_line(target, previous_line, original, - indent_word=' ', max_line_length=79, - aggressive=False, experimental=False, verbose=False): - """Break up long line and return result. - - Do this by generating multiple reformatted candidates and then - ranking the candidates to heuristically select the best option. - - """ - indent = _get_indentation(target) - source = target[len(indent):] - assert source.lstrip() == source - assert not target.lstrip().startswith('#') - - # Check for partial multiline. - tokens = list(generate_tokens(source)) - - candidates = shorten_line( - tokens, source, indent, - indent_word, - max_line_length, - aggressive=aggressive, - experimental=experimental, - previous_line=previous_line) - - # Also sort alphabetically as a tie breaker (for determinism). - candidates = sorted( - sorted(set(candidates).union([target, original])), - key=lambda x: line_shortening_rank( - x, - indent_word, - max_line_length, - experimental=experimental)) - - if verbose >= 4: - print(('-' * 79 + '\n').join([''] + candidates + ['']), - file=wrap_output(sys.stderr, 'utf-8')) - - if candidates: - best_candidate = candidates[0] - - # Don't allow things to get longer. - if longest_line_length(best_candidate) > longest_line_length(original): - return None - - return best_candidate - - -def longest_line_length(code): - """Return length of longest line.""" - if len(code) == 0: - return 0 - return max(len(line) for line in code.splitlines()) - - -def join_logical_line(logical_line): - """Return single line based on logical line input.""" - indentation = _get_indentation(logical_line) - - return indentation + untokenize_without_newlines( - generate_tokens(logical_line.lstrip())) + '\n' - - -def untokenize_without_newlines(tokens): - """Return source code based on tokens.""" - text = '' - last_row = 0 - last_column = -1 - - for t in tokens: - token_string = t[1] - (start_row, start_column) = t[2] - (end_row, end_column) = t[3] - - if start_row > last_row: - last_column = 0 - if ( - (start_column > last_column or token_string == '\n') and - not text.endswith(' ') - ): - text += ' ' - - if token_string != '\n': - text += token_string - - last_row = end_row - last_column = end_column - - return text.rstrip() - - -def _find_logical(source_lines): - # Make a variable which is the index of all the starts of lines. - logical_start = [] - logical_end = [] - last_newline = True - parens = 0 - for t in generate_tokens(''.join(source_lines)): - if t[0] in [tokenize.COMMENT, tokenize.DEDENT, - tokenize.INDENT, tokenize.NL, - tokenize.ENDMARKER]: - continue - if not parens and t[0] in [tokenize.NEWLINE, tokenize.SEMI]: - last_newline = True - logical_end.append((t[3][0] - 1, t[2][1])) - continue - if last_newline and not parens: - logical_start.append((t[2][0] - 1, t[2][1])) - last_newline = False - if t[0] == tokenize.OP: - if t[1] in '([{': - parens += 1 - elif t[1] in '}])': - parens -= 1 - return (logical_start, logical_end) - - -def _get_logical(source_lines, result, logical_start, logical_end): - """Return the logical line corresponding to the result. - - Assumes input is already E702-clean. - - """ - row = result['line'] - 1 - col = result['column'] - 1 - ls = None - le = None - for i in range(0, len(logical_start), 1): - assert logical_end - x = logical_end[i] - if x[0] > row or (x[0] == row and x[1] > col): - le = x - ls = logical_start[i] - break - if ls is None: - return None - original = source_lines[ls[0]:le[0] + 1] - return ls, le, original - - -def get_item(items, index, default=None): - if 0 <= index < len(items): - return items[index] - - return default - - -def reindent(source, indent_size, leave_tabs=False): - """Reindent all lines.""" - reindenter = Reindenter(source, leave_tabs) - return reindenter.run(indent_size) - - -def code_almost_equal(a, b): - """Return True if code is similar. - - Ignore whitespace when comparing specific line. - - """ - split_a = split_and_strip_non_empty_lines(a) - split_b = split_and_strip_non_empty_lines(b) - - if len(split_a) != len(split_b): - return False - - for (index, _) in enumerate(split_a): - if ''.join(split_a[index].split()) != ''.join(split_b[index].split()): - return False - - return True - - -def split_and_strip_non_empty_lines(text): - """Return lines split by newline. - - Ignore empty lines. - - """ - return [line.strip() for line in text.splitlines() if line.strip()] - - -def refactor(source, fixer_names, ignore=None, filename=''): - """Return refactored code using lib2to3. - - Skip if ignore string is produced in the refactored code. - - """ - not_found_end_of_file_newline = source and source.rstrip("\r\n") == source - if not_found_end_of_file_newline: - input_source = source + "\n" - else: - input_source = source - - from lib2to3 import pgen2 - try: - new_text = refactor_with_2to3(input_source, - fixer_names=fixer_names, - filename=filename) - except (pgen2.parse.ParseError, - SyntaxError, - UnicodeDecodeError, - UnicodeEncodeError): - return source - - if ignore: - if ignore in new_text and ignore not in source: - return source - - if not_found_end_of_file_newline: - return new_text.rstrip("\r\n") - - return new_text - - -def code_to_2to3(select, ignore, where='', verbose=False): - fixes = set() - for code, fix in CODE_TO_2TO3.items(): - if code_match(code, select=select, ignore=ignore): - if verbose: - print('---> Applying {} fix for {}'.format(where, - code.upper()), - file=sys.stderr) - fixes |= set(fix) - return fixes - - -def fix_2to3(source, - aggressive=True, select=None, ignore=None, filename='', - where='global', verbose=False): - """Fix various deprecated code (via lib2to3).""" - if not aggressive: - return source - - select = select or [] - ignore = ignore or [] - - return refactor(source, - code_to_2to3(select=select, - ignore=ignore, - where=where, - verbose=verbose), - filename=filename) - - -def find_newline(source): - """Return type of newline used in source. - - Input is a list of lines. - - """ - assert not isinstance(source, str) - - counter = collections.defaultdict(int) - for line in source: - if line.endswith(CRLF): - counter[CRLF] += 1 - elif line.endswith(CR): - counter[CR] += 1 - elif line.endswith(LF): - counter[LF] += 1 - - return (sorted(counter, key=counter.get, reverse=True) or [LF])[0] - - -def _get_indentword(source): - """Return indentation type.""" - indent_word = ' ' # Default in case source has no indentation - try: - for t in generate_tokens(source): - if t[0] == token.INDENT: - indent_word = t[1] - break - except (SyntaxError, tokenize.TokenError): - pass - return indent_word - - -def _get_indentation(line): - """Return leading whitespace.""" - if line.strip(): - non_whitespace_index = len(line) - len(line.lstrip()) - return line[:non_whitespace_index] - - return '' - - -def get_diff_text(old, new, filename): - """Return text of unified diff between old and new.""" - newline = '\n' - diff = difflib.unified_diff( - old, new, - 'original/' + filename, - 'fixed/' + filename, - lineterm=newline) - - text = '' - for line in diff: - text += line - - # Work around missing newline (http://bugs.python.org/issue2142). - if text and not line.endswith(newline): - text += newline + r'\ No newline at end of file' + newline - - return text - - -def _priority_key(pep8_result): - """Key for sorting PEP8 results. - - Global fixes should be done first. This is important for things like - indentation. - - """ - priority = [ - # Fix multiline colon-based before semicolon based. - 'e701', - # Break multiline statements early. - 'e702', - # Things that make lines longer. - 'e225', 'e231', - # Remove extraneous whitespace before breaking lines. - 'e201', - # Shorten whitespace in comment before resorting to wrapping. - 'e262' - ] - middle_index = 10000 - lowest_priority = [ - # We need to shorten lines last since the logical fixer can get in a - # loop, which causes us to exit early. - 'e501', - ] - key = pep8_result['id'].lower() - try: - return priority.index(key) - except ValueError: - try: - return middle_index + lowest_priority.index(key) + 1 - except ValueError: - return middle_index - - -def shorten_line(tokens, source, indentation, indent_word, max_line_length, - aggressive=False, experimental=False, previous_line=''): - """Separate line at OPERATOR. - - Multiple candidates will be yielded. - - """ - for candidate in _shorten_line(tokens=tokens, - source=source, - indentation=indentation, - indent_word=indent_word, - aggressive=aggressive, - previous_line=previous_line): - yield candidate - - if aggressive: - for key_token_strings in SHORTEN_OPERATOR_GROUPS: - shortened = _shorten_line_at_tokens( - tokens=tokens, - source=source, - indentation=indentation, - indent_word=indent_word, - key_token_strings=key_token_strings, - aggressive=aggressive) - - if shortened is not None and shortened != source: - yield shortened - - if experimental: - for shortened in _shorten_line_at_tokens_new( - tokens=tokens, - source=source, - indentation=indentation, - max_line_length=max_line_length): - - yield shortened - - -def _shorten_line(tokens, source, indentation, indent_word, - aggressive=False, previous_line=''): - """Separate line at OPERATOR. - - The input is expected to be free of newlines except for inside multiline - strings and at the end. - - Multiple candidates will be yielded. - - """ - for (token_type, - token_string, - start_offset, - end_offset) in token_offsets(tokens): - - if ( - token_type == tokenize.COMMENT and - not is_probably_part_of_multiline(previous_line) and - not is_probably_part_of_multiline(source) and - not source[start_offset + 1:].strip().lower().startswith( - ('noqa', 'pragma:', 'pylint:')) - ): - # Move inline comments to previous line. - first = source[:start_offset] - second = source[start_offset:] - yield (indentation + second.strip() + '\n' + - indentation + first.strip() + '\n') - elif token_type == token.OP and token_string != '=': - # Don't break on '=' after keyword as this violates PEP 8. - - assert token_type != token.INDENT - - first = source[:end_offset] - - second_indent = indentation - if (first.rstrip().endswith('(') and - source[end_offset:].lstrip().startswith(')')): - pass - elif first.rstrip().endswith('('): - second_indent += indent_word - elif '(' in first: - second_indent += ' ' * (1 + first.find('(')) - else: - second_indent += indent_word - - second = (second_indent + source[end_offset:].lstrip()) - if ( - not second.strip() or - second.lstrip().startswith('#') - ): - continue - - # Do not begin a line with a comma - if second.lstrip().startswith(','): - continue - # Do end a line with a dot - if first.rstrip().endswith('.'): - continue - if token_string in '+-*/': - fixed = first + ' \\' + '\n' + second - else: - fixed = first + '\n' + second - - # Only fix if syntax is okay. - if check_syntax(normalize_multiline(fixed) - if aggressive else fixed): - yield indentation + fixed - - -def _is_binary_operator(token_type, text): - return ((token_type == tokenize.OP or text in ['and', 'or']) and - text not in '()[]{},:.;@=%~') - - -# A convenient way to handle tokens. -Token = collections.namedtuple('Token', ['token_type', 'token_string', - 'spos', 'epos', 'line']) - - -class ReformattedLines(object): - - """The reflowed lines of atoms. - - Each part of the line is represented as an "atom." They can be moved - around when need be to get the optimal formatting. - - """ - - ########################################################################### - # Private Classes - - class _Indent(object): - - """Represent an indentation in the atom stream.""" - - def __init__(self, indent_amt): - self._indent_amt = indent_amt - - def emit(self): - return ' ' * self._indent_amt - - @property - def size(self): - return self._indent_amt - - class _Space(object): - - """Represent a space in the atom stream.""" - - def emit(self): - return ' ' - - @property - def size(self): - return 1 - - class _LineBreak(object): - - """Represent a line break in the atom stream.""" - - def emit(self): - return '\n' - - @property - def size(self): - return 0 - - def __init__(self, max_line_length): - self._max_line_length = max_line_length - self._lines = [] - self._bracket_depth = 0 - self._prev_item = None - self._prev_prev_item = None - - def __repr__(self): - return self.emit() - - ########################################################################### - # Public Methods - - def add(self, obj, indent_amt, break_after_open_bracket): - if isinstance(obj, Atom): - self._add_item(obj, indent_amt) - return - - self._add_container(obj, indent_amt, break_after_open_bracket) - - def add_comment(self, item): - num_spaces = 2 - if len(self._lines) > 1: - if isinstance(self._lines[-1], self._Space): - num_spaces -= 1 - if len(self._lines) > 2: - if isinstance(self._lines[-2], self._Space): - num_spaces -= 1 - - while num_spaces > 0: - self._lines.append(self._Space()) - num_spaces -= 1 - self._lines.append(item) - - def add_indent(self, indent_amt): - self._lines.append(self._Indent(indent_amt)) - - def add_line_break(self, indent): - self._lines.append(self._LineBreak()) - self.add_indent(len(indent)) - - def add_line_break_at(self, index, indent_amt): - self._lines.insert(index, self._LineBreak()) - self._lines.insert(index + 1, self._Indent(indent_amt)) - - def add_space_if_needed(self, curr_text, equal=False): - if ( - not self._lines or isinstance( - self._lines[-1], (self._LineBreak, self._Indent, self._Space)) - ): - return - - prev_text = str(self._prev_item) - prev_prev_text = ( - str(self._prev_prev_item) if self._prev_prev_item else '') - - if ( - # The previous item was a keyword or identifier and the current - # item isn't an operator that doesn't require a space. - ((self._prev_item.is_keyword or self._prev_item.is_string or - self._prev_item.is_name or self._prev_item.is_number) and - (curr_text[0] not in '([{.,:}])' or - (curr_text[0] == '=' and equal))) or - - # Don't place spaces around a '.', unless it's in an 'import' - # statement. - ((prev_prev_text != 'from' and prev_text[-1] != '.' and - curr_text != 'import') and - - # Don't place a space before a colon. - curr_text[0] != ':' and - - # Don't split up ending brackets by spaces. - ((prev_text[-1] in '}])' and curr_text[0] not in '.,}])') or - - # Put a space after a colon or comma. - prev_text[-1] in ':,' or - - # Put space around '=' if asked to. - (equal and prev_text == '=') or - - # Put spaces around non-unary arithmetic operators. - ((self._prev_prev_item and - (prev_text not in '+-' and - (self._prev_prev_item.is_name or - self._prev_prev_item.is_number or - self._prev_prev_item.is_string)) and - prev_text in ('+', '-', '%', '*', '/', '//', '**', 'in'))))) - ): - self._lines.append(self._Space()) - - def previous_item(self): - """Return the previous non-whitespace item.""" - return self._prev_item - - def fits_on_current_line(self, item_extent): - return self.current_size() + item_extent <= self._max_line_length - - def current_size(self): - """The size of the current line minus the indentation.""" - size = 0 - for item in reversed(self._lines): - size += item.size - if isinstance(item, self._LineBreak): - break - - return size - - def line_empty(self): - return (self._lines and - isinstance(self._lines[-1], - (self._LineBreak, self._Indent))) - - def emit(self): - string = '' - for item in self._lines: - if isinstance(item, self._LineBreak): - string = string.rstrip() - string += item.emit() - - return string.rstrip() + '\n' - - ########################################################################### - # Private Methods - - def _add_item(self, item, indent_amt): - """Add an item to the line. - - Reflow the line to get the best formatting after the item is - inserted. The bracket depth indicates if the item is being - inserted inside of a container or not. - - """ - if self._prev_item and self._prev_item.is_string and item.is_string: - # Place consecutive string literals on separate lines. - self._lines.append(self._LineBreak()) - self._lines.append(self._Indent(indent_amt)) - - item_text = str(item) - if self._lines and self._bracket_depth: - # Adding the item into a container. - self._prevent_default_initializer_splitting(item, indent_amt) - - if item_text in '.,)]}': - self._split_after_delimiter(item, indent_amt) - - elif self._lines and not self.line_empty(): - # Adding the item outside of a container. - if self.fits_on_current_line(len(item_text)): - self._enforce_space(item) - - else: - # Line break for the new item. - self._lines.append(self._LineBreak()) - self._lines.append(self._Indent(indent_amt)) - - self._lines.append(item) - self._prev_item, self._prev_prev_item = item, self._prev_item - - if item_text in '([{': - self._bracket_depth += 1 - - elif item_text in '}])': - self._bracket_depth -= 1 - assert self._bracket_depth >= 0 - - def _add_container(self, container, indent_amt, break_after_open_bracket): - actual_indent = indent_amt + 1 - - if ( - str(self._prev_item) != '=' and - not self.line_empty() and - not self.fits_on_current_line( - container.size + self._bracket_depth + 2) - ): - - if str(container)[0] == '(' and self._prev_item.is_name: - # Don't split before the opening bracket of a call. - break_after_open_bracket = True - actual_indent = indent_amt + 4 - elif ( - break_after_open_bracket or - str(self._prev_item) not in '([{' - ): - # If the container doesn't fit on the current line and the - # current line isn't empty, place the container on the next - # line. - self._lines.append(self._LineBreak()) - self._lines.append(self._Indent(indent_amt)) - break_after_open_bracket = False - else: - actual_indent = self.current_size() + 1 - break_after_open_bracket = False - - if isinstance(container, (ListComprehension, IfExpression)): - actual_indent = indent_amt - - # Increase the continued indentation only if recursing on a - # container. - container.reflow(self, ' ' * actual_indent, - break_after_open_bracket=break_after_open_bracket) - - def _prevent_default_initializer_splitting(self, item, indent_amt): - """Prevent splitting between a default initializer. - - When there is a default initializer, it's best to keep it all on - the same line. It's nicer and more readable, even if it goes - over the maximum allowable line length. This goes back along the - current line to determine if we have a default initializer, and, - if so, to remove extraneous whitespaces and add a line - break/indent before it if needed. - - """ - if str(item) == '=': - # This is the assignment in the initializer. Just remove spaces for - # now. - self._delete_whitespace() - return - - if (not self._prev_item or not self._prev_prev_item or - str(self._prev_item) != '='): - return - - self._delete_whitespace() - prev_prev_index = self._lines.index(self._prev_prev_item) - - if ( - isinstance(self._lines[prev_prev_index - 1], self._Indent) or - self.fits_on_current_line(item.size + 1) - ): - # The default initializer is already the only item on this line. - # Don't insert a newline here. - return - - # Replace the space with a newline/indent combo. - if isinstance(self._lines[prev_prev_index - 1], self._Space): - del self._lines[prev_prev_index - 1] - - self.add_line_break_at(self._lines.index(self._prev_prev_item), - indent_amt) - - def _split_after_delimiter(self, item, indent_amt): - """Split the line only after a delimiter.""" - self._delete_whitespace() - - if self.fits_on_current_line(item.size): - return - - last_space = None - for current_item in reversed(self._lines): - if ( - last_space and - (not isinstance(current_item, Atom) or - not current_item.is_colon) - ): - break - else: - last_space = None - if isinstance(current_item, self._Space): - last_space = current_item - if isinstance(current_item, (self._LineBreak, self._Indent)): - return - - if not last_space: - return - - self.add_line_break_at(self._lines.index(last_space), indent_amt) - - def _enforce_space(self, item): - """Enforce a space in certain situations. - - There are cases where we will want a space where normally we - wouldn't put one. This just enforces the addition of a space. - - """ - if isinstance(self._lines[-1], - (self._Space, self._LineBreak, self._Indent)): - return - - if not self._prev_item: - return - - item_text = str(item) - prev_text = str(self._prev_item) - - # Prefer a space around a '.' in an import statement, and between the - # 'import' and '('. - if ( - (item_text == '.' and prev_text == 'from') or - (item_text == 'import' and prev_text == '.') or - (item_text == '(' and prev_text == 'import') - ): - self._lines.append(self._Space()) - - def _delete_whitespace(self): - """Delete all whitespace from the end of the line.""" - while isinstance(self._lines[-1], (self._Space, self._LineBreak, - self._Indent)): - del self._lines[-1] - - -class Atom(object): - - """The smallest unbreakable unit that can be reflowed.""" - - def __init__(self, atom): - self._atom = atom - - def __repr__(self): - return self._atom.token_string - - def __len__(self): - return self.size - - def reflow( - self, reflowed_lines, continued_indent, extent, - break_after_open_bracket=False, - is_list_comp_or_if_expr=False, - next_is_dot=False - ): - if self._atom.token_type == tokenize.COMMENT: - reflowed_lines.add_comment(self) - return - - total_size = extent if extent else self.size - - if self._atom.token_string not in ',:([{}])': - # Some atoms will need an extra 1-sized space token after them. - total_size += 1 - - prev_item = reflowed_lines.previous_item() - if ( - not is_list_comp_or_if_expr and - not reflowed_lines.fits_on_current_line(total_size) and - not (next_is_dot and - reflowed_lines.fits_on_current_line(self.size + 1)) and - not reflowed_lines.line_empty() and - not self.is_colon and - not (prev_item and prev_item.is_name and - str(self) == '(') - ): - # Start a new line if there is already something on the line and - # adding this atom would make it go over the max line length. - reflowed_lines.add_line_break(continued_indent) - else: - reflowed_lines.add_space_if_needed(str(self)) - - reflowed_lines.add(self, len(continued_indent), - break_after_open_bracket) - - def emit(self): - return self.__repr__() - - @property - def is_keyword(self): - return keyword.iskeyword(self._atom.token_string) - - @property - def is_string(self): - return self._atom.token_type == tokenize.STRING - - @property - def is_name(self): - return self._atom.token_type == tokenize.NAME - - @property - def is_number(self): - return self._atom.token_type == tokenize.NUMBER - - @property - def is_comma(self): - return self._atom.token_string == ',' - - @property - def is_colon(self): - return self._atom.token_string == ':' - - @property - def size(self): - return len(self._atom.token_string) - - -class Container(object): - - """Base class for all container types.""" - - def __init__(self, items): - self._items = items - - def __repr__(self): - string = '' - last_was_keyword = False - - for item in self._items: - if item.is_comma: - string += ', ' - elif item.is_colon: - string += ': ' - else: - item_string = str(item) - if ( - string and - (last_was_keyword or - (not string.endswith(tuple('([{,.:}]) ')) and - not item_string.startswith(tuple('([{,.:}])')))) - ): - string += ' ' - string += item_string - - last_was_keyword = item.is_keyword - return string - - def __iter__(self): - for element in self._items: - yield element - - def __getitem__(self, idx): - return self._items[idx] - - def reflow(self, reflowed_lines, continued_indent, - break_after_open_bracket=False): - last_was_container = False - for (index, item) in enumerate(self._items): - next_item = get_item(self._items, index + 1) - - if isinstance(item, Atom): - is_list_comp_or_if_expr = ( - isinstance(self, (ListComprehension, IfExpression))) - item.reflow(reflowed_lines, continued_indent, - self._get_extent(index), - is_list_comp_or_if_expr=is_list_comp_or_if_expr, - next_is_dot=(next_item and - str(next_item) == '.')) - if last_was_container and item.is_comma: - reflowed_lines.add_line_break(continued_indent) - last_was_container = False - else: # isinstance(item, Container) - reflowed_lines.add(item, len(continued_indent), - break_after_open_bracket) - last_was_container = not isinstance(item, (ListComprehension, - IfExpression)) - - if ( - break_after_open_bracket and index == 0 and - # Prefer to keep empty containers together instead of - # separating them. - str(item) == self.open_bracket and - (not next_item or str(next_item) != self.close_bracket) and - (len(self._items) != 3 or not isinstance(next_item, Atom)) - ): - reflowed_lines.add_line_break(continued_indent) - break_after_open_bracket = False - else: - next_next_item = get_item(self._items, index + 2) - if ( - str(item) not in ['.', '%', 'in'] and - next_item and not isinstance(next_item, Container) and - str(next_item) != ':' and - next_next_item and (not isinstance(next_next_item, Atom) or - str(next_item) == 'not') and - not reflowed_lines.line_empty() and - not reflowed_lines.fits_on_current_line( - self._get_extent(index + 1) + 2) - ): - reflowed_lines.add_line_break(continued_indent) - - def _get_extent(self, index): - """The extent of the full element. - - E.g., the length of a function call or keyword. - - """ - extent = 0 - prev_item = get_item(self._items, index - 1) - seen_dot = prev_item and str(prev_item) == '.' - while index < len(self._items): - item = get_item(self._items, index) - index += 1 - - if isinstance(item, (ListComprehension, IfExpression)): - break - - if isinstance(item, Container): - if prev_item and prev_item.is_name: - if seen_dot: - extent += 1 - else: - extent += item.size - - prev_item = item - continue - elif (str(item) not in ['.', '=', ':', 'not'] and - not item.is_name and not item.is_string): - break - - if str(item) == '.': - seen_dot = True - - extent += item.size - prev_item = item - - return extent - - @property - def is_string(self): - return False - - @property - def size(self): - return len(self.__repr__()) - - @property - def is_keyword(self): - return False - - @property - def is_name(self): - return False - - @property - def is_comma(self): - return False - - @property - def is_colon(self): - return False - - @property - def open_bracket(self): - return None - - @property - def close_bracket(self): - return None - - -class Tuple(Container): - - """A high-level representation of a tuple.""" - - @property - def open_bracket(self): - return '(' - - @property - def close_bracket(self): - return ')' - - -class List(Container): - - """A high-level representation of a list.""" - - @property - def open_bracket(self): - return '[' - - @property - def close_bracket(self): - return ']' - - -class DictOrSet(Container): - - """A high-level representation of a dictionary or set.""" - - @property - def open_bracket(self): - return '{' - - @property - def close_bracket(self): - return '}' - - -class ListComprehension(Container): - - """A high-level representation of a list comprehension.""" - - @property - def size(self): - length = 0 - for item in self._items: - if isinstance(item, IfExpression): - break - length += item.size - return length - - -class IfExpression(Container): - - """A high-level representation of an if-expression.""" - - -def _parse_container(tokens, index, for_or_if=None): - """Parse a high-level container, such as a list, tuple, etc.""" - - # Store the opening bracket. - items = [Atom(Token(*tokens[index]))] - index += 1 - - num_tokens = len(tokens) - while index < num_tokens: - tok = Token(*tokens[index]) - - if tok.token_string in ',)]}': - # First check if we're at the end of a list comprehension or - # if-expression. Don't add the ending token as part of the list - # comprehension or if-expression, because they aren't part of those - # constructs. - if for_or_if == 'for': - return (ListComprehension(items), index - 1) - - elif for_or_if == 'if': - return (IfExpression(items), index - 1) - - # We've reached the end of a container. - items.append(Atom(tok)) - - # If not, then we are at the end of a container. - if tok.token_string == ')': - # The end of a tuple. - return (Tuple(items), index) - - elif tok.token_string == ']': - # The end of a list. - return (List(items), index) - - elif tok.token_string == '}': - # The end of a dictionary or set. - return (DictOrSet(items), index) - - elif tok.token_string in '([{': - # A sub-container is being defined. - (container, index) = _parse_container(tokens, index) - items.append(container) - - elif tok.token_string == 'for': - (container, index) = _parse_container(tokens, index, 'for') - items.append(container) - - elif tok.token_string == 'if': - (container, index) = _parse_container(tokens, index, 'if') - items.append(container) - - else: - items.append(Atom(tok)) - - index += 1 - - return (None, None) - - -def _parse_tokens(tokens): - """Parse the tokens. - - This converts the tokens into a form where we can manipulate them - more easily. - - """ - - index = 0 - parsed_tokens = [] - - num_tokens = len(tokens) - while index < num_tokens: - tok = Token(*tokens[index]) - - assert tok.token_type != token.INDENT - if tok.token_type == tokenize.NEWLINE: - # There's only one newline and it's at the end. - break - - if tok.token_string in '([{': - (container, index) = _parse_container(tokens, index) - if not container: - return None - parsed_tokens.append(container) - else: - parsed_tokens.append(Atom(tok)) - - index += 1 - - return parsed_tokens - - -def _reflow_lines(parsed_tokens, indentation, max_line_length, - start_on_prefix_line): - """Reflow the lines so that it looks nice.""" - - if str(parsed_tokens[0]) == 'def': - # A function definition gets indented a bit more. - continued_indent = indentation + ' ' * 2 * DEFAULT_INDENT_SIZE - else: - continued_indent = indentation + ' ' * DEFAULT_INDENT_SIZE - - break_after_open_bracket = not start_on_prefix_line - - lines = ReformattedLines(max_line_length) - lines.add_indent(len(indentation.lstrip('\r\n'))) - - if not start_on_prefix_line: - # If splitting after the opening bracket will cause the first element - # to be aligned weirdly, don't try it. - first_token = get_item(parsed_tokens, 0) - second_token = get_item(parsed_tokens, 1) - - if ( - first_token and second_token and - str(second_token)[0] == '(' and - len(indentation) + len(first_token) + 1 == len(continued_indent) - ): - return None - - for item in parsed_tokens: - lines.add_space_if_needed(str(item), equal=True) - - save_continued_indent = continued_indent - if start_on_prefix_line and isinstance(item, Container): - start_on_prefix_line = False - continued_indent = ' ' * (lines.current_size() + 1) - - item.reflow(lines, continued_indent, break_after_open_bracket) - continued_indent = save_continued_indent - - return lines.emit() - - -def _shorten_line_at_tokens_new(tokens, source, indentation, - max_line_length): - """Shorten the line taking its length into account. - - The input is expected to be free of newlines except for inside - multiline strings and at the end. - - """ - # Yield the original source so to see if it's a better choice than the - # shortened candidate lines we generate here. - yield indentation + source - - parsed_tokens = _parse_tokens(tokens) - - if parsed_tokens: - # Perform two reflows. The first one starts on the same line as the - # prefix. The second starts on the line after the prefix. - fixed = _reflow_lines(parsed_tokens, indentation, max_line_length, - start_on_prefix_line=True) - if fixed and check_syntax(normalize_multiline(fixed.lstrip())): - yield fixed - - fixed = _reflow_lines(parsed_tokens, indentation, max_line_length, - start_on_prefix_line=False) - if fixed and check_syntax(normalize_multiline(fixed.lstrip())): - yield fixed - - -def _shorten_line_at_tokens(tokens, source, indentation, indent_word, - key_token_strings, aggressive): - """Separate line by breaking at tokens in key_token_strings. - - The input is expected to be free of newlines except for inside - multiline strings and at the end. - - """ - offsets = [] - for (index, _t) in enumerate(token_offsets(tokens)): - (token_type, - token_string, - start_offset, - end_offset) = _t - - assert token_type != token.INDENT - - if token_string in key_token_strings: - # Do not break in containers with zero or one items. - unwanted_next_token = { - '(': ')', - '[': ']', - '{': '}'}.get(token_string) - if unwanted_next_token: - if ( - get_item(tokens, - index + 1, - default=[None, None])[1] == unwanted_next_token or - get_item(tokens, - index + 2, - default=[None, None])[1] == unwanted_next_token - ): - continue - - if ( - index > 2 and token_string == '(' and - tokens[index - 1][1] in ',(%[' - ): - # Don't split after a tuple start, or before a tuple start if - # the tuple is in a list. - continue - - if end_offset < len(source) - 1: - # Don't split right before newline. - offsets.append(end_offset) - else: - # Break at adjacent strings. These were probably meant to be on - # separate lines in the first place. - previous_token = get_item(tokens, index - 1) - if ( - token_type == tokenize.STRING and - previous_token and previous_token[0] == tokenize.STRING - ): - offsets.append(start_offset) - - current_indent = None - fixed = None - for line in split_at_offsets(source, offsets): - if fixed: - fixed += '\n' + current_indent + line - - for symbol in '([{': - if line.endswith(symbol): - current_indent += indent_word - else: - # First line. - fixed = line - assert not current_indent - current_indent = indent_word - - assert fixed is not None - - if check_syntax(normalize_multiline(fixed) - if aggressive > 1 else fixed): - return indentation + fixed - - return None - - -def token_offsets(tokens): - """Yield tokens and offsets.""" - end_offset = 0 - previous_end_row = 0 - previous_end_column = 0 - for t in tokens: - token_type = t[0] - token_string = t[1] - (start_row, start_column) = t[2] - (end_row, end_column) = t[3] - - # Account for the whitespace between tokens. - end_offset += start_column - if previous_end_row == start_row: - end_offset -= previous_end_column - - # Record the start offset of the token. - start_offset = end_offset - - # Account for the length of the token itself. - end_offset += len(token_string) - - yield (token_type, - token_string, - start_offset, - end_offset) - - previous_end_row = end_row - previous_end_column = end_column - - -def normalize_multiline(line): - """Normalize multiline-related code that will cause syntax error. - - This is for purposes of checking syntax. - - """ - if line.startswith('def ') and line.rstrip().endswith(':'): - return line + ' pass' - elif line.startswith('return '): - return 'def _(): ' + line - elif line.startswith('@'): - return line + 'def _(): pass' - elif line.startswith('class '): - return line + ' pass' - elif line.startswith(('if ', 'elif ', 'for ', 'while ')): - return line + ' pass' - - return line - - -def fix_whitespace(line, offset, replacement): - """Replace whitespace at offset and return fixed line.""" - # Replace escaped newlines too - left = line[:offset].rstrip('\n\r \t\\') - right = line[offset:].lstrip('\n\r \t\\') - if right.startswith('#'): - return line - - return left + replacement + right - - -def _execute_pep8(pep8_options, source): - """Execute pycodestyle via python method calls.""" - class QuietReport(pycodestyle.BaseReport): - - """Version of checker that does not print.""" - - def __init__(self, options): - super(QuietReport, self).__init__(options) - self.__full_error_results = [] - - def error(self, line_number, offset, text, check): - """Collect errors.""" - code = super(QuietReport, self).error(line_number, - offset, - text, - check) - if code: - self.__full_error_results.append( - {'id': code, - 'line': line_number, - 'column': offset + 1, - 'info': text}) - - def full_error_results(self): - """Return error results in detail. - - Results are in the form of a list of dictionaries. Each - dictionary contains 'id', 'line', 'column', and 'info'. - - """ - return self.__full_error_results - - checker = pycodestyle.Checker('', lines=source, reporter=QuietReport, - **pep8_options) - checker.check_all() - return checker.report.full_error_results() - - -def _remove_leading_and_normalize(line, with_rstrip=True): - # ignore FF in first lstrip() - if with_rstrip: - return line.lstrip(' \t\v').rstrip(CR + LF) + '\n' - return line.lstrip(' \t\v') - - -class Reindenter(object): - - """Reindents badly-indented code to uniformly use four-space indentation. - - Released to the public domain, by Tim Peters, 03 October 2000. - - """ - - def __init__(self, input_text, leave_tabs=False): - sio = io.StringIO(input_text) - source_lines = sio.readlines() - - self.string_content_line_numbers = multiline_string_lines(input_text) - - # File lines, rstripped & tab-expanded. Dummy at start is so - # that we can use tokenize's 1-based line numbering easily. - # Note that a line is all-blank iff it is a newline. - self.lines = [] - for line_number, line in enumerate(source_lines, start=1): - # Do not modify if inside a multiline string. - if line_number in self.string_content_line_numbers: - self.lines.append(line) - else: - # Only expand leading tabs. - with_rstrip = line_number != len(source_lines) - if leave_tabs: - self.lines.append( - _get_indentation(line) + - _remove_leading_and_normalize(line, with_rstrip) - ) - else: - self.lines.append( - _get_indentation(line).expandtabs() + - _remove_leading_and_normalize(line, with_rstrip) - ) - - self.lines.insert(0, None) - self.index = 1 # index into self.lines of next line - self.input_text = input_text - - def run(self, indent_size=DEFAULT_INDENT_SIZE): - """Fix indentation and return modified line numbers. - - Line numbers are indexed at 1. - - """ - if indent_size < 1: - return self.input_text - - try: - stats = _reindent_stats(tokenize.generate_tokens(self.getline)) - except (SyntaxError, tokenize.TokenError): - return self.input_text - # Remove trailing empty lines. - lines = self.lines - # Sentinel. - stats.append((len(lines), 0)) - # Map count of leading spaces to # we want. - have2want = {} - # Program after transformation. - after = [] - # Copy over initial empty lines -- there's nothing to do until - # we see a line with *something* on it. - i = stats[0][0] - after.extend(lines[1:i]) - for i in range(len(stats) - 1): - thisstmt, thislevel = stats[i] - nextstmt = stats[i + 1][0] - have = _leading_space_count(lines[thisstmt]) - want = thislevel * indent_size - if want < 0: - # A comment line. - if have: - # An indented comment line. If we saw the same - # indentation before, reuse what it most recently - # mapped to. - want = have2want.get(have, -1) - if want < 0: - # Then it probably belongs to the next real stmt. - for j in range(i + 1, len(stats) - 1): - jline, jlevel = stats[j] - if jlevel >= 0: - if have == _leading_space_count(lines[jline]): - want = jlevel * indent_size - break - # Maybe it's a hanging comment like this one, - if want < 0: - # in which case we should shift it like its base - # line got shifted. - for j in range(i - 1, -1, -1): - jline, jlevel = stats[j] - if jlevel >= 0: - want = (have + _leading_space_count( - after[jline - 1]) - - _leading_space_count(lines[jline])) - break - if want < 0: - # Still no luck -- leave it alone. - want = have - else: - want = 0 - assert want >= 0 - have2want[have] = want - diff = want - have - if diff == 0 or have == 0: - after.extend(lines[thisstmt:nextstmt]) - else: - for line_number, line in enumerate(lines[thisstmt:nextstmt], - start=thisstmt): - if line_number in self.string_content_line_numbers: - after.append(line) - elif diff > 0: - if line == '\n': - after.append(line) - else: - after.append(' ' * diff + line) - else: - remove = min(_leading_space_count(line), -diff) - after.append(line[remove:]) - - return ''.join(after) - - def getline(self): - """Line-getter for tokenize.""" - if self.index >= len(self.lines): - line = '' - else: - line = self.lines[self.index] - self.index += 1 - return line - - -def _reindent_stats(tokens): - """Return list of (lineno, indentlevel) pairs. - - One for each stmt and comment line. indentlevel is -1 for comment - lines, as a signal that tokenize doesn't know what to do about them; - indeed, they're our headache! - - """ - find_stmt = 1 # Next token begins a fresh stmt? - level = 0 # Current indent level. - stats = [] - - for t in tokens: - token_type = t[0] - sline = t[2][0] - line = t[4] - - if token_type == tokenize.NEWLINE: - # A program statement, or ENDMARKER, will eventually follow, - # after some (possibly empty) run of tokens of the form - # (NL | COMMENT)* (INDENT | DEDENT+)? - find_stmt = 1 - - elif token_type == tokenize.INDENT: - find_stmt = 1 - level += 1 - - elif token_type == tokenize.DEDENT: - find_stmt = 1 - level -= 1 - - elif token_type == tokenize.COMMENT: - if find_stmt: - stats.append((sline, -1)) - # But we're still looking for a new stmt, so leave - # find_stmt alone. - - elif token_type == tokenize.NL: - pass - - elif find_stmt: - # This is the first "real token" following a NEWLINE, so it - # must be the first token of the next program statement, or an - # ENDMARKER. - find_stmt = 0 - if line: # Not endmarker. - stats.append((sline, level)) - - return stats - - -def _leading_space_count(line): - """Return number of leading spaces in line.""" - i = 0 - while i < len(line) and line[i] == ' ': - i += 1 - return i - - -def refactor_with_2to3(source_text, fixer_names, filename=''): - """Use lib2to3 to refactor the source. - - Return the refactored source code. - - """ - from lib2to3.refactor import RefactoringTool - fixers = ['lib2to3.fixes.fix_' + name for name in fixer_names] - tool = RefactoringTool(fixer_names=fixers, explicit=fixers) - - from lib2to3.pgen2 import tokenize as lib2to3_tokenize - try: - # The name parameter is necessary particularly for the "import" fixer. - return str(tool.refactor_string(source_text, name=filename)) - except lib2to3_tokenize.TokenError: - return source_text - - -def check_syntax(code): - """Return True if syntax is okay.""" - try: - return compile(code, '', 'exec', dont_inherit=True) - except (SyntaxError, TypeError, ValueError): - return False - - -def find_with_line_numbers(pattern, contents): - """A wrapper around 're.finditer' to find line numbers. - - Returns a list of line numbers where pattern was found in contents. - """ - matches = list(re.finditer(pattern, contents)) - if not matches: - return [] - - end = matches[-1].start() - - # -1 so a failed `rfind` maps to the first line. - newline_offsets = { - -1: 0 - } - for line_num, m in enumerate(re.finditer(r'\n', contents), 1): - offset = m.start() - if offset > end: - break - newline_offsets[offset] = line_num - - def get_line_num(match, contents): - """Get the line number of string in a files contents. - - Failing to find the newline is OK, -1 maps to 0 - - """ - newline_offset = contents.rfind('\n', 0, match.start()) - return newline_offsets[newline_offset] - - return [get_line_num(match, contents) + 1 for match in matches] - - -def get_disabled_ranges(source): - """Returns a list of tuples representing the disabled ranges. - - If disabled and no re-enable will disable for rest of file. - - """ - enable_line_nums = find_with_line_numbers(ENABLE_REGEX, source) - disable_line_nums = find_with_line_numbers(DISABLE_REGEX, source) - total_lines = len(re.findall("\n", source)) + 1 - - enable_commands = {} - for num in enable_line_nums: - enable_commands[num] = True - for num in disable_line_nums: - enable_commands[num] = False - - disabled_ranges = [] - currently_enabled = True - disabled_start = None - - for line, commanded_enabled in sorted(enable_commands.items()): - if commanded_enabled is False and currently_enabled is True: - disabled_start = line - currently_enabled = False - elif commanded_enabled is True and currently_enabled is False: - disabled_ranges.append((disabled_start, line)) - currently_enabled = True - - if currently_enabled is False: - disabled_ranges.append((disabled_start, total_lines)) - - return disabled_ranges - - -def filter_disabled_results(result, disabled_ranges): - """Filter out reports based on tuple of disabled ranges. - - """ - line = result['line'] - for disabled_range in disabled_ranges: - if disabled_range[0] <= line <= disabled_range[1]: - return False - return True - - -def filter_results(source, results, aggressive): - """Filter out spurious reports from pycodestyle. - - If aggressive is True, we allow possibly unsafe fixes (E711, E712). - - """ - non_docstring_string_line_numbers = multiline_string_lines( - source, include_docstrings=False) - all_string_line_numbers = multiline_string_lines( - source, include_docstrings=True) - - commented_out_code_line_numbers = commented_out_code_lines(source) - - # Filter out the disabled ranges - disabled_ranges = get_disabled_ranges(source) - if disabled_ranges: - results = [ - result for result in results if filter_disabled_results( - result, - disabled_ranges, - ) - ] - - has_e901 = any(result['id'].lower() == 'e901' for result in results) - - for r in results: - issue_id = r['id'].lower() - - if r['line'] in non_docstring_string_line_numbers: - if issue_id.startswith(('e1', 'e501', 'w191')): - continue - - if r['line'] in all_string_line_numbers: - if issue_id in ['e501']: - continue - - # We must offset by 1 for lines that contain the trailing contents of - # multiline strings. - if not aggressive and (r['line'] + 1) in all_string_line_numbers: - # Do not modify multiline strings in non-aggressive mode. Remove - # trailing whitespace could break doctests. - if issue_id.startswith(('w29', 'w39')): - continue - - if aggressive <= 0: - if issue_id.startswith(('e711', 'e72', 'w6')): - continue - - if aggressive <= 1: - if issue_id.startswith(('e712', 'e713', 'e714')): - continue - - if aggressive <= 2: - if issue_id.startswith(('e704')): - continue - - if r['line'] in commented_out_code_line_numbers: - if issue_id.startswith(('e261', 'e262', 'e501')): - continue - - # Do not touch indentation if there is a token error caused by - # incomplete multi-line statement. Otherwise, we risk screwing up the - # indentation. - if has_e901: - if issue_id.startswith(('e1', 'e7')): - continue - - yield r - - -def multiline_string_lines(source, include_docstrings=False): - """Return line numbers that are within multiline strings. - - The line numbers are indexed at 1. - - Docstrings are ignored. - - """ - line_numbers = set() - previous_token_type = '' - try: - for t in generate_tokens(source): - token_type = t[0] - start_row = t[2][0] - end_row = t[3][0] - - if token_type == tokenize.STRING and start_row != end_row: - if ( - include_docstrings or - previous_token_type != tokenize.INDENT - ): - # We increment by one since we want the contents of the - # string. - line_numbers |= set(range(1 + start_row, 1 + end_row)) - - previous_token_type = token_type - except (SyntaxError, tokenize.TokenError): - pass - - return line_numbers - - -def commented_out_code_lines(source): - """Return line numbers of comments that are likely code. - - Commented-out code is bad practice, but modifying it just adds even - more clutter. - - """ - line_numbers = [] - try: - for t in generate_tokens(source): - token_type = t[0] - token_string = t[1] - start_row = t[2][0] - line = t[4] - - # Ignore inline comments. - if not line.lstrip().startswith('#'): - continue - - if token_type == tokenize.COMMENT: - stripped_line = token_string.lstrip('#').strip() - with warnings.catch_warnings(): - # ignore SyntaxWarning in Python3.8+ - # refs: - # https://bugs.python.org/issue15248 - # https://docs.python.org/3.8/whatsnew/3.8.html#other-language-changes - warnings.filterwarnings("ignore", category=SyntaxWarning) - if ( - ' ' in stripped_line and - '#' not in stripped_line and - check_syntax(stripped_line) - ): - line_numbers.append(start_row) - except (SyntaxError, tokenize.TokenError): - pass - - return line_numbers - - -def shorten_comment(line, max_line_length, last_comment=False): - """Return trimmed or split long comment line. - - If there are no comments immediately following it, do a text wrap. - Doing this wrapping on all comments in general would lead to jagged - comment text. - - """ - assert len(line) > max_line_length - line = line.rstrip() - - # PEP 8 recommends 72 characters for comment text. - indentation = _get_indentation(line) + '# ' - max_line_length = min(max_line_length, - len(indentation) + 72) - - MIN_CHARACTER_REPEAT = 5 - if ( - len(line) - len(line.rstrip(line[-1])) >= MIN_CHARACTER_REPEAT and - not line[-1].isalnum() - ): - # Trim comments that end with things like --------- - return line[:max_line_length] + '\n' - elif last_comment and re.match(r'\s*#+\s*\w+', line): - split_lines = textwrap.wrap(line.lstrip(' \t#'), - initial_indent=indentation, - subsequent_indent=indentation, - width=max_line_length, - break_long_words=False, - break_on_hyphens=False) - return '\n'.join(split_lines) + '\n' - - return line + '\n' - - -def normalize_line_endings(lines, newline): - """Return fixed line endings. - - All lines will be modified to use the most common line ending. - """ - line = [line.rstrip('\n\r') + newline for line in lines] - if line and lines[-1] == lines[-1].rstrip('\n\r'): - line[-1] = line[-1].rstrip('\n\r') - return line - - -def mutual_startswith(a, b): - return b.startswith(a) or a.startswith(b) - - -def code_match(code, select, ignore): - if ignore: - assert not isinstance(ignore, str) - for ignored_code in [c.strip() for c in ignore]: - if mutual_startswith(code.lower(), ignored_code.lower()): - return False - - if select: - assert not isinstance(select, str) - for selected_code in [c.strip() for c in select]: - if mutual_startswith(code.lower(), selected_code.lower()): - return True - return False - - return True - - -def fix_code(source, options=None, encoding=None, apply_config=False): - """Return fixed source code. - - "encoding" will be used to decode "source" if it is a byte string. - - """ - options = _get_options(options, apply_config) - # normalize - options.ignore = [opt.upper() for opt in options.ignore] - options.select = [opt.upper() for opt in options.select] - - # check ignore args - # NOTE: If W50x is not included, add W50x because the code - # correction result is indefinite. - ignore_opt = options.ignore - if not {"W50", "W503", "W504"} & set(ignore_opt): - options.ignore.append("W50") - - if not isinstance(source, str): - source = source.decode(encoding or get_encoding()) - - sio = io.StringIO(source) - return fix_lines(sio.readlines(), options=options) - - -def _get_options(raw_options, apply_config): - """Return parsed options.""" - if not raw_options: - return parse_args([''], apply_config=apply_config) - - if isinstance(raw_options, dict): - options = parse_args([''], apply_config=apply_config) - for name, value in raw_options.items(): - if not hasattr(options, name): - raise ValueError("No such option '{}'".format(name)) - - # Check for very basic type errors. - expected_type = type(getattr(options, name)) - if not isinstance(expected_type, (str, )): - if isinstance(value, (str, )): - raise ValueError( - "Option '{}' should not be a string".format(name)) - setattr(options, name, value) - else: - options = raw_options - - return options - - -def fix_lines(source_lines, options, filename=''): - """Return fixed source code.""" - # Transform everything to line feed. Then change them back to original - # before returning fixed source code. - original_newline = find_newline(source_lines) - tmp_source = ''.join(normalize_line_endings(source_lines, '\n')) - - # Keep a history to break out of cycles. - previous_hashes = set() - - if options.line_range: - # Disable "apply_local_fixes()" for now due to issue #175. - fixed_source = tmp_source - else: - # Apply global fixes only once (for efficiency). - fixed_source = apply_global_fixes(tmp_source, - options, - filename=filename) - - passes = 0 - long_line_ignore_cache = set() - while hash(fixed_source) not in previous_hashes: - if options.pep8_passes >= 0 and passes > options.pep8_passes: - break - passes += 1 - - previous_hashes.add(hash(fixed_source)) - - tmp_source = copy.copy(fixed_source) - - fix = FixPEP8( - filename, - options, - contents=tmp_source, - long_line_ignore_cache=long_line_ignore_cache) - - fixed_source = fix.fix() - - sio = io.StringIO(fixed_source) - return ''.join(normalize_line_endings(sio.readlines(), original_newline)) - - -def fix_file(filename, options=None, output=None, apply_config=False): - if not options: - options = parse_args([filename], apply_config=apply_config) - - original_source = readlines_from_file(filename) - - fixed_source = original_source - - if options.in_place or options.diff or output: - encoding = detect_encoding(filename) - - if output: - output = LineEndingWrapper(wrap_output(output, encoding=encoding)) - - fixed_source = fix_lines(fixed_source, options, filename=filename) - - if options.diff: - new = io.StringIO(fixed_source) - new = new.readlines() - diff = get_diff_text(original_source, new, filename) - if output: - output.write(diff) - output.flush() - elif options.jobs > 1: - diff = diff.encode(encoding) - return diff - elif options.in_place: - original = "".join(original_source).splitlines() - fixed = fixed_source.splitlines() - original_source_last_line = ( - original_source[-1].split("\n")[-1] if original_source else "" - ) - fixed_source_last_line = fixed_source.split("\n")[-1] - if original != fixed or ( - original_source_last_line != fixed_source_last_line - ): - with open_with_encoding(filename, 'w', encoding=encoding) as fp: - fp.write(fixed_source) - return fixed_source - return None - else: - if output: - output.write(fixed_source) - output.flush() - return fixed_source - - -def global_fixes(): - """Yield multiple (code, function) tuples.""" - for function in list(globals().values()): - if inspect.isfunction(function): - arguments = _get_parameters(function) - if arguments[:1] != ['source']: - continue - - code = extract_code_from_function(function) - if code: - yield (code, function) - - -def _get_parameters(function): - # pylint: disable=deprecated-method - if sys.version_info.major >= 3: - # We need to match "getargspec()", which includes "self" as the first - # value for methods. - # https://bugs.python.org/issue17481#msg209469 - if inspect.ismethod(function): - function = function.__func__ - - return list(inspect.signature(function).parameters) - else: - return inspect.getargspec(function)[0] - - -def apply_global_fixes(source, options, where='global', filename='', - codes=None): - """Run global fixes on source code. - - These are fixes that only need be done once (unlike those in - FixPEP8, which are dependent on pycodestyle). - - """ - if codes is None: - codes = [] - if any(code_match(code, select=options.select, ignore=options.ignore) - for code in ['E101', 'E111']): - source = reindent( - source, - indent_size=options.indent_size, - leave_tabs=not ( - code_match( - 'W191', - select=options.select, - ignore=options.ignore - ) - ) - ) - - for (code, function) in global_fixes(): - if code_match(code, select=options.select, ignore=options.ignore): - if options.verbose: - print('---> Applying {} fix for {}'.format(where, - code.upper()), - file=sys.stderr) - source = function(source, - aggressive=options.aggressive) - - source = fix_2to3(source, - aggressive=options.aggressive, - select=options.select, - ignore=options.ignore, - filename=filename, - where=where, - verbose=options.verbose) - - return source - - -def extract_code_from_function(function): - """Return code handled by function.""" - if not function.__name__.startswith('fix_'): - return None - - code = re.sub('^fix_', '', function.__name__) - if not code: - return None - - try: - int(code[1:]) - except ValueError: - return None - - return code - - -def _get_package_version(): - packages = ["pycodestyle: {}".format(pycodestyle.__version__)] - return ", ".join(packages) - - -def create_parser(): - """Return command-line parser.""" - parser = argparse.ArgumentParser(description=docstring_summary(__doc__), - prog='autopep8') - parser.add_argument('--version', action='version', - version='%(prog)s {} ({})'.format( - __version__, _get_package_version())) - parser.add_argument('-v', '--verbose', action='count', - default=0, - help='print verbose messages; ' - 'multiple -v result in more verbose messages') - parser.add_argument('-d', '--diff', action='store_true', - help='print the diff for the fixed source') - parser.add_argument('-i', '--in-place', action='store_true', - help='make changes to files in place') - parser.add_argument('--global-config', metavar='filename', - default=DEFAULT_CONFIG, - help='path to a global pep8 config file; if this file ' - 'does not exist then this is ignored ' - '(default: {})'.format(DEFAULT_CONFIG)) - parser.add_argument('--ignore-local-config', action='store_true', - help="don't look for and apply local config files; " - 'if not passed, defaults are updated with any ' - "config files in the project's root directory") - parser.add_argument('-r', '--recursive', action='store_true', - help='run recursively over directories; ' - 'must be used with --in-place or --diff') - parser.add_argument('-j', '--jobs', type=int, metavar='n', default=1, - help='number of parallel jobs; ' - 'match CPU count if value is less than 1') - parser.add_argument('-p', '--pep8-passes', metavar='n', - default=-1, type=int, - help='maximum number of additional pep8 passes ' - '(default: infinite)') - parser.add_argument('-a', '--aggressive', action='count', default=0, - help='enable non-whitespace changes; ' - 'multiple -a result in more aggressive changes') - parser.add_argument('--experimental', action='store_true', - help='enable experimental fixes') - parser.add_argument('--exclude', metavar='globs', - help='exclude file/directory names that match these ' - 'comma-separated globs') - parser.add_argument('--list-fixes', action='store_true', - help='list codes for fixes; ' - 'used by --ignore and --select') - parser.add_argument('--ignore', metavar='errors', default='', - help='do not fix these errors/warnings ' - '(default: {})'.format(DEFAULT_IGNORE)) - parser.add_argument('--select', metavar='errors', default='', - help='fix only these errors/warnings (e.g. E4,W)') - parser.add_argument('--max-line-length', metavar='n', default=79, type=int, - help='set maximum allowed line length ' - '(default: %(default)s)') - parser.add_argument('--line-range', '--range', metavar='line', - default=None, type=int, nargs=2, - help='only fix errors found within this inclusive ' - 'range of line numbers (e.g. 1 99); ' - 'line numbers are indexed at 1') - parser.add_argument('--indent-size', default=DEFAULT_INDENT_SIZE, - type=int, help=argparse.SUPPRESS) - parser.add_argument('--hang-closing', action='store_true', - help='hang-closing option passed to pycodestyle') - parser.add_argument('--exit-code', action='store_true', - help='change to behavior of exit code.' - ' default behavior of return value, 0 is no ' - 'differences, 1 is error exit. return 2 when' - ' add this option. 2 is exists differences.') - parser.add_argument('files', nargs='*', - help="files to format or '-' for standard in") - - return parser - - -def _expand_codes(codes, ignore_codes): - """expand to individual E/W codes""" - ret = set() - - is_conflict = False - if all( - any( - conflicting_code.startswith(code) - for code in codes - ) - for conflicting_code in CONFLICTING_CODES - ): - is_conflict = True - - is_ignore_w503 = "W503" in ignore_codes - is_ignore_w504 = "W504" in ignore_codes - - for code in codes: - if code == "W": - if is_ignore_w503 and is_ignore_w504: - ret.update({"W1", "W2", "W3", "W505", "W6"}) - elif is_ignore_w503: - ret.update({"W1", "W2", "W3", "W504", "W505", "W6"}) - else: - ret.update({"W1", "W2", "W3", "W503", "W505", "W6"}) - elif code in ("W5", "W50"): - if is_ignore_w503 and is_ignore_w504: - ret.update({"W505"}) - elif is_ignore_w503: - ret.update({"W504", "W505"}) - else: - ret.update({"W503", "W505"}) - elif not (code in ("W503", "W504") and is_conflict): - ret.add(code) - - return ret - - -def parse_args(arguments, apply_config=False): - """Parse command-line options.""" - parser = create_parser() - args = parser.parse_args(arguments) - - if not args.files and not args.list_fixes: - parser.exit(EXIT_CODE_ARGPARSE_ERROR, 'incorrect number of arguments') - - args.files = [decode_filename(name) for name in args.files] - - if apply_config: - parser = read_config(args, parser) - # prioritize settings when exist pyproject.toml's tool.autopep8 section - try: - parser_with_pyproject_toml = read_pyproject_toml(args, parser) - except Exception: - parser_with_pyproject_toml = None - if parser_with_pyproject_toml: - parser = parser_with_pyproject_toml - args = parser.parse_args(arguments) - args.files = [decode_filename(name) for name in args.files] - - if '-' in args.files: - if len(args.files) > 1: - parser.exit( - EXIT_CODE_ARGPARSE_ERROR, - 'cannot mix stdin and regular files', - ) - - if args.diff: - parser.exit( - EXIT_CODE_ARGPARSE_ERROR, - '--diff cannot be used with standard input', - ) - - if args.in_place: - parser.exit( - EXIT_CODE_ARGPARSE_ERROR, - '--in-place cannot be used with standard input', - ) - - if args.recursive: - parser.exit( - EXIT_CODE_ARGPARSE_ERROR, - '--recursive cannot be used with standard input', - ) - - if len(args.files) > 1 and not (args.in_place or args.diff): - parser.exit( - EXIT_CODE_ARGPARSE_ERROR, - 'autopep8 only takes one filename as argument ' - 'unless the "--in-place" or "--diff" args are used', - ) - - if args.recursive and not (args.in_place or args.diff): - parser.exit( - EXIT_CODE_ARGPARSE_ERROR, - '--recursive must be used with --in-place or --diff', - ) - - if args.in_place and args.diff: - parser.exit( - EXIT_CODE_ARGPARSE_ERROR, - '--in-place and --diff are mutually exclusive', - ) - - if args.max_line_length <= 0: - parser.exit( - EXIT_CODE_ARGPARSE_ERROR, - '--max-line-length must be greater than 0', - ) - - if args.indent_size <= 0: - parser.exit( - EXIT_CODE_ARGPARSE_ERROR, - '--indent-size must be greater than 0', - ) - - if args.select: - args.select = _expand_codes( - _split_comma_separated(args.select), - (_split_comma_separated(args.ignore) if args.ignore else []) - ) - - if args.ignore: - args.ignore = _split_comma_separated(args.ignore) - if all( - not any( - conflicting_code.startswith(ignore_code) - for ignore_code in args.ignore - ) - for conflicting_code in CONFLICTING_CODES - ): - args.ignore.update(CONFLICTING_CODES) - elif not args.select: - if args.aggressive: - # Enable everything by default if aggressive. - args.select = {'E', 'W1', 'W2', 'W3', 'W6'} - else: - args.ignore = _split_comma_separated(DEFAULT_IGNORE) - - if args.exclude: - args.exclude = _split_comma_separated(args.exclude) - else: - args.exclude = {} - - if args.jobs < 1: - # Do not import multiprocessing globally in case it is not supported - # on the platform. - import multiprocessing - args.jobs = multiprocessing.cpu_count() - - if args.jobs > 1 and not (args.in_place or args.diff): - parser.exit( - EXIT_CODE_ARGPARSE_ERROR, - 'parallel jobs requires --in-place', - ) - - if args.line_range: - if args.line_range[0] <= 0: - parser.exit( - EXIT_CODE_ARGPARSE_ERROR, - '--range must be positive numbers', - ) - if args.line_range[0] > args.line_range[1]: - parser.exit( - EXIT_CODE_ARGPARSE_ERROR, - 'First value of --range should be less than or equal ' - 'to the second', - ) - - return args - - -def _get_normalize_options(args, config, section, option_list): - for (k, v) in config.items(section): - norm_opt = k.lstrip('-').replace('-', '_') - if not option_list.get(norm_opt): - continue - opt_type = option_list[norm_opt] - if opt_type is int: - if v.strip() == "auto": - # skip to special case - if args.verbose: - print(f"ignore config: {k}={v}") - continue - value = config.getint(section, k) - elif opt_type is bool: - value = config.getboolean(section, k) - else: - value = config.get(section, k) - yield norm_opt, k, value - - -def read_config(args, parser): - """Read both user configuration and local configuration.""" - config = SafeConfigParser() - - try: - if args.verbose and os.path.exists(args.global_config): - print("read config path: {}".format(args.global_config)) - config.read(args.global_config) - - if not args.ignore_local_config: - parent = tail = args.files and os.path.abspath( - os.path.commonprefix(args.files)) - while tail: - if config.read([os.path.join(parent, fn) - for fn in PROJECT_CONFIG]): - if args.verbose: - for fn in PROJECT_CONFIG: - config_file = os.path.join(parent, fn) - if not os.path.exists(config_file): - continue - print( - "read config path: {}".format( - os.path.join(parent, fn) - ) - ) - break - (parent, tail) = os.path.split(parent) - - defaults = {} - option_list = {o.dest: o.type or type(o.default) - for o in parser._actions} - - for section in ['pep8', 'pycodestyle', 'flake8']: - if not config.has_section(section): - continue - for norm_opt, k, value in _get_normalize_options( - args, config, section, option_list - ): - if args.verbose: - print("enable config: section={}, key={}, value={}".format( - section, k, value)) - defaults[norm_opt] = value - - parser.set_defaults(**defaults) - except Error: - # Ignore for now. - pass - - return parser - - -def read_pyproject_toml(args, parser): - """Read pyproject.toml and load configuration.""" - if sys.version_info >= (3, 11): - import tomllib - else: - import tomli as tomllib - - config = None - - if os.path.exists(args.global_config): - with open(args.global_config, "rb") as fp: - config = tomllib.load(fp) - - if not args.ignore_local_config: - parent = tail = args.files and os.path.abspath( - os.path.commonprefix(args.files)) - while tail: - pyproject_toml = os.path.join(parent, "pyproject.toml") - if os.path.exists(pyproject_toml): - with open(pyproject_toml, "rb") as fp: - config = tomllib.load(fp) - break - (parent, tail) = os.path.split(parent) - - if not config: - return None - - if config.get("tool", {}).get("autopep8") is None: - return None - - config = config.get("tool").get("autopep8") - - defaults = {} - option_list = {o.dest: o.type or type(o.default) - for o in parser._actions} - - TUPLED_OPTIONS = ("ignore", "select") - for (k, v) in config.items(): - norm_opt = k.lstrip('-').replace('-', '_') - if not option_list.get(norm_opt): - continue - if type(v) in (list, tuple) and norm_opt in TUPLED_OPTIONS: - value = ",".join(v) - else: - value = v - if args.verbose: - print("enable pyproject.toml config: " - "key={}, value={}".format(k, value)) - defaults[norm_opt] = value - - if defaults: - # set value when exists key-value in defaults dict - parser.set_defaults(**defaults) - - return parser - - -def _split_comma_separated(string): - """Return a set of strings.""" - return {text.strip() for text in string.split(',') if text.strip()} - - -def decode_filename(filename): - """Return Unicode filename.""" - if isinstance(filename, str): - return filename - - return filename.decode(sys.getfilesystemencoding()) - - -def supported_fixes(): - """Yield pep8 error codes that autopep8 fixes. - - Each item we yield is a tuple of the code followed by its - description. - - """ - yield ('E101', docstring_summary(reindent.__doc__)) - - instance = FixPEP8(filename=None, options=None, contents='') - for attribute in dir(instance): - code = re.match('fix_([ew][0-9][0-9][0-9])', attribute) - if code: - yield ( - code.group(1).upper(), - re.sub(r'\s+', ' ', - docstring_summary(getattr(instance, attribute).__doc__)) - ) - - for (code, function) in sorted(global_fixes()): - yield (code.upper() + (4 - len(code)) * ' ', - re.sub(r'\s+', ' ', docstring_summary(function.__doc__))) - - for code in sorted(CODE_TO_2TO3): - yield (code.upper() + (4 - len(code)) * ' ', - re.sub(r'\s+', ' ', docstring_summary(fix_2to3.__doc__))) - - -def docstring_summary(docstring): - """Return summary of docstring.""" - return docstring.split('\n')[0] if docstring else '' - - -def line_shortening_rank(candidate, indent_word, max_line_length, - experimental=False): - """Return rank of candidate. - - This is for sorting candidates. - - """ - if not candidate.strip(): - return 0 - - rank = 0 - lines = candidate.rstrip().split('\n') - - offset = 0 - if ( - not lines[0].lstrip().startswith('#') and - lines[0].rstrip()[-1] not in '([{' - ): - for (opening, closing) in ('()', '[]', '{}'): - # Don't penalize empty containers that aren't split up. Things like - # this "foo(\n )" aren't particularly good. - opening_loc = lines[0].find(opening) - closing_loc = lines[0].find(closing) - if opening_loc >= 0: - if closing_loc < 0 or closing_loc != opening_loc + 1: - offset = max(offset, 1 + opening_loc) - - current_longest = max(offset + len(x.strip()) for x in lines) - - rank += 4 * max(0, current_longest - max_line_length) - - rank += len(lines) - - # Too much variation in line length is ugly. - rank += 2 * standard_deviation(len(line) for line in lines) - - bad_staring_symbol = { - '(': ')', - '[': ']', - '{': '}'}.get(lines[0][-1]) - - if len(lines) > 1: - if ( - bad_staring_symbol and - lines[1].lstrip().startswith(bad_staring_symbol) - ): - rank += 20 - - for lineno, current_line in enumerate(lines): - current_line = current_line.strip() - - if current_line.startswith('#'): - continue - - for bad_start in ['.', '%', '+', '-', '/']: - if current_line.startswith(bad_start): - rank += 100 - - # Do not tolerate operators on their own line. - if current_line == bad_start: - rank += 1000 - - if ( - current_line.endswith(('.', '%', '+', '-', '/')) and - "': " in current_line - ): - rank += 1000 - - if current_line.endswith(('(', '[', '{', '.')): - # Avoid lonely opening. They result in longer lines. - if len(current_line) <= len(indent_word): - rank += 100 - - # Avoid the ugliness of ", (\n". - if ( - current_line.endswith('(') and - current_line[:-1].rstrip().endswith(',') - ): - rank += 100 - - # Avoid the ugliness of "something[\n" and something[index][\n. - if ( - current_line.endswith('[') and - len(current_line) > 1 and - (current_line[-2].isalnum() or current_line[-2] in ']') - ): - rank += 300 - - # Also avoid the ugliness of "foo.\nbar" - if current_line.endswith('.'): - rank += 100 - - if has_arithmetic_operator(current_line): - rank += 100 - - # Avoid breaking at unary operators. - if re.match(r'.*[(\[{]\s*[\-\+~]$', current_line.rstrip('\\ ')): - rank += 1000 - - if re.match(r'.*lambda\s*\*$', current_line.rstrip('\\ ')): - rank += 1000 - - if current_line.endswith(('%', '(', '[', '{')): - rank -= 20 - - # Try to break list comprehensions at the "for". - if current_line.startswith('for '): - rank -= 50 - - if current_line.endswith('\\'): - # If a line ends in \-newline, it may be part of a - # multiline string. In that case, we would like to know - # how long that line is without the \-newline. If it's - # longer than the maximum, or has comments, then we assume - # that the \-newline is an okay candidate and only - # penalize it a bit. - total_len = len(current_line) - lineno += 1 - while lineno < len(lines): - total_len += len(lines[lineno]) - - if lines[lineno].lstrip().startswith('#'): - total_len = max_line_length - break - - if not lines[lineno].endswith('\\'): - break - - lineno += 1 - - if total_len < max_line_length: - rank += 10 - else: - rank += 100 if experimental else 1 - - # Prefer breaking at commas rather than colon. - if ',' in current_line and current_line.endswith(':'): - rank += 10 - - # Avoid splitting dictionaries between key and value. - if current_line.endswith(':'): - rank += 100 - - rank += 10 * count_unbalanced_brackets(current_line) - - return max(0, rank) - - -def standard_deviation(numbers): - """Return standard deviation.""" - numbers = list(numbers) - if not numbers: - return 0 - mean = sum(numbers) / len(numbers) - return (sum((n - mean) ** 2 for n in numbers) / - len(numbers)) ** .5 - - -def has_arithmetic_operator(line): - """Return True if line contains any arithmetic operators.""" - for operator in pycodestyle.ARITHMETIC_OP: - if operator in line: - return True - - return False - - -def count_unbalanced_brackets(line): - """Return number of unmatched open/close brackets.""" - count = 0 - for opening, closing in ['()', '[]', '{}']: - count += abs(line.count(opening) - line.count(closing)) - - return count - - -def split_at_offsets(line, offsets): - """Split line at offsets. - - Return list of strings. - - """ - result = [] - - previous_offset = 0 - current_offset = 0 - for current_offset in sorted(offsets): - if current_offset < len(line) and previous_offset != current_offset: - result.append(line[previous_offset:current_offset].strip()) - previous_offset = current_offset - - result.append(line[current_offset:]) - - return result - - -class LineEndingWrapper(object): - - r"""Replace line endings to work with sys.stdout. - - It seems that sys.stdout expects only '\n' as the line ending, no matter - the platform. Otherwise, we get repeated line endings. - - """ - - def __init__(self, output): - self.__output = output - - def write(self, s): - self.__output.write(s.replace('\r\n', '\n').replace('\r', '\n')) - - def flush(self): - self.__output.flush() - - -def match_file(filename, exclude): - """Return True if file is okay for modifying/recursing.""" - base_name = os.path.basename(filename) - - if base_name.startswith('.'): - return False - - for pattern in exclude: - if fnmatch.fnmatch(base_name, pattern): - return False - if fnmatch.fnmatch(filename, pattern): - return False - - if not os.path.isdir(filename) and not is_python_file(filename): - return False - - return True - - -def find_files(filenames, recursive, exclude): - """Yield filenames.""" - while filenames: - name = filenames.pop(0) - if recursive and os.path.isdir(name): - for root, directories, children in os.walk(name): - filenames += [os.path.join(root, f) for f in children - if match_file(os.path.join(root, f), - exclude)] - directories[:] = [d for d in directories - if match_file(os.path.join(root, d), - exclude)] - else: - is_exclude_match = False - for pattern in exclude: - if fnmatch.fnmatch(name, pattern): - is_exclude_match = True - break - if not is_exclude_match: - yield name - - -def _fix_file(parameters): - """Helper function for optionally running fix_file() in parallel.""" - if parameters[1].verbose: - print('[file:{}]'.format(parameters[0]), file=sys.stderr) - try: - return fix_file(*parameters) - except IOError as error: - print(str(error), file=sys.stderr) - raise error - - -def fix_multiple_files(filenames, options, output=None): - """Fix list of files. - - Optionally fix files recursively. - - """ - results = [] - filenames = find_files(filenames, options.recursive, options.exclude) - if options.jobs > 1: - import multiprocessing - pool = multiprocessing.Pool(options.jobs) - rets = [] - for name in filenames: - ret = pool.apply_async(_fix_file, ((name, options),)) - rets.append(ret) - pool.close() - pool.join() - if options.diff: - for r in rets: - sys.stdout.write(r.get().decode()) - sys.stdout.flush() - results.extend([x.get() for x in rets if x is not None]) - else: - for name in filenames: - ret = _fix_file((name, options, output)) - if ret is None: - continue - if options.diff: - if ret != '': - results.append(ret) - elif options.in_place: - results.append(ret) - else: - original_source = readlines_from_file(name) - if "".join(original_source).splitlines() != ret.splitlines(): - results.append(ret) - return results - - -def is_python_file(filename): - """Return True if filename is Python file.""" - if filename.endswith('.py'): - return True - - try: - with open_with_encoding( - filename, - limit_byte_check=MAX_PYTHON_FILE_DETECTION_BYTES) as f: - text = f.read(MAX_PYTHON_FILE_DETECTION_BYTES) - if not text: - return False - first_line = text.splitlines()[0] - except (IOError, IndexError): - return False - - if not PYTHON_SHEBANG_REGEX.match(first_line): - return False - - return True - - -def is_probably_part_of_multiline(line): - """Return True if line is likely part of a multiline string. - - When multiline strings are involved, pep8 reports the error as being - at the start of the multiline string, which doesn't work for us. - - """ - return ( - '"""' in line or - "'''" in line or - line.rstrip().endswith('\\') - ) - - -def wrap_output(output, encoding): - """Return output with specified encoding.""" - return codecs.getwriter(encoding)(output.buffer - if hasattr(output, 'buffer') - else output) - - -def get_encoding(): - """Return preferred encoding.""" - return locale.getpreferredencoding() or sys.getdefaultencoding() - - -def main(argv=None, apply_config=True): - """Command-line entry.""" - if argv is None: - argv = sys.argv - - try: - # Exit on broken pipe. - signal.signal(signal.SIGPIPE, signal.SIG_DFL) - except AttributeError: # pragma: no cover - # SIGPIPE is not available on Windows. - pass - - try: - args = parse_args(argv[1:], apply_config=apply_config) - - if args.list_fixes: - for code, description in sorted(supported_fixes()): - print('{code} - {description}'.format( - code=code, description=description)) - return EXIT_CODE_OK - - if args.files == ['-']: - assert not args.in_place - - encoding = sys.stdin.encoding or get_encoding() - read_stdin = sys.stdin.read() - fixed_stdin = fix_code(read_stdin, args, encoding=encoding) - - # LineEndingWrapper is unnecessary here due to the symmetry between - # standard in and standard out. - wrap_output(sys.stdout, encoding=encoding).write(fixed_stdin) - - if hash(read_stdin) != hash(fixed_stdin): - if args.exit_code: - return EXIT_CODE_EXISTS_DIFF - else: - if args.in_place or args.diff: - args.files = list(set(args.files)) - else: - assert len(args.files) == 1 - assert not args.recursive - - results = fix_multiple_files(args.files, args, sys.stdout) - if args.diff: - ret = any([len(ret) != 0 for ret in results]) - else: - # with in-place option - ret = any([ret is not None for ret in results]) - if args.exit_code and ret: - return EXIT_CODE_EXISTS_DIFF - except IOError: - return EXIT_CODE_ERROR - except KeyboardInterrupt: - return EXIT_CODE_ERROR # pragma: no cover - - -class CachedTokenizer(object): - - """A one-element cache around tokenize.generate_tokens(). - - Original code written by Ned Batchelder, in coverage.py. - - """ - - def __init__(self): - self.last_text = None - self.last_tokens = None - - def generate_tokens(self, text): - """A stand-in for tokenize.generate_tokens().""" - if text != self.last_text: - string_io = io.StringIO(text) - self.last_tokens = list( - tokenize.generate_tokens(string_io.readline) - ) - self.last_text = text - return self.last_tokens - - -_cached_tokenizer = CachedTokenizer() -generate_tokens = _cached_tokenizer.generate_tokens - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/venv/lib/python3.12/site-packages/black-26.3.1.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/black-26.3.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/black-26.3.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/black-26.3.1.dist-info/METADATA b/venv/lib/python3.12/site-packages/black-26.3.1.dist-info/METADATA deleted file mode 100644 index 24aedca..0000000 --- a/venv/lib/python3.12/site-packages/black-26.3.1.dist-info/METADATA +++ /dev/null @@ -1,2478 +0,0 @@ -Metadata-Version: 2.4 -Name: black -Version: 26.3.1 -Summary: The uncompromising code formatter. -Project-URL: Documentation, https://black.readthedocs.io/ -Project-URL: Changelog, https://github.com/psf/black/blob/main/CHANGES.md -Project-URL: Repository, https://github.com/psf/black -Project-URL: Issues, https://github.com/psf/black/issues -Author-email: Łukasz Langa -License-Expression: MIT -License-File: LICENSE -Keywords: automation,autopep8,formatter,gofmt,pyfmt,rustfmt,yapf -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Console -Classifier: Intended Audience :: Developers -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: 3.14 -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Software Development :: Quality Assurance -Requires-Python: >=3.10 -Requires-Dist: click>=8.0.0 -Requires-Dist: mypy-extensions>=0.4.3 -Requires-Dist: packaging>=22.0 -Requires-Dist: pathspec>=1.0.0 -Requires-Dist: platformdirs>=2 -Requires-Dist: pytokens~=0.4.0 -Requires-Dist: tomli>=1.1.0; python_version < '3.11' -Requires-Dist: typing-extensions>=4.0.1; python_version < '3.11' -Provides-Extra: colorama -Requires-Dist: colorama>=0.4.3; extra == 'colorama' -Provides-Extra: d -Requires-Dist: aiohttp>=3.10; extra == 'd' -Provides-Extra: jupyter -Requires-Dist: ipython>=7.8.0; extra == 'jupyter' -Requires-Dist: tokenize-rt>=3.2.0; extra == 'jupyter' -Provides-Extra: uvloop -Requires-Dist: uvloop>=0.15.2; (sys_platform != 'win32') and extra == 'uvloop' -Requires-Dist: winloop>=0.5.0; (sys_platform == 'win32') and extra == 'uvloop' -Description-Content-Type: text/markdown - -[![Black Logo](https://raw.githubusercontent.com/psf/black/main/docs/_static/logo2-readme.png)](https://black.readthedocs.io/en/stable/) - -

The Uncompromising Code Formatter

- -

-Actions Status -Documentation Status -Coverage Status -License: MIT -PyPI -Supported Python Versions -Downloads -conda-forge -Code style: black -

- -> “Any color you like.” - -_Black_ is the uncompromising Python code formatter. By using it, you agree to cede -control over minutiae of hand-formatting. In return, _Black_ gives you speed, -determinism, and freedom from `pycodestyle` nagging about formatting. You will save time -and mental energy for more important matters. - -Blackened code looks the same regardless of the project you're reading. Formatting -becomes transparent after a while and you can focus on the content instead. - -_Black_ makes code review faster by producing the smallest diffs possible. - -Watch the [PyCon 2019 talk](https://youtu.be/esZLCuWs_2Y) to learn more. - ---- - -**[Read the documentation on ReadTheDocs!](https://black.readthedocs.io/en/stable)** - ---- - -## Installation and usage - -### Installation - -_Black_ can be installed by running `pip install black`. It requires Python 3.10+ to -run. If you want to format Jupyter Notebooks, install with -`pip install "black[jupyter]"`. - -### Usage - -To get started right away with sensible defaults: - -```sh -black {source_file_or_directory} -``` - -You can run _Black_ as a package if running it as a script doesn't work: - -```sh -python -m black {source_file_or_directory} -``` - -Further information can be found in our docs: - -- [Usage and Configuration](https://black.readthedocs.io/en/stable/usage_and_configuration/index.html) - -_Black_ is already [successfully used](https://github.com/psf/black#used-by) by many -projects, small and big. _Black_ has a comprehensive test suite, with efficient parallel -tests, and our own auto formatting and parallel Continuous Integration runner. Now that -we have become stable, you should not expect large formatting changes in the future. -Stylistic changes will mostly be responses to bug reports and support for new Python -syntax. For more information please refer to -[The Black Code Style](https://black.readthedocs.io/en/stable/the_black_code_style/index.html). - -Also, as a safety measure which slows down processing, _Black_ will check that the -reformatted code still produces a valid AST that is effectively equivalent to the -original (see the -[Pragmatism](https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html#ast-before-and-after-formatting) -section for details). If you're feeling confident, use `--fast`. - -## The _Black_ code style - -_Black_ is a PEP 8 compliant opinionated formatter. _Black_ reformats entire files in -place. Style configuration options are deliberately limited and rarely added. It doesn't -take previous formatting into account (see -[Pragmatism](https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html#pragmatism) -for exceptions). - -Our documentation covers the current _Black_ code style, but planned changes to it are -also documented. They're both worth taking a look at: - -- [The _Black_ Code Style: Current style](https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html) -- [The _Black_ Code Style: Future style](https://black.readthedocs.io/en/stable/the_black_code_style/future_style.html) - -Changes to the _Black_ code style are bound by the Stability Policy: - -- [The _Black_ Code Style: Stability Policy](https://black.readthedocs.io/en/stable/the_black_code_style/index.html#stability-policy) - -Please refer to this document before submitting an issue. What seems like a bug might be -intended behaviour. - -### Pragmatism - -Early versions of _Black_ used to be absolutist in some respects. They took after its -initial author. This was fine at the time as it made the implementation simpler and -there were not many users anyway. Not many edge cases were reported. As a mature tool, -_Black_ does make some exceptions to rules it otherwise holds. - -- [The _Black_ code style: Pragmatism](https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html#pragmatism) - -Please refer to this document before submitting an issue just like with the document -above. What seems like a bug might be intended behaviour. - -## Configuration - -_Black_ is able to read project-specific default values for its command line options -from a `pyproject.toml` file. This is especially useful for specifying custom -`--include` and `--exclude`/`--force-exclude`/`--extend-exclude` patterns for your -project. - -You can find more details in our documentation: - -- [The basics: Configuration via a file](https://black.readthedocs.io/en/stable/usage_and_configuration/the_basics.html#configuration-via-a-file) - -And if you're looking for more general configuration documentation: - -- [Usage and Configuration](https://black.readthedocs.io/en/stable/usage_and_configuration/index.html) - -**Pro-tip**: If you're asking yourself "Do I need to configure anything?" the answer is -"No". _Black_ is all about sensible defaults. Applying those defaults will have your -code in compliance with many other _Black_ formatted projects. - -## Used by - -The following notable open-source projects trust _Black_ with enforcing a consistent -code style: pytest, tox, Pyramid, Django, Django Channels, Hypothesis, attrs, -SQLAlchemy, Poetry, PyPA applications (Warehouse, Bandersnatch, Pipenv, virtualenv), -pandas, Pillow, Twisted, LocalStack, every Datadog Agent Integration, Home Assistant, -Zulip, Kedro, OpenOA, FLORIS, ORBIT, WOMBAT, and many more. - -The following organizations use _Black_: Dropbox, KeepTruckin, Lyft, Mozilla, Quora, -Duolingo, QuantumBlack, Tesla, Archer Aviation. - -Are we missing anyone? Let us know. - -## Testimonials - -**Mike Bayer**, [author of `SQLAlchemy`](https://www.sqlalchemy.org/): - -> I can't think of any single tool in my entire programming career that has given me a -> bigger productivity increase by its introduction. I can now do refactorings in about -> 1% of the keystrokes that it would have taken me previously when we had no way for -> code to format itself. - -**Dusty Phillips**, -[writer](https://smile.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=dusty+phillips): - -> _Black_ is opinionated so you don't have to be. - -**Hynek Schlawack**, [creator of `attrs`](https://www.attrs.org/), core developer of -Twisted and CPython: - -> An auto-formatter that doesn't suck is all I want for Xmas! - -**Carl Meyer**, [Django](https://www.djangoproject.com/) core developer: - -> At least the name is good. - -**Kenneth Reitz**, creator of [`requests`](https://requests.readthedocs.io/en/latest/) -and [`pipenv`](https://readthedocs.org/projects/pipenv/): - -> This vastly improves the formatting of our code. Thanks a ton! - -## Show your style - -Use the badge in your project's README.md: - -```md -[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) -``` - -Using the badge in README.rst: - -```rst -.. image:: https://img.shields.io/badge/code%20style-black-000000.svg - :target: https://github.com/psf/black -``` - -Looks like this: -[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) - -## License - -MIT - -## Contributing - -Welcome! Happy to see you willing to make the project better. You can get started by -reading this: - -- [Contributing: The basics](https://black.readthedocs.io/en/latest/contributing/the_basics.html) - -You can also take a look at the rest of the contributing docs or talk with the -developers: - -- [Contributing documentation](https://black.readthedocs.io/en/latest/contributing/index.html) -- [Chat on Discord](https://discord.gg/RtVdv86PrH) - -## Change log - -The log has become rather long. It moved to its own file. - -See [CHANGES](https://black.readthedocs.io/en/latest/change_log.html). - -## Authors - -The author list is quite long nowadays, so it lives in its own file. - -See [AUTHORS.md](./AUTHORS.md) - -## Code of Conduct - -Everyone participating in the _Black_ project, and in particular in the issue tracker, -pull requests, and social media activity, is expected to treat other people with respect -and more generally to follow the guidelines articulated in the -[Python Community Code of Conduct](https://www.python.org/psf/codeofconduct/). - -At the same time, humor is encouraged. In fact, basic familiarity with Monty Python's -Flying Circus is expected. We are not savages. - -And if you _really_ need to slap somebody, do it with a fish while dancing. -# Change Log - -## 26.3.1 - -### Stable style - -- Prevent Jupyter notebook magic masking collisions from corrupting cells by using - exact-length placeholders for short magics and aborting if a placeholder can no longer - be unmasked safely (#5038) - -### Configuration - -- Always hash cache filename components derived from `--python-cell-magics` so custom - magic names cannot affect cache paths (#5038) - -### _Blackd_ - -- Disable browser-originated requests by default, add configurable origin allowlisting - and request body limits, and bound executor submissions to improve backpressure - (#5039) - -## 26.3.0 - -### Stable style - -- Don't double-decode input, causing non-UTF-8 files to be corrupted (#4964) -- Fix crash on standalone comment in lambda default arguments (#4993) -- Preserve parentheses when `# type: ignore` comments would be merged with other - comments on the same line, preventing AST equivalence failures (#4888) - -### Preview style - -- Fix bug where `if` guards in `case` blocks were incorrectly split when the pattern had - a trailing comma (#4884) -- Fix `string_processing` crashing on unassigned long string literals with trailing - commas (one-item tuples) (#4929) -- Simplify implementation of the power operator "hugging" logic (#4918) - -### Packaging - -- Fix shutdown errors in PyInstaller builds on macOS by disabling multiprocessing in - frozen environments (#4930) - -### Performance - -- Introduce winloop for windows as an alternative to uvloop (#4996) -- Remove deprecated function `uvloop.install()` in favor of `uvloop.new_event_loop()` - (#4996) -- Rename `maybe_install_uvloop` function to `maybe_use_uvloop` to simplify loop - installation and creation of either a uvloop/winloop evenloop or default eventloop - (#4996) - -### Output - -- Emit a clear warning when the target Python version is newer than the running Python - version, since AST safety checks cannot parse newer syntax. Also replace the - misleading "INTERNAL ERROR" message with an actionable error explaining the version - mismatch (#4983) - -### _Blackd_ - -- Introduce winloop to be used when windows in use which enables blackd to run faster on - windows when winloop is installed. (#4996) - -### Integrations - -- Remove unused gallery script (#5030) -- Harden parsing of `black` requirements in the GitHub Action when `use_pyproject` is - enabled so that only version specifiers are accepted and direct references such as - `black @ https://...` are rejected. Users should upgrade to the latest version of the - action as soon as possible. This update is received automatically when using - `psf/black@stable`, and is independent of the version of Black installed by the - action. (#5031) - -### Documentation - -- Expand preview style documentation with detailed examples for `wrap_comprehension_in`, - `simplify_power_operator_hugging`, and `wrap_long_dict_values_in_parens` features - (#4987) -- Add detailed documentation for formatting Jupyter Notebooks (#5009) - -## 26.1.0 - -### Highlights - -Introduces the 2026 stable style (#4892), stabilizing the following changes: - -- `always_one_newline_after_import`: Always force one blank line after import - statements, except when the line after the import is a comment or an import statement - (#4489) -- `fix_fmt_skip_in_one_liners`: Fix `# fmt: skip` behavior on one-liner declarations, - such as `def foo(): return "mock" # fmt: skip`, where previously the declaration would - have been incorrectly collapsed (#4800) -- `fix_module_docstring_detection`: Fix module docstrings being treated as normal - strings if preceded by comments (#4764) -- `fix_type_expansion_split`: Fix type expansions split in generic functions (#4777) -- `multiline_string_handling`: Make expressions involving multiline strings more compact - (#1879) -- `normalize_cr_newlines`: Add `\r` style newlines to the potential newlines to - normalize file newlines both from and to (#4710) -- `remove_parens_around_except_types`: Remove parentheses around multiple exception - types in `except` and `except*` without `as` (#4720) -- `remove_parens_from_assignment_lhs`: Remove unnecessary parentheses from the left-hand - side of assignments while preserving magic trailing commas and intentional multiline - formatting (#4865) -- `standardize_type_comments`: Format type comments which have zero or more spaces - between `#` and `type:` or between `type:` and value to `# type: (value)` (#4645) - -The following change was not in any previous stable release: - -- Regenerated the `_width_table.py` and added tests for the Khmer language (#4253) - -This release alo bumps `pathspec` to v1 and fixes inconsistencies with Git's -`.gitignore` logic (#4958). Now, files will be ignored if a pattern matches them, even -if the parent directory is directly unignored. For example, Black would previously -format `exclude/not_this/foo.py` with this `.gitignore`: - -``` -exclude/ -!exclude/not_this/ -``` - -Now, `exclude/not_this/foo.py` will remain ignored. To ensure `exclude/not_this/` and -all of it's children are included in formatting (and in Git), use this `.gitignore`: - -``` -*/exclude/* -!*/exclude/not_this/ -``` - -This new behavior matches Git. The leading `*/` are only necessary if you wish to ignore -matching subdirectories (like the previous behavior did), and not just matching root -directories. - -### Output - -- Explicitly shutdown the multiprocessing manager when run in diff mode too (#4952) - -### Integrations - -- Upgraded PyPI upload workflow to use Trusted Publishing (#4611) - -## 25.12.0 - -### Highlights - -- Black no longer supports running with Python 3.9 (#4842) - -### Stable style - -- Fix bug where comments preceding `# fmt: off`/`# fmt: on` blocks were incorrectly - removed, particularly affecting Jupytext's `# %% [markdown]` comments (#4845) -- Fix crash when multiple `# fmt: skip` comments are used in a multi-part if-clause, on - string literals, or on dictionary entries with long lines (#4872) -- Fix possible crash when `fmt: ` directives aren't on the top level (#4856) - -### Preview style - -- Fix `fmt: skip` skipping the line after instead of the line it's on (#4855) -- Remove unnecessary parentheses from the left-hand side of assignments while preserving - magic trailing commas and intentional multiline formatting (#4865) -- Fix `fix_fmt_skip_in_one_liners` crashing on `with` statements (#4853) -- Fix `fix_fmt_skip_in_one_liners` crashing on annotated parameters (#4854) -- Fix new lines being added after imports with `# fmt: skip` on them (#4894) - -### Packaging - -- Releases now include arm64 Windows binaries and wheels (#4814) - -### Integrations - -- Add `output-file` input to GitHub Action `psf/black` to write formatter output to a - file for artifact capture and log cleanliness (#4824) - -## 25.11.0 - -### Highlights - -- Enable base 3.14 support (#4804) -- Add support for the new Python 3.14 t-string syntax introduced by PEP 750 (#4805) - -### Stable style - -- Fix bug where comments between `# fmt: off` and `# fmt: on` were reformatted (#4811) -- Comments containing fmt directives now preserve their exact formatting instead of - being normalized (#4811) - -### Preview style - -- Move `multiline_string_handling` from `--unstable` to `--preview` (#4760) -- Fix bug where module docstrings would be treated as normal strings if preceded by - comments (#4764) -- Fix bug where python 3.12 generics syntax split line happens weirdly (#4777) -- Standardize type comments to form `# type: ` (#4645) -- Fix `fix_fmt_skip_in_one_liners` preview feature to respect `# fmt: skip` for compound - statements with semicolon-separated bodies (#4800) - -### Configuration - -- Add `no_cache` option to control caching behavior. (#4803) - -### Packaging - -- Releases now include arm64 Linux binaries (#4773) - -### Output - -- Write unchanged content to stdout when excluding formatting from stdin using pipes - (#4610) - -### _Blackd_ - -- Implemented BlackDClient. This simple python client allows to easily send formatting - requests to blackd (#4774) - -### Integrations - -- Enable 3.14 base CI (#4804) -- Enhance GitHub Action `psf/black` to support the `required-version` major-version-only - "stability" format when using pyproject.toml (#4770) -- Improve error message for vim plugin users. It now handles independently vim version -- Vim: Warn on unsupported Vim and Python versions independently (#4772) -- Vim: Print the import paths when importing black fails (#4675) -- Vim: Fix handling of virtualenvs that have a different Python version (#4675) - -## 25.9.0 - -### Highlights - -- Remove support for pre-python 3.7 `await/async` as soft keywords/variable names - (#4676) - -### Stable style - -- Fix crash while formatting a long `del` statement containing tuples (#4628) -- Fix crash while formatting expressions using the walrus operator in complex `with` - statements (#4630) -- Handle `# fmt: skip` followed by a comment at the end of file (#4635) -- Fix crash when a tuple appears in the `as` clause of a `with` statement (#4634) -- Fix crash when tuple is used as a context manager inside a `with` statement (#4646) -- Fix crash when formatting a `\` followed by a `\r` followed by a comment (#4663) -- Fix crash on a `\\r\n` (#4673) -- Fix crash on `await ...` (where `...` is a literal `Ellipsis`) (#4676) -- Fix crash on parenthesized expression inside a type parameter bound (#4684) -- Fix crash when using line ranges excluding indented single line decorated items - (#4670) - -### Preview style - -- Fix a bug where one-liner functions/conditionals marked with `# fmt: skip` would still - be formatted (#4552) -- Improve `multiline_string_handling` with ternaries and dictionaries (#4657) -- Fix a bug where `string_processing` would not split f-strings directly after - expressions (#4680) -- Wrap the `in` clause of comprehensions across lines if necessary (#4699) -- Remove parentheses around multiple exception types in `except` and `except*` without - `as`. (#4720) -- Add `\r` style newlines to the potential newlines to normalize file newlines both from - and to (#4710) - -### Parser - -- Rewrite tokenizer to improve performance and compliance (#4536) -- Fix bug where certain unusual expressions (e.g., lambdas) were not accepted in type - parameter bounds and defaults. (#4602) - -### Performance - -- Avoid using an extra process when running with only one worker (#4734) - -### Integrations - -- Fix the version check in the vim file to reject Python 3.8 (#4567) -- Enhance GitHub Action `psf/black` to read Black version from an additional section in - pyproject.toml: `[project.dependency-groups]` (#4606) -- Build gallery docker image with python3-slim and reduce image size (#4686) - -### Documentation - -- Add FAQ entry for windows emoji not displaying (#4714) - -## 25.1.0 - -### Highlights - -This release introduces the new 2025 stable style (#4558), stabilizing the following -changes: - -- Normalize casing of Unicode escape characters in strings to lowercase (#2916) -- Fix inconsistencies in whether certain strings are detected as docstrings (#4095) -- Consistently add trailing commas to typed function parameters (#4164) -- Remove redundant parentheses in if guards for case blocks (#4214) -- Add parentheses to if clauses in case blocks when the line is too long (#4269) -- Whitespace before `# fmt: skip` comments is no longer normalized (#4146) -- Fix line length computation for certain expressions that involve the power operator - (#4154) -- Check if there is a newline before the terminating quotes of a docstring (#4185) -- Fix type annotation spacing between `*` and more complex type variable tuple (#4440) - -The following changes were not in any previous release: - -- Remove parentheses around sole list items (#4312) -- Generic function definitions are now formatted more elegantly: parameters are split - over multiple lines first instead of type parameter definitions (#4553) - -### Stable style - -- Fix formatting cells in IPython notebooks with magic methods and starting or trailing - empty lines (#4484) -- Fix crash when formatting `with` statements containing tuple generators/unpacking - (#4538) - -### Preview style - -- Fix/remove string merging changing f-string quotes on f-strings with internal quotes - (#4498) -- Collapse multiple empty lines after an import into one (#4489) -- Prevent `string_processing` and `wrap_long_dict_values_in_parens` from removing - parentheses around long dictionary values (#4377) -- Move `wrap_long_dict_values_in_parens` from the unstable to preview style (#4561) - -### Packaging - -- Store license identifier inside the `License-Expression` metadata field, see - [PEP 639](https://peps.python.org/pep-0639/). (#4479) - -### Performance - -- Speed up the `is_fstring_start` function in Black's tokenizer (#4541) - -### Integrations - -- If using stdin with `--stdin-filename` set to a force excluded path, stdin won't be - formatted. (#4539) - -## 24.10.0 - -### Highlights - -- Black is now officially tested with Python 3.13 and provides Python 3.13 - mypyc-compiled wheels. (#4436) (#4449) -- Black will issue an error when used with Python 3.12.5, due to an upstream memory - safety issue in Python 3.12.5 that can cause Black's AST safety checks to fail. Please - use Python 3.12.6 or Python 3.12.4 instead. (#4447) -- Black no longer supports running with Python 3.8 (#4452) - -### Stable style - -- Fix crashes involving comments in parenthesised return types or `X | Y` style unions. - (#4453) -- Fix skipping Jupyter cells with unknown `%%` magic (#4462) - -### Preview style - -- Fix type annotation spacing between * and more complex type variable tuple (i.e. `def - fn(*args: *tuple[*Ts, T]) -> None: pass`) (#4440) - -### Caching - -- Fix bug where the cache was shared between runs with and without `--unstable` (#4466) - -### Packaging - -- Upgrade version of mypyc used to 1.12 beta (#4450) (#4449) -- `blackd` now requires a newer version of aiohttp. (#4451) - -### Output - -- Added Python target version information on parse error (#4378) -- Add information about Black version to internal error messages (#4457) - -## 24.8.0 - -### Stable style - -- Fix crash when `# fmt: off` is used before a closing parenthesis or bracket. (#4363) - -### Packaging - -- Packaging metadata updated: docs are explictly linked, the issue tracker is now also - linked. This improves the PyPI listing for Black. (#4345) - -### Parser - -- Fix regression where Black failed to parse a multiline f-string containing another - multiline string (#4339) -- Fix regression where Black failed to parse an escaped single quote inside an f-string - (#4401) -- Fix bug with Black incorrectly parsing empty lines with a backslash (#4343) -- Fix bugs with Black's tokenizer not handling `\{` inside f-strings very well (#4422) -- Fix incorrect line numbers in the tokenizer for certain tokens within f-strings - (#4423) - -### Performance - -- Improve performance when a large directory is listed in `.gitignore` (#4415) - -### _Blackd_ - -- Fix blackd (and all extras installs) for docker container (#4357) - -## 24.4.2 - -This is a bugfix release to fix two regressions in the new f-string parser introduced in -24.4.1. - -### Parser - -- Fix regression where certain complex f-strings failed to parse (#4332) - -### Performance - -- Fix bad performance on certain complex string literals (#4331) - -## 24.4.1 - -### Highlights - -- Add support for the new Python 3.12 f-string syntax introduced by PEP 701 (#3822) - -### Stable style - -- Fix crash involving indented dummy functions containing newlines (#4318) - -### Parser - -- Add support for type parameter defaults, a new syntactic feature added to Python 3.13 - by PEP 696 (#4327) - -### Integrations - -- Github Action now works even when `git archive` is skipped (#4313) - -## 24.4.0 - -### Stable style - -- Fix unwanted crashes caused by AST equivalency check (#4290) - -### Preview style - -- `if` guards in `case` blocks are now wrapped in parentheses when the line is too long. - (#4269) -- Stop moving multiline strings to a new line unless inside brackets (#4289) - -### Integrations - -- Add a new option `use_pyproject` to the GitHub Action `psf/black`. This will read the - Black version from `pyproject.toml`. (#4294) - -## 24.3.0 - -### Highlights - -This release is a milestone: it fixes Black's first CVE security vulnerability. If you -run Black on untrusted input, or if you habitually put thousands of leading tab -characters in your docstrings, you are strongly encouraged to upgrade immediately to fix -[CVE-2024-21503](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2024-21503). - -This release also fixes a bug in Black's AST safety check that allowed Black to make -incorrect changes to certain f-strings that are valid in Python 3.12 and higher. - -### Stable style - -- Don't move comments along with delimiters, which could cause crashes (#4248) -- Strengthen AST safety check to catch more unsafe changes to strings. Previous versions - of Black would incorrectly format the contents of certain unusual f-strings containing - nested strings with the same quote type. Now, Black will crash on such strings until - support for the new f-string syntax is implemented. (#4270) -- Fix a bug where line-ranges exceeding the last code line would not work as expected - (#4273) - -### Performance - -- Fix catastrophic performance on docstrings that contain large numbers of leading tab - characters. This fixes - [CVE-2024-21503](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2024-21503). - (#4278) - -### Documentation - -- Note what happens when `--check` is used with `--quiet` (#4236) - -## 24.2.0 - -### Stable style - -- Fixed a bug where comments where mistakenly removed along with redundant parentheses - (#4218) - -### Preview style - -- Move the `hug_parens_with_braces_and_square_brackets` feature to the unstable style - due to an outstanding crash and proposed formatting tweaks (#4198) -- Fixed a bug where base expressions caused inconsistent formatting of \*\* in tenary - expression (#4154) -- Checking for newline before adding one on docstring that is almost at the line limit - (#4185) -- Remove redundant parentheses in `case` statement `if` guards (#4214). - -### Configuration - -- Fix issue where _Black_ would ignore input files in the presence of symlinks (#4222) -- _Black_ now ignores `pyproject.toml` that is missing a `tool.black` section when - discovering project root and configuration. Since _Black_ continues to use version - control as an indicator of project root, this is expected to primarily change behavior - for users in a monorepo setup (desirably). If you wish to preserve previous behavior, - simply add an empty `[tool.black]` to the previously discovered `pyproject.toml` - (#4204) - -### Output - -- Black will swallow any `SyntaxWarning`s or `DeprecationWarning`s produced by the `ast` - module when performing equivalence checks (#4189) - -### Integrations - -- Add a JSONSchema and provide a validate-pyproject entry-point (#4181) - -## 24.1.1 - -Bugfix release to fix a bug that made Black unusable on certain file systems with strict -limits on path length. - -### Preview style - -- Consistently add trailing comma on typed parameters (#4164) - -### Configuration - -- Shorten the length of the name of the cache file to fix crashes on file systems that - do not support long paths (#4176) - -## 24.1.0 - -### Highlights - -This release introduces the new 2024 stable style (#4106), stabilizing the following -changes: - -- Add parentheses around `if`-`else` expressions (#2278) -- Dummy class and function implementations consisting only of `...` are formatted more - compactly (#3796) -- If an assignment statement is too long, we now prefer splitting on the right-hand side - (#3368) -- Hex codes in Unicode escape sequences are now standardized to lowercase (#2916) -- Allow empty first lines at the beginning of most blocks (#3967, #4061) -- Add parentheses around long type annotations (#3899) -- Enforce newline after module docstrings (#3932, #4028) -- Fix incorrect magic trailing comma handling in return types (#3916) -- Remove blank lines before class docstrings (#3692) -- Wrap multiple context managers in parentheses if combined in a single `with` statement - (#3489) -- Fix bug in line length calculations for power operations (#3942) -- Add trailing commas to collection literals even if there's a comment after the last - entry (#3393) -- When using `--skip-magic-trailing-comma` or `-C`, trailing commas are stripped from - subscript expressions with more than 1 element (#3209) -- Add extra blank lines in stubs in a few cases (#3564, #3862) -- Accept raw strings as docstrings (#3947) -- Split long lines in case blocks (#4024) -- Stop removing spaces from walrus operators within subscripts (#3823) -- Fix incorrect formatting of certain async statements (#3609) -- Allow combining `# fmt: skip` with other comments (#3959) - -There are already a few improvements in the `--preview` style, which are slated for the -2025 stable style. Try them out and -[share your feedback](https://github.com/psf/black/issues). In the past, the preview -style has included some features that we were not able to stabilize. This year, we're -adding a separate `--unstable` style for features with known problems. Now, the -`--preview` style only includes features that we actually expect to make it into next -year's stable style. - -### Stable style - -Several bug fixes were made in features that are moved to the stable style in this -release: - -- Fix comment handling when parenthesising conditional expressions (#4134) -- Fix bug where spaces were not added around parenthesized walruses in subscripts, - unlike other binary operators (#4109) -- Remove empty lines before docstrings in async functions (#4132) -- Address a missing case in the change to allow empty lines at the beginning of all - blocks, except immediately before a docstring (#4130) -- For stubs, fix logic to enforce empty line after nested classes with bodies (#4141) - -### Preview style - -- Add `--unstable` style, covering preview features that have known problems that would - block them from going into the stable style. Also add the `--enable-unstable-feature` - flag; for example, use - `--enable-unstable-feature hug_parens_with_braces_and_square_brackets` to apply this - preview feature throughout 2024, even if a later Black release downgrades the feature - to unstable (#4096) -- Format module docstrings the same as class and function docstrings (#4095) -- Fix crash when using a walrus in a dictionary (#4155) -- Fix unnecessary parentheses when wrapping long dicts (#4135) -- Stop normalizing spaces before `# fmt: skip` comments (#4146) - -### Configuration - -- Print warning when configuration in `pyproject.toml` contains an invalid key (#4165) -- Fix symlink handling, properly ignoring symlinks that point outside of root (#4161) -- Fix cache mtime logic that resulted in false positive cache hits (#4128) -- Remove the long-deprecated `--experimental-string-processing` flag. This feature can - currently be enabled with `--preview --enable-unstable-feature string_processing`. - (#4096) - -### Integrations - -- Revert the change to run Black's pre-commit integration only on specific git hooks - (#3940) for better compatibility with older versions of pre-commit (#4137) - -## 23.12.1 - -### Packaging - -- Fixed a bug that included dependencies from the `d` extra by default (#4108) - -## 23.12.0 - -### Highlights - -It's almost 2024, which means it's time for a new edition of _Black_'s stable style! -Together with this release, we'll put out an alpha release 24.1a1 showcasing the draft -2024 stable style, which we'll finalize in the January release. Please try it out and -[share your feedback](https://github.com/psf/black/issues/4042). - -This release (23.12.0) will still produce the 2023 style. Most but not all of the -changes in `--preview` mode will be in the 2024 stable style. - -### Stable style - -- Fix bug where `# fmt: off` automatically dedents when used with the `--line-ranges` - option, even when it is not within the specified line range. (#4084) -- Fix feature detection for parenthesized context managers (#4104) - -### Preview style - -- Prefer more equal signs before a break when splitting chained assignments (#4010) -- Standalone form feed characters at the module level are no longer removed (#4021) -- Additional cases of immediately nested tuples, lists, and dictionaries are now - indented less (#4012) -- Allow empty lines at the beginning of all blocks, except immediately before a - docstring (#4060) -- Fix crash in preview mode when using a short `--line-length` (#4086) -- Keep suites consisting of only an ellipsis on their own lines if they are not - functions or class definitions (#4066) (#4103) - -### Configuration - -- `--line-ranges` now skips _Black_'s internal stability check in `--safe` mode. This - avoids a crash on rare inputs that have many unformatted same-content lines. (#4034) - -### Packaging - -- Upgrade to mypy 1.7.1 (#4049) (#4069) -- Faster compiled wheels are now available for CPython 3.12 (#4070) - -### Integrations - -- Enable 3.12 CI (#4035) -- Build docker images in parallel (#4054) -- Build docker images with 3.12 (#4055) - -## 23.11.0 - -### Highlights - -- Support formatting ranges of lines with the new `--line-ranges` command-line option - (#4020) - -### Stable style - -- Fix crash on formatting bytes strings that look like docstrings (#4003) -- Fix crash when whitespace followed a backslash before newline in a docstring (#4008) -- Fix standalone comments inside complex blocks crashing Black (#4016) -- Fix crash on formatting code like `await (a ** b)` (#3994) -- No longer treat leading f-strings as docstrings. This matches Python's behaviour and - fixes a crash (#4019) - -### Preview style - -- Multiline dicts and lists that are the sole argument to a function are now indented - less (#3964) -- Multiline unpacked dicts and lists as the sole argument to a function are now also - indented less (#3992) -- In f-string debug expressions, quote types that are visible in the final string are - now preserved (#4005) -- Fix a bug where long `case` blocks were not split into multiple lines. Also enable - general trailing comma rules on `case` blocks (#4024) -- Keep requiring two empty lines between module-level docstring and first function or - class definition (#4028) -- Add support for single-line format skip with other comments on the same line (#3959) - -### Configuration - -- Consistently apply force exclusion logic before resolving symlinks (#4015) -- Fix a bug in the matching of absolute path names in `--include` (#3976) - -### Performance - -- Fix mypyc builds on arm64 on macOS (#4017) - -### Integrations - -- Black's pre-commit integration will now run only on git hooks appropriate for a code - formatter (#3940) - -## 23.10.1 - -### Highlights - -- Maintenance release to get a fix out for GitHub Action edge case (#3957) - -### Preview style - -- Fix merging implicit multiline strings that have inline comments (#3956) -- Allow empty first line after block open before a comment or compound statement (#3967) - -### Packaging - -- Change Dockerfile to hatch + compile black (#3965) - -### Integrations - -- The summary output for GitHub workflows is now suppressible using the `summary` - parameter. (#3958) -- Fix the action failing when Black check doesn't pass (#3957) - -### Documentation - -- It is known Windows documentation CI is broken - https://github.com/psf/black/issues/3968 - -## 23.10.0 - -### Stable style - -- Fix comments getting removed from inside parenthesized strings (#3909) - -### Preview style - -- Fix long lines with power operators getting split before the line length (#3942) -- Long type hints are now wrapped in parentheses and properly indented when split across - multiple lines (#3899) -- Magic trailing commas are now respected in return types. (#3916) -- Require one empty line after module-level docstrings. (#3932) -- Treat raw triple-quoted strings as docstrings (#3947) - -### Configuration - -- Fix cache versioning logic when `BLACK_CACHE_DIR` is set (#3937) - -### Parser - -- Fix bug where attributes named `type` were not accepted inside `match` statements - (#3950) -- Add support for PEP 695 type aliases containing lambdas and other unusual expressions - (#3949) - -### Output - -- Black no longer attempts to provide special errors for attempting to format Python 2 - code (#3933) -- Black will more consistently print stacktraces on internal errors in verbose mode - (#3938) - -### Integrations - -- The action output displayed in the job summary is now wrapped in Markdown (#3914) - -## 23.9.1 - -Due to various issues, the previous release (23.9.0) did not include compiled mypyc -wheels, which make Black significantly faster. These issues have now been fixed, and -this release should come with compiled wheels once again. - -There will be no wheels for Python 3.12 due to a bug in mypyc. We will provide 3.12 -wheels in a future release as soon as the mypyc bug is fixed. - -### Packaging - -- Upgrade to mypy 1.5.1 (#3864) - -### Performance - -- Store raw tuples instead of NamedTuples in Black's cache, improving performance and - decreasing the size of the cache (#3877) - -## 23.9.0 - -### Preview style - -- More concise formatting for dummy implementations (#3796) -- In stub files, add a blank line between a statement with a body (e.g an - `if sys.version_info > (3, x):`) and a function definition on the same level (#3862) -- Fix a bug whereby spaces were removed from walrus operators within subscript(#3823) - -### Configuration - -- Black now applies exclusion and ignore logic before resolving symlinks (#3846) - -### Performance - -- Avoid importing `IPython` if notebook cells do not contain magics (#3782) -- Improve caching by comparing file hashes as fallback for mtime and size (#3821) - -### _Blackd_ - -- Fix an issue in `blackd` with single character input (#3558) - -### Integrations - -- Black now has an - [official pre-commit mirror](https://github.com/psf/black-pre-commit-mirror). Swapping - `https://github.com/psf/black` to `https://github.com/psf/black-pre-commit-mirror` in - your `.pre-commit-config.yaml` will make Black about 2x faster (#3828) -- The `.black.env` folder specified by `ENV_PATH` will now be removed on the completion - of the GitHub Action (#3759) - -## 23.7.0 - -### Highlights - -- Runtime support for Python 3.7 has been removed. Formatting 3.7 code will still be - supported until further notice (#3765) - -### Stable style - -- Fix a bug where an illegal trailing comma was added to return type annotations using - PEP 604 unions (#3735) -- Fix several bugs and crashes where comments in stub files were removed or mishandled - under some circumstances (#3745) -- Fix a crash with multi-line magic comments like `type: ignore` within parentheses - (#3740) -- Fix error in AST validation when _Black_ removes trailing whitespace in a type comment - (#3773) - -### Preview style - -- Implicitly concatenated strings used as function args are no longer wrapped inside - parentheses (#3640) -- Remove blank lines between a class definition and its docstring (#3692) - -### Configuration - -- The `--workers` argument to _Black_ can now be specified via the `BLACK_NUM_WORKERS` - environment variable (#3743) -- `.pytest_cache`, `.ruff_cache` and `.vscode` are now excluded by default (#3691) -- Fix _Black_ not honouring `pyproject.toml` settings when running `--stdin-filename` - and the `pyproject.toml` found isn't in the current working directory (#3719) -- _Black_ will now error if `exclude` and `extend-exclude` have invalid data types in - `pyproject.toml`, instead of silently doing the wrong thing (#3764) - -### Packaging - -- Upgrade mypyc from 0.991 to 1.3 (#3697) -- Remove patching of Click that mitigated errors on Python 3.6 with `LANG=C` (#3768) - -### Parser - -- Add support for the new PEP 695 syntax in Python 3.12 (#3703) - -### Performance - -- Speed up _Black_ significantly when the cache is full (#3751) -- Avoid importing `IPython` in a case where we wouldn't need it (#3748) - -### Output - -- Use aware UTC datetimes internally, avoids deprecation warning on Python 3.12 (#3728) -- Change verbose logging to exactly mirror _Black_'s logic for source discovery (#3749) - -### _Blackd_ - -- The `blackd` argument parser now shows the default values for options in their help - text (#3712) - -### Integrations - -- Black is now tested with - [`PYTHONWARNDEFAULTENCODING = 1`](https://docs.python.org/3/library/io.html#io-encoding-warning) - (#3763) -- Update GitHub Action to display black output in the job summary (#3688) - -### Documentation - -- Add a CITATION.cff file to the root of the repository, containing metadata on how to - cite this software (#3723) -- Update the _classes_ and _exceptions_ documentation in Developer reference to match - the latest code base (#3755) - -## 23.3.0 - -### Highlights - -This release fixes a longstanding confusing behavior in Black's GitHub action, where the -version of the action did not determine the version of Black being run (issue #3382). In -addition, there is a small bug fix around imports and a number of improvements to the -preview style. - -Please try out the -[preview style](https://black.readthedocs.io/en/stable/the_black_code_style/future_style.html#preview-style) -with `black --preview` and tell us your feedback. All changes in the preview style are -expected to become part of Black's stable style in January 2024. - -### Stable style - -- Import lines with `# fmt: skip` and `# fmt: off` no longer have an extra blank line - added when they are right after another import line (#3610) - -### Preview style - -- Add trailing commas to collection literals even if there's a comment after the last - entry (#3393) -- `async def`, `async for`, and `async with` statements are now formatted consistently - compared to their non-async version. (#3609) -- `with` statements that contain two context managers will be consistently wrapped in - parentheses (#3589) -- Let string splitters respect [East Asian Width](https://www.unicode.org/reports/tr11/) - (#3445) -- Now long string literals can be split after East Asian commas and periods (`、` U+3001 - IDEOGRAPHIC COMMA, `。` U+3002 IDEOGRAPHIC FULL STOP, & `,` U+FF0C FULLWIDTH COMMA) - besides before spaces (#3445) -- For stubs, enforce one blank line after a nested class with a body other than just - `...` (#3564) -- Improve handling of multiline strings by changing line split behavior (#1879) - -### Parser - -- Added support for formatting files with invalid type comments (#3594) - -### Integrations - -- Update GitHub Action to use the version of Black equivalent to action's version if - version input is not specified (#3543) -- Fix missing Python binary path in autoload script for vim (#3508) - -### Documentation - -- Document that only the most recent release is supported for security issues; - vulnerabilities should be reported through Tidelift (#3612) - -## 23.1.0 - -### Highlights - -This is the first release of 2023, and following our -[stability policy](https://black.readthedocs.io/en/stable/the_black_code_style/index.html#stability-policy), -it comes with a number of improvements to our stable style, including improvements to -empty line handling, removal of redundant parentheses in several contexts, and output -that highlights implicitly concatenated strings better. - -There are also many changes to the preview style; try out `black --preview` and give us -feedback to help us set the stable style for next year. - -In addition to style changes, Black now automatically infers the supported Python -versions from your `pyproject.toml` file, removing the need to set Black's target -versions separately. - -### Stable style - -- Introduce the 2023 stable style, which incorporates most aspects of last year's - preview style (#3418). Specific changes: - - Enforce empty lines before classes and functions with sticky leading comments - (#3302) (22.12.0) - - Reformat empty and whitespace-only files as either an empty file (if no newline is - present) or as a single newline character (if a newline is present) (#3348) - (22.12.0) - - Implicitly concatenated strings used as function args are now wrapped inside - parentheses (#3307) (22.12.0) - - Correctly handle trailing commas that are inside a line's leading non-nested parens - (#3370) (22.12.0) - - `--skip-string-normalization` / `-S` now prevents docstring prefixes from being - normalized as expected (#3168) (since 22.8.0) - - When using `--skip-magic-trailing-comma` or `-C`, trailing commas are stripped from - subscript expressions with more than 1 element (#3209) (22.8.0) - - Implicitly concatenated strings inside a list, set, or tuple are now wrapped inside - parentheses (#3162) (22.8.0) - - Fix a string merging/split issue when a comment is present in the middle of - implicitly concatenated strings on its own line (#3227) (22.8.0) - - Docstring quotes are no longer moved if it would violate the line length limit - (#3044, #3430) (22.6.0) - - Parentheses around return annotations are now managed (#2990) (22.6.0) - - Remove unnecessary parentheses around awaited objects (#2991) (22.6.0) - - Remove unnecessary parentheses in `with` statements (#2926) (22.6.0) - - Remove trailing newlines after code block open (#3035) (22.6.0) - - Code cell separators `#%%` are now standardised to `# %%` (#2919) (22.3.0) - - Remove unnecessary parentheses from `except` statements (#2939) (22.3.0) - - Remove unnecessary parentheses from tuple unpacking in `for` loops (#2945) (22.3.0) - - Avoid magic-trailing-comma in single-element subscripts (#2942) (22.3.0) -- Fix a crash when a colon line is marked between `# fmt: off` and `# fmt: on` (#3439) - -### Preview style - -- Format hex codes in unicode escape sequences in string literals (#2916) -- Add parentheses around `if`-`else` expressions (#2278) -- Improve performance on large expressions that contain many strings (#3467) -- Fix a crash in preview style with assert + parenthesized string (#3415) -- Fix crashes in preview style with walrus operators used in function return annotations - and except clauses (#3423) -- Fix a crash in preview advanced string processing where mixed implicitly concatenated - regular and f-strings start with an empty span (#3463) -- Fix a crash in preview advanced string processing where a standalone comment is placed - before a dict's value (#3469) -- Fix an issue where extra empty lines are added when a decorator has `# fmt: skip` - applied or there is a standalone comment between decorators (#3470) -- Do not put the closing quotes in a docstring on a separate line, even if the line is - too long (#3430) -- Long values in dict literals are now wrapped in parentheses; correspondingly - unnecessary parentheses around short values in dict literals are now removed; long - string lambda values are now wrapped in parentheses (#3440) -- Fix two crashes in preview style involving edge cases with docstrings (#3451) -- Exclude string type annotations from improved string processing; fix crash when the - return type annotation is stringified and spans across multiple lines (#3462) -- Wrap multiple context managers in parentheses when targeting Python 3.9+ (#3489) -- Fix several crashes in preview style with walrus operators used in `with` statements - or tuples (#3473) -- Fix an invalid quote escaping bug in f-string expressions where it produced invalid - code. Implicitly concatenated f-strings with different quotes can now be merged or - quote-normalized by changing the quotes used in expressions. (#3509) -- Fix crash on `await (yield)` when Black is compiled with mypyc (#3533) - -### Configuration - -- Black now tries to infer its `--target-version` from the project metadata specified in - `pyproject.toml` (#3219) - -### Packaging - -- Upgrade mypyc from `0.971` to `0.991` so mypycified _Black_ can be built on armv7 - (#3380) - - This also fixes some crashes while using compiled Black with a debug build of - CPython -- Drop specific support for the `tomli` requirement on 3.11 alpha releases, working - around a bug that would cause the requirement not to be installed on any non-final - Python releases (#3448) -- Black now depends on `packaging` version `22.0` or later. This is required for new - functionality that needs to parse part of the project metadata (#3219) - -### Output - -- Calling `black --help` multiple times will return the same help contents each time - (#3516) -- Verbose logging now shows the values of `pyproject.toml` configuration variables - (#3392) -- Fix false symlink detection messages in verbose output due to using an incorrect - relative path to the project root (#3385) - -### Integrations - -- Move 3.11 CI to normal flow now that all dependencies support 3.11 (#3446) -- Docker: Add new `latest_prerelease` tag automation to follow latest black alpha - release on docker images (#3465) - -### Documentation - -- Expand `vim-plug` installation instructions to offer more explicit options (#3468) - -## 22.12.0 - -### Preview style - -- Enforce empty lines before classes and functions with sticky leading comments (#3302) -- Reformat empty and whitespace-only files as either an empty file (if no newline is - present) or as a single newline character (if a newline is present) (#3348) -- Implicitly concatenated strings used as function args are now wrapped inside - parentheses (#3307) -- For assignment statements, prefer splitting the right hand side if the left hand side - fits on a single line (#3368) -- Correctly handle trailing commas that are inside a line's leading non-nested parens - (#3370) - -### Configuration - -- Fix incorrectly applied `.gitignore` rules by considering the `.gitignore` location - and the relative path to the target file (#3338) -- Fix incorrectly ignoring `.gitignore` presence when more than one source directory is - specified (#3336) - -### Parser - -- Parsing support has been added for walruses inside generator expression that are - passed as function args (for example, - `any(match := my_re.match(text) for text in texts)`) (#3327). - -### Integrations - -- Vim plugin: Optionally allow using the system installation of Black via - `let g:black_use_virtualenv = 0`(#3309) - -## 22.10.0 - -### Highlights - -- Runtime support for Python 3.6 has been removed. Formatting 3.6 code will still be - supported until further notice. - -### Stable style - -- Fix a crash when `# fmt: on` is used on a different block level than `# fmt: off` - (#3281) - -### Preview style - -- Fix a crash when formatting some dicts with parenthesis-wrapped long string keys - (#3262) - -### Configuration - -- `.ipynb_checkpoints` directories are now excluded by default (#3293) -- Add `--skip-source-first-line` / `-x` option to ignore the first line of source code - while formatting (#3299) - -### Packaging - -- Executables made with PyInstaller will no longer crash when formatting several files - at once on macOS. Native x86-64 executables for macOS are available once again. - (#3275) -- Hatchling is now used as the build backend. This will not have any effect for users - who install Black with its wheels from PyPI. (#3233) -- Faster compiled wheels are now available for CPython 3.11 (#3276) - -### _Blackd_ - -- Windows style (CRLF) newlines will be preserved (#3257). - -### Integrations - -- Vim plugin: add flag (`g:black_preview`) to enable/disable the preview style (#3246) -- Update GitHub Action to support formatting of Jupyter Notebook files via a `jupyter` - option (#3282) -- Update GitHub Action to support use of version specifiers (e.g. `<23`) for Black - version (#3265) - -## 22.8.0 - -### Highlights - -- Python 3.11 is now supported, except for _blackd_ as aiohttp does not support 3.11 as - of publishing (#3234) -- This is the last release that supports running _Black_ on Python 3.6 (formatting 3.6 - code will continue to be supported until further notice) -- Reword the stability policy to say that we may, in rare cases, make changes that - affect code that was not previously formatted by _Black_ (#3155) - -### Stable style - -- Fix an infinite loop when using `# fmt: on/off` in the middle of an expression or code - block (#3158) -- Fix incorrect handling of `# fmt: skip` on colon (`:`) lines (#3148) -- Comments are no longer deleted when a line had spaces removed around power operators - (#2874) - -### Preview style - -- Single-character closing docstring quotes are no longer moved to their own line as - this is invalid. This was a bug introduced in version 22.6.0. (#3166) -- `--skip-string-normalization` / `-S` now prevents docstring prefixes from being - normalized as expected (#3168) -- When using `--skip-magic-trailing-comma` or `-C`, trailing commas are stripped from - subscript expressions with more than 1 element (#3209) -- Implicitly concatenated strings inside a list, set, or tuple are now wrapped inside - parentheses (#3162) -- Fix a string merging/split issue when a comment is present in the middle of implicitly - concatenated strings on its own line (#3227) - -### _Blackd_ - -- `blackd` now supports enabling the preview style via the `X-Preview` header (#3217) - -### Configuration - -- Black now uses the presence of debug f-strings to detect target version (#3215) -- Fix misdetection of project root and verbose logging of sources in cases involving - `--stdin-filename` (#3216) -- Immediate `.gitignore` files in source directories given on the command line are now - also respected, previously only `.gitignore` files in the project root and - automatically discovered directories were respected (#3237) - -### Documentation - -- Recommend using BlackConnect in IntelliJ IDEs (#3150) - -### Integrations - -- Vim plugin: prefix messages with `Black: ` so it's clear they come from Black (#3194) -- Docker: changed to a /opt/venv installation + added to PATH to be available to - non-root users (#3202) - -### Output - -- Change from deprecated `asyncio.get_event_loop()` to create our event loop which - removes DeprecationWarning (#3164) -- Remove logging from internal `blib2to3` library since it regularly emits error logs - about failed caching that can and should be ignored (#3193) - -### Parser - -- Type comments are now included in the AST equivalence check consistently so accidental - deletion raises an error. Though type comments can't be tracked when running on PyPy - 3.7 due to standard library limitations. (#2874) - -### Performance - -- Reduce Black's startup time when formatting a single file by 15-30% (#3211) - -## 22.6.0 - -### Style - -- Fix unstable formatting involving `#fmt: skip` and `# fmt:skip` comments (notice the - lack of spaces) (#2970) - -### Preview style - -- Docstring quotes are no longer moved if it would violate the line length limit (#3044) -- Parentheses around return annotations are now managed (#2990) -- Remove unnecessary parentheses around awaited objects (#2991) -- Remove unnecessary parentheses in `with` statements (#2926) -- Remove trailing newlines after code block open (#3035) - -### Integrations - -- Add `scripts/migrate-black.py` script to ease introduction of Black to a Git project - (#3038) - -### Output - -- Output Python version and implementation as part of `--version` flag (#2997) - -### Packaging - -- Use `tomli` instead of `tomllib` on Python 3.11 builds where `tomllib` is not - available (#2987) - -### Parser - -- [PEP 654](https://peps.python.org/pep-0654/#except) syntax (for example, - `except *ExceptionGroup:`) is now supported (#3016) -- [PEP 646](https://peps.python.org/pep-0646) syntax (for example, - `Array[Batch, *Shape]` or `def fn(*args: *T) -> None`) is now supported (#3071) - -### Vim Plugin - -- Fix `strtobool` function. It didn't parse true/on/false/off. (#3025) - -## 22.3.0 - -### Preview style - -- Code cell separators `#%%` are now standardised to `# %%` (#2919) -- Remove unnecessary parentheses from `except` statements (#2939) -- Remove unnecessary parentheses from tuple unpacking in `for` loops (#2945) -- Avoid magic-trailing-comma in single-element subscripts (#2942) - -### Configuration - -- Do not format `__pypackages__` directories by default (#2836) -- Add support for specifying stable version with `--required-version` (#2832). -- Avoid crashing when the user has no homedir (#2814) -- Avoid crashing when md5 is not available (#2905) -- Fix handling of directory junctions on Windows (#2904) - -### Documentation - -- Update pylint config documentation (#2931) - -### Integrations - -- Move test to disable plugin in Vim/Neovim, which speeds up loading (#2896) - -### Output - -- In verbose mode, log when _Black_ is using user-level config (#2861) - -### Packaging - -- Fix Black to work with Click 8.1.0 (#2966) -- On Python 3.11 and newer, use the standard library's `tomllib` instead of `tomli` - (#2903) -- `black-primer`, the deprecated internal devtool, has been removed and copied to a - [separate repository](https://github.com/cooperlees/black-primer) (#2924) - -### Parser - -- Black can now parse starred expressions in the target of `for` and `async for` - statements, e.g `for item in *items_1, *items_2: pass` (#2879). - -## 22.1.0 - -At long last, _Black_ is no longer a beta product! This is the first non-beta release -and the first release covered by our new -[stability policy](https://black.readthedocs.io/en/stable/the_black_code_style/index.html#stability-policy). - -### Highlights - -- **Remove Python 2 support** (#2740) -- Introduce the `--preview` flag (#2752) - -### Style - -- Deprecate `--experimental-string-processing` and move the functionality under - `--preview` (#2789) -- For stubs, one blank line between class attributes and methods is now kept if there's - at least one pre-existing blank line (#2736) -- Black now normalizes string prefix order (#2297) -- Remove spaces around power operators if both operands are simple (#2726) -- Work around bug that causes unstable formatting in some cases in the presence of the - magic trailing comma (#2807) -- Use parentheses for attribute access on decimal float and int literals (#2799) -- Don't add whitespace for attribute access on hexadecimal, binary, octal, and complex - literals (#2799) -- Treat blank lines in stubs the same inside top-level `if` statements (#2820) -- Fix unstable formatting with semicolons and arithmetic expressions (#2817) -- Fix unstable formatting around magic trailing comma (#2572) - -### Parser - -- Fix mapping cases that contain as-expressions, like `case {"key": 1 | 2 as password}` - (#2686) -- Fix cases that contain multiple top-level as-expressions, like `case 1 as a, 2 as b` - (#2716) -- Fix call patterns that contain as-expressions with keyword arguments, like - `case Foo(bar=baz as quux)` (#2749) -- Tuple unpacking on `return` and `yield` constructs now implies 3.8+ (#2700) -- Unparenthesized tuples on annotated assignments (e.g - `values: Tuple[int, ...] = 1, 2, 3`) now implies 3.8+ (#2708) -- Fix handling of standalone `match()` or `case()` when there is a trailing newline or a - comment inside of the parentheses. (#2760) -- `from __future__ import annotations` statement now implies Python 3.7+ (#2690) - -### Performance - -- Speed-up the new backtracking parser about 4X in general (enabled when - `--target-version` is set to 3.10 and higher). (#2728) -- _Black_ is now compiled with [mypyc](https://github.com/mypyc/mypyc) for an overall 2x - speed-up. 64-bit Windows, MacOS, and Linux (not including musl) are supported. (#1009, - #2431) - -### Configuration - -- Do not accept bare carriage return line endings in pyproject.toml (#2408) -- Add configuration option (`python-cell-magics`) to format cells with custom magics in - Jupyter Notebooks (#2744) -- Allow setting custom cache directory on all platforms with environment variable - `BLACK_CACHE_DIR` (#2739). -- Enable Python 3.10+ by default, without any extra need to specify - `--target-version=py310`. (#2758) -- Make passing `SRC` or `--code` mandatory and mutually exclusive (#2804) - -### Output - -- Improve error message for invalid regular expression (#2678) -- Improve error message when parsing fails during AST safety check by embedding the - underlying SyntaxError (#2693) -- No longer color diff headers white as it's unreadable in light themed terminals - (#2691) -- Text coloring added in the final statistics (#2712) -- Verbose mode also now describes how a project root was discovered and which paths will - be formatted. (#2526) - -### Packaging - -- All upper version bounds on dependencies have been removed (#2718) -- `typing-extensions` is no longer a required dependency in Python 3.10+ (#2772) -- Set `click` lower bound to `8.0.0` (#2791) - -### Integrations - -- Update GitHub action to support containerized runs (#2748) - -### Documentation - -- Change protocol in pip installation instructions to `https://` (#2761) -- Change HTML theme to Furo primarily for its responsive design and mobile support - (#2793) -- Deprecate the `black-primer` tool (#2809) -- Document Python support policy (#2819) - -## 21.12b0 - -### _Black_ - -- Fix determination of f-string expression spans (#2654) -- Fix bad formatting of error messages about EOF in multi-line statements (#2343) -- Functions and classes in blocks now have more consistent surrounding spacing (#2472) - -#### Jupyter Notebook support - -- Cell magics are now only processed if they are known Python cell magics. Earlier, all - cell magics were tokenized, leading to possible indentation errors e.g. with - `%%writefile`. (#2630) -- Fix assignment to environment variables in Jupyter Notebooks (#2642) - -#### Python 3.10 support - -- Point users to using `--target-version py310` if we detect 3.10-only syntax (#2668) -- Fix `match` statements with open sequence subjects, like `match a, b:` or - `match a, *b:` (#2639) (#2659) -- Fix `match`/`case` statements that contain `match`/`case` soft keywords multiple - times, like `match re.match()` (#2661) -- Fix `case` statements with an inline body (#2665) -- Fix styling of starred expressions inside `match` subject (#2667) -- Fix parser error location on invalid syntax in a `match` statement (#2649) -- Fix Python 3.10 support on platforms without ProcessPoolExecutor (#2631) -- Improve parsing performance on code that uses `match` under `--target-version py310` - up to ~50% (#2670) - -### Packaging - -- Remove dependency on `regex` (#2644) (#2663) - -## 21.11b1 - -### _Black_ - -- Bumped regex version minimum to 2021.4.4 to fix Pattern class usage (#2621) - -## 21.11b0 - -### _Black_ - -- Warn about Python 2 deprecation in more cases by improving Python 2 only syntax - detection (#2592) -- Add experimental PyPy support (#2559) -- Add partial support for the match statement. As it's experimental, it's only enabled - when `--target-version py310` is explicitly specified (#2586) -- Add support for parenthesized with (#2586) -- Declare support for Python 3.10 for running Black (#2562) - -### Integrations - -- Fixed vim plugin with Python 3.10 by removing deprecated distutils import (#2610) -- The vim plugin now parses `skip_magic_trailing_comma` from pyproject.toml (#2613) - -## 21.10b0 - -### _Black_ - -- Document stability policy, that will apply for non-beta releases (#2529) -- Add new `--workers` parameter (#2514) -- Fixed feature detection for positional-only arguments in lambdas (#2532) -- Bumped typed-ast version minimum to 1.4.3 for 3.10 compatibility (#2519) -- Fixed a Python 3.10 compatibility issue where the loop argument was still being passed - even though it has been removed (#2580) -- Deprecate Python 2 formatting support (#2523) - -### _Blackd_ - -- Remove dependency on aiohttp-cors (#2500) -- Bump required aiohttp version to 3.7.4 (#2509) - -### _Black-Primer_ - -- Add primer support for --projects (#2555) -- Print primer summary after individual failures (#2570) - -### Integrations - -- Allow to pass `target_version` in the vim plugin (#1319) -- Install build tools in docker file and use multi-stage build to keep the image size - down (#2582) - -## 21.9b0 - -### Packaging - -- Fix missing modules in self-contained binaries (#2466) -- Fix missing toml extra used during installation (#2475) - -## 21.8b0 - -### _Black_ - -- Add support for formatting Jupyter Notebook files (#2357) -- Move from `appdirs` dependency to `platformdirs` (#2375) -- Present a more user-friendly error if .gitignore is invalid (#2414) -- The failsafe for accidentally added backslashes in f-string expressions has been - hardened to handle more edge cases during quote normalization (#2437) -- Avoid changing a function return type annotation's type to a tuple by adding a - trailing comma (#2384) -- Parsing support has been added for unparenthesized walruses in set literals, set - comprehensions, and indices (#2447). -- Pin `setuptools-scm` build-time dependency version (#2457) -- Exclude typing-extensions version 3.10.0.1 due to it being broken on Python 3.10 - (#2460) - -### _Blackd_ - -- Replace sys.exit(-1) with raise ImportError as it plays more nicely with tools that - scan installed packages (#2440) - -### Integrations - -- The provided pre-commit hooks no longer specify `language_version` to avoid overriding - `default_language_version` (#2430) - -## 21.7b0 - -### _Black_ - -- Configuration files using TOML features higher than spec v0.5.0 are now supported - (#2301) -- Add primer support and test for code piped into black via STDIN (#2315) -- Fix internal error when `FORCE_OPTIONAL_PARENTHESES` feature is enabled (#2332) -- Accept empty stdin (#2346) -- Provide a more useful error when parsing fails during AST safety checks (#2304) - -### Docker - -- Add new `latest_release` tag automation to follow latest black release on docker - images (#2374) - -### Integrations - -- The vim plugin now searches upwards from the directory containing the current buffer - instead of the current working directory for pyproject.toml. (#1871) -- The vim plugin now reads the correct string normalization option in pyproject.toml - (#1869) -- The vim plugin no longer crashes Black when there's boolean values in pyproject.toml - (#1869) - -## 21.6b0 - -### _Black_ - -- Fix failure caused by `fmt: skip` and indentation (#2281) -- Account for += assignment when deciding whether to split string (#2312) -- Correct max string length calculation when there are string operators (#2292) -- Fixed option usage when using the `--code` flag (#2259) -- Do not call `uvloop.install()` when _Black_ is used as a library (#2303) -- Added `--required-version` option to require a specific version to be running (#2300) -- Fix incorrect custom breakpoint indices when string group contains fake f-strings - (#2311) -- Fix regression where `R` prefixes would be lowercased for docstrings (#2285) -- Fix handling of named escapes (`\N{...}`) when `--experimental-string-processing` is - used (#2319) - -### Integrations - -- The official Black action now supports choosing what version to use, and supports the - major 3 OSes. (#1940) - -## 21.5b2 - -### _Black_ - -- A space is no longer inserted into empty docstrings (#2249) -- Fix handling of .gitignore files containing non-ASCII characters on Windows (#2229) -- Respect `.gitignore` files in all levels, not only `root/.gitignore` file (apply - `.gitignore` rules like `git` does) (#2225) -- Restored compatibility with Click 8.0 on Python 3.6 when LANG=C used (#2227) -- Add extra uvloop install + import support if in python env (#2258) -- Fix --experimental-string-processing crash when matching parens are not found (#2283) -- Make sure to split lines that start with a string operator (#2286) -- Fix regular expression that black uses to identify f-expressions (#2287) - -### _Blackd_ - -- Add a lower bound for the `aiohttp-cors` dependency. Only 0.4.0 or higher is - supported. (#2231) - -### Packaging - -- Release self-contained x86_64 MacOS binaries as part of the GitHub release pipeline - (#2198) -- Always build binaries with the latest available Python (#2260) - -### Documentation - -- Add discussion of magic comments to FAQ page (#2272) -- `--experimental-string-processing` will be enabled by default in the future (#2273) -- Fix typos discovered by codespell (#2228) -- Fix Vim plugin installation instructions. (#2235) -- Add new Frequently Asked Questions page (#2247) -- Fix encoding + symlink issues preventing proper build on Windows (#2262) - -## 21.5b1 - -### _Black_ - -- Refactor `src/black/__init__.py` into many files (#2206) - -### Documentation - -- Replaced all remaining references to the - [`master`](https://github.com/psf/black/tree/main) branch with the - [`main`](https://github.com/psf/black/tree/main) branch. Some additional changes in - the source code were also made. (#2210) -- Significantly reorganized the documentation to make much more sense. Check them out by - heading over to [the stable docs on RTD](https://black.readthedocs.io/en/stable/). - (#2174) - -## 21.5b0 - -### _Black_ - -- Set `--pyi` mode if `--stdin-filename` ends in `.pyi` (#2169) -- Stop detecting target version as Python 3.9+ with pre-PEP-614 decorators that are - being called but with no arguments (#2182) - -### _Black-Primer_ - -- Add `--no-diff` to black-primer to suppress formatting changes (#2187) - -## 21.4b2 - -### _Black_ - -- Fix crash if the user configuration directory is inaccessible. (#2158) - -- Clarify - [circumstances](https://github.com/psf/black/blob/master/docs/the_black_code_style.md#pragmatism) - in which _Black_ may change the AST (#2159) - -- Allow `.gitignore` rules to be overridden by specifying `exclude` in `pyproject.toml` - or on the command line. (#2170) - -### _Packaging_ - -- Install `primer.json` (used by `black-primer` by default) with black. (#2154) - -## 21.4b1 - -### _Black_ - -- Fix crash on docstrings ending with "\\ ". (#2142) - -- Fix crash when atypical whitespace is cleaned out of dostrings (#2120) - -- Reflect the `--skip-magic-trailing-comma` and `--experimental-string-processing` flags - in the name of the cache file. Without this fix, changes in these flags would not take - effect if the cache had already been populated. (#2131) - -- Don't remove necessary parentheses from assignment expression containing assert / - return statements. (#2143) - -### _Packaging_ - -- Bump pathspec to >= 0.8.1 to solve invalid .gitignore exclusion handling - -## 21.4b0 - -### _Black_ - -- Fixed a rare but annoying formatting instability created by the combination of - optional trailing commas inserted by `Black` and optional parentheses looking at - pre-existing "magic" trailing commas. This fixes issue #1629 and all of its many many - duplicates. (#2126) - -- `Black` now processes one-line docstrings by stripping leading and trailing spaces, - and adding a padding space when needed to break up """". (#1740) - -- `Black` now cleans up leading non-breaking spaces in comments (#2092) - -- `Black` now respects `--skip-string-normalization` when normalizing multiline - docstring quotes (#1637) - -- `Black` no longer removes all empty lines between non-function code and decorators - when formatting typing stubs. Now `Black` enforces a single empty line. (#1646) - -- `Black` no longer adds an incorrect space after a parenthesized assignment expression - in if/while statements (#1655) - -- Added `--skip-magic-trailing-comma` / `-C` to avoid using trailing commas as a reason - to split lines (#1824) - -- fixed a crash when PWD=/ on POSIX (#1631) - -- fixed "I/O operation on closed file" when using --diff (#1664) - -- Prevent coloured diff output being interleaved with multiple files (#1673) - -- Added support for PEP 614 relaxed decorator syntax on python 3.9 (#1711) - -- Added parsing support for unparenthesized tuples and yield expressions in annotated - assignments (#1835) - -- added `--extend-exclude` argument (PR #2005) - -- speed up caching by avoiding pathlib (#1950) - -- `--diff` correctly indicates when a file doesn't end in a newline (#1662) - -- Added `--stdin-filename` argument to allow stdin to respect `--force-exclude` rules - (#1780) - -- Lines ending with `fmt: skip` will now be not formatted (#1800) - -- PR #2053: Black no longer relies on typed-ast for Python 3.8 and higher - -- PR #2053: Python 2 support is now optional, install with - `python3 -m pip install black[python2]` to maintain support. - -- Exclude `venv` directory by default (#1683) - -- Fixed "Black produced code that is not equivalent to the source" when formatting - Python 2 docstrings (#2037) - -### _Packaging_ - -- Self-contained native _Black_ binaries are now provided for releases via GitHub - Releases (#1743) - -## 20.8b1 - -### _Packaging_ - -- explicitly depend on Click 7.1.2 or newer as `Black` no longer works with versions - older than 7.0 - -## 20.8b0 - -### _Black_ - -- re-implemented support for explicit trailing commas: now it works consistently within - any bracket pair, including nested structures (#1288 and duplicates) - -- `Black` now reindents docstrings when reindenting code around it (#1053) - -- `Black` now shows colored diffs (#1266) - -- `Black` is now packaged using 'py3' tagged wheels (#1388) - -- `Black` now supports Python 3.8 code, e.g. star expressions in return statements - (#1121) - -- `Black` no longer normalizes capital R-string prefixes as those have a - community-accepted meaning (#1244) - -- `Black` now uses exit code 2 when specified configuration file doesn't exit (#1361) - -- `Black` now works on AWS Lambda (#1141) - -- added `--force-exclude` argument (#1032) - -- removed deprecated `--py36` option (#1236) - -- fixed `--diff` output when EOF is encountered (#526) - -- fixed `# fmt: off` handling around decorators (#560) - -- fixed unstable formatting with some `# type: ignore` comments (#1113) - -- fixed invalid removal on organizing brackets followed by indexing (#1575) - -- introduced `black-primer`, a CI tool that allows us to run regression tests against - existing open source users of Black (#1402) - -- introduced property-based fuzzing to our test suite based on Hypothesis and - Hypothersmith (#1566) - -- implemented experimental and disabled by default long string rewrapping (#1132), - hidden under a `--experimental-string-processing` flag while it's being worked on; - this is an undocumented and unsupported feature, you lose Internet points for - depending on it (#1609) - -### Vim plugin - -- prefer virtualenv packages over global packages (#1383) - -## 19.10b0 - -- added support for PEP 572 assignment expressions (#711) - -- added support for PEP 570 positional-only arguments (#943) - -- added support for async generators (#593) - -- added support for pre-splitting collections by putting an explicit trailing comma - inside (#826) - -- added `black -c` as a way to format code passed from the command line (#761) - -- --safe now works with Python 2 code (#840) - -- fixed grammar selection for Python 2-specific code (#765) - -- fixed feature detection for trailing commas in function definitions and call sites - (#763) - -- `# fmt: off`/`# fmt: on` comment pairs placed multiple times within the same block of - code now behave correctly (#1005) - -- _Black_ no longer crashes on Windows machines with more than 61 cores (#838) - -- _Black_ no longer crashes on standalone comments prepended with a backslash (#767) - -- _Black_ no longer crashes on `from` ... `import` blocks with comments (#829) - -- _Black_ no longer crashes on Python 3.7 on some platform configurations (#494) - -- _Black_ no longer fails on comments in from-imports (#671) - -- _Black_ no longer fails when the file starts with a backslash (#922) - -- _Black_ no longer merges regular comments with type comments (#1027) - -- _Black_ no longer splits long lines that contain type comments (#997) - -- removed unnecessary parentheses around `yield` expressions (#834) - -- added parentheses around long tuples in unpacking assignments (#832) - -- added parentheses around complex powers when they are prefixed by a unary operator - (#646) - -- fixed bug that led _Black_ format some code with a line length target of 1 (#762) - -- _Black_ no longer introduces quotes in f-string subexpressions on string boundaries - (#863) - -- if _Black_ puts parenthesis around a single expression, it moves comments to the - wrapped expression instead of after the brackets (#872) - -- `blackd` now returns the version of _Black_ in the response headers (#1013) - -- `blackd` can now output the diff of formats on source code when the `X-Diff` header is - provided (#969) - -## 19.3b0 - -- new option `--target-version` to control which Python versions _Black_-formatted code - should target (#618) - -- deprecated `--py36` (use `--target-version=py36` instead) (#724) - -- _Black_ no longer normalizes numeric literals to include `_` separators (#696) - -- long `del` statements are now split into multiple lines (#698) - -- type comments are no longer mangled in function signatures - -- improved performance of formatting deeply nested data structures (#509) - -- _Black_ now properly formats multiple files in parallel on Windows (#632) - -- _Black_ now creates cache files atomically which allows it to be used in parallel - pipelines (like `xargs -P8`) (#673) - -- _Black_ now correctly indents comments in files that were previously formatted with - tabs (#262) - -- `blackd` now supports CORS (#622) - -## 18.9b0 - -- numeric literals are now formatted by _Black_ (#452, #461, #464, #469): - - numeric literals are normalized to include `_` separators on Python 3.6+ code - - - added `--skip-numeric-underscore-normalization` to disable the above behavior and - leave numeric underscores as they were in the input - - - code with `_` in numeric literals is recognized as Python 3.6+ - - - most letters in numeric literals are lowercased (e.g., in `1e10`, `0x01`) - - - hexadecimal digits are always uppercased (e.g. `0xBADC0DE`) - -- added `blackd`, see - [its documentation](https://github.com/psf/black/blob/18.9b0/README.md#blackd) for - more info (#349) - -- adjacent string literals are now correctly split into multiple lines (#463) - -- trailing comma is now added to single imports that don't fit on a line (#250) - -- cache is now populated when `--check` is successful for a file which speeds up - consecutive checks of properly formatted unmodified files (#448) - -- whitespace at the beginning of the file is now removed (#399) - -- fixed mangling [pweave](http://mpastell.com/pweave/) and - [Spyder IDE](https://www.spyder-ide.org/) special comments (#532) - -- fixed unstable formatting when unpacking big tuples (#267) - -- fixed parsing of `__future__` imports with renames (#389) - -- fixed scope of `# fmt: off` when directly preceding `yield` and other nodes (#385) - -- fixed formatting of lambda expressions with default arguments (#468) - -- fixed `async for` statements: _Black_ no longer breaks them into separate lines (#372) - -- note: the Vim plugin stopped registering `,=` as a default chord as it turned out to - be a bad idea (#415) - -## 18.6b4 - -- hotfix: don't freeze when multiple comments directly precede `# fmt: off` (#371) - -## 18.6b3 - -- typing stub files (`.pyi`) now have blank lines added after constants (#340) - -- `# fmt: off` and `# fmt: on` are now much more dependable: - - they now work also within bracket pairs (#329) - - - they now correctly work across function/class boundaries (#335) - - - they now work when an indentation block starts with empty lines or misaligned - comments (#334) - -- made Click not fail on invalid environments; note that Click is right but the - likelihood we'll need to access non-ASCII file paths when dealing with Python source - code is low (#277) - -- fixed improper formatting of f-strings with quotes inside interpolated expressions - (#322) - -- fixed unnecessary slowdown when long list literals where found in a file - -- fixed unnecessary slowdown on AST nodes with very many siblings - -- fixed cannibalizing backslashes during string normalization - -- fixed a crash due to symbolic links pointing outside of the project directory (#338) - -## 18.6b2 - -- added `--config` (#65) - -- added `-h` equivalent to `--help` (#316) - -- fixed improper unmodified file caching when `-S` was used - -- fixed extra space in string unpacking (#305) - -- fixed formatting of empty triple quoted strings (#313) - -- fixed unnecessary slowdown in comment placement calculation on lines without comments - -## 18.6b1 - -- hotfix: don't output human-facing information on stdout (#299) - -- hotfix: don't output cake emoji on non-zero return code (#300) - -## 18.6b0 - -- added `--include` and `--exclude` (#270) - -- added `--skip-string-normalization` (#118) - -- added `--verbose` (#283) - -- the header output in `--diff` now actually conforms to the unified diff spec - -- fixed long trivial assignments being wrapped in unnecessary parentheses (#273) - -- fixed unnecessary parentheses when a line contained multiline strings (#232) - -- fixed stdin handling not working correctly if an old version of Click was used (#276) - -- _Black_ now preserves line endings when formatting a file in place (#258) - -## 18.5b1 - -- added `--pyi` (#249) - -- added `--py36` (#249) - -- Python grammar pickle caches are stored with the formatting caches, making _Black_ - work in environments where site-packages is not user-writable (#192) - -- _Black_ now enforces a PEP 257 empty line after a class-level docstring (and/or - fields) and the first method - -- fixed invalid code produced when standalone comments were present in a trailer that - was omitted from line splitting on a large expression (#237) - -- fixed optional parentheses being removed within `# fmt: off` sections (#224) - -- fixed invalid code produced when stars in very long imports were incorrectly wrapped - in optional parentheses (#234) - -- fixed unstable formatting when inline comments were moved around in a trailer that was - omitted from line splitting on a large expression (#238) - -- fixed extra empty line between a class declaration and the first method if no class - docstring or fields are present (#219) - -- fixed extra empty line between a function signature and an inner function or inner - class (#196) - -## 18.5b0 - -- call chains are now formatted according to the - [fluent interfaces](https://en.wikipedia.org/wiki/Fluent_interface) style (#67) - -- data structure literals (tuples, lists, dictionaries, and sets) are now also always - exploded like imports when they don't fit in a single line (#152) - -- slices are now formatted according to PEP 8 (#178) - -- parentheses are now also managed automatically on the right-hand side of assignments - and return statements (#140) - -- math operators now use their respective priorities for delimiting multiline - expressions (#148) - -- optional parentheses are now omitted on expressions that start or end with a bracket - and only contain a single operator (#177) - -- empty parentheses in a class definition are now removed (#145, #180) - -- string prefixes are now standardized to lowercase and `u` is removed on Python 3.6+ - only code and Python 2.7+ code with the `unicode_literals` future import (#188, #198, - #199) - -- typing stub files (`.pyi`) are now formatted in a style that is consistent with PEP - 484 (#207, #210) - -- progress when reformatting many files is now reported incrementally - -- fixed trailers (content with brackets) being unnecessarily exploded into their own - lines after a dedented closing bracket (#119) - -- fixed an invalid trailing comma sometimes left in imports (#185) - -- fixed non-deterministic formatting when multiple pairs of removable parentheses were - used (#183) - -- fixed multiline strings being unnecessarily wrapped in optional parentheses in long - assignments (#215) - -- fixed not splitting long from-imports with only a single name - -- fixed Python 3.6+ file discovery by also looking at function calls with unpacking. - This fixed non-deterministic formatting if trailing commas where used both in function - signatures with stars and function calls with stars but the former would be - reformatted to a single line. - -- fixed crash on dealing with optional parentheses (#193) - -- fixed "is", "is not", "in", and "not in" not considered operators for splitting - purposes - -- fixed crash when dead symlinks where encountered - -## 18.4a4 - -- don't populate the cache on `--check` (#175) - -## 18.4a3 - -- added a "cache"; files already reformatted that haven't changed on disk won't be - reformatted again (#109) - -- `--check` and `--diff` are no longer mutually exclusive (#149) - -- generalized star expression handling, including double stars; this fixes - multiplication making expressions "unsafe" for trailing commas (#132) - -- _Black_ no longer enforces putting empty lines behind control flow statements (#90) - -- _Black_ now splits imports like "Mode 3 + trailing comma" of isort (#127) - -- fixed comment indentation when a standalone comment closes a block (#16, #32) - -- fixed standalone comments receiving extra empty lines if immediately preceding a - class, def, or decorator (#56, #154) - -- fixed `--diff` not showing entire path (#130) - -- fixed parsing of complex expressions after star and double stars in function calls - (#2) - -- fixed invalid splitting on comma in lambda arguments (#133) - -- fixed missing splits of ternary expressions (#141) - -## 18.4a2 - -- fixed parsing of unaligned standalone comments (#99, #112) - -- fixed placement of dictionary unpacking inside dictionary literals (#111) - -- Vim plugin now works on Windows, too - -- fixed unstable formatting when encountering unnecessarily escaped quotes in a string - (#120) - -## 18.4a1 - -- added `--quiet` (#78) - -- added automatic parentheses management (#4) - -- added [pre-commit](https://pre-commit.com) integration (#103, #104) - -- fixed reporting on `--check` with multiple files (#101, #102) - -- fixed removing backslash escapes from raw strings (#100, #105) - -## 18.4a0 - -- added `--diff` (#87) - -- add line breaks before all delimiters, except in cases like commas, to better comply - with PEP 8 (#73) - -- standardize string literals to use double quotes (almost) everywhere (#75) - -- fixed handling of standalone comments within nested bracketed expressions; _Black_ - will no longer produce super long lines or put all standalone comments at the end of - the expression (#22) - -- fixed 18.3a4 regression: don't crash and burn on empty lines with trailing whitespace - (#80) - -- fixed 18.3a4 regression: `# yapf: disable` usage as trailing comment would cause - _Black_ to not emit the rest of the file (#95) - -- when CTRL+C is pressed while formatting many files, _Black_ no longer freaks out with - a flurry of asyncio-related exceptions - -- only allow up to two empty lines on module level and only single empty lines within - functions (#74) - -## 18.3a4 - -- `# fmt: off` and `# fmt: on` are implemented (#5) - -- automatic detection of deprecated Python 2 forms of print statements and exec - statements in the formatted file (#49) - -- use proper spaces for complex expressions in default values of typed function - arguments (#60) - -- only return exit code 1 when --check is used (#50) - -- don't remove single trailing commas from square bracket indexing (#59) - -- don't omit whitespace if the previous factor leaf wasn't a math operator (#55) - -- omit extra space in kwarg unpacking if it's the first argument (#46) - -- omit extra space in - [Sphinx auto-attribute comments](http://www.sphinx-doc.org/en/stable/ext/autodoc.html#directive-autoattribute) - (#68) - -## 18.3a3 - -- don't remove single empty lines outside of bracketed expressions (#19) - -- added ability to pipe formatting from stdin to stdin (#25) - -- restored ability to format code with legacy usage of `async` as a name (#20, #42) - -- even better handling of numpy-style array indexing (#33, again) - -## 18.3a2 - -- changed positioning of binary operators to occur at beginning of lines instead of at - the end, following - [a recent change to PEP 8](https://github.com/python/peps/commit/c59c4376ad233a62ca4b3a6060c81368bd21e85b) - (#21) - -- ignore empty bracket pairs while splitting. This avoids very weirdly looking - formattings (#34, #35) - -- remove a trailing comma if there is a single argument to a call - -- if top level functions were separated by a comment, don't put four empty lines after - the upper function - -- fixed unstable formatting of newlines with imports - -- fixed unintentional folding of post scriptum standalone comments into last statement - if it was a simple statement (#18, #28) - -- fixed missing space in numpy-style array indexing (#33) - -- fixed spurious space after star-based unary expressions (#31) - -## 18.3a1 - -- added `--check` - -- only put trailing commas in function signatures and calls if it's safe to do so. If - the file is Python 3.6+ it's always safe, otherwise only safe if there are no `*args` - or `**kwargs` used in the signature or call. (#8) - -- fixed invalid spacing of dots in relative imports (#6, #13) - -- fixed invalid splitting after comma on unpacked variables in for-loops (#23) - -- fixed spurious space in parenthesized set expressions (#7) - -- fixed spurious space after opening parentheses and in default arguments (#14, #17) - -- fixed spurious space after unary operators when the operand was a complex expression - (#15) - -## 18.3a0 - -- first published version, Happy 🍰 Day 2018! - -- alpha quality - -- date-versioned (see: ) diff --git a/venv/lib/python3.12/site-packages/black-26.3.1.dist-info/RECORD b/venv/lib/python3.12/site-packages/black-26.3.1.dist-info/RECORD deleted file mode 100644 index fe1a06a..0000000 --- a/venv/lib/python3.12/site-packages/black-26.3.1.dist-info/RECORD +++ /dev/null @@ -1,129 +0,0 @@ -../../../bin/black,sha256=PZtYdZkZD07OGgsYpIadtBU0M7TsPdon_I9uiZijc2s,253 -../../../bin/blackd,sha256=uGY1-fbM_e03FZKETFzN34D8qa-fI2UdCj1caFZdlLk,254 -30fcd23745efe32ce681__mypyc.cpython-312-x86_64-linux-gnu.so,sha256=bLPlE7bL38nIXncQpYPsyvm5MP-SlFtbgyERROdyXXE,4496288 -__pycache__/_black_version.cpython-312.pyc,, -_black_version.py,sha256=5ofda8e9NKfhvLYrocrChCfM2MWstovRb4mLrI5WYO0,19 -_black_version.pyi,sha256=GxQ4ZGLPQObN92QW_Hb8IJPEuYINNn186FjrRovM09g,13 -black-26.3.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -black-26.3.1.dist-info/METADATA,sha256=-mxo0oe8mMLTKryPQmYKZ3kNYIIzqE0ZfKRALpwfd4Y,91891 -black-26.3.1.dist-info/RECORD,, -black-26.3.1.dist-info/WHEEL,sha256=SkV40iM9v5hSIrczJF0UC4SxNJml1CGlx9qKJaGskqM,187 -black-26.3.1.dist-info/entry_points.txt,sha256=XTCA4X2yVA0tMiV7l96Gv9TyxhVhoCaznLN2XThqYSA,144 -black-26.3.1.dist-info/licenses/LICENSE,sha256=nAQo8MO0d5hQz1vZbhGqqK_HLUqG1KNiI9erouWNbgA,1080 -black/__init__.cpython-312-x86_64-linux-gnu.so,sha256=XnXYJxsvGwkb8oRAnyf5Prk0dR0C8OxrcCmW8u8uYVU,15976 -black/__init__.py,sha256=1Kuja0_d00WAcnfmy1SVdzVfOr_Ye7qBM_8ISwifD7k,54780 -black/__main__.py,sha256=mogeA4o9zt4w-ufKvaQjSEhtSgQkcMVLK9ChvdB5wH8,47 -black/__pycache__/__init__.cpython-312.pyc,, -black/__pycache__/__main__.cpython-312.pyc,, -black/__pycache__/_width_table.cpython-312.pyc,, -black/__pycache__/brackets.cpython-312.pyc,, -black/__pycache__/cache.cpython-312.pyc,, -black/__pycache__/comments.cpython-312.pyc,, -black/__pycache__/concurrency.cpython-312.pyc,, -black/__pycache__/const.cpython-312.pyc,, -black/__pycache__/debug.cpython-312.pyc,, -black/__pycache__/files.cpython-312.pyc,, -black/__pycache__/handle_ipynb_magics.cpython-312.pyc,, -black/__pycache__/linegen.cpython-312.pyc,, -black/__pycache__/lines.cpython-312.pyc,, -black/__pycache__/mode.cpython-312.pyc,, -black/__pycache__/nodes.cpython-312.pyc,, -black/__pycache__/numerics.cpython-312.pyc,, -black/__pycache__/output.cpython-312.pyc,, -black/__pycache__/parsing.cpython-312.pyc,, -black/__pycache__/ranges.cpython-312.pyc,, -black/__pycache__/report.cpython-312.pyc,, -black/__pycache__/rusty.cpython-312.pyc,, -black/__pycache__/schema.cpython-312.pyc,, -black/__pycache__/strings.cpython-312.pyc,, -black/__pycache__/trans.cpython-312.pyc,, -black/_width_table.cpython-312-x86_64-linux-gnu.so,sha256=hToN6Ua5HmjJVz8NYcDqWlecowGiOwcXZiWOuqQcQuw,15992 -black/_width_table.py,sha256=3wOvb0P6LSH1cudI_olvYhdCiv7j8JUuK2_crtq6iPU,3096 -black/brackets.cpython-312-x86_64-linux-gnu.so,sha256=L0OFifN-puLIzrVHhKk5oV-x7wxZY4-FW3VO7NKpvKs,15984 -black/brackets.py,sha256=hhUpeApDIXCNYQcuxOqvKNdH0x2AR_cJdf0ScVXA8xA,12410 -black/cache.cpython-312-x86_64-linux-gnu.so,sha256=lLMDgol5Q7jmEVQPlRZ4O7PVMFWibAcyvgEdgW46av4,15976 -black/cache.py,sha256=_N51IHzj0-D55kDuk8v9hm0TfKfsJv1bQL3anxUR4k4,4754 -black/comments.cpython-312-x86_64-linux-gnu.so,sha256=tHXDD5Sexuih2kKeIZDtU3qFoOJY0ew2PHG3pW5-1-Y,15984 -black/comments.py,sha256=CetBrvd3QeIU_rjAgOfZ4RpddM4MUr9FOXhXXtdZRpE,29753 -black/concurrency.py,sha256=zJZqyO4uPxrCDwfCdN5d_wh13P9xHpwipqSBacU-DRM,7573 -black/const.cpython-312-x86_64-linux-gnu.so,sha256=qbeoY1mQIdf98h5rljuYFXTBt1BO1yvYj8TFiiOaJqA,15976 -black/const.py,sha256=U7cDnhWljmrieOtPBUdO2Vcz69J_VXB6-Br94wuCVuo,321 -black/debug.py,sha256=7YQ8vErjf-P4zG5ddbh-Rpdos6Aipd0iYNZI3zGD9X0,1922 -black/files.py,sha256=muUVfacY_o5YadnSAwD581hkRevX437jC14RB7nLXyQ,14664 -black/handle_ipynb_magics.cpython-312-x86_64-linux-gnu.so,sha256=fue5O1AS-YR1fNWINBZ5XS61ISrd8MEy7VbggfyB0lc,16008 -black/handle_ipynb_magics.py,sha256=WHE2UurdicCNXNpRpmwBFe1C893ecZkAxZ3VnjRwZZ4,15901 -black/linegen.cpython-312-x86_64-linux-gnu.so,sha256=fGlT6dKZ8MCuTZoktzfHByH9r6c3fKP7FVLkK2GxCXM,15984 -black/linegen.py,sha256=uJ7PcKKmonGgczKErWZdLCjF1CvPM7ecstTygxSkub8,78915 -black/lines.cpython-312-x86_64-linux-gnu.so,sha256=Mxk3bt637EFKUQAZzt5BRNRZA1pVovmjtdbvJnk33O0,15976 -black/lines.py,sha256=XOBACftVVdot4xTFlmKmofXOXPcHcfIBwP-t8CuxYmY,41887 -black/mode.cpython-312-x86_64-linux-gnu.so,sha256=YVGU7ZVIIcIFz3GieKIOe8TMEn3vwOj77g3vnXbvHvA,15976 -black/mode.py,sha256=4aRQB8mBzy8C9AK_QA_e8N6iCbpXOAml7svRQNBsxL4,10242 -black/nodes.cpython-312-x86_64-linux-gnu.so,sha256=HHPlgl_YVTy8mMnEt6_tKs4-Wa9SKjKnDSo11K1EkbM,15976 -black/nodes.py,sha256=bIC6lb_4_8XiNyVl2XZyqihSMBYtHsYihiuo8O5Cq1Y,32177 -black/numerics.cpython-312-x86_64-linux-gnu.so,sha256=KwdtHiBxGlQrqvXOaVkfGow-wA6h11aPIhw0FfR36Mg,15984 -black/numerics.py,sha256=xRGnTSdMVbTaA9IGechc8JM-cIuJGCc326s71hkXJIw,1655 -black/output.py,sha256=ImkKqeOhtlkHMsJ9_W8tHbNogCS_Wq_7Up8998gIHec,3911 -black/parsing.cpython-312-x86_64-linux-gnu.so,sha256=gBM0oL_0AsVx-6pkQHXriekfGEhzYYNrab4WS1bEiW4,15984 -black/parsing.py,sha256=Ib5IieKVD6iK3ATJpaC1HjQYe5bauy5M57hKSK5dtV8,8427 -black/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -black/ranges.cpython-312-x86_64-linux-gnu.so,sha256=ly-oeI328C60JzDBCKmK3h-v-7baqCie7zwlJms2wAs,15984 -black/ranges.py,sha256=aVHdpnR0HshgAJH4Zp5HoVxBNKtn3wrFumcrW0L4lPo,20594 -black/report.py,sha256=igkNi8iR5FqSa1sXddS-HnoqW7Cq7PveCmFCfd-pN6w,3452 -black/resources/__init__.cpython-312-x86_64-linux-gnu.so,sha256=gX2C0e-a_YnoxEN-k2KhSbu-JJrP1qt-N2_8ZFnnSok,15984 -black/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -black/resources/__pycache__/__init__.cpython-312.pyc,, -black/resources/black.schema.json,sha256=NbLoLdoIAGO--h1Ia2iSkoD-dZ4hKrE4wpTLsRezKZI,7385 -black/rusty.cpython-312-x86_64-linux-gnu.so,sha256=jyJcxN1Kb3fFX-Ac4xv4OHIo1UVjreN76fSgI2xwFmE,15976 -black/rusty.py,sha256=4LKo3KTUWYZ2cN6QKmwwZVbsCNt2fpu5lzue2V-uxIA,557 -black/schema.cpython-312-x86_64-linux-gnu.so,sha256=dyEBLIlpWjjYtLSpGZORA9YabcmwVDp65dfdlxdz2c4,15984 -black/schema.py,sha256=ru0z9EA-f3wfLLVPefeFpM0s4GYsYg_UjpOiMLhjdbA,431 -black/strings.cpython-312-x86_64-linux-gnu.so,sha256=Jp-Q4CcynfW00BoBxHcm1k6ZD9-UjLI7sZka6Q9sn48,15984 -black/strings.py,sha256=W9Ym8q9okHpxDw6JIB1w1yMqIs5oFZDGZE0J2Lxhiwo,13304 -black/trans.cpython-312-x86_64-linux-gnu.so,sha256=WthzM13BfprC6sHIC6fLq-GNJ91paS-phAENTfj5NzU,15976 -black/trans.py,sha256=46ZNW_jcU6XjbsKxHuDXAqi9Bz5ycLiWt_Joj8GupEw,97078 -blackd/__init__.py,sha256=9gi4LWD2VrjGvGLDOlhp4Thu6B0B_HDlLOjz1P9w64g,10330 -blackd/__main__.py,sha256=L4xAcDh1K5zb6SsJB102AewW2G13P9-w2RiEwuFj8WA,37 -blackd/__pycache__/__init__.cpython-312.pyc,, -blackd/__pycache__/__main__.cpython-312.pyc,, -blackd/__pycache__/client.cpython-312.pyc,, -blackd/__pycache__/middlewares.cpython-312.pyc,, -blackd/client.py,sha256=-AxxVGAyTSvFPS0ONWvev0E-vQ-6w2_dJYnzNIRkW7w,3986 -blackd/middlewares.py,sha256=uufpRJLNGeIUb_qhp7XD5l48Q7-pi-_ApNObrVNQQ9E,1487 -blib2to3/Grammar.txt,sha256=ZNQ8U62MoRqZDII-0Pijvn4jWmPusLJN9GWSG-abID8,12024 -blib2to3/LICENSE,sha256=V4mIG4rrnJH1g19bt8q-hKD-zUuyvi9UyeaVenjseZ0,12762 -blib2to3/PatternGrammar.txt,sha256=zq8klc2KDv8vgw9IzSUq5Cu509lgIscjfNbnzKAIjQE,807 -blib2to3/README,sha256=QYZYIfb1NXTTYqDV4kn8oRcNG_qlTFYH1sr3V1h65ko,1074 -blib2to3/__init__.py,sha256=9_8wL9Scv8_Cs8HJyJHGvx1vwXErsuvlsAqNZLcJQR0,8 -blib2to3/__pycache__/__init__.cpython-312.pyc,, -blib2to3/__pycache__/pygram.cpython-312.pyc,, -blib2to3/__pycache__/pytree.cpython-312.pyc,, -blib2to3/pgen2/__init__.py,sha256=hY6w9QUzvTvRb-MoFfd_q_7ZLt6IUHC2yxWCfsZupQA,143 -blib2to3/pgen2/__pycache__/__init__.cpython-312.pyc,, -blib2to3/pgen2/__pycache__/conv.cpython-312.pyc,, -blib2to3/pgen2/__pycache__/driver.cpython-312.pyc,, -blib2to3/pgen2/__pycache__/grammar.cpython-312.pyc,, -blib2to3/pgen2/__pycache__/literals.cpython-312.pyc,, -blib2to3/pgen2/__pycache__/parse.cpython-312.pyc,, -blib2to3/pgen2/__pycache__/pgen.cpython-312.pyc,, -blib2to3/pgen2/__pycache__/token.cpython-312.pyc,, -blib2to3/pgen2/__pycache__/tokenize.cpython-312.pyc,, -blib2to3/pgen2/conv.cpython-312-x86_64-linux-gnu.so,sha256=uj8A9VMmfd-T3oxFeMDpSTeoRQZw4KzNs7l4GKYQutM,15976 -blib2to3/pgen2/conv.py,sha256=KcnskrhJ-0jhQ8kssxP2b1FPjFkKUjduf0hcF_dhreI,9596 -blib2to3/pgen2/driver.cpython-312-x86_64-linux-gnu.so,sha256=YbantdXGPkU2pIKCnDE__GjRfdcwoipFCRLXKnPW1Mk,15984 -blib2to3/pgen2/driver.py,sha256=yB1O43VhEB6sZ5tavynucntVwLCBS1TzsSFsqQx_DRY,10443 -blib2to3/pgen2/grammar.cpython-312-x86_64-linux-gnu.so,sha256=5nw1bCaaQkM7DabLE1QJFfE7enoqQWBpKu7U4T_c0SI,15984 -blib2to3/pgen2/grammar.py,sha256=xApSZeigr9IBog2G9_vLvhOiKqUjZrQOPHlrieCw8lE,6846 -blib2to3/pgen2/literals.cpython-312-x86_64-linux-gnu.so,sha256=Qdvapcu5flIEtxlq11j1aXxoXnxrq7eCyxJYRtb98Gg,15984 -blib2to3/pgen2/literals.py,sha256=bl7gBpwIsdRSt8laGERSyOVh4YpKSnAUII14CBcT5Ms,1580 -blib2to3/pgen2/parse.cpython-312-x86_64-linux-gnu.so,sha256=zoPtpwaG-0hjb88Fznn_fHQldsqH8LrLGf8HiLTlEDI,15976 -blib2to3/pgen2/parse.py,sha256=6sGjepxIQlkCTwQlqoX3NHA_5bl6SZgbuJCQ4N0Clx4,15480 -blib2to3/pgen2/pgen.cpython-312-x86_64-linux-gnu.so,sha256=u8Um0ABrR7-gl4wcfn849UgNV-wQdeTNiHo2HnWDkMA,15976 -blib2to3/pgen2/pgen.py,sha256=89Bh-0-j1Ze7xyZUp7K9-eouronO0EXWqm4Y1AuS-tY,15078 -blib2to3/pgen2/token.cpython-312-x86_64-linux-gnu.so,sha256=YGnaQuZqijTVhY6r5fwA7M-wXurd9G7ad9X01Iwjqmc,15976 -blib2to3/pgen2/token.py,sha256=YAbhcVBxJCv4NfhVnZhfqzGImthKinym3-I2U_0RM8U,1970 -blib2to3/pgen2/tokenize.cpython-312-x86_64-linux-gnu.so,sha256=0Nlv72Z7hzCUtjeAA5C-l3lyek8AvSKado-73qK0zLE,15984 -blib2to3/pgen2/tokenize.py,sha256=FWhPTRmHeRs-xGMfjqgB7T_sgU0EVGrZ5u-CNOAk_KE,7378 -blib2to3/pygram.cpython-312-x86_64-linux-gnu.so,sha256=3UKHzP3mrXmnarwfJgPxMKXCcC_HnaR8hAv_WsTatO4,15984 -blib2to3/pygram.py,sha256=4-TkPphLW1RyMPdzid1FP9kmuOM9Az9sZhK94ATyOBU,5020 -blib2to3/pytree.cpython-312-x86_64-linux-gnu.so,sha256=BsitJLpjZaCUAEZj0PiWrRaENEGcazupvSnj_j5lCZE,15984 -blib2to3/pytree.py,sha256=oF4F41tLbJ2ML2sNOZ3C4k2Nbox4A8IJGj_srt-G6O8,32416 diff --git a/venv/lib/python3.12/site-packages/black-26.3.1.dist-info/WHEEL b/venv/lib/python3.12/site-packages/black-26.3.1.dist-info/WHEEL deleted file mode 100644 index e598fb8..0000000 --- a/venv/lib/python3.12/site-packages/black-26.3.1.dist-info/WHEEL +++ /dev/null @@ -1,7 +0,0 @@ -Wheel-Version: 1.0 -Generator: hatchling 1.29.0 -Root-Is-Purelib: false -Tag: cp312-cp312-manylinux_2_17_x86_64 -Tag: cp312-cp312-manylinux2014_x86_64 -Tag: cp312-cp312-manylinux_2_28_x86_64 - diff --git a/venv/lib/python3.12/site-packages/black-26.3.1.dist-info/entry_points.txt b/venv/lib/python3.12/site-packages/black-26.3.1.dist-info/entry_points.txt deleted file mode 100644 index 864da49..0000000 --- a/venv/lib/python3.12/site-packages/black-26.3.1.dist-info/entry_points.txt +++ /dev/null @@ -1,6 +0,0 @@ -[console_scripts] -black = black:patched_main -blackd = blackd:patched_main [d] - -[validate_pyproject.tool_schema] -black = black.schema:get_schema diff --git a/venv/lib/python3.12/site-packages/black-26.3.1.dist-info/licenses/LICENSE b/venv/lib/python3.12/site-packages/black-26.3.1.dist-info/licenses/LICENSE deleted file mode 100644 index 7a9b891..0000000 --- a/venv/lib/python3.12/site-packages/black-26.3.1.dist-info/licenses/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Łukasz Langa - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/venv/lib/python3.12/site-packages/black/__init__.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/black/__init__.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index b90a9a7..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__init__.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/__init__.py b/venv/lib/python3.12/site-packages/black/__init__.py deleted file mode 100644 index 60f0286..0000000 --- a/venv/lib/python3.12/site-packages/black/__init__.py +++ /dev/null @@ -1,1679 +0,0 @@ -import io -import json -import platform -import re -import sys -import tokenize -import traceback -from collections.abc import ( - Collection, - Generator, - MutableMapping, - Sequence, -) -from contextlib import nullcontext -from dataclasses import replace -from datetime import datetime, timezone -from enum import Enum -from json.decoder import JSONDecodeError -from pathlib import Path -from re import Pattern -from typing import Any - -import click -from click.core import ParameterSource -from mypy_extensions import mypyc_attr -from pathspec import GitIgnoreSpec -from pathspec.patterns.gitignore import GitIgnorePatternError - -from _black_version import version as __version__ -from black.cache import Cache -from black.comments import normalize_fmt_off -from black.const import ( - DEFAULT_EXCLUDES, - DEFAULT_INCLUDES, - DEFAULT_LINE_LENGTH, - STDIN_PLACEHOLDER, -) -from black.files import ( - best_effort_relative_path, - find_project_root, - find_pyproject_toml, - find_user_pyproject_toml, - gen_python_files, - get_gitignore, - parse_pyproject_toml, - path_is_excluded, - resolves_outside_root_or_cannot_stat, - wrap_stream_for_windows, -) -from black.handle_ipynb_magics import ( - PYTHON_CELL_MAGICS, - jupyter_dependencies_are_installed, - mask_cell, - put_trailing_semicolon_back, - remove_trailing_semicolon, - unmask_cell, - validate_cell, -) -from black.linegen import LN, LineGenerator, transform_line -from black.lines import EmptyLineTracker, LinesBlock -from black.mode import FUTURE_FLAG_TO_FEATURE, VERSION_TO_FEATURES, Feature -from black.mode import Mode as Mode # re-exported -from black.mode import Preview, TargetVersion, supports_feature -from black.nodes import STARS, is_number_token, is_simple_decorator_expression, syms -from black.output import color_diff, diff, dump_to_file, err, ipynb_diff, out -from black.parsing import ( # noqa F401 - ASTSafetyError, - InvalidInput, - lib2to3_parse, - parse_ast, - stringify_ast, -) -from black.ranges import ( - adjusted_lines, - convert_unchanged_lines, - parse_line_ranges, - sanitized_lines, -) -from black.report import Changed, NothingChanged, Report -from blib2to3.pgen2 import token -from blib2to3.pytree import Leaf, Node - -COMPILED = Path(__file__).suffix in (".pyd", ".so") - -# types -FileContent = str -Encoding = str -NewLine = str - - -class WriteBack(Enum): - NO = 0 - YES = 1 - DIFF = 2 - CHECK = 3 - COLOR_DIFF = 4 - - @classmethod - def from_configuration( - cls, *, check: bool, diff: bool, color: bool = False - ) -> "WriteBack": - if check and not diff: - return cls.CHECK - - if diff and color: - return cls.COLOR_DIFF - - return cls.DIFF if diff else cls.YES - - -# Legacy name, left for integrations. -FileMode = Mode - - -def read_pyproject_toml( - ctx: click.Context, param: click.Parameter, value: str | None -) -> str | None: - """Inject Black configuration from "pyproject.toml" into defaults in `ctx`. - - Returns the path to a successfully found and read configuration file, None - otherwise. - """ - if not value: - value = find_pyproject_toml( - ctx.params.get("src", ()), ctx.params.get("stdin_filename", None) - ) - if value is None: - return None - - try: - config = parse_pyproject_toml(value) - except (OSError, ValueError) as e: - raise click.FileError( - filename=value, hint=f"Error reading configuration file: {e}" - ) from None - - if not config: - return None - else: - spellcheck_pyproject_toml_keys(ctx, list(config), value) - # Sanitize the values to be Click friendly. For more information please see: - # https://github.com/psf/black/issues/1458 - # https://github.com/pallets/click/issues/1567 - config = { - k: str(v) if not isinstance(v, (list, dict)) else v - for k, v in config.items() - } - - target_version = config.get("target_version") - if target_version is not None and not isinstance(target_version, list): - raise click.BadOptionUsage( - "target-version", "Config key target-version must be a list" - ) - - exclude = config.get("exclude") - if exclude is not None and not isinstance(exclude, str): - raise click.BadOptionUsage("exclude", "Config key exclude must be a string") - - extend_exclude = config.get("extend_exclude") - if extend_exclude is not None and not isinstance(extend_exclude, str): - raise click.BadOptionUsage( - "extend-exclude", "Config key extend-exclude must be a string" - ) - - line_ranges = config.get("line_ranges") - if line_ranges is not None: - raise click.BadOptionUsage( - "line-ranges", "Cannot use line-ranges in the pyproject.toml file." - ) - - default_map: dict[str, Any] = {} - if ctx.default_map: - default_map.update(ctx.default_map) - default_map.update(config) - - ctx.default_map = default_map - return value - - -def spellcheck_pyproject_toml_keys( - ctx: click.Context, config_keys: list[str], config_file_path: str -) -> None: - invalid_keys: list[str] = [] - available_config_options = {param.name for param in ctx.command.params} - invalid_keys = [key for key in config_keys if key not in available_config_options] - if invalid_keys: - keys_str = ", ".join(map(repr, invalid_keys)) - out( - f"Invalid config keys detected: {keys_str} (in {config_file_path})", - fg="red", - ) - - -def target_version_option_callback( - c: click.Context, p: click.Option | click.Parameter, v: tuple[str, ...] -) -> list[TargetVersion]: - """Compute the target versions from a --target-version flag. - - This is its own function because mypy couldn't infer the type correctly - when it was a lambda, causing mypyc trouble. - """ - return [TargetVersion[val.upper()] for val in v] - - -def _target_versions_exceed_runtime( - target_versions: set[TargetVersion], -) -> bool: - if not target_versions: - return False - max_target_minor = max(tv.value for tv in target_versions) - return max_target_minor > sys.version_info[1] - - -def _version_mismatch_message(target_versions: set[TargetVersion]) -> str: - max_target = max(target_versions, key=lambda tv: tv.value) - runtime = f"{sys.version_info[0]}.{sys.version_info[1]}" - return ( - f"Python {runtime} cannot parse code formatted for" - f" {max_target.pretty()}. To fix this: run Black with" - f" {max_target.pretty()}, set --target-version to" - f" py3{sys.version_info[1]}, or use --fast to skip the safety" - " check." - ) - - -def enable_unstable_feature_callback( - c: click.Context, p: click.Option | click.Parameter, v: tuple[str, ...] -) -> list[Preview]: - """Compute the features from an --enable-unstable-feature flag.""" - return [Preview[val] for val in v] - - -def re_compile_maybe_verbose(regex: str) -> Pattern[str]: - """Compile a regular expression string in `regex`. - - If it contains newlines, use verbose mode. - """ - if "\n" in regex: - regex = "(?x)" + regex - compiled: Pattern[str] = re.compile(regex) - return compiled - - -def validate_regex( - ctx: click.Context, - param: click.Parameter, - value: str | None, -) -> Pattern[str] | None: - try: - return re_compile_maybe_verbose(value) if value is not None else None - except re.error as e: - raise click.BadParameter(f"Not a valid regular expression: {e}") from None - - -@click.command( - context_settings={"help_option_names": ["-h", "--help"]}, - # While Click does set this field automatically using the docstring, mypyc - # (annoyingly) strips 'em so we need to set it here too. - help="The uncompromising code formatter.", -) -@click.option("-c", "--code", type=str, help="Format the code passed in as a string.") -@click.option( - "-l", - "--line-length", - type=int, - default=DEFAULT_LINE_LENGTH, - help="How many characters per line to allow.", - show_default=True, -) -@click.option( - "-t", - "--target-version", - type=click.Choice([v.name.lower() for v in TargetVersion]), - callback=target_version_option_callback, - multiple=True, - help=( - "Python versions that should be supported by Black's output. You should" - " include all versions that your code supports. By default, Black will infer" - " target versions from the project metadata in pyproject.toml. If this does" - " not yield conclusive results, Black will use per-file auto-detection." - ), -) -@click.option( - "--pyi", - is_flag=True, - help=( - "Format all input files like typing stubs regardless of file extension. This" - " is useful when piping source on standard input." - ), -) -@click.option( - "--ipynb", - is_flag=True, - help=( - "Format all input files like Jupyter Notebooks regardless of file extension." - " This is useful when piping source on standard input." - ), -) -@click.option( - "--python-cell-magics", - multiple=True, - help=( - "When processing Jupyter Notebooks, add the given magic to the list" - f" of known python-magics ({', '.join(sorted(PYTHON_CELL_MAGICS))})." - " Useful for formatting cells with custom python magics." - ), - default=[], -) -@click.option( - "-x", - "--skip-source-first-line", - is_flag=True, - help="Skip the first line of the source code.", -) -@click.option( - "-S", - "--skip-string-normalization", - is_flag=True, - help="Don't normalize string quotes or prefixes.", -) -@click.option( - "-C", - "--skip-magic-trailing-comma", - is_flag=True, - help="Don't use trailing commas as a reason to split lines.", -) -@click.option( - "--preview", - is_flag=True, - help=( - "Enable potentially disruptive style changes that may be added to Black's main" - " functionality in the next major release." - ), -) -@click.option( - "--unstable", - is_flag=True, - help=( - "Enable potentially disruptive style changes that have known bugs or are not" - " currently expected to make it into the stable style Black's next major" - " release. Implies --preview." - ), -) -@click.option( - "--enable-unstable-feature", - type=click.Choice([v.name for v in Preview]), - callback=enable_unstable_feature_callback, - multiple=True, - help=( - "Enable specific features included in the `--unstable` style. Requires" - " `--preview`. No compatibility guarantees are provided on the behavior" - " or existence of any unstable features." - ), -) -@click.option( - "--check", - is_flag=True, - help=( - "Don't write the files back, just return the status. Return code 0 means" - " nothing would change. Return code 1 means some files would be reformatted." - " Return code 123 means there was an internal error." - ), -) -@click.option( - "--diff", - is_flag=True, - help=( - "Don't write the files back, just output a diff to indicate what changes" - " Black would've made. They are printed to stdout so capturing them is simple." - ), -) -@click.option( - "--color/--no-color", - is_flag=True, - help="Show (or do not show) colored diff. Only applies when --diff is given.", -) -@click.option( - "--line-ranges", - multiple=True, - metavar="START-END", - help=( - "When specified, Black will try its best to only format these lines. This" - " option can be specified multiple times, and a union of the lines will be" - " formatted. Each range must be specified as two integers connected by a `-`:" - " `-`. The `` and `` integer indices are 1-based and" - " inclusive on both ends." - ), - default=(), -) -@click.option( - "--fast/--safe", - is_flag=True, - help=( - "By default, Black performs an AST safety check after formatting your code." - " The --fast flag turns off this check and the --safe flag explicitly enables" - " it. [default: --safe]" - ), -) -@click.option( - "--required-version", - type=str, - help=( - "Require a specific version of Black to be running. This is useful for" - " ensuring that all contributors to your project are using the same" - " version, because different versions of Black may format code a little" - " differently. This option can be set in a configuration file for consistent" - " results across environments." - ), -) -@click.option( - "--exclude", - type=str, - callback=validate_regex, - help=( - "A regular expression that matches files and directories that should be" - " excluded on recursive searches. An empty value means no paths are excluded." - " Use forward slashes for directories on all platforms (Windows, too)." - " By default, Black also ignores all paths listed in .gitignore. Changing this" - f" value will override all default exclusions. [default: {DEFAULT_EXCLUDES}]" - ), - show_default=False, -) -@click.option( - "--extend-exclude", - type=str, - callback=validate_regex, - help=( - "Like --exclude, but adds additional files and directories on top of the" - " default values instead of overriding them." - ), -) -@click.option( - "--force-exclude", - type=str, - callback=validate_regex, - help=( - "Like --exclude, but files and directories matching this regex will be excluded" - " even when they are passed explicitly as arguments. This is useful when" - " invoking Black programmatically on changed files, such as in a pre-commit" - " hook or editor plugin." - ), -) -@click.option( - "--stdin-filename", - type=str, - is_eager=True, - help=( - "The name of the file when passing it through stdin. Useful to make sure Black" - " will respect the --force-exclude option on some editors that rely on using" - " stdin." - ), -) -@click.option( - "--include", - type=str, - default=DEFAULT_INCLUDES, - callback=validate_regex, - help=( - "A regular expression that matches files and directories that should be" - " included on recursive searches. An empty value means all files are included" - " regardless of the name. Use forward slashes for directories on all platforms" - " (Windows, too). Overrides all exclusions, including from .gitignore and" - " command line options." - ), - show_default=True, -) -@click.option( - "-W", - "--workers", - type=click.IntRange(min=1), - default=None, - help=( - "When Black formats multiple files, it may use a process pool to speed up" - " formatting. This option controls the number of parallel workers. This can" - " also be specified via the BLACK_NUM_WORKERS environment variable. Defaults" - " to the number of CPUs in the system." - ), -) -@click.option( - "-q", - "--quiet", - is_flag=True, - help=( - "Stop emitting all non-critical output. Error messages will still be emitted" - " (which can silenced by 2>/dev/null)." - ), -) -@click.option( - "-v", - "--verbose", - is_flag=True, - help=( - "Emit messages about files that were not changed or were ignored due to" - " exclusion patterns. If Black is using a configuration file, a message" - " detailing which one it is using will be emitted." - ), -) -@click.version_option( - version=__version__, - message=( - f"%(prog)s, %(version)s (compiled: {'yes' if COMPILED else 'no'})\n" - f"Python ({platform.python_implementation()}) {platform.python_version()}" - ), -) -@click.argument( - "src", - nargs=-1, - type=click.Path( - exists=True, file_okay=True, dir_okay=True, readable=True, allow_dash=True - ), - is_eager=True, - metavar="SRC ...", -) -@click.option( - "--config", - type=click.Path( - exists=True, - file_okay=True, - dir_okay=False, - readable=True, - allow_dash=False, - path_type=str, - ), - is_eager=True, - callback=read_pyproject_toml, - help="Read configuration options from a configuration file.", -) -@click.option( - "--no-cache", - is_flag=True, - help=( - "Skip reading and writing the cache, forcing Black to reformat all" - " included files." - ), -) -@click.pass_context -def main( - ctx: click.Context, - code: str | None, - line_length: int, - target_version: list[TargetVersion], - check: bool, - diff: bool, - line_ranges: Sequence[str], - color: bool, - fast: bool, - pyi: bool, - ipynb: bool, - python_cell_magics: Sequence[str], - skip_source_first_line: bool, - skip_string_normalization: bool, - skip_magic_trailing_comma: bool, - preview: bool, - unstable: bool, - enable_unstable_feature: list[Preview], - quiet: bool, - verbose: bool, - required_version: str | None, - include: Pattern[str], - exclude: Pattern[str] | None, - extend_exclude: Pattern[str] | None, - force_exclude: Pattern[str] | None, - stdin_filename: str | None, - workers: int | None, - src: tuple[str, ...], - config: str | None, - no_cache: bool, -) -> None: - """The uncompromising code formatter.""" - ctx.ensure_object(dict) - - assert sys.version_info >= (3, 10), "Black requires Python 3.10+" - if sys.version_info[:3] == (3, 12, 5): - out( - "Python 3.12.5 has a memory safety issue that can cause Black's " - "AST safety checks to fail. " - "Please upgrade to Python 3.12.6 or downgrade to Python 3.12.4" - ) - ctx.exit(1) - - if src and code is not None: - out( - main.get_usage(ctx) - + "\n\n'SRC' and 'code' cannot be passed simultaneously." - ) - ctx.exit(1) - if not src and code is None: - out(main.get_usage(ctx) + "\n\nOne of 'SRC' or 'code' is required.") - ctx.exit(1) - - # It doesn't do anything if --unstable is also passed, so just allow it. - if enable_unstable_feature and not (preview or unstable): - out( - main.get_usage(ctx) - + "\n\n'--enable-unstable-feature' requires '--preview'." - ) - ctx.exit(1) - - root, method = ( - find_project_root(src, stdin_filename) if code is None else (None, None) - ) - ctx.obj["root"] = root - - if verbose: - if root: - out( - f"Identified `{root}` as project root containing a {method}.", - fg="blue", - ) - - if config: - config_source = ctx.get_parameter_source("config") - user_level_config = str(find_user_pyproject_toml()) - if config == user_level_config: - out( - "Using configuration from user-level config at " - f"'{user_level_config}'.", - fg="blue", - ) - elif config_source in ( - ParameterSource.DEFAULT, - ParameterSource.DEFAULT_MAP, - ): - out("Using configuration from project root.", fg="blue") - else: - out(f"Using configuration in '{config}'.", fg="blue") - if ctx.default_map: - for param, value in ctx.default_map.items(): - out(f"{param}: {value}") - - error_msg = "Oh no! 💥 💔 💥" - if ( - required_version - and required_version != __version__ - and required_version != __version__.split(".")[0] - ): - err( - f"{error_msg} The required version `{required_version}` does not match" - f" the running version `{__version__}`!" - ) - ctx.exit(1) - if ipynb and pyi: - err("Cannot pass both `pyi` and `ipynb` flags!") - ctx.exit(1) - - write_back = WriteBack.from_configuration(check=check, diff=diff, color=color) - if target_version: - versions = set(target_version) - else: - # We'll autodetect later. - versions = set() - mode = Mode( - target_versions=versions, - line_length=line_length, - is_pyi=pyi, - is_ipynb=ipynb, - skip_source_first_line=skip_source_first_line, - string_normalization=not skip_string_normalization, - magic_trailing_comma=not skip_magic_trailing_comma, - preview=preview, - unstable=unstable, - python_cell_magics=set(python_cell_magics), - enabled_features=set(enable_unstable_feature), - ) - - if not fast and _target_versions_exceed_runtime(versions): - err( - f"Warning: {_version_mismatch_message(versions)} Black's safety" - " check verifies equivalence by parsing the AST, which fails" - " when the running Python is older than the target version.", - fg="yellow", - ) - - lines: list[tuple[int, int]] = [] - if line_ranges: - if ipynb: - err("Cannot use --line-ranges with ipynb files.") - ctx.exit(1) - - try: - lines = parse_line_ranges(line_ranges) - except ValueError as e: - err(str(e)) - ctx.exit(1) - - if code is not None: - # Run in quiet mode by default with -c; the extra output isn't useful. - # You can still pass -v to get verbose output. - quiet = True - - report = Report(check=check, diff=diff, quiet=quiet, verbose=verbose) - - if code is not None: - reformat_code( - content=code, - fast=fast, - write_back=write_back, - mode=mode, - report=report, - lines=lines, - ) - else: - assert root is not None # root is only None if code is not None - try: - sources = get_sources( - root=root, - src=src, - quiet=quiet, - verbose=verbose, - include=include, - exclude=exclude, - extend_exclude=extend_exclude, - force_exclude=force_exclude, - report=report, - stdin_filename=stdin_filename, - ) - except GitIgnorePatternError: - ctx.exit(1) - - if not sources: - if verbose or not quiet: - out("No Python files are present to be formatted. Nothing to do 😴") - if "-" in src: - sys.stdout.write(sys.stdin.read()) - ctx.exit(0) - - if len(sources) == 1: - reformat_one( - src=sources.pop(), - fast=fast, - write_back=write_back, - mode=mode, - report=report, - lines=lines, - no_cache=no_cache, - ) - else: - from black.concurrency import reformat_many - - if lines: - err("Cannot use --line-ranges to format multiple files.") - ctx.exit(1) - reformat_many( - sources=sources, - fast=fast, - write_back=write_back, - mode=mode, - report=report, - workers=workers, - no_cache=no_cache, - ) - - if verbose or not quiet: - if code is None and (verbose or report.change_count or report.failure_count): - out() - out(error_msg if report.return_code else "All done! ✨ 🍰 ✨") - if code is None: - click.echo(str(report), err=True) - ctx.exit(report.return_code) - - -def get_sources( - *, - root: Path, - src: tuple[str, ...], - quiet: bool, - verbose: bool, - include: Pattern[str], - exclude: Pattern[str] | None, - extend_exclude: Pattern[str] | None, - force_exclude: Pattern[str] | None, - report: "Report", - stdin_filename: str | None, -) -> set[Path]: - """Compute the set of files to be formatted.""" - sources: set[Path] = set() - - assert root.is_absolute(), f"INTERNAL ERROR: `root` must be absolute but is {root}" - using_default_exclude = exclude is None - exclude = re_compile_maybe_verbose(DEFAULT_EXCLUDES) if exclude is None else exclude - gitignore: dict[Path, GitIgnoreSpec] | None = None - root_gitignore = get_gitignore(root) - - for s in src: - if s == "-" and stdin_filename: - path = Path(stdin_filename) - if path_is_excluded(stdin_filename, force_exclude): - report.path_ignored( - path, - "--stdin-filename matches the --force-exclude regular expression", - ) - continue - is_stdin = True - else: - path = Path(s) - is_stdin = False - - # Compare the logic here to the logic in `gen_python_files`. - if is_stdin or path.is_file(): - if resolves_outside_root_or_cannot_stat(path, root, report): - if verbose: - out(f'Skipping invalid source: "{path}"', fg="red") - continue - - root_relative_path = best_effort_relative_path(path, root).as_posix() - root_relative_path = "/" + root_relative_path - - # Hard-exclude any files that matches the `--force-exclude` regex. - if path_is_excluded(root_relative_path, force_exclude): - report.path_ignored( - path, "matches the --force-exclude regular expression" - ) - continue - - if is_stdin: - path = Path(f"{STDIN_PLACEHOLDER}{path}") - - if path.suffix == ".ipynb" and not jupyter_dependencies_are_installed( - warn=verbose or not quiet - ): - continue - - if verbose: - out(f'Found input source: "{path}"', fg="blue") - sources.add(path) - elif path.is_dir(): - path = root / (path.resolve().relative_to(root)) - if verbose: - out(f'Found input source directory: "{path}"', fg="blue") - - if using_default_exclude: - gitignore = { - root: root_gitignore, - path: get_gitignore(path), - } - sources.update( - gen_python_files( - path.iterdir(), - root, - include, - exclude, - extend_exclude, - force_exclude, - report, - gitignore, - verbose=verbose, - quiet=quiet, - ) - ) - elif s == "-": - if verbose: - out("Found input source stdin", fg="blue") - sources.add(path) - else: - err(f"invalid path: {s}") - - return sources - - -def reformat_code( - content: str, - fast: bool, - write_back: WriteBack, - mode: Mode, - report: Report, - *, - lines: Collection[tuple[int, int]] = (), -) -> None: - """ - Reformat and print out `content` without spawning child processes. - Similar to `reformat_one`, but for string content. - - `fast`, `write_back`, and `mode` options are passed to - :func:`format_file_in_place` or :func:`format_stdin_to_stdout`. - """ - path = Path("") - try: - changed = Changed.NO - if format_stdin_to_stdout( - content=content, fast=fast, write_back=write_back, mode=mode, lines=lines - ): - changed = Changed.YES - report.done(path, changed) - except Exception as exc: - if report.verbose: - traceback.print_exc() - report.failed(path, str(exc)) - - -# diff-shades depends on being to monkeypatch this function to operate. I know it's -# not ideal, but this shouldn't cause any issues ... hopefully. ~ichard26 -@mypyc_attr(patchable=True) -def reformat_one( - src: Path, - fast: bool, - write_back: WriteBack, - mode: Mode, - report: "Report", - *, - lines: Collection[tuple[int, int]] = (), - no_cache: bool = False, -) -> None: - """Reformat a single file under `src` without spawning child processes. - - `fast`, `write_back`, and `mode` options are passed to - :func:`format_file_in_place` or :func:`format_stdin_to_stdout`. - """ - try: - changed = Changed.NO - - if str(src) == "-": - is_stdin = True - elif str(src).startswith(STDIN_PLACEHOLDER): - is_stdin = True - # Use the original name again in case we want to print something - # to the user - src = Path(str(src)[len(STDIN_PLACEHOLDER) :]) - else: - is_stdin = False - - if is_stdin: - if src.suffix == ".pyi": - mode = replace(mode, is_pyi=True) - elif src.suffix == ".ipynb": - mode = replace(mode, is_ipynb=True) - if format_stdin_to_stdout( - fast=fast, write_back=write_back, mode=mode, lines=lines - ): - changed = Changed.YES - else: - cache = None if no_cache else Cache.read(mode) - if cache is not None and write_back not in ( - WriteBack.DIFF, - WriteBack.COLOR_DIFF, - ): - if not cache.is_changed(src): - changed = Changed.CACHED - if changed is not Changed.CACHED and format_file_in_place( - src, fast=fast, write_back=write_back, mode=mode, lines=lines - ): - changed = Changed.YES - if cache is not None and ( - (write_back is WriteBack.YES and changed is not Changed.CACHED) - or (write_back is WriteBack.CHECK and changed is Changed.NO) - ): - cache.write([src]) - report.done(src, changed) - except Exception as exc: - if report.verbose: - traceback.print_exc() - report.failed(src, str(exc)) - - -def format_file_in_place( - src: Path, - fast: bool, - mode: Mode, - write_back: WriteBack = WriteBack.NO, - lock: Any = None, # multiprocessing.Manager().Lock() is some crazy proxy - *, - lines: Collection[tuple[int, int]] = (), -) -> bool: - """Format file under `src` path. Return True if changed. - - If `write_back` is DIFF, write a diff to stdout. If it is YES, write reformatted - code to the file. - `mode` and `fast` options are passed to :func:`format_file_contents`. - """ - if src.suffix == ".pyi": - mode = replace(mode, is_pyi=True) - elif src.suffix == ".ipynb": - mode = replace(mode, is_ipynb=True) - - then = datetime.fromtimestamp(src.stat().st_mtime, timezone.utc) - header = b"" - with open(src, "rb") as buf: - if mode.skip_source_first_line: - header = buf.readline() - src_contents, encoding, newline = decode_bytes(buf.read(), mode) - try: - dst_contents = format_file_contents( - src_contents, fast=fast, mode=mode, lines=lines - ) - except NothingChanged: - return False - except JSONDecodeError: - raise ValueError( - f"File '{src}' cannot be parsed as valid Jupyter notebook." - ) from None - src_contents = header.decode(encoding) + src_contents - dst_contents = header.decode(encoding) + dst_contents - - if write_back == WriteBack.YES: - with open(src, "w", encoding=encoding, newline=newline) as f: - f.write(dst_contents) - elif write_back in (WriteBack.DIFF, WriteBack.COLOR_DIFF): - now = datetime.now(timezone.utc) - src_name = f"{src}\t{then}" - dst_name = f"{src}\t{now}" - if mode.is_ipynb: - diff_contents = ipynb_diff(src_contents, dst_contents, src_name, dst_name) - else: - diff_contents = diff(src_contents, dst_contents, src_name, dst_name) - - if write_back == WriteBack.COLOR_DIFF: - diff_contents = color_diff(diff_contents) - - with lock or nullcontext(): - f = io.TextIOWrapper( - sys.stdout.buffer, - encoding=encoding, - newline=newline, - write_through=True, - ) - f = wrap_stream_for_windows(f) - f.write(diff_contents) - f.detach() - - return True - - -def format_stdin_to_stdout( - fast: bool, - *, - content: str | None = None, - write_back: WriteBack = WriteBack.NO, - mode: Mode, - lines: Collection[tuple[int, int]] = (), -) -> bool: - """Format file on stdin. Return True if changed. - - If content is None, it's read from sys.stdin. - - If `write_back` is YES, write reformatted code back to stdout. If it is DIFF, - write a diff to stdout. The `mode` argument is passed to - :func:`format_file_contents`. - """ - then = datetime.now(timezone.utc) - - if content is None: - src, encoding, newline = decode_bytes(sys.stdin.buffer.read(), mode) - else: - src, encoding, newline = content, "utf-8", "\n" - - dst = src - try: - dst = format_file_contents(src, fast=fast, mode=mode, lines=lines) - return True - - except NothingChanged: - return False - - finally: - f = io.TextIOWrapper( - sys.stdout.buffer, encoding=encoding, newline=newline, write_through=True - ) - if write_back == WriteBack.YES: - # Make sure there's a newline after the content - if dst and dst[-1] != "\n" and dst[-1] != "\r": - dst += newline - f.write(dst) - elif write_back in (WriteBack.DIFF, WriteBack.COLOR_DIFF): - now = datetime.now(timezone.utc) - src_name = f"STDIN\t{then}" - dst_name = f"STDOUT\t{now}" - d = diff(src, dst, src_name, dst_name) - if write_back == WriteBack.COLOR_DIFF: - d = color_diff(d) - f = wrap_stream_for_windows(f) - f.write(d) - f.detach() - - -def check_stability_and_equivalence( - src_contents: str, - dst_contents: str, - *, - mode: Mode, - lines: Collection[tuple[int, int]] = (), -) -> None: - """Perform stability and equivalence checks. - - Raise AssertionError if source and destination contents are not - equivalent, or if a second pass of the formatter would format the - content differently. - """ - try: - assert_equivalent(src_contents, dst_contents) - except ASTSafetyError: - if _target_versions_exceed_runtime(mode.target_versions): - raise ASTSafetyError( - "failed to verify equivalence of the formatted output:" - f" {_version_mismatch_message(mode.target_versions)}" - ) from None - raise - assert_stable(src_contents, dst_contents, mode=mode, lines=lines) - - -def format_file_contents( - src_contents: str, - *, - fast: bool, - mode: Mode, - lines: Collection[tuple[int, int]] = (), -) -> FileContent: - """Reformat contents of a file and return new contents. - - If `fast` is False, additionally confirm that the reformatted code is - valid by calling :func:`assert_equivalent` and :func:`assert_stable` on it. - `mode` is passed to :func:`format_str`. - """ - if mode.is_ipynb: - dst_contents = format_ipynb_string(src_contents, fast=fast, mode=mode) - else: - dst_contents = format_str(src_contents, mode=mode, lines=lines) - if src_contents == dst_contents: - raise NothingChanged - - if not fast and not mode.is_ipynb: - # Jupyter notebooks will already have been checked above. - check_stability_and_equivalence( - src_contents, dst_contents, mode=mode, lines=lines - ) - return dst_contents - - -def format_cell(src: str, *, fast: bool, mode: Mode) -> str: - """Format code in given cell of Jupyter notebook. - - General idea is: - - - if cell has trailing semicolon, remove it; - - if cell has IPython magics, mask them; - - format cell; - - reinstate IPython magics; - - reinstate trailing semicolon (if originally present); - - strip trailing newlines. - - Cells with syntax errors will not be processed, as they - could potentially be automagics or multi-line magics, which - are currently not supported. - """ - validate_cell(src, mode) - src_without_trailing_semicolon, has_trailing_semicolon = remove_trailing_semicolon( - src - ) - try: - masked_src, replacements = mask_cell(src_without_trailing_semicolon) - except SyntaxError: - raise NothingChanged from None - masked_dst = format_str(masked_src, mode=mode) - if not fast: - check_stability_and_equivalence(masked_src, masked_dst, mode=mode) - dst_without_trailing_semicolon = unmask_cell(masked_dst, replacements) - dst = put_trailing_semicolon_back( - dst_without_trailing_semicolon, has_trailing_semicolon - ) - dst = dst.rstrip("\n") - if dst == src: - raise NothingChanged from None - return dst - - -def validate_metadata(nb: MutableMapping[str, Any]) -> None: - """If notebook is marked as non-Python, don't format it. - - All notebook metadata fields are optional, see - https://nbformat.readthedocs.io/en/latest/format_description.html. So - if a notebook has empty metadata, we will try to parse it anyway. - """ - language = nb.get("metadata", {}).get("language_info", {}).get("name", None) - if language is not None and language != "python": - raise NothingChanged from None - - -def format_ipynb_string(src_contents: str, *, fast: bool, mode: Mode) -> FileContent: - """Format Jupyter notebook. - - Operate cell-by-cell, only on code cells, only for Python notebooks. - If the ``.ipynb`` originally had a trailing newline, it'll be preserved. - """ - if not src_contents: - raise NothingChanged - - trailing_newline = src_contents[-1] == "\n" - modified = False - nb = json.loads(src_contents) - validate_metadata(nb) - for cell in nb["cells"]: - if cell.get("cell_type", None) == "code": - try: - src = "".join(cell["source"]) - dst = format_cell(src, fast=fast, mode=mode) - except NothingChanged: - pass - else: - cell["source"] = dst.splitlines(keepends=True) - modified = True - if modified: - dst_contents = json.dumps(nb, indent=1, ensure_ascii=False) - if trailing_newline: - dst_contents = dst_contents + "\n" - return dst_contents - else: - raise NothingChanged - - -def format_str( - src_contents: str, *, mode: Mode, lines: Collection[tuple[int, int]] = () -) -> str: - """Reformat a string and return new contents. - - `mode` determines formatting options, such as how many characters per line are - allowed. Example: - - >>> import black - >>> print(black.format_str("def f(arg:str='')->None:...", mode=black.Mode())) - def f(arg: str = "") -> None: - ... - - A more complex example: - - >>> print( - ... black.format_str( - ... "def f(arg:str='')->None: hey", - ... mode=black.Mode( - ... target_versions={black.TargetVersion.PY36}, - ... line_length=10, - ... string_normalization=False, - ... is_pyi=False, - ... ), - ... ), - ... ) - def f( - arg: str = '', - ) -> None: - hey - - """ - if lines: - lines = sanitized_lines(lines, src_contents) - if not lines: - return src_contents # Nothing to format - dst_contents = _format_str_once(src_contents, mode=mode, lines=lines) - # Forced second pass to work around optional trailing commas (becoming - # forced trailing commas on pass 2) interacting differently with optional - # parentheses. Admittedly ugly. - if src_contents != dst_contents: - if lines: - lines = adjusted_lines(lines, src_contents, dst_contents) - return _format_str_once(dst_contents, mode=mode, lines=lines) - return dst_contents - - -def _format_str_once( - src_contents: str, *, mode: Mode, lines: Collection[tuple[int, int]] = () -) -> str: - # Use the encoding overwrite since the src_contents may contain a different - # magic encoding comment than utf-8 - normalized_contents, _, newline_type = decode_bytes( - src_contents.encode("utf-8"), mode, encoding_overwrite="utf-8" - ) - - src_node = lib2to3_parse( - normalized_contents.lstrip(), target_versions=mode.target_versions - ) - - dst_blocks: list[LinesBlock] = [] - if mode.target_versions: - versions = mode.target_versions - else: - future_imports = get_future_imports(src_node) - versions = detect_target_versions(src_node, future_imports=future_imports) - - line_generation_features = { - feature - for feature in { - Feature.PARENTHESIZED_CONTEXT_MANAGERS, - Feature.UNPARENTHESIZED_EXCEPT_TYPES, - Feature.T_STRINGS, - } - if supports_feature(versions, feature) - } - normalize_fmt_off(src_node, mode, lines) - if lines: - # This should be called after normalize_fmt_off. - convert_unchanged_lines(src_node, lines) - - line_generator = LineGenerator(mode=mode, features=line_generation_features) - elt = EmptyLineTracker(mode=mode) - split_line_features = { - feature - for feature in { - Feature.TRAILING_COMMA_IN_CALL, - Feature.TRAILING_COMMA_IN_DEF, - } - if supports_feature(versions, feature) - } - block: LinesBlock | None = None - for current_line in line_generator.visit(src_node): - block = elt.maybe_empty_lines(current_line) - dst_blocks.append(block) - for line in transform_line( - current_line, mode=mode, features=split_line_features - ): - block.content_lines.append(str(line)) - if dst_blocks: - dst_blocks[-1].after = 0 - dst_contents = [] - for block in dst_blocks: - dst_contents.extend(block.all_lines()) - if not dst_contents: - if "\n" in normalized_contents: - return newline_type - return "".join(dst_contents).replace("\n", newline_type) - - -def decode_bytes( - src: bytes, mode: Mode, *, encoding_overwrite: str | None = None -) -> tuple[FileContent, Encoding, NewLine]: - """Return a tuple of (decoded_contents, encoding, newline). - - `newline` is either CRLF, LF, or CR, but `decoded_contents` is decoded with - universal newlines (i.e. only contains LF). - - Use the keyword only encoding_overwrite argument if the bytes are encoded - differently to their possible encoding magic comment. - """ - srcbuf = io.BytesIO(src) - - # Still use detect encoding even if overrite set because otherwise lines - # might be different - encoding, lines = tokenize.detect_encoding(srcbuf.readline) - if encoding_overwrite is not None: - encoding = encoding_overwrite - - if not lines: - return "", encoding, "\n" - - if lines[0][-2:] == b"\r\n": - if b"\r" in lines[0][:-2]: - newline = "\r" - else: - newline = "\r\n" - elif lines[0][-1:] == b"\n": - if b"\r" in lines[0][:-1]: - newline = "\r" - else: - newline = "\n" - else: - if b"\r" in lines[0]: - newline = "\r" - else: - newline = "\n" - - srcbuf.seek(0) - with io.TextIOWrapper(srcbuf, encoding) as tiow: - return tiow.read(), encoding, newline - - -def get_features_used( - node: Node, *, future_imports: set[str] | None = None -) -> set[Feature]: - """Return a set of (relatively) new Python features used in this file. - - Currently looking for: - - f-strings; - - self-documenting expressions in f-strings (f"{x=}"); - - underscores in numeric literals; - - trailing commas after * or ** in function signatures and calls; - - positional only arguments in function signatures and lambdas; - - assignment expression; - - relaxed decorator syntax; - - usage of __future__ flags (annotations); - - print / exec statements; - - parenthesized context managers; - - match statements; - - except* clause; - - variadic generics; - """ - features: set[Feature] = set() - if future_imports: - features |= { - FUTURE_FLAG_TO_FEATURE[future_import] - for future_import in future_imports - if future_import in FUTURE_FLAG_TO_FEATURE - } - - for n in node.pre_order(): - if n.type == token.FSTRING_START: - features.add(Feature.F_STRINGS) - elif n.type == token.TSTRING_START: - features.add(Feature.T_STRINGS) - elif ( - n.type == token.RBRACE - and n.parent is not None - and any(child.type == token.EQUAL for child in n.parent.children) - ): - features.add(Feature.DEBUG_F_STRINGS) - - elif is_number_token(n): - if "_" in n.value: - features.add(Feature.NUMERIC_UNDERSCORES) - - elif n.type == token.SLASH: - if n.parent and n.parent.type in { - syms.typedargslist, - syms.arglist, - syms.varargslist, - }: - features.add(Feature.POS_ONLY_ARGUMENTS) - - elif n.type == token.COLONEQUAL: - features.add(Feature.ASSIGNMENT_EXPRESSIONS) - - elif n.type == syms.decorator: - if len(n.children) > 1 and not is_simple_decorator_expression( - n.children[1] - ): - features.add(Feature.RELAXED_DECORATORS) - - elif ( - n.type in {syms.typedargslist, syms.arglist} - and n.children - and n.children[-1].type == token.COMMA - ): - if n.type == syms.typedargslist: - feature = Feature.TRAILING_COMMA_IN_DEF - else: - feature = Feature.TRAILING_COMMA_IN_CALL - - for ch in n.children: - if ch.type in STARS: - features.add(feature) - - if ch.type == syms.argument: - for argch in ch.children: - if argch.type in STARS: - features.add(feature) - - elif ( - n.type in {syms.return_stmt, syms.yield_expr} - and len(n.children) >= 2 - and n.children[1].type == syms.testlist_star_expr - and any(child.type == syms.star_expr for child in n.children[1].children) - ): - features.add(Feature.UNPACKING_ON_FLOW) - - elif ( - n.type == syms.annassign - and len(n.children) >= 4 - and n.children[3].type == syms.testlist_star_expr - ): - features.add(Feature.ANN_ASSIGN_EXTENDED_RHS) - - elif ( - n.type == syms.with_stmt - and len(n.children) > 2 - and n.children[1].type == syms.atom - ): - atom_children = n.children[1].children - if ( - len(atom_children) == 3 - and atom_children[0].type == token.LPAR - and _contains_asexpr(atom_children[1]) - and atom_children[2].type == token.RPAR - ): - features.add(Feature.PARENTHESIZED_CONTEXT_MANAGERS) - - elif n.type == syms.match_stmt: - features.add(Feature.PATTERN_MATCHING) - - elif n.type in {syms.subscriptlist, syms.trailer} and any( - child.type == syms.star_expr for child in n.children - ): - features.add(Feature.VARIADIC_GENERICS) - - elif ( - n.type == syms.tname_star - and len(n.children) == 3 - and n.children[2].type == syms.star_expr - ): - features.add(Feature.VARIADIC_GENERICS) - - elif n.type in (syms.type_stmt, syms.typeparams): - features.add(Feature.TYPE_PARAMS) - - elif ( - n.type in (syms.typevartuple, syms.paramspec, syms.typevar) - and n.children[-2].type == token.EQUAL - ): - features.add(Feature.TYPE_PARAM_DEFAULTS) - - elif ( - n.type == syms.except_clause - and len(n.children) >= 2 - and ( - n.children[1].type == token.STAR or n.children[1].type == syms.testlist - ) - ): - is_star_except = n.children[1].type == token.STAR - - if is_star_except: - features.add(Feature.EXCEPT_STAR) - - # Presence of except* pushes as clause 1 index back - has_as_clause = ( - len(n.children) >= is_star_except + 3 - and n.children[is_star_except + 2].type == token.NAME - and n.children[is_star_except + 2].value == "as" # type: ignore - ) - - # If there's no 'as' clause and the except expression is a testlist. - if not has_as_clause and ( - (is_star_except and n.children[2].type == syms.testlist) - or (not is_star_except and n.children[1].type == syms.testlist) - ): - features.add(Feature.UNPARENTHESIZED_EXCEPT_TYPES) - - return features - - -def _contains_asexpr(node: Node | Leaf) -> bool: - """Return True if `node` contains an as-pattern.""" - if node.type == syms.asexpr_test: - return True - elif node.type == syms.atom: - if ( - len(node.children) == 3 - and node.children[0].type == token.LPAR - and node.children[2].type == token.RPAR - ): - return _contains_asexpr(node.children[1]) - elif node.type == syms.testlist_gexp: - return any(_contains_asexpr(child) for child in node.children) - return False - - -def detect_target_versions( - node: Node, *, future_imports: set[str] | None = None -) -> set[TargetVersion]: - """Detect the version to target based on the nodes used.""" - features = get_features_used(node, future_imports=future_imports) - return { - version for version in TargetVersion if features <= VERSION_TO_FEATURES[version] - } - - -def get_future_imports(node: Node) -> set[str]: - """Return a set of __future__ imports in the file.""" - imports: set[str] = set() - - def get_imports_from_children(children: list[LN]) -> Generator[str, None, None]: - for child in children: - if isinstance(child, Leaf): - if child.type == token.NAME: - yield child.value - - elif child.type == syms.import_as_name: - orig_name = child.children[0] - assert isinstance(orig_name, Leaf), "Invalid syntax parsing imports" - assert orig_name.type == token.NAME, "Invalid syntax parsing imports" - yield orig_name.value - - elif child.type == syms.import_as_names: - yield from get_imports_from_children(child.children) - - else: - raise AssertionError("Invalid syntax parsing imports") - - for child in node.children: - if child.type != syms.simple_stmt: - break - - first_child = child.children[0] - if isinstance(first_child, Leaf): - # Continue looking if we see a docstring; otherwise stop. - if ( - len(child.children) == 2 - and first_child.type == token.STRING - and child.children[1].type == token.NEWLINE - ): - continue - - break - - elif first_child.type == syms.import_from: - module_name = first_child.children[1] - if not isinstance(module_name, Leaf) or module_name.value != "__future__": - break - - imports |= set(get_imports_from_children(first_child.children[3:])) - else: - break - - return imports - - -def _black_info() -> str: - return ( - f"Black {__version__} on " - f"Python ({platform.python_implementation()}) {platform.python_version()}" - ) - - -def assert_equivalent(src: str, dst: str) -> None: - """Raise AssertionError if `src` and `dst` aren't equivalent.""" - try: - src_ast = parse_ast(src) - except Exception as exc: - raise ASTSafetyError( - "cannot use --safe with this file; failed to parse source file AST: " - f"{exc}\n" - "This could be caused by running Black with an older Python version " - "that does not support new syntax used in your source file." - ) from exc - - try: - dst_ast = parse_ast(dst) - except Exception as exc: - log = dump_to_file("".join(traceback.format_tb(exc.__traceback__)), dst) - raise ASTSafetyError( - f"INTERNAL ERROR: {_black_info()} produced invalid code: {exc}. " - "Please report a bug on https://github.com/psf/black/issues. " - f"This invalid output might be helpful: {log}" - ) from None - - src_ast_str = "\n".join(stringify_ast(src_ast)) - dst_ast_str = "\n".join(stringify_ast(dst_ast)) - if src_ast_str != dst_ast_str: - log = dump_to_file(diff(src_ast_str, dst_ast_str, "src", "dst")) - raise ASTSafetyError( - f"INTERNAL ERROR: {_black_info()} produced code that is not equivalent to" - " the source. Please report a bug on https://github.com/psf/black/issues." - f" This diff might be helpful: {log}" - ) from None - - -def assert_stable( - src: str, dst: str, mode: Mode, *, lines: Collection[tuple[int, int]] = () -) -> None: - """Raise AssertionError if `dst` reformats differently the second time.""" - if lines: - # Formatting specified lines requires `adjusted_lines` to map original lines - # to the formatted lines before re-formatting the previously formatted result. - # Due to less-ideal diff algorithm, some edge cases produce incorrect new line - # ranges. Hence for now, we skip the stable check. - # See https://github.com/psf/black/issues/4033 for context. - return - # We shouldn't call format_str() here, because that formats the string - # twice and may hide a bug where we bounce back and forth between two - # versions. - newdst = _format_str_once(dst, mode=mode, lines=lines) - if dst != newdst: - log = dump_to_file( - str(mode), - diff(src, dst, "source", "first pass"), - diff(dst, newdst, "first pass", "second pass"), - ) - raise AssertionError( - f"INTERNAL ERROR: {_black_info()} produced different code on the second" - " pass of the formatter. Please report a bug on" - f" https://github.com/psf/black/issues. This diff might be helpful: {log}" - ) from None - - -def patched_main() -> None: - # PyInstaller patches multiprocessing to need freeze_support() even in non-Windows - # environments so just assume we always need to call it if frozen. - if getattr(sys, "frozen", False): - from multiprocessing import freeze_support - - freeze_support() - - main() - - -if __name__ == "__main__": - patched_main() diff --git a/venv/lib/python3.12/site-packages/black/__main__.py b/venv/lib/python3.12/site-packages/black/__main__.py deleted file mode 100644 index 19b810b..0000000 --- a/venv/lib/python3.12/site-packages/black/__main__.py +++ /dev/null @@ -1,3 +0,0 @@ -from black import patched_main - -patched_main() diff --git a/venv/lib/python3.12/site-packages/black/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index edba056..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/__pycache__/__main__.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/__pycache__/__main__.cpython-312.pyc deleted file mode 100644 index 3d7ee69..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__pycache__/__main__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/__pycache__/_width_table.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/__pycache__/_width_table.cpython-312.pyc deleted file mode 100644 index 336bf93..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__pycache__/_width_table.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/__pycache__/brackets.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/__pycache__/brackets.cpython-312.pyc deleted file mode 100644 index df06544..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__pycache__/brackets.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/__pycache__/cache.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/__pycache__/cache.cpython-312.pyc deleted file mode 100644 index 5457dc7..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__pycache__/cache.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/__pycache__/comments.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/__pycache__/comments.cpython-312.pyc deleted file mode 100644 index 3831777..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__pycache__/comments.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/__pycache__/concurrency.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/__pycache__/concurrency.cpython-312.pyc deleted file mode 100644 index 0bc741b..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__pycache__/concurrency.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/__pycache__/const.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/__pycache__/const.cpython-312.pyc deleted file mode 100644 index d4383cb..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__pycache__/const.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/__pycache__/debug.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/__pycache__/debug.cpython-312.pyc deleted file mode 100644 index 71f575c..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__pycache__/debug.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/__pycache__/files.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/__pycache__/files.cpython-312.pyc deleted file mode 100644 index 28018ed..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__pycache__/files.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/__pycache__/handle_ipynb_magics.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/__pycache__/handle_ipynb_magics.cpython-312.pyc deleted file mode 100644 index ba363d5..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__pycache__/handle_ipynb_magics.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/__pycache__/linegen.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/__pycache__/linegen.cpython-312.pyc deleted file mode 100644 index 1b92e1a..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__pycache__/linegen.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/__pycache__/lines.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/__pycache__/lines.cpython-312.pyc deleted file mode 100644 index 1e1c20d..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__pycache__/lines.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/__pycache__/mode.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/__pycache__/mode.cpython-312.pyc deleted file mode 100644 index 9d55510..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__pycache__/mode.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/__pycache__/nodes.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/__pycache__/nodes.cpython-312.pyc deleted file mode 100644 index 1a4719f..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__pycache__/nodes.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/__pycache__/numerics.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/__pycache__/numerics.cpython-312.pyc deleted file mode 100644 index 98eb64c..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__pycache__/numerics.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/__pycache__/output.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/__pycache__/output.cpython-312.pyc deleted file mode 100644 index 3095588..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__pycache__/output.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/__pycache__/parsing.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/__pycache__/parsing.cpython-312.pyc deleted file mode 100644 index fc17841..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__pycache__/parsing.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/__pycache__/ranges.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/__pycache__/ranges.cpython-312.pyc deleted file mode 100644 index 3100e79..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__pycache__/ranges.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/__pycache__/report.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/__pycache__/report.cpython-312.pyc deleted file mode 100644 index 91803f0..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__pycache__/report.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/__pycache__/rusty.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/__pycache__/rusty.cpython-312.pyc deleted file mode 100644 index 5016593..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__pycache__/rusty.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/__pycache__/schema.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/__pycache__/schema.cpython-312.pyc deleted file mode 100644 index 59782a7..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__pycache__/schema.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/__pycache__/strings.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/__pycache__/strings.cpython-312.pyc deleted file mode 100644 index f50ea96..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__pycache__/strings.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/__pycache__/trans.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/__pycache__/trans.cpython-312.pyc deleted file mode 100644 index 54ca40e..0000000 Binary files a/venv/lib/python3.12/site-packages/black/__pycache__/trans.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/_width_table.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/black/_width_table.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 9206c1c..0000000 Binary files a/venv/lib/python3.12/site-packages/black/_width_table.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/_width_table.py b/venv/lib/python3.12/site-packages/black/_width_table.py deleted file mode 100644 index 5175357..0000000 --- a/venv/lib/python3.12/site-packages/black/_width_table.py +++ /dev/null @@ -1,132 +0,0 @@ -# Generated by make_width_table.py -# wcwidth 0.2.14 -# Unicode 17.0.0 -from typing import Final - -WIDTH_TABLE: Final[list[tuple[int, int, int]]] = [ - (4352, 4447, 2), - (8986, 8987, 2), - (9001, 9002, 2), - (9193, 9196, 2), - (9200, 9200, 2), - (9203, 9203, 2), - (9725, 9726, 2), - (9748, 9749, 2), - (9776, 9783, 2), - (9800, 9811, 2), - (9855, 9855, 2), - (9866, 9871, 2), - (9875, 9875, 2), - (9889, 9889, 2), - (9898, 9899, 2), - (9917, 9918, 2), - (9924, 9925, 2), - (9934, 9934, 2), - (9940, 9940, 2), - (9962, 9962, 2), - (9970, 9971, 2), - (9973, 9973, 2), - (9978, 9978, 2), - (9981, 9981, 2), - (9989, 9989, 2), - (9994, 9995, 2), - (10024, 10024, 2), - (10060, 10060, 2), - (10062, 10062, 2), - (10067, 10069, 2), - (10071, 10071, 2), - (10133, 10135, 2), - (10160, 10160, 2), - (10175, 10175, 2), - (11035, 11036, 2), - (11088, 11088, 2), - (11093, 11093, 2), - (11904, 11929, 2), - (11931, 12019, 2), - (12032, 12245, 2), - (12272, 12329, 2), - (12336, 12350, 2), - (12353, 12438, 2), - (12443, 12543, 2), - (12549, 12591, 2), - (12593, 12686, 2), - (12688, 12773, 2), - (12783, 12830, 2), - (12832, 12871, 2), - (12880, 42124, 2), - (42128, 42182, 2), - (43360, 43388, 2), - (44032, 55203, 2), - (63744, 64255, 2), - (65040, 65049, 2), - (65072, 65106, 2), - (65108, 65126, 2), - (65128, 65131, 2), - (65281, 65376, 2), - (65504, 65510, 2), - (94176, 94179, 2), - (94194, 94198, 2), - (94208, 101589, 2), - (101631, 101662, 2), - (101760, 101874, 2), - (110576, 110579, 2), - (110581, 110587, 2), - (110589, 110590, 2), - (110592, 110882, 2), - (110898, 110898, 2), - (110928, 110930, 2), - (110933, 110933, 2), - (110948, 110951, 2), - (110960, 111355, 2), - (119552, 119638, 2), - (119648, 119670, 2), - (126980, 126980, 2), - (127183, 127183, 2), - (127374, 127374, 2), - (127377, 127386, 2), - (127488, 127490, 2), - (127504, 127547, 2), - (127552, 127560, 2), - (127568, 127569, 2), - (127584, 127589, 2), - (127744, 127776, 2), - (127789, 127797, 2), - (127799, 127868, 2), - (127870, 127891, 2), - (127904, 127946, 2), - (127951, 127955, 2), - (127968, 127984, 2), - (127988, 127988, 2), - (127992, 127994, 2), - (128000, 128062, 2), - (128064, 128064, 2), - (128066, 128252, 2), - (128255, 128317, 2), - (128331, 128334, 2), - (128336, 128359, 2), - (128378, 128378, 2), - (128405, 128406, 2), - (128420, 128420, 2), - (128507, 128591, 2), - (128640, 128709, 2), - (128716, 128716, 2), - (128720, 128722, 2), - (128725, 128728, 2), - (128732, 128735, 2), - (128747, 128748, 2), - (128756, 128764, 2), - (128992, 129003, 2), - (129008, 129008, 2), - (129292, 129338, 2), - (129340, 129349, 2), - (129351, 129535, 2), - (129648, 129660, 2), - (129664, 129674, 2), - (129678, 129734, 2), - (129736, 129736, 2), - (129741, 129756, 2), - (129759, 129770, 2), - (129775, 129784, 2), - (131072, 196605, 2), - (196608, 262141, 2), -] diff --git a/venv/lib/python3.12/site-packages/black/brackets.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/black/brackets.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index d90f9d2..0000000 Binary files a/venv/lib/python3.12/site-packages/black/brackets.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/brackets.py b/venv/lib/python3.12/site-packages/black/brackets.py deleted file mode 100644 index 44a3c9a..0000000 --- a/venv/lib/python3.12/site-packages/black/brackets.py +++ /dev/null @@ -1,383 +0,0 @@ -"""Builds on top of nodes.py to track brackets.""" - -from collections.abc import Iterable, Sequence -from dataclasses import dataclass, field -from typing import Final, Union - -from black.nodes import ( - BRACKET, - CLOSING_BRACKETS, - COMPARATORS, - LOGIC_OPERATORS, - MATH_OPERATORS, - OPENING_BRACKETS, - UNPACKING_PARENTS, - VARARGS_PARENTS, - is_vararg, - syms, -) -from blib2to3.pgen2 import token -from blib2to3.pytree import Leaf, Node - -# types -LN = Union[Leaf, Node] -Depth = int -LeafID = int -NodeType = int -Priority = int - - -COMPREHENSION_PRIORITY: Final = 20 -COMMA_PRIORITY: Final = 18 -TERNARY_PRIORITY: Final = 16 -LOGIC_PRIORITY: Final = 14 -STRING_PRIORITY: Final = 12 -COMPARATOR_PRIORITY: Final = 10 -MATH_PRIORITIES: Final = { - token.VBAR: 9, - token.CIRCUMFLEX: 8, - token.AMPER: 7, - token.LEFTSHIFT: 6, - token.RIGHTSHIFT: 6, - token.PLUS: 5, - token.MINUS: 5, - token.STAR: 4, - token.SLASH: 4, - token.DOUBLESLASH: 4, - token.PERCENT: 4, - token.AT: 4, - token.TILDE: 3, - token.DOUBLESTAR: 2, -} -DOT_PRIORITY: Final = 1 - - -class BracketMatchError(Exception): - """Raised when an opening bracket is unable to be matched to a closing bracket.""" - - -@dataclass -class BracketTracker: - """Keeps track of brackets on a line.""" - - depth: int = 0 - bracket_match: dict[tuple[Depth, NodeType], Leaf] = field(default_factory=dict) - delimiters: dict[LeafID, Priority] = field(default_factory=dict) - previous: Leaf | None = None - _for_loop_depths: list[int] = field(default_factory=list) - _lambda_argument_depths: list[int] = field(default_factory=list) - invisible: list[Leaf] = field(default_factory=list) - - def mark(self, leaf: Leaf) -> None: - """Mark `leaf` with bracket-related metadata. Keep track of delimiters. - - All leaves receive an int `bracket_depth` field that stores how deep - within brackets a given leaf is. 0 means there are no enclosing brackets - that started on this line. - - If a leaf is itself a closing bracket and there is a matching opening - bracket earlier, it receives an `opening_bracket` field with which it forms a - pair. This is a one-directional link to avoid reference cycles. Closing - bracket without opening happens on lines continued from previous - breaks, e.g. `) -> "ReturnType":` as part of a funcdef where we place - the return type annotation on its own line of the previous closing RPAR. - - If a leaf is a delimiter (a token on which Black can split the line if - needed) and it's on depth 0, its `id()` is stored in the tracker's - `delimiters` field. - """ - if leaf.type == token.COMMENT: - return - - if ( - self.depth == 0 - and leaf.type in CLOSING_BRACKETS - and (self.depth, leaf.type) not in self.bracket_match - ): - return - - self.maybe_decrement_after_for_loop_variable(leaf) - self.maybe_decrement_after_lambda_arguments(leaf) - if leaf.type in CLOSING_BRACKETS: - self.depth -= 1 - try: - opening_bracket = self.bracket_match.pop((self.depth, leaf.type)) - except KeyError as e: - raise BracketMatchError( - "Unable to match a closing bracket to the following opening" - f" bracket: {leaf}" - ) from e - leaf.opening_bracket = opening_bracket - if not leaf.value: - self.invisible.append(leaf) - leaf.bracket_depth = self.depth - if self.depth == 0: - delim = is_split_before_delimiter(leaf, self.previous) - if delim and self.previous is not None: - self.delimiters[id(self.previous)] = delim - else: - delim = is_split_after_delimiter(leaf) - if delim: - self.delimiters[id(leaf)] = delim - if leaf.type in OPENING_BRACKETS: - self.bracket_match[self.depth, BRACKET[leaf.type]] = leaf - self.depth += 1 - if not leaf.value: - self.invisible.append(leaf) - self.previous = leaf - self.maybe_increment_lambda_arguments(leaf) - self.maybe_increment_for_loop_variable(leaf) - - def any_open_for_or_lambda(self) -> bool: - """Return True if there is an open for or lambda expression on the line. - - See maybe_increment_for_loop_variable and maybe_increment_lambda_arguments - for details.""" - return bool(self._for_loop_depths or self._lambda_argument_depths) - - def any_open_brackets(self) -> bool: - """Return True if there is an yet unmatched open bracket on the line.""" - return bool(self.bracket_match) - - def max_delimiter_priority(self, exclude: Iterable[LeafID] = ()) -> Priority: - """Return the highest priority of a delimiter found on the line. - - Values are consistent with what `is_split_*_delimiter()` return. - Raises ValueError on no delimiters. - """ - return max(v for k, v in self.delimiters.items() if k not in exclude) - - def delimiter_count_with_priority(self, priority: Priority = 0) -> int: - """Return the number of delimiters with the given `priority`. - - If no `priority` is passed, defaults to max priority on the line. - """ - if not self.delimiters: - return 0 - - priority = priority or self.max_delimiter_priority() - return sum(1 for p in self.delimiters.values() if p == priority) - - def maybe_increment_for_loop_variable(self, leaf: Leaf) -> bool: - """In a for loop, or comprehension, the variables are often unpacks. - - To avoid splitting on the comma in this situation, increase the depth of - tokens between `for` and `in`. - """ - if leaf.type == token.NAME and leaf.value == "for": - self.depth += 1 - self._for_loop_depths.append(self.depth) - return True - - return False - - def maybe_decrement_after_for_loop_variable(self, leaf: Leaf) -> bool: - """See `maybe_increment_for_loop_variable` above for explanation.""" - if ( - self._for_loop_depths - and self._for_loop_depths[-1] == self.depth - and leaf.type == token.NAME - and leaf.value == "in" - ): - self.depth -= 1 - self._for_loop_depths.pop() - return True - - return False - - def maybe_increment_lambda_arguments(self, leaf: Leaf) -> bool: - """In a lambda expression, there might be more than one argument. - - To avoid splitting on the comma in this situation, increase the depth of - tokens between `lambda` and `:`. - """ - if leaf.type == token.NAME and leaf.value == "lambda": - self.depth += 1 - self._lambda_argument_depths.append(self.depth) - return True - - return False - - def maybe_decrement_after_lambda_arguments(self, leaf: Leaf) -> bool: - """See `maybe_increment_lambda_arguments` above for explanation.""" - if ( - self._lambda_argument_depths - and self._lambda_argument_depths[-1] == self.depth - and leaf.type == token.COLON - ): - self.depth -= 1 - self._lambda_argument_depths.pop() - return True - - return False - - def get_open_lsqb(self) -> Leaf | None: - """Return the most recent opening square bracket (if any).""" - return self.bracket_match.get((self.depth - 1, token.RSQB)) - - -def is_split_after_delimiter(leaf: Leaf) -> Priority: - """Return the priority of the `leaf` delimiter, given a line break after it. - - The delimiter priorities returned here are from those delimiters that would - cause a line break after themselves. - - Higher numbers are higher priority. - """ - if leaf.type == token.COMMA: - return COMMA_PRIORITY - - return 0 - - -def is_split_before_delimiter(leaf: Leaf, previous: Leaf | None = None) -> Priority: - """Return the priority of the `leaf` delimiter, given a line break before it. - - The delimiter priorities returned here are from those delimiters that would - cause a line break before themselves. - - Higher numbers are higher priority. - """ - if is_vararg(leaf, within=VARARGS_PARENTS | UNPACKING_PARENTS): - # * and ** might also be MATH_OPERATORS but in this case they are not. - # Don't treat them as a delimiter. - return 0 - - if ( - leaf.type == token.DOT - and leaf.parent - and leaf.parent.type not in {syms.import_from, syms.dotted_name} - and (previous is None or previous.type in CLOSING_BRACKETS) - ): - return DOT_PRIORITY - - if ( - leaf.type in MATH_OPERATORS - and leaf.parent - and leaf.parent.type not in {syms.factor, syms.star_expr} - ): - return MATH_PRIORITIES[leaf.type] - - if leaf.type in COMPARATORS: - return COMPARATOR_PRIORITY - - if ( - leaf.type == token.STRING - and previous is not None - and previous.type == token.STRING - ): - return STRING_PRIORITY - - if leaf.type not in {token.NAME, token.ASYNC}: - return 0 - - if ( - leaf.value == "for" - and leaf.parent - and leaf.parent.type in {syms.comp_for, syms.old_comp_for} - or leaf.type == token.ASYNC - ): - if ( - not isinstance(leaf.prev_sibling, Leaf) - or leaf.prev_sibling.value != "async" - ): - return COMPREHENSION_PRIORITY - - if ( - leaf.value == "if" - and leaf.parent - and leaf.parent.type in {syms.comp_if, syms.old_comp_if} - ): - return COMPREHENSION_PRIORITY - - if leaf.value in {"if", "else"} and leaf.parent and leaf.parent.type == syms.test: - return TERNARY_PRIORITY - - if leaf.value == "is": - return COMPARATOR_PRIORITY - - if ( - leaf.value == "in" - and leaf.parent - and leaf.parent.type in {syms.comp_op, syms.comparison} - and not ( - previous is not None - and previous.type == token.NAME - and previous.value == "not" - ) - ): - return COMPARATOR_PRIORITY - - if ( - leaf.value == "not" - and leaf.parent - and leaf.parent.type == syms.comp_op - and not ( - previous is not None - and previous.type == token.NAME - and previous.value == "is" - ) - ): - return COMPARATOR_PRIORITY - - if leaf.value in LOGIC_OPERATORS and leaf.parent: - return LOGIC_PRIORITY - - return 0 - - -def max_delimiter_priority_in_atom(node: LN) -> Priority: - """Return maximum delimiter priority inside `node`. - - This is specific to atoms with contents contained in a pair of parentheses. - If `node` isn't an atom or there are no enclosing parentheses, returns 0. - """ - if node.type != syms.atom: - return 0 - - first = node.children[0] - last = node.children[-1] - if not (first.type == token.LPAR and last.type == token.RPAR): - return 0 - - bt = BracketTracker() - for c in node.children[1:-1]: - if isinstance(c, Leaf): - bt.mark(c) - else: - for leaf in c.leaves(): - bt.mark(leaf) - try: - return bt.max_delimiter_priority() - - except ValueError: - return 0 - - -def get_leaves_inside_matching_brackets(leaves: Sequence[Leaf]) -> set[LeafID]: - """Return leaves that are inside matching brackets. - - The input `leaves` can have non-matching brackets at the head or tail parts. - Matching brackets are included. - """ - try: - # Start with the first opening bracket and ignore closing brackets before. - start_index = next( - i for i, l in enumerate(leaves) if l.type in OPENING_BRACKETS - ) - except StopIteration: - return set() - bracket_stack = [] - ids = set() - for i in range(start_index, len(leaves)): - leaf = leaves[i] - if leaf.type in OPENING_BRACKETS: - bracket_stack.append((BRACKET[leaf.type], i)) - if leaf.type in CLOSING_BRACKETS: - if bracket_stack and leaf.type == bracket_stack[-1][0]: - _, start = bracket_stack.pop() - for j in range(start, i + 1): - ids.add(id(leaves[j])) - else: - break - return ids diff --git a/venv/lib/python3.12/site-packages/black/cache.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/black/cache.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 95ea3b7..0000000 Binary files a/venv/lib/python3.12/site-packages/black/cache.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/cache.py b/venv/lib/python3.12/site-packages/black/cache.py deleted file mode 100644 index ef9d99a..0000000 --- a/venv/lib/python3.12/site-packages/black/cache.py +++ /dev/null @@ -1,150 +0,0 @@ -"""Caching of formatted files with feature-based invalidation.""" - -import hashlib -import os -import pickle -import sys -import tempfile -from collections.abc import Iterable -from dataclasses import dataclass, field -from pathlib import Path -from typing import NamedTuple - -from platformdirs import user_cache_dir - -from _black_version import version as __version__ -from black.mode import Mode -from black.output import err - -if sys.version_info >= (3, 11): - from typing import Self -else: - from typing_extensions import Self - - -class FileData(NamedTuple): - st_mtime: float - st_size: int - hash: str - - -def get_cache_dir() -> Path: - """Get the cache directory used by black. - - Users can customize this directory on all systems using `BLACK_CACHE_DIR` - environment variable. By default, the cache directory is the user cache directory - under the black application. - - This result is immediately set to a constant `black.cache.CACHE_DIR` as to avoid - repeated calls. - """ - # NOTE: Function mostly exists as a clean way to test getting the cache directory. - default_cache_dir = user_cache_dir("black") - cache_dir = Path(os.environ.get("BLACK_CACHE_DIR", default_cache_dir)) - cache_dir = cache_dir / __version__ - return cache_dir - - -CACHE_DIR = get_cache_dir() - - -def get_cache_file(mode: Mode) -> Path: - return CACHE_DIR / f"cache.{mode.get_cache_key()}.pickle" - - -@dataclass -class Cache: - mode: Mode - cache_file: Path - file_data: dict[str, FileData] = field(default_factory=dict) - - @classmethod - def read(cls, mode: Mode) -> Self: - """Read the cache if it exists and is well-formed. - - If it is not well-formed, the call to write later should - resolve the issue. - """ - cache_file = get_cache_file(mode) - try: - exists = cache_file.exists() - except OSError as e: - # Likely file too long; see #4172 and #4174 - err(f"Unable to read cache file {cache_file} due to {e}") - return cls(mode, cache_file) - if not exists: - return cls(mode, cache_file) - - with cache_file.open("rb") as fobj: - try: - data: dict[str, tuple[float, int, str]] = pickle.load(fobj) - file_data = {k: FileData(*v) for k, v in data.items()} - except (pickle.UnpicklingError, ValueError, IndexError): - return cls(mode, cache_file) - - return cls(mode, cache_file, file_data) - - @staticmethod - def hash_digest(path: Path) -> str: - """Return hash digest for path.""" - - data = path.read_bytes() - return hashlib.sha256(data).hexdigest() - - @staticmethod - def get_file_data(path: Path) -> FileData: - """Return file data for path.""" - - stat = path.stat() - hash = Cache.hash_digest(path) - return FileData(stat.st_mtime, stat.st_size, hash) - - def is_changed(self, source: Path) -> bool: - """Check if source has changed compared to cached version.""" - res_src = source.resolve() - old = self.file_data.get(str(res_src)) - if old is None: - return True - - st = res_src.stat() - if st.st_size != old.st_size: - return True - if st.st_mtime != old.st_mtime: - new_hash = Cache.hash_digest(res_src) - if new_hash != old.hash: - return True - return False - - def filtered_cached(self, sources: Iterable[Path]) -> tuple[set[Path], set[Path]]: - """Split an iterable of paths in `sources` into two sets. - - The first contains paths of files that modified on disk or are not in the - cache. The other contains paths to non-modified files. - """ - changed: set[Path] = set() - done: set[Path] = set() - for src in sources: - if self.is_changed(src): - changed.add(src) - else: - done.add(src) - return changed, done - - def write(self, sources: Iterable[Path]) -> None: - """Update the cache file data and write a new cache file.""" - self.file_data.update( - **{str(src.resolve()): Cache.get_file_data(src) for src in sources} - ) - try: - CACHE_DIR.mkdir(parents=True, exist_ok=True) - with tempfile.NamedTemporaryFile( - dir=str(self.cache_file.parent), delete=False - ) as f: - # We store raw tuples in the cache because it's faster. - data: dict[str, tuple[float, int, str]] = { - k: (*v,) for k, v in self.file_data.items() - } - pickle.dump(data, f, protocol=4) - os.replace(f.name, self.cache_file) - except OSError: - pass diff --git a/venv/lib/python3.12/site-packages/black/comments.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/black/comments.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 53348fb..0000000 Binary files a/venv/lib/python3.12/site-packages/black/comments.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/comments.py b/venv/lib/python3.12/site-packages/black/comments.py deleted file mode 100644 index b3dda1d..0000000 --- a/venv/lib/python3.12/site-packages/black/comments.py +++ /dev/null @@ -1,827 +0,0 @@ -import re -from collections.abc import Collection, Iterator -from dataclasses import dataclass -from functools import lru_cache -from typing import Final, Union - -from black.mode import Mode -from black.nodes import ( - CLOSING_BRACKETS, - STANDALONE_COMMENT, - STATEMENT, - WHITESPACE, - container_of, - first_leaf_of, - is_type_comment_string, - make_simple_prefix, - preceding_leaf, - syms, -) -from blib2to3.pgen2 import token -from blib2to3.pytree import Leaf, Node - -# types -LN = Union[Leaf, Node] - -FMT_OFF: Final = {"# fmt: off", "# fmt:off", "# yapf: disable"} -FMT_SKIP: Final = {"# fmt: skip", "# fmt:skip"} -FMT_ON: Final = {"# fmt: on", "# fmt:on", "# yapf: enable"} - -# Compound statements we care about for fmt: skip handling -# (excludes except_clause and case_block which aren't standalone compound statements) -_COMPOUND_STATEMENTS: Final = STATEMENT - {syms.except_clause, syms.case_block} - -COMMENT_EXCEPTIONS = " !:#'" -_COMMENT_PREFIX = "# " -_COMMENT_LIST_SEPARATOR = ";" - - -@dataclass -class ProtoComment: - """Describes a piece of syntax that is a comment. - - It's not a :class:`blib2to3.pytree.Leaf` so that: - - * it can be cached (`Leaf` objects should not be reused more than once as - they store their lineno, column, prefix, and parent information); - * `newlines` and `consumed` fields are kept separate from the `value`. This - simplifies handling of special marker comments like ``# fmt: off/on``. - """ - - type: int # token.COMMENT or STANDALONE_COMMENT - value: str # content of the comment - newlines: int # how many newlines before the comment - consumed: int # how many characters of the original leaf's prefix did we consume - form_feed: bool # is there a form feed before the comment - leading_whitespace: str # leading whitespace before the comment, if any - - -def generate_comments(leaf: LN, mode: Mode) -> Iterator[Leaf]: - """Clean the prefix of the `leaf` and generate comments from it, if any. - - Comments in lib2to3 are shoved into the whitespace prefix. This happens - in `pgen2/driver.py:Driver.parse_tokens()`. This was a brilliant implementation - move because it does away with modifying the grammar to include all the - possible places in which comments can be placed. - - The sad consequence for us though is that comments don't "belong" anywhere. - This is why this function generates simple parentless Leaf objects for - comments. We simply don't know what the correct parent should be. - - No matter though, we can live without this. We really only need to - differentiate between inline and standalone comments. The latter don't - share the line with any code. - - Inline comments are emitted as regular token.COMMENT leaves. Standalone - are emitted with a fake STANDALONE_COMMENT token identifier. - """ - total_consumed = 0 - for pc in list_comments( - leaf.prefix, is_endmarker=leaf.type == token.ENDMARKER, mode=mode - ): - total_consumed = pc.consumed - prefix = make_simple_prefix(pc.newlines, pc.form_feed) - yield Leaf(pc.type, pc.value, prefix=prefix) - normalize_trailing_prefix(leaf, total_consumed) - - -@lru_cache(maxsize=4096) -def list_comments(prefix: str, *, is_endmarker: bool, mode: Mode) -> list[ProtoComment]: - """Return a list of :class:`ProtoComment` objects parsed from the given `prefix`.""" - result: list[ProtoComment] = [] - if not prefix or "#" not in prefix: - return result - - consumed = 0 - nlines = 0 - ignored_lines = 0 - form_feed = False - for index, full_line in enumerate(re.split("\r?\n|\r", prefix)): - consumed += len(full_line) + 1 # adding the length of the split '\n' - match = re.match(r"^(\s*)(\S.*|)$", full_line) - assert match - whitespace, line = match.groups() - if not line: - nlines += 1 - if "\f" in full_line: - form_feed = True - if not line.startswith("#"): - # Escaped newlines outside of a comment are not really newlines at - # all. We treat a single-line comment following an escaped newline - # as a simple trailing comment. - if line.endswith("\\"): - ignored_lines += 1 - continue - - if index == ignored_lines and not is_endmarker: - comment_type = token.COMMENT # simple trailing comment - else: - comment_type = STANDALONE_COMMENT - comment = make_comment(line, mode=mode) - result.append( - ProtoComment( - type=comment_type, - value=comment, - newlines=nlines, - consumed=consumed, - form_feed=form_feed, - leading_whitespace=whitespace, - ) - ) - form_feed = False - nlines = 0 - return result - - -def normalize_trailing_prefix(leaf: LN, total_consumed: int) -> None: - """Normalize the prefix that's left over after generating comments. - - Note: don't use backslashes for formatting or you'll lose your voting rights. - """ - remainder = leaf.prefix[total_consumed:] - if "\\" not in remainder: - nl_count = remainder.count("\n") - form_feed = "\f" in remainder and remainder.endswith("\n") - leaf.prefix = make_simple_prefix(nl_count, form_feed) - return - - leaf.prefix = "" - - -def make_comment(content: str, mode: Mode) -> str: - """Return a consistently formatted comment from the given `content` string. - - All comments (except for "##", "#!", "#:", '#'") should have a single - space between the hash sign and the content. - - If `content` didn't start with a hash sign, one is provided. - - Comments containing fmt directives are preserved exactly as-is to respect - user intent (e.g., `#no space # fmt: skip` stays as-is). - """ - content = content.rstrip() - if not content: - return "#" - - # Preserve comments with fmt directives exactly as-is - if content.startswith("#") and contains_fmt_directive(content): - return content - - if content[0] == "#": - content = content[1:] - if ( - content - and content[0] == "\N{NO-BREAK SPACE}" - and not is_type_comment_string("# " + content.lstrip(), mode=mode) - ): - content = " " + content[1:] # Replace NBSP by a simple space - if ( - content - and "\N{NO-BREAK SPACE}" not in content - and is_type_comment_string("#" + content, mode=mode) - ): - type_part, value_part = content.split(":", 1) - content = type_part.strip() + ": " + value_part.strip() - - if content and content[0] not in COMMENT_EXCEPTIONS: - content = " " + content - return "#" + content - - -def normalize_fmt_off( - node: Node, mode: Mode, lines: Collection[tuple[int, int]] -) -> None: - """Convert content between `# fmt: off`/`# fmt: on` into standalone comments.""" - try_again = True - while try_again: - try_again = convert_one_fmt_off_pair(node, mode, lines) - - -def _should_process_fmt_comment( - comment: ProtoComment, leaf: Leaf -) -> tuple[bool, bool, bool]: - """Check if comment should be processed for fmt handling. - - Returns (should_process, is_fmt_off, is_fmt_skip). - """ - is_fmt_off = contains_fmt_directive(comment.value, FMT_OFF) - is_fmt_skip = contains_fmt_directive(comment.value, FMT_SKIP) - - if not is_fmt_off and not is_fmt_skip: - return False, False, False - - # Invalid use when `# fmt: off` is applied before a closing bracket - if is_fmt_off and leaf.type in CLOSING_BRACKETS: - return False, False, False - - return True, is_fmt_off, is_fmt_skip - - -def _is_valid_standalone_fmt_comment( - comment: ProtoComment, leaf: Leaf, is_fmt_off: bool, is_fmt_skip: bool -) -> bool: - """Check if comment is a valid standalone fmt directive. - - We only want standalone comments. If there's no previous leaf or if - the previous leaf is indentation, it's a standalone comment in disguise. - """ - if comment.type == STANDALONE_COMMENT: - return True - - prev = preceding_leaf(leaf) - if not prev: - return True - - # Treat STANDALONE_COMMENT nodes as whitespace for check - if is_fmt_off and prev.type not in WHITESPACE and prev.type != STANDALONE_COMMENT: - return False - if is_fmt_skip and prev.type in WHITESPACE: - return False - - return True - - -def _handle_comment_only_fmt_block( - leaf: Leaf, - comment: ProtoComment, - previous_consumed: int, - mode: Mode, -) -> bool: - """Handle fmt:off/on blocks that contain only comments. - - Returns True if a block was converted, False otherwise. - """ - all_comments = list_comments(leaf.prefix, is_endmarker=False, mode=mode) - - # Find the first fmt:off and its matching fmt:on - fmt_off_idx = None - fmt_on_idx = None - for idx, c in enumerate(all_comments): - if fmt_off_idx is None and contains_fmt_directive(c.value, FMT_OFF): - fmt_off_idx = idx - if ( - fmt_off_idx is not None - and idx > fmt_off_idx - and contains_fmt_directive(c.value, FMT_ON) - ): - fmt_on_idx = idx - break - - # Only proceed if we found both directives - if fmt_on_idx is None or fmt_off_idx is None: - return False - - comment = all_comments[fmt_off_idx] - fmt_on_comment = all_comments[fmt_on_idx] - original_prefix = leaf.prefix - - # Build the hidden value - start_pos = comment.consumed - end_pos = fmt_on_comment.consumed - content_between_and_fmt_on = original_prefix[start_pos:end_pos] - hidden_value = comment.value + "\n" + content_between_and_fmt_on - - if hidden_value.endswith("\n"): - hidden_value = hidden_value[:-1] - - # Build the standalone comment prefix - preserve all content before fmt:off - # including any comments that precede it - if fmt_off_idx == 0: - # No comments before fmt:off, use previous_consumed - pre_fmt_off_consumed = previous_consumed - else: - # Use the consumed position of the last comment before fmt:off - # This preserves all comments and content before the fmt:off directive - pre_fmt_off_consumed = all_comments[fmt_off_idx - 1].consumed - - standalone_comment_prefix = ( - original_prefix[:pre_fmt_off_consumed] + "\n" * comment.newlines - ) - - fmt_off_prefix = original_prefix.split(comment.value)[0] - if "\n" in fmt_off_prefix: - fmt_off_prefix = fmt_off_prefix.split("\n")[-1] - standalone_comment_prefix += fmt_off_prefix - - # Update leaf prefix - leaf.prefix = original_prefix[fmt_on_comment.consumed :] - - # Insert the STANDALONE_COMMENT - parent = leaf.parent - assert parent is not None, "INTERNAL ERROR: fmt: on/off handling (prefix only)" - - leaf_idx = None - for idx, child in enumerate(parent.children): - if child is leaf: - leaf_idx = idx - break - - assert leaf_idx is not None, "INTERNAL ERROR: fmt: on/off handling (leaf index)" - - parent.insert_child( - leaf_idx, - Leaf( - STANDALONE_COMMENT, - hidden_value, - prefix=standalone_comment_prefix, - fmt_pass_converted_first_leaf=None, - ), - ) - return True - - -def convert_one_fmt_off_pair( - node: Node, mode: Mode, lines: Collection[tuple[int, int]] -) -> bool: - """Convert content of a single `# fmt: off`/`# fmt: on` into a standalone comment. - - Returns True if a pair was converted. - """ - for leaf in node.leaves(): - # Skip STANDALONE_COMMENT nodes that were created by fmt:off/on/skip processing - # to avoid reprocessing them in subsequent iterations - if leaf.type == STANDALONE_COMMENT and hasattr( - leaf, "fmt_pass_converted_first_leaf" - ): - continue - - previous_consumed = 0 - for comment in list_comments(leaf.prefix, is_endmarker=False, mode=mode): - should_process, is_fmt_off, is_fmt_skip = _should_process_fmt_comment( - comment, leaf - ) - if not should_process: - previous_consumed = comment.consumed - continue - - if not _is_valid_standalone_fmt_comment( - comment, leaf, is_fmt_off, is_fmt_skip - ): - previous_consumed = comment.consumed - continue - - ignored_nodes = list(generate_ignored_nodes(leaf, comment, mode)) - - # Handle comment-only blocks - if not ignored_nodes and is_fmt_off: - if _handle_comment_only_fmt_block( - leaf, comment, previous_consumed, mode - ): - return True - continue - - # Need actual nodes to process - if not ignored_nodes: - continue - - # Handle regular fmt blocks - - _handle_regular_fmt_block( - ignored_nodes, - comment, - previous_consumed, - is_fmt_skip, - lines, - leaf, - ) - return True - - return False - - -def _handle_regular_fmt_block( - ignored_nodes: list[LN], - comment: ProtoComment, - previous_consumed: int, - is_fmt_skip: bool, - lines: Collection[tuple[int, int]], - leaf: Leaf, -) -> None: - """Handle fmt blocks with actual AST nodes.""" - first = ignored_nodes[0] # Can be a container node with the `leaf`. - parent = first.parent - prefix = first.prefix - - if contains_fmt_directive(comment.value, FMT_OFF): - first.prefix = prefix[comment.consumed :] - if is_fmt_skip: - first.prefix = "" - standalone_comment_prefix = prefix - else: - standalone_comment_prefix = prefix[:previous_consumed] + "\n" * comment.newlines - - # Ensure STANDALONE_COMMENT nodes have trailing newlines when stringified - # This prevents multiple fmt: skip comments from being concatenated on one line - parts = [] - for node in ignored_nodes: - if isinstance(node, Leaf) and node.type == STANDALONE_COMMENT: - # Add newline after STANDALONE_COMMENT Leaf - node_str = str(node) - if not node_str.endswith("\n"): - node_str += "\n" - parts.append(node_str) - elif isinstance(node, Node): - # For nodes that might contain STANDALONE_COMMENT leaves, - # we need custom stringify - has_standalone = any( - leaf.type == STANDALONE_COMMENT for leaf in node.leaves() - ) - if has_standalone: - # Stringify node with STANDALONE_COMMENT leaves having trailing newlines - def stringify_node(n: LN) -> str: - if isinstance(n, Leaf): - if n.type == STANDALONE_COMMENT: - result = n.prefix + n.value - if not result.endswith("\n"): - result += "\n" - return result - return str(n) - else: - # For nested nodes, recursively process children - return "".join(stringify_node(child) for child in n.children) - - parts.append(stringify_node(node)) - else: - parts.append(str(node)) - else: - parts.append(str(node)) - - hidden_value = "".join(parts) - comment_lineno = leaf.lineno - comment.newlines - - if contains_fmt_directive(comment.value, FMT_OFF): - fmt_off_prefix = "" - if len(lines) > 0 and not any( - line[0] <= comment_lineno <= line[1] for line in lines - ): - # keeping indentation of comment by preserving original whitespaces. - fmt_off_prefix = prefix.split(comment.value)[0] - if "\n" in fmt_off_prefix: - fmt_off_prefix = fmt_off_prefix.split("\n")[-1] - standalone_comment_prefix += fmt_off_prefix - hidden_value = comment.value + "\n" + hidden_value - - if is_fmt_skip: - hidden_value += comment.leading_whitespace + comment.value - - if hidden_value.endswith("\n"): - # That happens when one of the `ignored_nodes` ended with a NEWLINE - # leaf (possibly followed by a DEDENT). - hidden_value = hidden_value[:-1] - - first_idx: int | None = None - for ignored in ignored_nodes: - index = ignored.remove() - if first_idx is None: - first_idx = index - - assert parent is not None, "INTERNAL ERROR: fmt: on/off handling (1)" - assert first_idx is not None, "INTERNAL ERROR: fmt: on/off handling (2)" - - parent.insert_child( - first_idx, - Leaf( - STANDALONE_COMMENT, - hidden_value, - prefix=standalone_comment_prefix, - fmt_pass_converted_first_leaf=first_leaf_of(first), - ), - ) - - -def generate_ignored_nodes( - leaf: Leaf, comment: ProtoComment, mode: Mode -) -> Iterator[LN]: - """Starting from the container of `leaf`, generate all leaves until `# fmt: on`. - - If comment is skip, returns leaf only. - Stops at the end of the block. - """ - if contains_fmt_directive(comment.value, FMT_SKIP): - yield from _generate_ignored_nodes_from_fmt_skip(leaf, comment, mode) - return - container: LN | None = container_of(leaf) - while container is not None and container.type != token.ENDMARKER: - if is_fmt_on(container, mode=mode): - return - - # fix for fmt: on in children - if children_contains_fmt_on(container, mode=mode): - for index, child in enumerate(container.children): - if isinstance(child, Leaf) and is_fmt_on(child, mode=mode): - if child.type in CLOSING_BRACKETS: - # This means `# fmt: on` is placed at a different bracket level - # than `# fmt: off`. This is an invalid use, but as a courtesy, - # we include this closing bracket in the ignored nodes. - # The alternative is to fail the formatting. - yield child - return - if ( - child.type == token.INDENT - and index < len(container.children) - 1 - and children_contains_fmt_on( - container.children[index + 1], mode=mode - ) - ): - # This means `# fmt: on` is placed right after an indentation - # level, and we shouldn't swallow the previous INDENT token. - return - if children_contains_fmt_on(child, mode=mode): - return - yield child - else: - if container.type == token.DEDENT and container.next_sibling is None: - # This can happen when there is no matching `# fmt: on` comment at the - # same level as `# fmt: on`. We need to keep this DEDENT. - return - yield container - container = container.next_sibling - - -def _find_compound_statement_context(parent: Node) -> Node | None: - """Return the body node of a compound statement if we should respect fmt: skip. - - This handles one-line compound statements like: - if condition: body # fmt: skip - - When Black expands such statements, they temporarily look like: - if condition: - body # fmt: skip - - In both cases, we want to return the body node (either the simple_stmt directly - or the suite containing it). - """ - if parent.type != syms.simple_stmt: - return None - - if not isinstance(parent.parent, Node): - return None - - # Case 1: Expanded form after Black's initial formatting pass. - # The one-liner has been split across multiple lines: - # if True: - # print("a"); print("b") # fmt: skip - # Structure: compound_stmt -> suite -> simple_stmt - if ( - parent.parent.type == syms.suite - and isinstance(parent.parent.parent, Node) - and parent.parent.parent.type in _COMPOUND_STATEMENTS - ): - return parent.parent - - # Case 2: Original one-line form from the input source. - # The statement is still on a single line: - # if True: print("a"); print("b") # fmt: skip - # Structure: compound_stmt -> simple_stmt - if parent.parent.type in _COMPOUND_STATEMENTS: - return parent - - return None - - -def _should_keep_compound_statement_inline( - body_node: Node, simple_stmt_parent: Node -) -> bool: - """Check if a compound statement should be kept on one line. - - Returns True only for compound statements with semicolon-separated bodies, - like: if True: print("a"); print("b") # fmt: skip - """ - # Check if there are semicolons in the body - for leaf in body_node.leaves(): - if leaf.type == token.SEMI: - # Verify it's a single-line body (one simple_stmt) - if body_node.type == syms.suite: - # After formatting: check suite has one simple_stmt child - simple_stmts = [ - child - for child in body_node.children - if child.type == syms.simple_stmt - ] - return len(simple_stmts) == 1 and simple_stmts[0] is simple_stmt_parent - else: - # Original form: body_node IS the simple_stmt - return body_node is simple_stmt_parent - return False - - -def _get_compound_statement_header( - body_node: Node, simple_stmt_parent: Node -) -> list[LN]: - """Get header nodes for a compound statement that should be preserved inline.""" - if not _should_keep_compound_statement_inline(body_node, simple_stmt_parent): - return [] - - # Get the compound statement (parent of body) - compound_stmt = body_node.parent - if compound_stmt is None or compound_stmt.type not in _COMPOUND_STATEMENTS: - return [] - - # Collect all header leaves before the body - header_leaves: list[LN] = [] - for child in compound_stmt.children: - if child is body_node: - break - if isinstance(child, Leaf): - if child.type not in (token.NEWLINE, token.INDENT): - header_leaves.append(child) - else: - header_leaves.extend(child.leaves()) - return header_leaves - - -def _generate_ignored_nodes_from_fmt_skip( - leaf: Leaf, comment: ProtoComment, mode: Mode -) -> Iterator[LN]: - """Generate all leaves that should be ignored by the `# fmt: skip` from `leaf`.""" - prev_sibling = leaf.prev_sibling - parent = leaf.parent - ignored_nodes: list[LN] = [] - # Need to properly format the leaf prefix to compare it to comment.value, - # which is also formatted - comments = list_comments(leaf.prefix, is_endmarker=False, mode=mode) - if not comments or comment.value != comments[0].value: - return - - if not prev_sibling and parent: - prev_sibling = parent.prev_sibling - - if prev_sibling is not None: - leaf.prefix = leaf.prefix[comment.consumed :] - - # Generates the nodes to be ignored by `fmt: skip`. - - # Nodes to ignore are the ones on the same line as the - # `# fmt: skip` comment, excluding the `# fmt: skip` - # node itself. - - # Traversal process (starting at the `# fmt: skip` node): - # 1. Move to the `prev_sibling` of the current node. - # 2. If `prev_sibling` has children, go to its rightmost leaf. - # 3. If there's no `prev_sibling`, move up to the parent - # node and repeat. - # 4. Continue until: - # a. You encounter an `INDENT` or `NEWLINE` node (indicates - # start of the line). - # b. You reach the root node. - - # Include all visited LEAVES in the ignored list, except INDENT - # or NEWLINE leaves. - - current_node = prev_sibling - ignored_nodes = [current_node] - if current_node.prev_sibling is None and current_node.parent is not None: - current_node = current_node.parent - - # Track seen nodes to detect cycles that can occur after tree modifications - seen_nodes = {id(current_node)} - - while "\n" not in current_node.prefix and current_node.prev_sibling is not None: - leaf_nodes = list(current_node.prev_sibling.leaves()) - next_node = leaf_nodes[-1] if leaf_nodes else current_node - - # Detect infinite loop - if we've seen this node before, stop - # This can happen when STANDALONE_COMMENT nodes are inserted - # during processing - if id(next_node) in seen_nodes: - break - - current_node = next_node - seen_nodes.add(id(current_node)) - - # Stop if we encounter a STANDALONE_COMMENT created by fmt processing - if ( - isinstance(current_node, Leaf) - and current_node.type == STANDALONE_COMMENT - and hasattr(current_node, "fmt_pass_converted_first_leaf") - ): - break - - if ( - current_node.type in CLOSING_BRACKETS - and current_node.parent - and current_node.parent.type == syms.atom - ): - current_node = current_node.parent - - if current_node.type in (token.NEWLINE, token.INDENT): - current_node.prefix = "" - break - - if current_node.type == token.DEDENT: - break - - # Special case for with expressions - # Without this, we can stuck inside the asexpr_test's children's children - if ( - current_node.parent - and current_node.parent.type == syms.asexpr_test - and current_node.parent.parent - and current_node.parent.parent.type == syms.with_stmt - ): - current_node = current_node.parent - - ignored_nodes.insert(0, current_node) - - if current_node.prev_sibling is None and current_node.parent is not None: - current_node = current_node.parent - - # Special handling for compound statements with semicolon-separated bodies - if isinstance(parent, Node): - body_node = _find_compound_statement_context(parent) - if body_node is not None: - header_nodes = _get_compound_statement_header(body_node, parent) - if header_nodes: - ignored_nodes = header_nodes + ignored_nodes - - yield from ignored_nodes - elif ( - parent is not None and parent.type == syms.suite and leaf.type == token.NEWLINE - ): - # The `# fmt: skip` is on the colon line of the if/while/def/class/... - # statements. The ignored nodes should be previous siblings of the - # parent suite node. - leaf.prefix = "" - parent_sibling = parent.prev_sibling - while parent_sibling is not None and parent_sibling.type != syms.suite: - ignored_nodes.insert(0, parent_sibling) - parent_sibling = parent_sibling.prev_sibling - # Special case for `async_stmt` where the ASYNC token is on the - # grandparent node. - grandparent = parent.parent - if ( - grandparent is not None - and grandparent.prev_sibling is not None - and grandparent.prev_sibling.type == token.ASYNC - ): - ignored_nodes.insert(0, grandparent.prev_sibling) - yield from iter(ignored_nodes) - - -def is_fmt_on(container: LN, mode: Mode) -> bool: - """Determine whether formatting is switched on within a container. - Determined by whether the last `# fmt:` comment is `on` or `off`. - """ - fmt_on = False - for comment in list_comments(container.prefix, is_endmarker=False, mode=mode): - if contains_fmt_directive(comment.value, FMT_ON): - fmt_on = True - elif contains_fmt_directive(comment.value, FMT_OFF): - fmt_on = False - return fmt_on - - -def children_contains_fmt_on(container: LN, mode: Mode) -> bool: - """Determine if children have formatting switched on.""" - for child in container.children: - leaf = first_leaf_of(child) - if leaf is not None and is_fmt_on(leaf, mode=mode): - return True - - return False - - -def contains_pragma_comment(comment_list: list[Leaf]) -> bool: - """ - Returns: - True iff one of the comments in @comment_list is a pragma used by one - of the more common static analysis tools for python (e.g. mypy, flake8, - pylint). - """ - for comment in comment_list: - if comment.value.startswith(("# type:", "# noqa", "# pylint:")): - return True - - return False - - -def contains_fmt_directive( - comment_line: str, directives: set[str] = FMT_OFF | FMT_ON | FMT_SKIP -) -> bool: - """ - Checks if the given comment contains format directives, alone or paired with - other comments. - - Defaults to checking all directives (skip, off, on, yapf), but can be - narrowed to specific ones. - - Matching styles: - # foobar <-- single comment - # foobar # foobar # foobar <-- multiple comments - # foobar; foobar <-- list of comments (; separated) - """ - semantic_comment_blocks = [ - comment_line, - *[ - _COMMENT_PREFIX + comment.strip() - for comment in comment_line.split(_COMMENT_PREFIX)[1:] - ], - *[ - _COMMENT_PREFIX + comment.strip() - for comment in comment_line.strip(_COMMENT_PREFIX).split( - _COMMENT_LIST_SEPARATOR - ) - ], - ] - - return any(comment in directives for comment in semantic_comment_blocks) diff --git a/venv/lib/python3.12/site-packages/black/concurrency.py b/venv/lib/python3.12/site-packages/black/concurrency.py deleted file mode 100644 index e2c5b1f..0000000 --- a/venv/lib/python3.12/site-packages/black/concurrency.py +++ /dev/null @@ -1,221 +0,0 @@ -""" -Formatting many files at once via multiprocessing. Contains entrypoint and utilities. - -NOTE: this module is only imported if we need to format several files at once. -""" - -from __future__ import annotations - -import asyncio -import logging -import os -import signal -import sys -import traceback -from collections.abc import Iterable -from concurrent.futures import Executor, ProcessPoolExecutor, ThreadPoolExecutor -from multiprocessing import Manager -from pathlib import Path -from typing import Any - -from mypy_extensions import mypyc_attr - -from black import WriteBack, format_file_in_place -from black.cache import Cache -from black.mode import Mode -from black.output import err -from black.report import Changed, Report - - -def maybe_use_uvloop() -> asyncio.AbstractEventLoop: - """If our environment has uvloop or winloop installed we use it otherwise - a normal asyncio eventloop is called as fallback. - - This is called only from command-line entry points to avoid - interfering with the parent process if Black is used as a library. - """ - try: - if sys.platform != "win32": - import uvloop - - return uvloop.new_event_loop() - else: - import winloop - - return winloop.new_event_loop() - except ImportError: - return asyncio.new_event_loop() - - -def cancel(tasks: Iterable[asyncio.Future[Any]]) -> None: - """asyncio signal handler that cancels all `tasks` and reports to stderr.""" - err("Aborted!") - for task in tasks: - task.cancel() - - -def shutdown(loop: asyncio.AbstractEventLoop) -> None: - """Cancel all pending tasks on `loop`, wait for them, and close the loop.""" - try: - # This part is borrowed from asyncio/runners.py in Python 3.7b2. - to_cancel = [task for task in asyncio.all_tasks(loop) if not task.done()] - if not to_cancel: - return - - for task in to_cancel: - task.cancel() - loop.run_until_complete(asyncio.gather(*to_cancel, return_exceptions=True)) - finally: - # `concurrent.futures.Future` objects cannot be cancelled once they - # are already running. There might be some when the `shutdown()` happened. - # Silence their logger's spew about the event loop being closed. - cf_logger = logging.getLogger("concurrent.futures") - cf_logger.setLevel(logging.CRITICAL) - loop.close() - - -# diff-shades depends on being to monkeypatch this function to operate. I know it's -# not ideal, but this shouldn't cause any issues ... hopefully. ~ichard26 -@mypyc_attr(patchable=True) -def reformat_many( - sources: set[Path], - fast: bool, - write_back: WriteBack, - mode: Mode, - report: Report, - workers: int | None, - no_cache: bool = False, -) -> None: - """Reformat multiple files using a ProcessPoolExecutor.""" - - if workers is None: - workers = int(os.environ.get("BLACK_NUM_WORKERS", 0)) - workers = workers or os.cpu_count() or 1 - if sys.platform == "win32": - # Work around https://bugs.python.org/issue26903 - workers = min(workers, 60) - if getattr(sys, "frozen", False): - # In frozen builds (e.g. PyInstaller), avoid spawning worker processes (i.e. - # avoid using ProcessPoolExecutor) to prevent shutdown errors when workers - # try to import modules after cleanup begins. - # See https://github.com/psf/black/issues/4823 - workers = 1 - - executor: Executor | None = None - if workers > 1: - try: - executor = ProcessPoolExecutor(max_workers=workers) - except (ImportError, NotImplementedError, OSError): - # we arrive here if the underlying system does not support multi-processing - # like in AWS Lambda or Termux, in which case we gracefully fallback to - # a ThreadPoolExecutor with just a single worker (more workers would not do - # us any good due to the Global Interpreter Lock) - pass - - if executor is None: - executor = ThreadPoolExecutor(max_workers=1) - - loop = maybe_use_uvloop() - asyncio.set_event_loop(loop) - try: - loop.run_until_complete( - schedule_formatting( - sources=sources, - fast=fast, - write_back=write_back, - mode=mode, - report=report, - loop=loop, - executor=executor, - no_cache=no_cache, - ) - ) - finally: - try: - shutdown(loop) - finally: - asyncio.set_event_loop(None) - if executor is not None: - executor.shutdown() - - -async def schedule_formatting( - sources: set[Path], - fast: bool, - write_back: WriteBack, - mode: Mode, - report: Report, - loop: asyncio.AbstractEventLoop, - executor: Executor, - no_cache: bool = False, -) -> None: - """Run formatting of `sources` in parallel using the provided `executor`. - - (Use ProcessPoolExecutors for actual parallelism.) - - `write_back`, `fast`, and `mode` options are passed to - :func:`format_file_in_place`. - """ - cache = None if no_cache else Cache.read(mode) - if cache is not None and write_back not in ( - WriteBack.DIFF, - WriteBack.COLOR_DIFF, - ): - sources, cached = cache.filtered_cached(sources) - for src in sorted(cached): - report.done(src, Changed.CACHED) - if not sources: - return - - cancelled = [] - sources_to_cache = [] - lock = None - manager = None - if write_back in (WriteBack.DIFF, WriteBack.COLOR_DIFF): - # For diff output, we need locks to ensure we don't interleave output - # from different processes. - manager = Manager() - lock = manager.Lock() - - try: - tasks = { - asyncio.ensure_future( - loop.run_in_executor( - executor, format_file_in_place, src, fast, mode, write_back, lock - ) - ): src - for src in sorted(sources) - } - pending = tasks.keys() - try: - loop.add_signal_handler(signal.SIGINT, cancel, pending) - loop.add_signal_handler(signal.SIGTERM, cancel, pending) - except NotImplementedError: - # There are no good alternatives for these on Windows. - pass - while pending: - done, _ = await asyncio.wait(pending, return_when=asyncio.FIRST_COMPLETED) - for task in done: - src = tasks.pop(task) - if task.cancelled(): - cancelled.append(task) - elif exc := task.exception(): - if report.verbose: - traceback.print_exception(type(exc), exc, exc.__traceback__) - report.failed(src, str(exc)) - else: - changed = Changed.YES if task.result() else Changed.NO - # If the file was written back or was successfully checked as - # well-formatted, store this information in the cache. - if write_back is WriteBack.YES or ( - write_back is WriteBack.CHECK and changed is Changed.NO - ): - sources_to_cache.append(src) - report.done(src, changed) - if cancelled: - await asyncio.gather(*cancelled, return_exceptions=True) - if sources_to_cache and not no_cache and cache is not None: - cache.write(sources_to_cache) - finally: - if manager is not None: - manager.shutdown() diff --git a/venv/lib/python3.12/site-packages/black/const.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/black/const.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index d5a1768..0000000 Binary files a/venv/lib/python3.12/site-packages/black/const.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/const.py b/venv/lib/python3.12/site-packages/black/const.py deleted file mode 100644 index ee46667..0000000 --- a/venv/lib/python3.12/site-packages/black/const.py +++ /dev/null @@ -1,4 +0,0 @@ -DEFAULT_LINE_LENGTH = 88 -DEFAULT_EXCLUDES = r"/(\.direnv|\.eggs|\.git|\.hg|\.ipynb_checkpoints|\.mypy_cache|\.nox|\.pytest_cache|\.ruff_cache|\.tox|\.svn|\.venv|\.vscode|__pypackages__|_build|buck-out|build|dist|venv)/" # noqa: B950 -DEFAULT_INCLUDES = r"(\.pyi?|\.ipynb)$" -STDIN_PLACEHOLDER = "__BLACK_STDIN_FILENAME__" diff --git a/venv/lib/python3.12/site-packages/black/debug.py b/venv/lib/python3.12/site-packages/black/debug.py deleted file mode 100644 index f051c49..0000000 --- a/venv/lib/python3.12/site-packages/black/debug.py +++ /dev/null @@ -1,55 +0,0 @@ -from collections.abc import Iterator -from dataclasses import dataclass, field -from typing import Any, TypeVar, Union - -from black.nodes import Visitor -from black.output import out -from black.parsing import lib2to3_parse -from blib2to3.pgen2 import token -from blib2to3.pytree import Leaf, Node, type_repr - -LN = Union[Leaf, Node] -T = TypeVar("T") - - -@dataclass -class DebugVisitor(Visitor[T]): - tree_depth: int = 0 - list_output: list[str] = field(default_factory=list) - print_output: bool = True - - def out(self, message: str, *args: Any, **kwargs: Any) -> None: - self.list_output.append(message) - if self.print_output: - out(message, *args, **kwargs) - - def visit_default(self, node: LN) -> Iterator[T]: - indent = " " * (2 * self.tree_depth) - if isinstance(node, Node): - _type = type_repr(node.type) - self.out(f"{indent}{_type}", fg="yellow") - self.tree_depth += 1 - for child in node.children: - yield from self.visit(child) - - self.tree_depth -= 1 - self.out(f"{indent}/{_type}", fg="yellow", bold=False) - else: - _type = token.tok_name.get(node.type, str(node.type)) - self.out(f"{indent}{_type}", fg="blue", nl=False) - if node.prefix: - # We don't have to handle prefixes for `Node` objects since - # that delegates to the first child anyway. - self.out(f" {node.prefix!r}", fg="green", bold=False, nl=False) - self.out(f" {node.value!r}", fg="blue", bold=False) - - @classmethod - def show(cls, code: str | Leaf | Node) -> None: - """Pretty-print the lib2to3 AST of a given string of `code`. - - Convenience method for debugging. - """ - v: DebugVisitor[None] = DebugVisitor() - if isinstance(code, str): - code = lib2to3_parse(code) - list(v.visit(code)) diff --git a/venv/lib/python3.12/site-packages/black/files.py b/venv/lib/python3.12/site-packages/black/files.py deleted file mode 100644 index 77d1a49..0000000 --- a/venv/lib/python3.12/site-packages/black/files.py +++ /dev/null @@ -1,426 +0,0 @@ -import io -import os -import sys -from collections.abc import Iterable, Iterator, Sequence -from functools import lru_cache -from pathlib import Path -from re import Pattern -from typing import TYPE_CHECKING, Any, Union - -from mypy_extensions import mypyc_attr -from packaging.specifiers import InvalidSpecifier, Specifier, SpecifierSet -from packaging.version import InvalidVersion, Version -from pathspec import GitIgnoreSpec -from pathspec.patterns.gitignore import GitIgnorePatternError - -if sys.version_info >= (3, 11): - try: - import tomllib - except ImportError: - # Help users on older alphas - if not TYPE_CHECKING: - import tomli as tomllib -else: - import tomli as tomllib - -from black.handle_ipynb_magics import jupyter_dependencies_are_installed -from black.mode import TargetVersion -from black.output import err -from black.report import Report - -if TYPE_CHECKING: - import colorama - - -@lru_cache -def _load_toml(path: Path | str) -> dict[str, Any]: - with open(path, "rb") as f: - return tomllib.load(f) - - -@lru_cache -def _cached_resolve(path: Path) -> Path: - return path.resolve() - - -@lru_cache -def find_project_root( - srcs: Sequence[str], stdin_filename: str | None = None -) -> tuple[Path, str]: - """Return a directory containing .git, .hg, or pyproject.toml. - - pyproject.toml files are only considered if they contain a [tool.black] - section and are ignored otherwise. - - That directory will be a common parent of all files and directories - passed in `srcs`. - - If no directory in the tree contains a marker that would specify it's the - project root, the root of the file system is returned. - - Returns a two-tuple with the first element as the project root path and - the second element as a string describing the method by which the - project root was discovered. - """ - if stdin_filename is not None: - srcs = tuple(stdin_filename if s == "-" else s for s in srcs) - if not srcs: - srcs = [str(_cached_resolve(Path.cwd()))] - - path_srcs = [_cached_resolve(Path(Path.cwd(), src)) for src in srcs] - - # A list of lists of parents for each 'src'. 'src' is included as a - # "parent" of itself if it is a directory - src_parents = [ - list(path.parents) + ([path] if path.is_dir() else []) for path in path_srcs - ] - - common_base = max( - set.intersection(*(set(parents) for parents in src_parents)), - key=lambda path: path.parts, - ) - - for directory in (common_base, *common_base.parents): - if (directory / ".git").exists(): - return directory, ".git directory" - - if (directory / ".hg").is_dir(): - return directory, ".hg directory" - - if (directory / "pyproject.toml").is_file(): - pyproject_toml = _load_toml(directory / "pyproject.toml") - if "black" in pyproject_toml.get("tool", {}): - return directory, "pyproject.toml" - - return directory, "file system root" - - -def find_pyproject_toml( - path_search_start: tuple[str, ...], stdin_filename: str | None = None -) -> str | None: - """Find the absolute filepath to a pyproject.toml if it exists""" - path_project_root, _ = find_project_root(path_search_start, stdin_filename) - path_pyproject_toml = path_project_root / "pyproject.toml" - if path_pyproject_toml.is_file(): - return str(path_pyproject_toml) - - try: - path_user_pyproject_toml = find_user_pyproject_toml() - return ( - str(path_user_pyproject_toml) - if path_user_pyproject_toml.is_file() - else None - ) - except (PermissionError, RuntimeError) as e: - # We do not have access to the user-level config directory, so ignore it. - err(f"Ignoring user configuration directory due to {e!r}") - return None - - -@mypyc_attr(patchable=True) -def parse_pyproject_toml(path_config: str) -> dict[str, Any]: - """Parse a pyproject toml file, pulling out relevant parts for Black. - - If parsing fails, will raise a tomllib.TOMLDecodeError. - """ - pyproject_toml = _load_toml(path_config) - config: dict[str, Any] = pyproject_toml.get("tool", {}).get("black", {}) - config = {k.replace("--", "").replace("-", "_"): v for k, v in config.items()} - - if "target_version" not in config: - inferred_target_version = infer_target_version(pyproject_toml) - if inferred_target_version is not None: - config["target_version"] = [v.name.lower() for v in inferred_target_version] - - return config - - -def infer_target_version( - pyproject_toml: dict[str, Any], -) -> list[TargetVersion] | None: - """Infer Black's target version from the project metadata in pyproject.toml. - - Supports the PyPA standard format (PEP 621): - https://packaging.python.org/en/latest/specifications/declaring-project-metadata/#requires-python - - If the target version cannot be inferred, returns None. - """ - project_metadata = pyproject_toml.get("project", {}) - requires_python = project_metadata.get("requires-python", None) - if requires_python is not None: - try: - return parse_req_python_version(requires_python) - except InvalidVersion: - pass - try: - return parse_req_python_specifier(requires_python) - except (InvalidSpecifier, InvalidVersion): - pass - - return None - - -def parse_req_python_version(requires_python: str) -> list[TargetVersion] | None: - """Parse a version string (i.e. ``"3.7"``) to a list of TargetVersion. - - If parsing fails, will raise a packaging.version.InvalidVersion error. - If the parsed version cannot be mapped to a valid TargetVersion, returns None. - """ - version = Version(requires_python) - if version.release[0] != 3: - return None - try: - return [TargetVersion(version.release[1])] - except (IndexError, ValueError): - return None - - -def parse_req_python_specifier(requires_python: str) -> list[TargetVersion] | None: - """Parse a specifier string (i.e. ``">=3.7,<3.10"``) to a list of TargetVersion. - - If parsing fails, will raise a packaging.specifiers.InvalidSpecifier error. - If the parsed specifier cannot be mapped to a valid TargetVersion, returns None. - """ - specifier_set = strip_specifier_set(SpecifierSet(requires_python)) - if not specifier_set: - return None - - target_version_map = {f"3.{v.value}": v for v in TargetVersion} - compatible_versions: list[str] = list(specifier_set.filter(target_version_map)) - if compatible_versions: - return [target_version_map[v] for v in compatible_versions] - return None - - -def strip_specifier_set(specifier_set: SpecifierSet) -> SpecifierSet: - """Strip minor versions for some specifiers in the specifier set. - - For background on version specifiers, see PEP 440: - https://peps.python.org/pep-0440/#version-specifiers - """ - specifiers = [] - for s in specifier_set: - if "*" in str(s): - specifiers.append(s) - elif s.operator in ["~=", "==", ">=", "==="]: - version = Version(s.version) - stripped = Specifier(f"{s.operator}{version.major}.{version.minor}") - specifiers.append(stripped) - elif s.operator == ">": - version = Version(s.version) - if len(version.release) > 2: - s = Specifier(f">={version.major}.{version.minor}") - specifiers.append(s) - else: - specifiers.append(s) - - return SpecifierSet(",".join(str(s) for s in specifiers)) - - -@lru_cache -def find_user_pyproject_toml() -> Path: - r"""Return the path to the top-level user configuration for black. - - This looks for ~\.black on Windows and ~/.config/black on Linux and other - Unix systems. - - May raise: - - RuntimeError: if the current user has no homedir - - PermissionError: if the current process cannot access the user's homedir - """ - if sys.platform == "win32": - # Windows - user_config_path = Path.home() / ".black" - else: - config_root = os.environ.get("XDG_CONFIG_HOME", "~/.config") - user_config_path = Path(config_root).expanduser() / "black" - return _cached_resolve(user_config_path) - - -@lru_cache -def get_gitignore(root: Path) -> GitIgnoreSpec: - """Return a GitIgnoreSpec matching gitignore content if present.""" - gitignore = root / ".gitignore" - lines: list[str] = [] - if gitignore.is_file(): - with gitignore.open(encoding="utf-8") as gf: - lines = gf.readlines() - try: - return GitIgnoreSpec.from_lines(lines) - except GitIgnorePatternError as e: - err(f"Could not parse {gitignore}: {e}") - raise - - -def resolves_outside_root_or_cannot_stat( - path: Path, - root: Path, - report: Report | None = None, -) -> bool: - """ - Returns whether the path is a symbolic link that points outside the - root directory. Also returns True if we failed to resolve the path. - """ - try: - resolved_path = _cached_resolve(path) - except OSError as e: - if report: - report.path_ignored(path, f"cannot be read because {e}") - return True - try: - resolved_path.relative_to(root) - except ValueError: - if report: - report.path_ignored(path, f"is a symbolic link that points outside {root}") - return True - return False - - -def best_effort_relative_path(path: Path, root: Path) -> Path: - # Precondition: resolves_outside_root_or_cannot_stat(path, root) is False - try: - return path.absolute().relative_to(root) - except ValueError: - pass - root_parent = next((p for p in path.parents if _cached_resolve(p) == root), None) - if root_parent is not None: - return path.relative_to(root_parent) - # something adversarial, fallback to path guaranteed by precondition - return _cached_resolve(path).relative_to(root) - - -def _path_is_ignored( - root_relative_path: str, - root: Path, - gitignore_dict: dict[Path, GitIgnoreSpec], -) -> bool: - path = root / root_relative_path - # Note that this logic is sensitive to the ordering of gitignore_dict. Callers must - # ensure that gitignore_dict is ordered from least specific to most specific. - for gitignore_path, pattern in gitignore_dict.items(): - try: - relative_path = path.relative_to(gitignore_path).as_posix() - if path.is_dir(): - relative_path = relative_path + "/" - except ValueError: - break - if pattern.match_file(relative_path): - return True - return False - - -def path_is_excluded( - normalized_path: str, - pattern: Pattern[str] | None, -) -> bool: - match = pattern.search(normalized_path) if pattern else None - return bool(match and match.group(0)) - - -def gen_python_files( - paths: Iterable[Path], - root: Path, - include: Pattern[str], - exclude: Pattern[str], - extend_exclude: Pattern[str] | None, - force_exclude: Pattern[str] | None, - report: Report, - gitignore_dict: dict[Path, GitIgnoreSpec] | None, - *, - verbose: bool, - quiet: bool, -) -> Iterator[Path]: - """Generate all files under `path` whose paths are not excluded by the - `exclude_regex`, `extend_exclude`, or `force_exclude` regexes, - but are included by the `include` regex. - - Symbolic links pointing outside of the `root` directory are ignored. - - `report` is where output about exclusions goes. - """ - - assert root.is_absolute(), f"INTERNAL ERROR: `root` must be absolute but is {root}" - for child in paths: - assert child.is_absolute() - root_relative_path = child.relative_to(root).as_posix() - - # First ignore files matching .gitignore, if passed - if gitignore_dict and _path_is_ignored( - root_relative_path, root, gitignore_dict - ): - report.path_ignored(child, "matches a .gitignore file content") - continue - - # Then ignore with `--exclude` `--extend-exclude` and `--force-exclude` options. - root_relative_path = "/" + root_relative_path - if child.is_dir(): - root_relative_path += "/" - - if path_is_excluded(root_relative_path, exclude): - report.path_ignored(child, "matches the --exclude regular expression") - continue - - if path_is_excluded(root_relative_path, extend_exclude): - report.path_ignored( - child, "matches the --extend-exclude regular expression" - ) - continue - - if path_is_excluded(root_relative_path, force_exclude): - report.path_ignored(child, "matches the --force-exclude regular expression") - continue - - if resolves_outside_root_or_cannot_stat(child, root, report): - continue - - if child.is_dir(): - # If gitignore is None, gitignore usage is disabled, while a Falsey - # gitignore is when the directory doesn't have a .gitignore file. - if gitignore_dict is not None: - new_gitignore_dict = { - **gitignore_dict, - root / child: get_gitignore(child), - } - else: - new_gitignore_dict = None - yield from gen_python_files( - child.iterdir(), - root, - include, - exclude, - extend_exclude, - force_exclude, - report, - new_gitignore_dict, - verbose=verbose, - quiet=quiet, - ) - - elif child.is_file(): - if child.suffix == ".ipynb" and not jupyter_dependencies_are_installed( - warn=verbose or not quiet - ): - continue - include_match = include.search(root_relative_path) if include else True - if include_match: - yield child - - -def wrap_stream_for_windows( - f: io.TextIOWrapper, -) -> Union[io.TextIOWrapper, "colorama.AnsiToWin32"]: - """ - Wrap stream with colorama's wrap_stream so colors are shown on Windows. - - If `colorama` is unavailable, the original stream is returned unmodified. - Otherwise, the `wrap_stream()` function determines whether the stream needs - to be wrapped for a Windows environment and will accordingly either return - an `AnsiToWin32` wrapper or the original stream. - """ - try: - from colorama.initialise import wrap_stream - except ImportError: - return f - else: - # Set `strip=False` to avoid needing to modify test_express_diff_with_color. - return wrap_stream(f, convert=None, strip=False, autoreset=False, wrap=True) diff --git a/venv/lib/python3.12/site-packages/black/handle_ipynb_magics.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/black/handle_ipynb_magics.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 14baa50..0000000 Binary files a/venv/lib/python3.12/site-packages/black/handle_ipynb_magics.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/handle_ipynb_magics.py b/venv/lib/python3.12/site-packages/black/handle_ipynb_magics.py deleted file mode 100644 index e12537d..0000000 --- a/venv/lib/python3.12/site-packages/black/handle_ipynb_magics.py +++ /dev/null @@ -1,515 +0,0 @@ -"""Functions to process IPython magics with.""" - -import ast -import collections -import dataclasses -import re -import secrets -import string -from collections.abc import Collection -from functools import lru_cache -from importlib.util import find_spec -from typing import TypeGuard - -from black.mode import Mode -from black.output import out -from black.report import NothingChanged - -TRANSFORMED_MAGICS = frozenset(( - "get_ipython().run_cell_magic", - "get_ipython().system", - "get_ipython().getoutput", - "get_ipython().run_line_magic", -)) -TOKENS_TO_IGNORE = frozenset(( - "ENDMARKER", - "NL", - "NEWLINE", - "COMMENT", - "DEDENT", - "UNIMPORTANT_WS", - "ESCAPED_NL", -)) -PYTHON_CELL_MAGICS = frozenset(( - "capture", - "prun", - "pypy", - "python", - "python3", - "time", - "timeit", -)) - - -@dataclasses.dataclass(frozen=True) -class Replacement: - mask: str - src: str - - -@lru_cache -def jupyter_dependencies_are_installed(*, warn: bool) -> bool: - installed = ( - find_spec("tokenize_rt") is not None and find_spec("IPython") is not None - ) - if not installed and warn: - msg = ( - "Skipping .ipynb files as Jupyter dependencies are not installed.\n" - 'You can fix this by running ``pip install "black[jupyter]"``' - ) - out(msg) - return installed - - -def validate_cell(src: str, mode: Mode) -> None: - r"""Check that cell does not already contain TransformerManager transformations, - or non-Python cell magics, which might cause tokenizer_rt to break because of - indentations. - - If a cell contains ``!ls``, then it'll be transformed to - ``get_ipython().system('ls')``. However, if the cell originally contained - ``get_ipython().system('ls')``, then it would get transformed in the same way: - - >>> TransformerManager().transform_cell("get_ipython().system('ls')") - "get_ipython().system('ls')\n" - >>> TransformerManager().transform_cell("!ls") - "get_ipython().system('ls')\n" - - Due to the impossibility of safely roundtripping in such situations, cells - containing transformed magics will be ignored. - """ - if any(transformed_magic in src for transformed_magic in TRANSFORMED_MAGICS): - raise NothingChanged - - line = _get_code_start(src) - if line.startswith("%%") and ( - line.split(maxsplit=1)[0][2:] - not in PYTHON_CELL_MAGICS | mode.python_cell_magics - ): - raise NothingChanged - - -def remove_trailing_semicolon(src: str) -> tuple[str, bool]: - """Remove trailing semicolon from Jupyter notebook cell. - - For example, - - fig, ax = plt.subplots() - ax.plot(x_data, y_data); # plot data - - would become - - fig, ax = plt.subplots() - ax.plot(x_data, y_data) # plot data - - Mirrors the logic in `quiet` from `IPython.core.displayhook`, but uses - ``tokenize_rt`` so that round-tripping works fine. - """ - from tokenize_rt import reversed_enumerate, src_to_tokens, tokens_to_src - - tokens = src_to_tokens(src) - trailing_semicolon = False - for idx, token in reversed_enumerate(tokens): - if token.name in TOKENS_TO_IGNORE: - continue - if token.name == "OP" and token.src == ";": - del tokens[idx] - trailing_semicolon = True - break - if not trailing_semicolon: - return src, False - return tokens_to_src(tokens), True - - -def put_trailing_semicolon_back(src: str, has_trailing_semicolon: bool) -> str: - """Put trailing semicolon back if cell originally had it. - - Mirrors the logic in `quiet` from `IPython.core.displayhook`, but uses - ``tokenize_rt`` so that round-tripping works fine. - """ - if not has_trailing_semicolon: - return src - from tokenize_rt import reversed_enumerate, src_to_tokens, tokens_to_src - - tokens = src_to_tokens(src) - for idx, token in reversed_enumerate(tokens): - if token.name in TOKENS_TO_IGNORE: - continue - tokens[idx] = token._replace(src=token.src + ";") - break - else: # pragma: nocover - raise AssertionError( - "INTERNAL ERROR: Was not able to reinstate trailing semicolon. " - "Please report a bug on https://github.com/psf/black/issues. " - ) from None - return str(tokens_to_src(tokens)) - - -def mask_cell(src: str) -> tuple[str, list[Replacement]]: - """Mask IPython magics so content becomes parseable Python code. - - For example, - - %matplotlib inline - 'foo' - - becomes - - b"25716f358c32750" - 'foo' - - The replacements are returned, along with the transformed code. - """ - replacements: list[Replacement] = [] - try: - ast.parse(src) - except SyntaxError: - # Might have IPython magics, will process below. - pass - else: - # Syntax is fine, nothing to mask, early return. - return src, replacements - - from IPython.core.inputtransformer2 import TransformerManager - - transformer_manager = TransformerManager() - # A side effect of the following transformation is that it also removes any - # empty lines at the beginning of the cell. - transformed = transformer_manager.transform_cell(src) - transformed, cell_magic_replacements = replace_cell_magics(transformed) - replacements += cell_magic_replacements - transformed = transformer_manager.transform_cell(transformed) - transformed, magic_replacements = replace_magics(transformed) - if len(transformed.strip().splitlines()) != len(src.strip().splitlines()): - # Multi-line magic, not supported. - raise NothingChanged - replacements += magic_replacements - return transformed, replacements - - -def create_token(n_chars: int) -> str: - """Create a randomly generated token that is n_chars characters long.""" - assert n_chars > 0 - if n_chars == 1: - return secrets.choice(string.ascii_letters) - if n_chars < 4: - return "_" + "".join( - secrets.choice(string.ascii_letters + string.digits + "_") - for _ in range(n_chars - 1) - ) - n_bytes = max(n_chars // 2 - 1, 1) - token = secrets.token_hex(n_bytes) - if len(token) + 3 > n_chars: - token = token[:-1] - # We use a bytestring so that the string does not get interpreted - # as a docstring. - return f'b"{token}"' - - -def get_token(src: str, magic: str, existing_tokens: Collection[str] = ()) -> str: - """Return randomly generated token to mask IPython magic with. - - For example, if 'magic' was `%matplotlib inline`, then a possible - token to mask it with would be `"43fdd17f7e5ddc83"`. The token - will be the same length as the magic, and we make sure that it was - not already present anywhere else in the cell. - """ - assert magic - n_chars = len(magic) - token = create_token(n_chars) - counter = 0 - while token in src or token in existing_tokens: - token = create_token(n_chars) - counter += 1 - if counter > 100: - raise AssertionError( - "INTERNAL ERROR: Black was not able to replace IPython magic. " - "Please report a bug on https://github.com/psf/black/issues. " - f"The magic might be helpful: {magic}" - ) from None - return token - - -def replace_cell_magics(src: str) -> tuple[str, list[Replacement]]: - r"""Replace cell magic with token. - - Note that 'src' will already have been processed by IPython's - TransformerManager().transform_cell. - - Example, - - get_ipython().run_cell_magic('t', '-n1', 'ls =!ls\n') - - becomes - - "a794." - ls =!ls - - The replacement, along with the transformed code, is returned. - """ - replacements: list[Replacement] = [] - - tree = ast.parse(src) - - cell_magic_finder = CellMagicFinder() - cell_magic_finder.visit(tree) - if cell_magic_finder.cell_magic is None: - return src, replacements - header = cell_magic_finder.cell_magic.header - mask = get_token(src, header) - replacements.append(Replacement(mask=mask, src=header)) - return f"{mask}\n{cell_magic_finder.cell_magic.body}", replacements - - -def replace_magics(src: str) -> tuple[str, list[Replacement]]: - """Replace magics within body of cell. - - Note that 'src' will already have been processed by IPython's - TransformerManager().transform_cell. - - Example, this - - get_ipython().run_line_magic('matplotlib', 'inline') - 'foo' - - becomes - - "5e67db56d490fd39" - 'foo' - - The replacement, along with the transformed code, are returned. - """ - replacements = [] - existing_tokens: set[str] = set() - magic_finder = MagicFinder() - magic_finder.visit(ast.parse(src)) - new_srcs = [] - for i, line in enumerate(src.split("\n"), start=1): - if i in magic_finder.magics: - offsets_and_magics = magic_finder.magics[i] - if len(offsets_and_magics) != 1: # pragma: nocover - raise AssertionError( - f"Expecting one magic per line, got: {offsets_and_magics}\n" - "Please report a bug on https://github.com/psf/black/issues." - ) - col_offset, magic = ( - offsets_and_magics[0].col_offset, - offsets_and_magics[0].magic, - ) - mask = get_token(src, magic, existing_tokens) - replacements.append(Replacement(mask=mask, src=magic)) - existing_tokens.add(mask) - line = line[:col_offset] + mask - new_srcs.append(line) - return "\n".join(new_srcs), replacements - - -def unmask_cell(src: str, replacements: list[Replacement]) -> str: - """Remove replacements from cell. - - For example - - "9b20" - foo = bar - - becomes - - %%time - foo = bar - """ - for replacement in replacements: - if src.count(replacement.mask) != 1: - raise NothingChanged - src = src.replace(replacement.mask, replacement.src, 1) - return src - - -def _get_code_start(src: str) -> str: - """Provides the first line where the code starts. - - Iterates over lines of code until it finds the first line that doesn't - contain only empty spaces and comments. It removes any empty spaces at the - start of the line and returns it. If such line doesn't exist, it returns an - empty string. - """ - for match in re.finditer(".+", src): - line = match.group(0).lstrip() - if line and not line.startswith("#"): - return line - return "" - - -def _is_ipython_magic(node: ast.expr) -> TypeGuard[ast.Attribute]: - """Check if attribute is IPython magic. - - Note that the source of the abstract syntax tree - will already have been processed by IPython's - TransformerManager().transform_cell. - """ - return ( - isinstance(node, ast.Attribute) - and isinstance(node.value, ast.Call) - and isinstance(node.value.func, ast.Name) - and node.value.func.id == "get_ipython" - ) - - -def _get_str_args(args: list[ast.expr]) -> list[str]: - str_args = [] - for arg in args: - assert isinstance(arg, ast.Constant) and isinstance(arg.value, str) - str_args.append(arg.value) - return str_args - - -@dataclasses.dataclass(frozen=True) -class CellMagic: - name: str - params: str | None - body: str - - @property - def header(self) -> str: - if self.params: - return f"%%{self.name} {self.params}" - return f"%%{self.name}" - - -# ast.NodeVisitor + dataclass = breakage under mypyc. -class CellMagicFinder(ast.NodeVisitor): - r"""Find cell magics. - - Note that the source of the abstract syntax tree - will already have been processed by IPython's - TransformerManager().transform_cell. - - For example, - - %%time\n - foo() - - would have been transformed to - - get_ipython().run_cell_magic('time', '', 'foo()\n') - - and we look for instances of the latter. - """ - - def __init__(self, cell_magic: CellMagic | None = None) -> None: - self.cell_magic = cell_magic - - def visit_Expr(self, node: ast.Expr) -> None: - """Find cell magic, extract header and body.""" - if ( - isinstance(node.value, ast.Call) - and _is_ipython_magic(node.value.func) - and node.value.func.attr == "run_cell_magic" - ): - args = _get_str_args(node.value.args) - self.cell_magic = CellMagic(name=args[0], params=args[1], body=args[2]) - self.generic_visit(node) - - -@dataclasses.dataclass(frozen=True) -class OffsetAndMagic: - col_offset: int - magic: str - - -# Unsurprisingly, subclassing ast.NodeVisitor means we can't use dataclasses here -# as mypyc will generate broken code. -class MagicFinder(ast.NodeVisitor): - """Visit cell to look for get_ipython calls. - - Note that the source of the abstract syntax tree - will already have been processed by IPython's - TransformerManager().transform_cell. - - For example, - - %matplotlib inline - - would have been transformed to - - get_ipython().run_line_magic('matplotlib', 'inline') - - and we look for instances of the latter (and likewise for other - types of magics). - """ - - def __init__(self) -> None: - self.magics: dict[int, list[OffsetAndMagic]] = collections.defaultdict(list) - - def visit_Assign(self, node: ast.Assign) -> None: - """Look for system assign magics. - - For example, - - black_version = !black --version - env = %env var - - would have been (respectively) transformed to - - black_version = get_ipython().getoutput('black --version') - env = get_ipython().run_line_magic('env', 'var') - - and we look for instances of any of the latter. - """ - if isinstance(node.value, ast.Call) and _is_ipython_magic(node.value.func): - args = _get_str_args(node.value.args) - if node.value.func.attr == "getoutput": - src = f"!{args[0]}" - elif node.value.func.attr == "run_line_magic": - src = f"%{args[0]}" - if args[1]: - src += f" {args[1]}" - else: - raise AssertionError( - f"Unexpected IPython magic {node.value.func.attr!r} found. " - "Please report a bug on https://github.com/psf/black/issues." - ) from None - self.magics[node.value.lineno].append( - OffsetAndMagic(node.value.col_offset, src) - ) - self.generic_visit(node) - - def visit_Expr(self, node: ast.Expr) -> None: - """Look for magics in body of cell. - - For examples, - - !ls - !!ls - ?ls - ??ls - - would (respectively) get transformed to - - get_ipython().system('ls') - get_ipython().getoutput('ls') - get_ipython().run_line_magic('pinfo', 'ls') - get_ipython().run_line_magic('pinfo2', 'ls') - - and we look for instances of any of the latter. - """ - if isinstance(node.value, ast.Call) and _is_ipython_magic(node.value.func): - args = _get_str_args(node.value.args) - if node.value.func.attr == "run_line_magic": - if args[0] == "pinfo": - src = f"?{args[1]}" - elif args[0] == "pinfo2": - src = f"??{args[1]}" - else: - src = f"%{args[0]}" - if args[1]: - src += f" {args[1]}" - elif node.value.func.attr == "system": - src = f"!{args[0]}" - elif node.value.func.attr == "getoutput": - src = f"!!{args[0]}" - else: - raise NothingChanged # unsupported magic. - self.magics[node.value.lineno].append( - OffsetAndMagic(node.value.col_offset, src) - ) - self.generic_visit(node) diff --git a/venv/lib/python3.12/site-packages/black/linegen.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/black/linegen.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 63b15e4..0000000 Binary files a/venv/lib/python3.12/site-packages/black/linegen.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/linegen.py b/venv/lib/python3.12/site-packages/black/linegen.py deleted file mode 100644 index 0689902..0000000 --- a/venv/lib/python3.12/site-packages/black/linegen.py +++ /dev/null @@ -1,2048 +0,0 @@ -""" -Generating lines of code. -""" - -import re -import sys -from collections.abc import Collection, Iterator -from dataclasses import replace -from enum import Enum, auto -from functools import partial, wraps -from typing import Union, cast - -from black.brackets import ( - COMMA_PRIORITY, - DOT_PRIORITY, - STRING_PRIORITY, - get_leaves_inside_matching_brackets, - max_delimiter_priority_in_atom, -) -from black.comments import ( - FMT_OFF, - FMT_ON, - contains_fmt_directive, - generate_comments, - list_comments, -) -from black.lines import ( - Line, - RHSResult, - append_leaves, - can_be_split, - can_omit_invisible_parens, - is_line_short_enough, - line_to_string, -) -from black.mode import Feature, Mode, Preview -from black.nodes import ( - ASSIGNMENTS, - BRACKETS, - CLOSING_BRACKETS, - OPENING_BRACKETS, - STANDALONE_COMMENT, - STATEMENT, - WHITESPACE, - Visitor, - ensure_visible, - fstring_tstring_to_string, - get_annotation_type, - has_sibling_with_type, - is_arith_like, - is_async_stmt_or_funcdef, - is_atom_with_invisible_parens, - is_docstring, - is_empty_tuple, - is_generator, - is_lpar_token, - is_multiline_string, - is_name_token, - is_one_sequence_between, - is_one_tuple, - is_parent_function_or_class, - is_part_of_annotation, - is_rpar_token, - is_stub_body, - is_stub_suite, - is_tuple, - is_tuple_containing_star, - is_tuple_containing_walrus, - is_type_ignore_comment_string, - is_vararg, - is_walrus_assignment, - is_yield, - syms, - wrap_in_parentheses, -) -from black.numerics import normalize_numeric_literal -from black.strings import ( - fix_multiline_docstring, - get_string_prefix, - normalize_string_prefix, - normalize_string_quotes, - normalize_unicode_escape_sequences, -) -from black.trans import ( - CannotTransform, - StringMerger, - StringParenStripper, - StringParenWrapper, - StringSplitter, - Transformer, - hug_power_op, -) -from blib2to3.pgen2 import token -from blib2to3.pytree import Leaf, Node - -# types -LeafID = int -LN = Union[Leaf, Node] - - -class CannotSplit(CannotTransform): - """A readable split that fits the allotted line length is impossible.""" - - -# This isn't a dataclass because @dataclass + Generic breaks mypyc. -# See also https://github.com/mypyc/mypyc/issues/827. -class LineGenerator(Visitor[Line]): - """Generates reformatted Line objects. Empty lines are not emitted. - - Note: destroys the tree it's visiting by mutating prefixes of its leaves - in ways that will no longer stringify to valid Python code on the tree. - """ - - def __init__(self, mode: Mode, features: Collection[Feature]) -> None: - self.mode = mode - self.features = features - self.current_line: Line - self.__post_init__() - - def line(self, indent: int = 0) -> Iterator[Line]: - """Generate a line. - - If the line is empty, only emit if it makes sense. - If the line is too long, split it first and then generate. - - If any lines were generated, set up a new current_line. - """ - if not self.current_line: - self.current_line.depth += indent - return # Line is empty, don't emit. Creating a new one unnecessary. - - if len(self.current_line.leaves) == 1 and is_async_stmt_or_funcdef( - self.current_line.leaves[0] - ): - # Special case for async def/for/with statements. `visit_async_stmt` - # adds an `ASYNC` leaf then visits the child def/for/with statement - # nodes. Line yields from those nodes shouldn't treat the former - # `ASYNC` leaf as a complete line. - return - - complete_line = self.current_line - self.current_line = Line(mode=self.mode, depth=complete_line.depth + indent) - yield complete_line - - def visit_default(self, node: LN) -> Iterator[Line]: - """Default `visit_*()` implementation. Recurses to children of `node`.""" - if isinstance(node, Leaf): - any_open_brackets = self.current_line.bracket_tracker.any_open_brackets() - for comment in generate_comments(node, mode=self.mode): - if any_open_brackets: - # any comment within brackets is subject to splitting - self.current_line.append(comment) - elif comment.type == token.COMMENT: - # regular trailing comment - self.current_line.append(comment) - yield from self.line() - - else: - # regular standalone comment - yield from self.line() - - self.current_line.append(comment) - yield from self.line() - - if any_open_brackets: - node.prefix = "" - if node.type not in WHITESPACE: - self.current_line.append(node) - yield from super().visit_default(node) - - def visit_test(self, node: Node) -> Iterator[Line]: - """Visit an `x if y else z` test""" - - already_parenthesized = ( - node.prev_sibling and node.prev_sibling.type == token.LPAR - ) - - if not already_parenthesized: - # Similar to logic in wrap_in_parentheses - lpar = Leaf(token.LPAR, "") - rpar = Leaf(token.RPAR, "") - prefix = node.prefix - node.prefix = "" - lpar.prefix = prefix - node.insert_child(0, lpar) - node.append_child(rpar) - - yield from self.visit_default(node) - - def visit_INDENT(self, node: Leaf) -> Iterator[Line]: - """Increase indentation level, maybe yield a line.""" - # In blib2to3 INDENT never holds comments. - yield from self.line(+1) - yield from self.visit_default(node) - - def visit_DEDENT(self, node: Leaf) -> Iterator[Line]: - """Decrease indentation level, maybe yield a line.""" - # The current line might still wait for trailing comments. At DEDENT time - # there won't be any (they would be prefixes on the preceding NEWLINE). - # Emit the line then. - yield from self.line() - - # While DEDENT has no value, its prefix may contain standalone comments - # that belong to the current indentation level. Get 'em. - yield from self.visit_default(node) - - # Finally, emit the dedent. - yield from self.line(-1) - - def visit_stmt( - self, node: Node, keywords: set[str], parens: set[str] - ) -> Iterator[Line]: - """Visit a statement. - - This implementation is shared for `if`, `while`, `for`, `try`, `except`, - `def`, `with`, `class`, `assert`, and assignments. - - The relevant Python language `keywords` for a given statement will be - NAME leaves within it. This methods puts those on a separate line. - - `parens` holds a set of string leaf values immediately after which - invisible parens should be put. - """ - normalize_invisible_parens( - node, parens_after=parens, mode=self.mode, features=self.features - ) - for child in node.children: - if is_name_token(child) and child.value in keywords: - yield from self.line() - - yield from self.visit(child) - - def visit_typeparams(self, node: Node) -> Iterator[Line]: - yield from self.visit_default(node) - node.children[0].prefix = "" - - def visit_typevartuple(self, node: Node) -> Iterator[Line]: - yield from self.visit_default(node) - node.children[1].prefix = "" - - def visit_paramspec(self, node: Node) -> Iterator[Line]: - yield from self.visit_default(node) - node.children[1].prefix = "" - - def visit_dictsetmaker(self, node: Node) -> Iterator[Line]: - if Preview.wrap_long_dict_values_in_parens in self.mode: - for i, child in enumerate(node.children): - if i == 0: - continue - if node.children[i - 1].type == token.COLON: - if ( - child.type == syms.atom - and child.children[0].type in OPENING_BRACKETS - and not is_walrus_assignment(child) - ): - maybe_make_parens_invisible_in_atom( - child, - parent=node, - mode=self.mode, - features=self.features, - remove_brackets_around_comma=False, - ) - else: - wrap_in_parentheses(node, child, visible=False) - yield from self.visit_default(node) - - def visit_funcdef(self, node: Node) -> Iterator[Line]: - """Visit function definition.""" - yield from self.line() - - # Remove redundant brackets around return type annotation. - is_return_annotation = False - for child in node.children: - if child.type == token.RARROW: - is_return_annotation = True - elif is_return_annotation: - if child.type == syms.atom and child.children[0].type == token.LPAR: - if maybe_make_parens_invisible_in_atom( - child, - parent=node, - mode=self.mode, - features=self.features, - remove_brackets_around_comma=False, - ): - wrap_in_parentheses(node, child, visible=False) - else: - wrap_in_parentheses(node, child, visible=False) - is_return_annotation = False - - for child in node.children: - yield from self.visit(child) - - def visit_match_case(self, node: Node) -> Iterator[Line]: - """Visit either a match or case statement.""" - normalize_invisible_parens( - node, parens_after=set(), mode=self.mode, features=self.features - ) - - yield from self.line() - for child in node.children: - yield from self.visit(child) - - def visit_suite(self, node: Node) -> Iterator[Line]: - """Visit a suite.""" - if is_stub_suite(node): - yield from self.visit(node.children[2]) - else: - yield from self.visit_default(node) - - def visit_simple_stmt(self, node: Node) -> Iterator[Line]: - """Visit a statement without nested statements.""" - prev_type: int | None = None - for child in node.children: - if (prev_type is None or prev_type == token.SEMI) and is_arith_like(child): - wrap_in_parentheses(node, child, visible=False) - prev_type = child.type - - if node.parent and node.parent.type in STATEMENT: - if is_parent_function_or_class(node) and is_stub_body(node): - yield from self.visit_default(node) - else: - yield from self.line(+1) - yield from self.visit_default(node) - yield from self.line(-1) - - else: - if node.parent and is_stub_suite(node.parent): - node.prefix = "" - yield from self.visit_default(node) - return - yield from self.line() - yield from self.visit_default(node) - - def visit_async_stmt(self, node: Node) -> Iterator[Line]: - """Visit `async def`, `async for`, `async with`.""" - yield from self.line() - - children = iter(node.children) - for child in children: - yield from self.visit(child) - - if child.type == token.ASYNC or child.type == STANDALONE_COMMENT: - # STANDALONE_COMMENT happens when `# fmt: skip` is applied on the async - # line. - break - - internal_stmt = next(children) - yield from self.visit(internal_stmt) - - def visit_decorators(self, node: Node) -> Iterator[Line]: - """Visit decorators.""" - for child in node.children: - yield from self.line() - yield from self.visit(child) - - def visit_power(self, node: Node) -> Iterator[Line]: - for idx, leaf in enumerate(node.children[:-1]): - next_leaf = node.children[idx + 1] - - if not isinstance(leaf, Leaf): - continue - - value = leaf.value.lower() - if ( - leaf.type == token.NUMBER - and next_leaf.type == syms.trailer - # Ensure that we are in an attribute trailer - and next_leaf.children[0].type == token.DOT - # It shouldn't wrap hexadecimal, binary and octal literals - and not value.startswith(("0x", "0b", "0o")) - # It shouldn't wrap complex literals - and "j" not in value - ): - wrap_in_parentheses(node, leaf) - - remove_await_parens(node, mode=self.mode, features=self.features) - - yield from self.visit_default(node) - - def visit_SEMI(self, leaf: Leaf) -> Iterator[Line]: - """Remove a semicolon and put the other statement on a separate line.""" - yield from self.line() - - def visit_ENDMARKER(self, leaf: Leaf) -> Iterator[Line]: - """End of file. Process outstanding comments and end with a newline.""" - yield from self.visit_default(leaf) - yield from self.line() - - def visit_STANDALONE_COMMENT(self, leaf: Leaf) -> Iterator[Line]: - any_open_brackets = self.current_line.bracket_tracker.any_open_brackets() - if not any_open_brackets: - yield from self.line() - # STANDALONE_COMMENT nodes created by our special handling in - # normalize_fmt_off for comment-only blocks have fmt:off as the first - # line and fmt:on as the last line (each directive on its own line, - # not embedded in other text). These should be appended directly - # without calling visit_default, which would process their prefix and - # lose indentation. Normal STANDALONE_COMMENT nodes go through - # visit_default. - value = leaf.value - lines = value.splitlines() - is_fmt_off_block = ( - len(lines) >= 2 - and contains_fmt_directive(lines[0], FMT_OFF) - and contains_fmt_directive(lines[-1], FMT_ON) - ) - if is_fmt_off_block: - # This is a fmt:off/on block from normalize_fmt_off - we still need - # to process any prefix comments (like markdown comments) but append - # the fmt block itself directly to preserve its formatting - - # Only process prefix comments if there actually is a prefix with comments - if leaf.prefix and any( - line.strip().startswith("#") - and not contains_fmt_directive(line.strip()) - for line in leaf.prefix.split("\n") - ): - for comment in generate_comments(leaf, mode=self.mode): - yield from self.line() - self.current_line.append(comment) - yield from self.line() - # Clear the prefix since we've processed it as comments above - leaf.prefix = "" - - self.current_line.append(leaf) - if not any_open_brackets: - yield from self.line() - else: - # Normal standalone comment - process through visit_default - yield from self.visit_default(leaf) - - def visit_factor(self, node: Node) -> Iterator[Line]: - """Force parentheses between a unary op and a binary power: - - -2 ** 8 -> -(2 ** 8) - """ - _operator, operand = node.children - if ( - operand.type == syms.power - and len(operand.children) == 3 - and operand.children[1].type == token.DOUBLESTAR - ): - lpar = Leaf(token.LPAR, "(") - rpar = Leaf(token.RPAR, ")") - index = operand.remove() or 0 - node.insert_child(index, Node(syms.atom, [lpar, operand, rpar])) - yield from self.visit_default(node) - - def visit_tname(self, node: Node) -> Iterator[Line]: - """ - Add potential parentheses around types in function parameter lists to be made - into real parentheses in case the type hint is too long to fit on a line - Examples: - def foo(a: int, b: float = 7): ... - - -> - - def foo(a: (int), b: (float) = 7): ... - """ - if len(node.children) == 3 and maybe_make_parens_invisible_in_atom( - node.children[2], parent=node, mode=self.mode, features=self.features - ): - wrap_in_parentheses(node, node.children[2], visible=False) - - yield from self.visit_default(node) - - def visit_STRING(self, leaf: Leaf) -> Iterator[Line]: - normalize_unicode_escape_sequences(leaf) - - if is_docstring(leaf) and not re.search(r"\\\s*\n", leaf.value): - # We're ignoring docstrings with backslash newline escapes because changing - # indentation of those changes the AST representation of the code. - if self.mode.string_normalization: - docstring = normalize_string_prefix(leaf.value) - # We handle string normalization at the end of this method, but since - # what we do right now acts differently depending on quote style (ex. - # see padding logic below), there's a possibility for unstable - # formatting. To avoid a situation where this function formats a - # docstring differently on the second pass, normalize it early. - docstring = normalize_string_quotes(docstring) - else: - docstring = leaf.value - prefix = get_string_prefix(docstring) - docstring = docstring[len(prefix) :] # Remove the prefix - quote_char = docstring[0] - # A natural way to remove the outer quotes is to do: - # docstring = docstring.strip(quote_char) - # but that breaks on """""x""" (which is '""x'). - # So we actually need to remove the first character and the next two - # characters but only if they are the same as the first. - quote_len = 1 if docstring[1] != quote_char else 3 - docstring = docstring[quote_len:-quote_len] - docstring_started_empty = not docstring - indent = " " * 4 * self.current_line.depth - - if is_multiline_string(leaf): - docstring = fix_multiline_docstring(docstring, indent) - else: - docstring = docstring.strip() - - has_trailing_backslash = False - if docstring: - # Add some padding if the docstring starts / ends with a quote mark. - if docstring[0] == quote_char: - docstring = " " + docstring - if docstring[-1] == quote_char: - docstring += " " - if docstring[-1] == "\\": - backslash_count = len(docstring) - len(docstring.rstrip("\\")) - if backslash_count % 2: - # Odd number of tailing backslashes, add some padding to - # avoid escaping the closing string quote. - docstring += " " - has_trailing_backslash = True - elif not docstring_started_empty: - docstring = " " - - # We could enforce triple quotes at this point. - quote = quote_char * quote_len - - # It's invalid to put closing single-character quotes on a new line. - if quote_len == 3: - # We need to find the length of the last line of the docstring - # to find if we can add the closing quotes to the line without - # exceeding the maximum line length. - # If docstring is one line, we don't put the closing quotes on a - # separate line because it looks ugly (#3320). - lines = docstring.splitlines() - last_line_length = len(lines[-1]) if docstring else 0 - - # If adding closing quotes would cause the last line to exceed - # the maximum line length, and the closing quote is not - # prefixed by a newline then put a line break before - # the closing quotes - if ( - len(lines) > 1 - and last_line_length + quote_len > self.mode.line_length - and len(indent) + quote_len <= self.mode.line_length - and not has_trailing_backslash - ): - if leaf.value[-1 - quote_len] == "\n": - leaf.value = prefix + quote + docstring + quote - else: - leaf.value = prefix + quote + docstring + "\n" + indent + quote - else: - leaf.value = prefix + quote + docstring + quote - else: - leaf.value = prefix + quote + docstring + quote - - if self.mode.string_normalization and leaf.type == token.STRING: - leaf.value = normalize_string_prefix(leaf.value) - leaf.value = normalize_string_quotes(leaf.value) - yield from self.visit_default(leaf) - - def visit_NUMBER(self, leaf: Leaf) -> Iterator[Line]: - normalize_numeric_literal(leaf) - yield from self.visit_default(leaf) - - def visit_atom(self, node: Node) -> Iterator[Line]: - """Visit any atom""" - if len(node.children) == 3: - first = node.children[0] - last = node.children[-1] - if (first.type == token.LSQB and last.type == token.RSQB) or ( - first.type == token.LBRACE and last.type == token.RBRACE - ): - # Lists or sets of one item - maybe_make_parens_invisible_in_atom( - node.children[1], - parent=node, - mode=self.mode, - features=self.features, - ) - - yield from self.visit_default(node) - - def visit_fstring(self, node: Node) -> Iterator[Line]: - # currently we don't want to format and split f-strings at all. - string_leaf = fstring_tstring_to_string(node) - node.replace(string_leaf) - if "\\" in string_leaf.value and any( - "\\" in str(child) - for child in node.children - if child.type == syms.fstring_replacement_field - ): - # string normalization doesn't account for nested quotes, - # causing breakages. skip normalization when nested quotes exist - yield from self.visit_default(string_leaf) - return - yield from self.visit_STRING(string_leaf) - - def visit_tstring(self, node: Node) -> Iterator[Line]: - # currently we don't want to format and split t-strings at all. - string_leaf = fstring_tstring_to_string(node) - node.replace(string_leaf) - if "\\" in string_leaf.value and any( - "\\" in str(child) - for child in node.children - if child.type == syms.fstring_replacement_field - ): - # string normalization doesn't account for nested quotes, - # causing breakages. skip normalization when nested quotes exist - yield from self.visit_default(string_leaf) - return - yield from self.visit_STRING(string_leaf) - - # TODO: Uncomment Implementation to format f-string children - # fstring_start = node.children[0] - # fstring_end = node.children[-1] - # assert isinstance(fstring_start, Leaf) - # assert isinstance(fstring_end, Leaf) - - # quote_char = fstring_end.value[0] - # quote_idx = fstring_start.value.index(quote_char) - # prefix, quote = ( - # fstring_start.value[:quote_idx], - # fstring_start.value[quote_idx:] - # ) - - # if not is_docstring(node, self.mode): - # prefix = normalize_string_prefix(prefix) - - # assert quote == fstring_end.value - - # is_raw_fstring = "r" in prefix or "R" in prefix - # middles = [ - # leaf - # for leaf in node.leaves() - # if leaf.type == token.FSTRING_MIDDLE - # ] - - # if self.mode.string_normalization: - # middles, quote = normalize_fstring_quotes(quote, middles, is_raw_fstring) - - # fstring_start.value = prefix + quote - # fstring_end.value = quote - - # yield from self.visit_default(node) - - def visit_comp_for(self, node: Node) -> Iterator[Line]: - if Preview.wrap_comprehension_in in self.mode: - normalize_invisible_parens( - node, parens_after={"in"}, mode=self.mode, features=self.features - ) - yield from self.visit_default(node) - - def visit_old_comp_for(self, node: Node) -> Iterator[Line]: - yield from self.visit_comp_for(node) - - def __post_init__(self) -> None: - """You are in a twisty little maze of passages.""" - self.current_line = Line(mode=self.mode) - - v = self.visit_stmt - Ø: set[str] = set() - self.visit_assert_stmt = partial(v, keywords={"assert"}, parens={"assert", ","}) - self.visit_if_stmt = partial( - v, keywords={"if", "else", "elif"}, parens={"if", "elif"} - ) - self.visit_while_stmt = partial(v, keywords={"while", "else"}, parens={"while"}) - self.visit_for_stmt = partial(v, keywords={"for", "else"}, parens={"for", "in"}) - self.visit_try_stmt = partial( - v, keywords={"try", "except", "else", "finally"}, parens=Ø - ) - self.visit_except_clause = partial(v, keywords={"except"}, parens={"except"}) - self.visit_with_stmt = partial(v, keywords={"with"}, parens={"with"}) - self.visit_classdef = partial(v, keywords={"class"}, parens=Ø) - - self.visit_expr_stmt = partial(v, keywords=Ø, parens=ASSIGNMENTS) - self.visit_return_stmt = partial(v, keywords={"return"}, parens={"return"}) - self.visit_import_from = partial(v, keywords=Ø, parens={"import"}) - self.visit_del_stmt = partial(v, keywords=Ø, parens={"del"}) - self.visit_async_funcdef = self.visit_async_stmt - self.visit_decorated = self.visit_decorators - - # PEP 634 - self.visit_match_stmt = self.visit_match_case - self.visit_case_block = self.visit_match_case - self.visit_guard = partial(v, keywords=Ø, parens={"if"}) - - -# Remove when `simplify_power_operator_hugging` becomes stable. -def _hugging_power_ops_line_to_string( - line: Line, - features: Collection[Feature], - mode: Mode, -) -> str | None: - try: - return line_to_string(next(hug_power_op(line, features, mode))) - except CannotTransform: - return None - - -def transform_line( - line: Line, mode: Mode, features: Collection[Feature] = () -) -> Iterator[Line]: - """Transform a `line`, potentially splitting it into many lines. - - They should fit in the allotted `line_length` but might not be able to. - - `features` are syntactical features that may be used in the output. - """ - if line.is_comment: - yield line - return - - line_str = line_to_string(line) - - if Preview.simplify_power_operator_hugging in mode: - line_str_hugging_power_ops = line_str - else: - # We need the line string when power operators are hugging to determine if we - # should split the line. Default to line_str, if no power operator are present - # on the line. - line_str_hugging_power_ops = ( - _hugging_power_ops_line_to_string(line, features, mode) or line_str - ) - - ll = mode.line_length - sn = mode.string_normalization - string_merge = StringMerger(ll, sn) - string_paren_strip = StringParenStripper(ll, sn) - string_split = StringSplitter(ll, sn) - string_paren_wrap = StringParenWrapper(ll, sn) - - transformers: list[Transformer] - if ( - not line.contains_uncollapsable_type_comments() - and not line.should_split_rhs - and not line.magic_trailing_comma - and ( - is_line_short_enough(line, mode=mode, line_str=line_str_hugging_power_ops) - or line.contains_unsplittable_type_ignore() - ) - and not (line.inside_brackets and line.contains_standalone_comments()) - and not line.contains_implicit_multiline_string_with_comments() - ): - # Only apply basic string preprocessing, since lines shouldn't be split here. - if Preview.string_processing in mode: - transformers = [string_merge, string_paren_strip] - else: - transformers = [] - elif line.is_def and not should_split_funcdef_with_rhs(line, mode): - transformers = [left_hand_split] - else: - - def _rhs( - self: object, line: Line, features: Collection[Feature], mode: Mode - ) -> Iterator[Line]: - """Wraps calls to `right_hand_split`. - - The calls increasingly `omit` right-hand trailers (bracket pairs with - content), meaning the trailers get glued together to split on another - bracket pair instead. - """ - for omit in generate_trailers_to_omit(line, mode.line_length): - lines = list(right_hand_split(line, mode, features, omit=omit)) - # Note: this check is only able to figure out if the first line of the - # *current* transformation fits in the line length. This is true only - # for simple cases. All others require running more transforms via - # `transform_line()`. This check doesn't know if those would succeed. - if is_line_short_enough(lines[0], mode=mode): - yield from lines - return - - # All splits failed, best effort split with no omits. - # This mostly happens to multiline strings that are by definition - # reported as not fitting a single line, as well as lines that contain - # trailing commas (those have to be exploded). - yield from right_hand_split(line, mode, features=features) - - # HACK: nested functions (like _rhs) compiled by mypyc don't retain their - # __name__ attribute which is needed in `run_transformer` further down. - # Unfortunately a nested class breaks mypyc too. So a class must be created - # via type ... https://github.com/mypyc/mypyc/issues/884 - rhs = type("rhs", (), {"__call__": _rhs})() - - if Preview.string_processing in mode: - if line.inside_brackets: - transformers = [ - string_merge, - string_paren_strip, - string_split, - delimiter_split, - standalone_comment_split, - string_paren_wrap, - rhs, - ] - else: - transformers = [ - string_merge, - string_paren_strip, - string_split, - string_paren_wrap, - rhs, - ] - else: - if line.inside_brackets: - transformers = [delimiter_split, standalone_comment_split, rhs] - else: - transformers = [rhs] - - if Preview.simplify_power_operator_hugging not in mode: - # It's always safe to attempt hugging of power operations and pretty much every - # line could match. - transformers.append(hug_power_op) - - for transform in transformers: - # We are accumulating lines in `result` because we might want to abort - # mission and return the original line in the end, or attempt a different - # split altogether. - try: - result = run_transformer(line, transform, mode, features, line_str=line_str) - except CannotTransform: - continue - else: - yield from result - break - - else: - yield line - - -def should_split_funcdef_with_rhs(line: Line, mode: Mode) -> bool: - """If a funcdef has a magic trailing comma in the return type, then we should first - split the line with rhs to respect the comma. - """ - return_type_leaves: list[Leaf] = [] - in_return_type = False - - for leaf in line.leaves: - if leaf.type == token.COLON: - in_return_type = False - if in_return_type: - return_type_leaves.append(leaf) - if leaf.type == token.RARROW: - in_return_type = True - - # using `bracket_split_build_line` will mess with whitespace, so we duplicate a - # couple lines from it. - result = Line(mode=line.mode, depth=line.depth) - leaves_to_track = get_leaves_inside_matching_brackets(return_type_leaves) - for leaf in return_type_leaves: - result.append( - leaf, - preformatted=True, - track_bracket=id(leaf) in leaves_to_track, - ) - - # we could also return true if the line is too long, and the return type is longer - # than the param list. Or if `should_split_rhs` returns True. - return result.magic_trailing_comma is not None - - -class _BracketSplitComponent(Enum): - head = auto() - body = auto() - tail = auto() - - -def left_hand_split( - line: Line, _features: Collection[Feature], mode: Mode -) -> Iterator[Line]: - """Split line into many lines, starting with the first matching bracket pair. - - Note: this usually looks weird, only use this for function definitions. - Prefer RHS otherwise. This is why this function is not symmetrical with - :func:`right_hand_split` which also handles optional parentheses. - """ - for leaf_type in [token.LPAR, token.LSQB]: - tail_leaves: list[Leaf] = [] - body_leaves: list[Leaf] = [] - head_leaves: list[Leaf] = [] - current_leaves = head_leaves - matching_bracket: Leaf | None = None - depth = 0 - for index, leaf in enumerate(line.leaves): - if index == 2 and leaf.type == token.LSQB: - # A [ at index 2 means this is a type param, so start - # tracking the depth - depth += 1 - elif depth > 0: - if leaf.type == token.LSQB: - depth += 1 - elif leaf.type == token.RSQB: - depth -= 1 - if ( - current_leaves is body_leaves - and leaf.type in CLOSING_BRACKETS - and leaf.opening_bracket is matching_bracket - and isinstance(matching_bracket, Leaf) - # If the code is still on LPAR and we are inside a type - # param, ignore the match since this is searching - # for the function arguments - and not (leaf_type == token.LPAR and depth > 0) - ): - ensure_visible(leaf) - ensure_visible(matching_bracket) - current_leaves = tail_leaves if body_leaves else head_leaves - current_leaves.append(leaf) - if current_leaves is head_leaves: - if leaf.type == leaf_type and ( - not (leaf_type == token.LPAR and depth > 0) - ): - matching_bracket = leaf - current_leaves = body_leaves - if matching_bracket and tail_leaves: - break - if not matching_bracket or not tail_leaves: - raise CannotSplit("No brackets found") - - head = bracket_split_build_line( - head_leaves, line, matching_bracket, component=_BracketSplitComponent.head - ) - body = bracket_split_build_line( - body_leaves, line, matching_bracket, component=_BracketSplitComponent.body - ) - tail = bracket_split_build_line( - tail_leaves, line, matching_bracket, component=_BracketSplitComponent.tail - ) - bracket_split_succeeded_or_raise(head, body, tail) - for result in (head, body, tail): - if result: - yield result - - -def right_hand_split( - line: Line, - mode: Mode, - features: Collection[Feature] = (), - omit: Collection[LeafID] = (), -) -> Iterator[Line]: - """Split line into many lines, starting with the last matching bracket pair. - - If the split was by optional parentheses, attempt splitting without them, too. - `omit` is a collection of closing bracket IDs that shouldn't be considered for - this split. - - Note: running this function modifies `bracket_depth` on the leaves of `line`. - """ - rhs_result = _first_right_hand_split(line, omit=omit) - yield from _maybe_split_omitting_optional_parens( - rhs_result, line, mode, features=features, omit=omit - ) - - -def _first_right_hand_split( - line: Line, - omit: Collection[LeafID] = (), -) -> RHSResult: - """Split the line into head, body, tail starting with the last bracket pair. - - Note: this function should not have side effects. It's relied upon by - _maybe_split_omitting_optional_parens to get an opinion whether to prefer - splitting on the right side of an assignment statement. - """ - tail_leaves: list[Leaf] = [] - body_leaves: list[Leaf] = [] - head_leaves: list[Leaf] = [] - current_leaves = tail_leaves - opening_bracket: Leaf | None = None - closing_bracket: Leaf | None = None - for leaf in reversed(line.leaves): - if current_leaves is body_leaves: - if leaf is opening_bracket: - current_leaves = head_leaves if body_leaves else tail_leaves - current_leaves.append(leaf) - if current_leaves is tail_leaves: - if leaf.type in CLOSING_BRACKETS and id(leaf) not in omit: - opening_bracket = leaf.opening_bracket - closing_bracket = leaf - current_leaves = body_leaves - if not (opening_bracket and closing_bracket and head_leaves): - # If there is no opening or closing_bracket that means the split failed and - # all content is in the tail. Otherwise, if `head_leaves` are empty, it means - # the matching `opening_bracket` wasn't available on `line` anymore. - raise CannotSplit("No brackets found") - - tail_leaves.reverse() - body_leaves.reverse() - head_leaves.reverse() - - body: Line | None = None - if ( - Preview.hug_parens_with_braces_and_square_brackets in line.mode - and tail_leaves[0].value - and tail_leaves[0].opening_bracket is head_leaves[-1] - ): - inner_body_leaves = list(body_leaves) - hugged_opening_leaves: list[Leaf] = [] - hugged_closing_leaves: list[Leaf] = [] - is_unpacking = body_leaves[0].type in [token.STAR, token.DOUBLESTAR] - unpacking_offset: int = 1 if is_unpacking else 0 - while ( - len(inner_body_leaves) >= 2 + unpacking_offset - and inner_body_leaves[-1].type in CLOSING_BRACKETS - and inner_body_leaves[-1].opening_bracket - is inner_body_leaves[unpacking_offset] - ): - if unpacking_offset: - hugged_opening_leaves.append(inner_body_leaves.pop(0)) - unpacking_offset = 0 - hugged_opening_leaves.append(inner_body_leaves.pop(0)) - hugged_closing_leaves.insert(0, inner_body_leaves.pop()) - - if hugged_opening_leaves and inner_body_leaves: - inner_body = bracket_split_build_line( - inner_body_leaves, - line, - hugged_opening_leaves[-1], - component=_BracketSplitComponent.body, - ) - if ( - line.mode.magic_trailing_comma - and inner_body_leaves[-1].type == token.COMMA - ): - should_hug = True - else: - line_length = line.mode.line_length - sum( - len(str(leaf)) - for leaf in hugged_opening_leaves + hugged_closing_leaves - ) - if is_line_short_enough( - inner_body, mode=replace(line.mode, line_length=line_length) - ): - # Do not hug if it fits on a single line. - should_hug = False - else: - should_hug = True - if should_hug: - body_leaves = inner_body_leaves - head_leaves.extend(hugged_opening_leaves) - tail_leaves = hugged_closing_leaves + tail_leaves - body = inner_body # No need to re-calculate the body again later. - - head = bracket_split_build_line( - head_leaves, line, opening_bracket, component=_BracketSplitComponent.head - ) - if body is None: - body = bracket_split_build_line( - body_leaves, line, opening_bracket, component=_BracketSplitComponent.body - ) - tail = bracket_split_build_line( - tail_leaves, line, opening_bracket, component=_BracketSplitComponent.tail - ) - bracket_split_succeeded_or_raise(head, body, tail) - return RHSResult(head, body, tail, opening_bracket, closing_bracket) - - -def _maybe_split_omitting_optional_parens( - rhs: RHSResult, - line: Line, - mode: Mode, - features: Collection[Feature] = (), - omit: Collection[LeafID] = (), -) -> Iterator[Line]: - if ( - Feature.FORCE_OPTIONAL_PARENTHESES not in features - # the opening bracket is an optional paren - and rhs.opening_bracket.type == token.LPAR - and not rhs.opening_bracket.value - # the closing bracket is an optional paren - and rhs.closing_bracket.type == token.RPAR - and not rhs.closing_bracket.value - # it's not an import (optional parens are the only thing we can split on - # in this case; attempting a split without them is a waste of time) - and not line.is_import - # and we can actually remove the parens - and can_omit_invisible_parens(rhs, mode.line_length) - ): - omit = {id(rhs.closing_bracket), *omit} - try: - # The RHSResult Omitting Optional Parens. - rhs_oop = _first_right_hand_split(line, omit=omit) - if _prefer_split_rhs_oop_over_rhs(rhs_oop, rhs, mode): - yield from _maybe_split_omitting_optional_parens( - rhs_oop, line, mode, features=features, omit=omit - ) - return - - except CannotSplit as e: - # For chained assignments we want to use the previous successful split - if line.is_chained_assignment: - pass - - elif ( - not can_be_split(rhs.body) - and not is_line_short_enough(rhs.body, mode=mode) - and not ( - Preview.wrap_long_dict_values_in_parens - and rhs.opening_bracket.parent - and rhs.opening_bracket.parent.parent - and rhs.opening_bracket.parent.parent.type == syms.dictsetmaker - ) - ): - raise CannotSplit( - "Splitting failed, body is still too long and can't be split." - ) from e - - elif ( - rhs.head.contains_multiline_strings() - or rhs.tail.contains_multiline_strings() - ): - raise CannotSplit( - "The current optional pair of parentheses is bound to fail to" - " satisfy the splitting algorithm because the head or the tail" - " contains multiline strings which by definition never fit one" - " line." - ) from e - - ensure_visible(rhs.opening_bracket) - ensure_visible(rhs.closing_bracket) - for result in (rhs.head, rhs.body, rhs.tail): - if result: - yield result - - -def _prefer_split_rhs_oop_over_rhs( - rhs_oop: RHSResult, rhs: RHSResult, mode: Mode -) -> bool: - """ - Returns whether we should prefer the result from a split omitting optional parens - (rhs_oop) over the original (rhs). - """ - # contains unsplittable type ignore - if ( - rhs_oop.head.contains_unsplittable_type_ignore() - or rhs_oop.body.contains_unsplittable_type_ignore() - or rhs_oop.tail.contains_unsplittable_type_ignore() - ): - return True - - # Retain optional parens around dictionary values - if ( - Preview.wrap_long_dict_values_in_parens - and rhs.opening_bracket.parent - and rhs.opening_bracket.parent.parent - and rhs.opening_bracket.parent.parent.type == syms.dictsetmaker - and rhs.body.bracket_tracker.delimiters - ): - # Unless the split is inside the key - return any(leaf.type == token.COLON for leaf in rhs_oop.tail.leaves) - - # the split is right after `=` - if not (len(rhs.head.leaves) >= 2 and rhs.head.leaves[-2].type == token.EQUAL): - return True - - # the left side of assignment contains brackets - if not any(leaf.type in BRACKETS for leaf in rhs.head.leaves[:-1]): - return True - - # the left side of assignment is short enough (the -1 is for the ending optional - # paren) - if not is_line_short_enough( - rhs.head, mode=replace(mode, line_length=mode.line_length - 1) - ): - return True - - # the left side of assignment won't explode further because of magic trailing comma - if rhs.head.magic_trailing_comma is not None: - return True - - # If we have multiple targets, we prefer more `=`s on the head vs pushing them to - # the body - rhs_head_equal_count = [leaf.type for leaf in rhs.head.leaves].count(token.EQUAL) - rhs_oop_head_equal_count = [leaf.type for leaf in rhs_oop.head.leaves].count( - token.EQUAL - ) - if rhs_head_equal_count > 1 and rhs_head_equal_count > rhs_oop_head_equal_count: - return False - - has_closing_bracket_after_assign = False - for leaf in reversed(rhs_oop.head.leaves): - if leaf.type == token.EQUAL: - break - if leaf.type in CLOSING_BRACKETS: - has_closing_bracket_after_assign = True - break - return ( - # contains matching brackets after the `=` (done by checking there is a - # closing bracket) - has_closing_bracket_after_assign - or ( - # the split is actually from inside the optional parens (done by checking - # the first line still contains the `=`) - any(leaf.type == token.EQUAL for leaf in rhs_oop.head.leaves) - # the first line is short enough - and is_line_short_enough(rhs_oop.head, mode=mode) - ) - ) - - -def bracket_split_succeeded_or_raise(head: Line, body: Line, tail: Line) -> None: - """Raise :exc:`CannotSplit` if the last left- or right-hand split failed. - - Do nothing otherwise. - - A left- or right-hand split is based on a pair of brackets. Content before - (and including) the opening bracket is left on one line, content inside the - brackets is put on a separate line, and finally content starting with and - following the closing bracket is put on a separate line. - - Those are called `head`, `body`, and `tail`, respectively. If the split - produced the same line (all content in `head`) or ended up with an empty `body` - and the `tail` is just the closing bracket, then it's considered failed. - """ - tail_len = len(str(tail).strip()) - if not body: - if tail_len == 0: - raise CannotSplit("Splitting brackets produced the same line") - - elif tail_len < 3: - raise CannotSplit( - f"Splitting brackets on an empty body to save {tail_len} characters is" - " not worth it" - ) - - -def _ensure_trailing_comma( - leaves: list[Leaf], original: Line, opening_bracket: Leaf -) -> bool: - if not leaves: - return False - # Ensure a trailing comma for imports - if original.is_import: - return True - # ...and standalone function arguments - if not original.is_def: - return False - if opening_bracket.value != "(": - return False - # Don't add commas if we already have any commas - if any( - leaf.type == token.COMMA and not is_part_of_annotation(leaf) for leaf in leaves - ): - return False - - # Find a leaf with a parent (comments don't have parents) - leaf_with_parent = next((leaf for leaf in leaves if leaf.parent), None) - if leaf_with_parent is None: - return True - # Don't add commas inside parenthesized return annotations - if get_annotation_type(leaf_with_parent) == "return": - return False - # Don't add commas inside PEP 604 unions - if ( - leaf_with_parent.parent - and leaf_with_parent.parent.next_sibling - and leaf_with_parent.parent.next_sibling.type == token.VBAR - ): - return False - return True - - -def bracket_split_build_line( - leaves: list[Leaf], - original: Line, - opening_bracket: Leaf, - *, - component: _BracketSplitComponent, -) -> Line: - """Return a new line with given `leaves` and respective comments from `original`. - - If it's the head component, brackets will be tracked so trailing commas are - respected. - - If it's the body component, the result line is one-indented inside brackets and as - such has its first leaf's prefix normalized and a trailing comma added when - expected. - """ - result = Line(mode=original.mode, depth=original.depth) - if component is _BracketSplitComponent.body: - result.inside_brackets = True - result.depth += 1 - if _ensure_trailing_comma(leaves, original, opening_bracket): - for i in range(len(leaves) - 1, -1, -1): - if leaves[i].type == STANDALONE_COMMENT: - continue - - if leaves[i].type != token.COMMA: - new_comma = Leaf(token.COMMA, ",") - leaves.insert(i + 1, new_comma) - break - - leaves_to_track: set[LeafID] = set() - if component is _BracketSplitComponent.head: - leaves_to_track = get_leaves_inside_matching_brackets(leaves) - # Populate the line - for leaf in leaves: - result.append( - leaf, - preformatted=True, - track_bracket=id(leaf) in leaves_to_track, - ) - for comment_after in original.comments_after(leaf): - result.append(comment_after, preformatted=True) - if component is _BracketSplitComponent.body and should_split_line( - result, opening_bracket - ): - result.should_split_rhs = True - return result - - -def dont_increase_indentation(split_func: Transformer) -> Transformer: - """Normalize prefix of the first leaf in every line returned by `split_func`. - - This is a decorator over relevant split functions. - """ - - @wraps(split_func) - def split_wrapper( - line: Line, features: Collection[Feature], mode: Mode - ) -> Iterator[Line]: - for split_line in split_func(line, features, mode): - split_line.leaves[0].prefix = "" - yield split_line - - return split_wrapper - - -def _get_last_non_comment_leaf(line: Line) -> int | None: - for leaf_idx in range(len(line.leaves) - 1, 0, -1): - if line.leaves[leaf_idx].type != STANDALONE_COMMENT: - return leaf_idx - return None - - -def _can_add_trailing_comma(leaf: Leaf, features: Collection[Feature]) -> bool: - if is_vararg(leaf, within={syms.typedargslist}): - return Feature.TRAILING_COMMA_IN_DEF in features - if is_vararg(leaf, within={syms.arglist, syms.argument}): - return Feature.TRAILING_COMMA_IN_CALL in features - return True - - -def _safe_add_trailing_comma(safe: bool, delimiter_priority: int, line: Line) -> Line: - if ( - safe - and delimiter_priority == COMMA_PRIORITY - and line.leaves[-1].type != token.COMMA - and line.leaves[-1].type != STANDALONE_COMMENT - ): - new_comma = Leaf(token.COMMA, ",") - line.append(new_comma) - return line - - -MIGRATE_COMMENT_DELIMITERS = {STRING_PRIORITY, COMMA_PRIORITY} - - -@dont_increase_indentation -def delimiter_split( - line: Line, features: Collection[Feature], mode: Mode -) -> Iterator[Line]: - """Split according to delimiters of the highest priority. - - If the appropriate Features are given, the split will add trailing commas - also in function signatures and calls that contain `*` and `**`. - """ - if len(line.leaves) == 0: - raise CannotSplit("Line empty") from None - last_leaf = line.leaves[-1] - - bt = line.bracket_tracker - try: - delimiter_priority = bt.max_delimiter_priority(exclude={id(last_leaf)}) - except ValueError: - raise CannotSplit("No delimiters found") from None - - if ( - delimiter_priority == DOT_PRIORITY - and bt.delimiter_count_with_priority(delimiter_priority) == 1 - ): - raise CannotSplit("Splitting a single attribute from its owner looks wrong") - - current_line = Line( - mode=line.mode, depth=line.depth, inside_brackets=line.inside_brackets - ) - lowest_depth = sys.maxsize - trailing_comma_safe = True - - def append_to_line(leaf: Leaf) -> Iterator[Line]: - """Append `leaf` to current line or to new line if appending impossible.""" - nonlocal current_line - try: - current_line.append_safe(leaf, preformatted=True) - except ValueError: - yield current_line - - current_line = Line( - mode=line.mode, depth=line.depth, inside_brackets=line.inside_brackets - ) - current_line.append(leaf) - - def append_comments(leaf: Leaf) -> Iterator[Line]: - for comment_after in line.comments_after(leaf): - yield from append_to_line(comment_after) - - last_non_comment_leaf = _get_last_non_comment_leaf(line) - for leaf_idx, leaf in enumerate(line.leaves): - yield from append_to_line(leaf) - - previous_priority = leaf_idx > 0 and bt.delimiters.get( - id(line.leaves[leaf_idx - 1]) - ) - if ( - previous_priority != delimiter_priority - or delimiter_priority in MIGRATE_COMMENT_DELIMITERS - ): - yield from append_comments(leaf) - - lowest_depth = min(lowest_depth, leaf.bracket_depth) - if trailing_comma_safe and leaf.bracket_depth == lowest_depth: - trailing_comma_safe = _can_add_trailing_comma(leaf, features) - - if last_leaf.type == STANDALONE_COMMENT and leaf_idx == last_non_comment_leaf: - current_line = _safe_add_trailing_comma( - trailing_comma_safe, delimiter_priority, current_line - ) - - leaf_priority = bt.delimiters.get(id(leaf)) - if leaf_priority == delimiter_priority: - if ( - leaf_idx + 1 < len(line.leaves) - and delimiter_priority not in MIGRATE_COMMENT_DELIMITERS - ): - yield from append_comments(line.leaves[leaf_idx + 1]) - - yield current_line - current_line = Line( - mode=line.mode, depth=line.depth, inside_brackets=line.inside_brackets - ) - - if current_line: - current_line = _safe_add_trailing_comma( - trailing_comma_safe, delimiter_priority, current_line - ) - yield current_line - - -@dont_increase_indentation -def standalone_comment_split( - line: Line, features: Collection[Feature], mode: Mode -) -> Iterator[Line]: - """Split standalone comments from the rest of the line.""" - if not line.contains_standalone_comments(): - raise CannotSplit("Line does not have any standalone comments") - - current_line = Line( - mode=line.mode, depth=line.depth, inside_brackets=line.inside_brackets - ) - - def append_to_line(leaf: Leaf) -> Iterator[Line]: - """Append `leaf` to current line or to new line if appending impossible.""" - nonlocal current_line - try: - current_line.append_safe(leaf, preformatted=True) - except ValueError: - yield current_line - - current_line = Line( - line.mode, depth=line.depth, inside_brackets=line.inside_brackets - ) - current_line.append(leaf) - - for leaf in line.leaves: - yield from append_to_line(leaf) - - for comment_after in line.comments_after(leaf): - yield from append_to_line(comment_after) - - if current_line: - yield current_line - - -def normalize_invisible_parens( - node: Node, parens_after: set[str], *, mode: Mode, features: Collection[Feature] -) -> None: - """Make existing optional parentheses invisible or create new ones. - - `parens_after` is a set of string leaf values immediately after which parens - should be put. - - Standardizes on visible parentheses for single-element tuples, and keeps - existing visible parentheses for other tuples and generator expressions. - """ - for pc in list_comments(node.prefix, is_endmarker=False, mode=mode): - if contains_fmt_directive(pc.value, FMT_OFF): - # This `node` has a prefix with `# fmt: off`, don't mess with parens. - return - - # The multiple context managers grammar has a different pattern, thus this is - # separate from the for-loop below. This possibly wraps them in invisible parens, - # and later will be removed in remove_with_parens when needed. - if node.type == syms.with_stmt: - _maybe_wrap_cms_in_parens(node, mode, features) - - check_lpar = False - for index, child in enumerate(list(node.children)): - # Fixes a bug where invisible parens are not properly stripped from - # assignment statements that contain type annotations. - if isinstance(child, Node) and child.type == syms.annassign: - normalize_invisible_parens( - child, parens_after=parens_after, mode=mode, features=features - ) - - # Fixes a bug where invisible parens are not properly wrapped around - # case blocks. - if isinstance(child, Node) and child.type == syms.case_block: - normalize_invisible_parens( - child, parens_after={"case"}, mode=mode, features=features - ) - - # Add parentheses around if guards in case blocks - if isinstance(child, Node) and child.type == syms.guard: - normalize_invisible_parens( - child, parens_after={"if"}, mode=mode, features=features - ) - - # Add parentheses around long tuple unpacking in assignments. - if ( - index == 0 - and isinstance(child, Node) - and child.type == syms.testlist_star_expr - ): - check_lpar = True - - if ( - index == 0 - and isinstance(child, Node) - and child.type == syms.atom - and node.type == syms.expr_stmt - and not _atom_has_magic_trailing_comma(child, mode) - and not _is_atom_multiline(child) - ): - if maybe_make_parens_invisible_in_atom( - child, - parent=node, - mode=mode, - features=features, - remove_brackets_around_comma=True, - allow_star_expr=True, - ): - wrap_in_parentheses(node, child, visible=False) - - if check_lpar: - if ( - child.type == syms.atom - and node.type == syms.for_stmt - and isinstance(child.prev_sibling, Leaf) - and child.prev_sibling.type == token.NAME - and child.prev_sibling.value == "for" - ): - if maybe_make_parens_invisible_in_atom( - child, - parent=node, - mode=mode, - features=features, - remove_brackets_around_comma=True, - ): - wrap_in_parentheses(node, child, visible=False) - elif isinstance(child, Node) and node.type == syms.with_stmt: - remove_with_parens(child, node, mode=mode, features=features) - elif child.type == syms.atom and not ( - "in" in parens_after - and len(child.children) == 3 - and is_lpar_token(child.children[0]) - and is_rpar_token(child.children[-1]) - and child.children[1].type == syms.test - ): - if maybe_make_parens_invisible_in_atom( - child, parent=node, mode=mode, features=features - ): - wrap_in_parentheses(node, child, visible=False) - elif is_one_tuple(child): - wrap_in_parentheses(node, child, visible=True) - elif node.type == syms.import_from: - _normalize_import_from(node, child, index) - break - elif ( - index == 1 - and child.type == token.STAR - and node.type == syms.except_clause - ): - # In except* (PEP 654), the star is actually part of - # of the keyword. So we need to skip the insertion of - # invisible parentheses to work more precisely. - continue - - elif ( - isinstance(child, Leaf) - and child.next_sibling is not None - and child.next_sibling.type == token.COLON - and child.value == "case" - ): - # A special patch for "case case:" scenario, the second occurrence - # of case will be not parsed as a Python keyword. - break - - elif not is_multiline_string(child): - if ( - Preview.fix_if_guard_explosion_in_case_statement in mode - and node.type == syms.guard - ): - mock_line = Line(mode=mode) - for leaf in child.leaves(): - mock_line.append(leaf) - # If it's a guard AND it's short, we DON'T wrap - if not is_line_short_enough(mock_line, mode=mode): - wrap_in_parentheses(node, child, visible=False) - else: - wrap_in_parentheses(node, child, visible=False) - - comma_check = child.type == token.COMMA - - check_lpar = isinstance(child, Leaf) and ( - child.value in parens_after or comma_check - ) - - -def _normalize_import_from(parent: Node, child: LN, index: int) -> None: - # "import from" nodes store parentheses directly as part of - # the statement - if is_lpar_token(child): - assert is_rpar_token(parent.children[-1]) - # make parentheses invisible - child.value = "" - parent.children[-1].value = "" - elif child.type != token.STAR: - # insert invisible parentheses - parent.insert_child(index, Leaf(token.LPAR, "")) - parent.append_child(Leaf(token.RPAR, "")) - - -def remove_await_parens(node: Node, mode: Mode, features: Collection[Feature]) -> None: - if node.children[0].type == token.AWAIT and len(node.children) > 1: - if ( - node.children[1].type == syms.atom - and node.children[1].children[0].type == token.LPAR - ): - if maybe_make_parens_invisible_in_atom( - node.children[1], - parent=node, - mode=mode, - features=features, - remove_brackets_around_comma=True, - ): - wrap_in_parentheses(node, node.children[1], visible=False) - - # Since await is an expression we shouldn't remove - # brackets in cases where this would change - # the AST due to operator precedence. - # Therefore we only aim to remove brackets around - # power nodes that aren't also await expressions themselves. - # https://peps.python.org/pep-0492/#updated-operator-precedence-table - # N.B. We've still removed any redundant nested brackets though :) - opening_bracket = cast(Leaf, node.children[1].children[0]) - closing_bracket = cast(Leaf, node.children[1].children[-1]) - bracket_contents = node.children[1].children[1] - if isinstance(bracket_contents, Node) and ( - bracket_contents.type != syms.power - or bracket_contents.children[0].type == token.AWAIT - or any( - isinstance(child, Leaf) and child.type == token.DOUBLESTAR - for child in bracket_contents.children - ) - ): - ensure_visible(opening_bracket) - ensure_visible(closing_bracket) - - -def _maybe_wrap_cms_in_parens( - node: Node, mode: Mode, features: Collection[Feature] -) -> None: - """When enabled and safe, wrap the multiple context managers in invisible parens. - - It is only safe when `features` contain Feature.PARENTHESIZED_CONTEXT_MANAGERS. - """ - if ( - Feature.PARENTHESIZED_CONTEXT_MANAGERS not in features - or len(node.children) <= 2 - # If it's an atom, it's already wrapped in parens. - or node.children[1].type == syms.atom - ): - return - colon_index: int | None = None - for i in range(2, len(node.children)): - if node.children[i].type == token.COLON: - colon_index = i - break - if colon_index is not None: - lpar = Leaf(token.LPAR, "") - rpar = Leaf(token.RPAR, "") - context_managers = node.children[1:colon_index] - for child in context_managers: - child.remove() - # After wrapping, the with_stmt will look like this: - # with_stmt - # NAME 'with' - # atom - # LPAR '' - # testlist_gexp - # ... <-- context_managers - # /testlist_gexp - # RPAR '' - # /atom - # COLON ':' - new_child = Node( - syms.atom, [lpar, Node(syms.testlist_gexp, context_managers), rpar] - ) - node.insert_child(1, new_child) - - -def remove_with_parens( - node: Node, parent: Node, mode: Mode, features: Collection[Feature] -) -> None: - """Recursively hide optional parens in `with` statements.""" - # Removing all unnecessary parentheses in with statements in one pass is a tad - # complex as different variations of bracketed statements result in pretty - # different parse trees: - # - # with (open("file")) as f: # this is an asexpr_test - # ... - # - # with (open("file") as f): # this is an atom containing an - # ... # asexpr_test - # - # with (open("file")) as f, (open("file")) as f: # this is asexpr_test, COMMA, - # ... # asexpr_test - # - # with (open("file") as f, open("file") as f): # an atom containing a - # ... # testlist_gexp which then - # # contains multiple asexpr_test(s) - if node.type == syms.atom: - if maybe_make_parens_invisible_in_atom( - node, - parent=parent, - mode=mode, - features=features, - remove_brackets_around_comma=True, - ): - wrap_in_parentheses(parent, node, visible=False) - if isinstance(node.children[1], Node): - remove_with_parens(node.children[1], node, mode=mode, features=features) - elif node.type == syms.testlist_gexp: - for child in node.children: - if isinstance(child, Node): - remove_with_parens(child, node, mode=mode, features=features) - elif node.type == syms.asexpr_test and not any( - leaf.type == token.COLONEQUAL for leaf in node.leaves() - ): - if maybe_make_parens_invisible_in_atom( - node.children[0], - parent=node, - mode=mode, - features=features, - remove_brackets_around_comma=True, - ): - wrap_in_parentheses(node, node.children[0], visible=False) - - -def _atom_has_magic_trailing_comma(node: LN, mode: Mode) -> bool: - """Check if an atom node has a magic trailing comma. - - Returns True for single-element tuples with trailing commas like (a,), - which should be preserved to maintain their tuple type. - """ - if not mode.magic_trailing_comma: - return False - - return is_one_tuple(node) - - -def _is_atom_multiline(node: LN) -> bool: - """Check if an atom node is multiline (indicating intentional formatting).""" - if not isinstance(node, Node) or len(node.children) < 3: - return False - - # Check the middle child (between LPAR and RPAR) for newlines in its subtree - # The first child's prefix contains blank lines/comments before the opening paren - middle = node.children[1] - for child in middle.pre_order(): - if isinstance(child, Leaf) and "\n" in child.prefix: - return True - - return False - - -def maybe_make_parens_invisible_in_atom( - node: LN, - parent: LN, - mode: Mode, - features: Collection[Feature], - remove_brackets_around_comma: bool = False, - allow_star_expr: bool = False, -) -> bool: - """If it's safe, make the parens in the atom `node` invisible, recursively. - Additionally, remove repeated, adjacent invisible parens from the atom `node` - as they are redundant. - - Returns whether the node should itself be wrapped in invisible parentheses. - """ - if ( - node.type not in (syms.atom, syms.expr) - or is_empty_tuple(node) - or is_one_tuple(node) - or (is_tuple(node) and parent.type == syms.asexpr_test) - or ( - is_tuple(node) - and parent.type == syms.with_stmt - and has_sibling_with_type(node, token.COMMA) - ) - or (is_yield(node) and parent.type != syms.expr_stmt) - or ( - # This condition tries to prevent removing non-optional brackets - # around a tuple, however, can be a bit overzealous so we provide - # and option to skip this check for `for` and `with` statements. - not remove_brackets_around_comma - and max_delimiter_priority_in_atom(node) >= COMMA_PRIORITY - # Remove parentheses around multiple exception types in except and - # except* without as. See PEP 758 for details. - and not ( - Feature.UNPARENTHESIZED_EXCEPT_TYPES in features - # is a tuple - and is_tuple(node) - # has a parent node - and node.parent is not None - # parent is an except clause - and node.parent.type == syms.except_clause - # is not immediately followed by as clause - and not ( - node.next_sibling is not None - and is_name_token(node.next_sibling) - and node.next_sibling.value == "as" - ) - ) - ) - or is_tuple_containing_walrus(node) - or (not allow_star_expr and is_tuple_containing_star(node)) - or is_generator(node) - ): - return False - - if is_walrus_assignment(node): - if parent.type in [ - syms.annassign, - syms.expr_stmt, - syms.assert_stmt, - syms.return_stmt, - syms.except_clause, - syms.funcdef, - syms.with_stmt, - syms.testlist_gexp, - syms.tname, - # these ones aren't useful to end users, but they do please fuzzers - syms.for_stmt, - syms.del_stmt, - syms.for_stmt, - ]: - return False - - first = node.children[0] - last = node.children[-1] - if is_lpar_token(first) and is_rpar_token(last): - middle = node.children[1] - # make parentheses invisible - if ( - # If the prefix of `middle` includes a type comment with - # ignore annotation, then we do not remove the parentheses - not is_type_ignore_comment_string(middle.prefix.strip(), mode=mode) - ): - first.value = "" - last.value = "" - maybe_make_parens_invisible_in_atom( - middle, - parent=parent, - mode=mode, - features=features, - remove_brackets_around_comma=remove_brackets_around_comma, - ) - - if is_atom_with_invisible_parens(middle): - # Strip the invisible parens from `middle` by replacing - # it with the child in-between the invisible parens - middle.replace(middle.children[1]) - - if middle.children[0].prefix.strip(): - # Preserve comments before first paren - middle.children[1].prefix = ( - middle.children[0].prefix + middle.children[1].prefix - ) - - if middle.children[-1].prefix.strip(): - # Preserve comments before last paren - last.prefix = middle.children[-1].prefix + last.prefix - - return False - - return True - - -def should_split_line(line: Line, opening_bracket: Leaf) -> bool: - """Should `line` be immediately split with `delimiter_split()` after RHS?""" - - if not (opening_bracket.parent and opening_bracket.value in "[{("): - return False - - # We're essentially checking if the body is delimited by commas and there's more - # than one of them (we're excluding the trailing comma and if the delimiter priority - # is still commas, that means there's more). - exclude = set() - trailing_comma = False - try: - last_leaf = line.leaves[-1] - if last_leaf.type == token.COMMA: - trailing_comma = True - exclude.add(id(last_leaf)) - max_priority = line.bracket_tracker.max_delimiter_priority(exclude=exclude) - except (IndexError, ValueError): - return False - - return max_priority == COMMA_PRIORITY and ( - (line.mode.magic_trailing_comma and trailing_comma) - # always explode imports - or opening_bracket.parent.type in {syms.atom, syms.import_from} - ) - - -def generate_trailers_to_omit(line: Line, line_length: int) -> Iterator[set[LeafID]]: - """Generate sets of closing bracket IDs that should be omitted in a RHS. - - Brackets can be omitted if the entire trailer up to and including - a preceding closing bracket fits in one line. - - Yielded sets are cumulative (contain results of previous yields, too). First - set is empty, unless the line should explode, in which case bracket pairs until - the one that needs to explode are omitted. - """ - - omit: set[LeafID] = set() - if not line.magic_trailing_comma: - yield omit - - length = 4 * line.depth - opening_bracket: Leaf | None = None - closing_bracket: Leaf | None = None - inner_brackets: set[LeafID] = set() - for index, leaf, leaf_length in line.enumerate_with_length(is_reversed=True): - length += leaf_length - if length > line_length: - break - - has_inline_comment = leaf_length > len(leaf.value) + len(leaf.prefix) - if leaf.type == STANDALONE_COMMENT or has_inline_comment: - break - - if opening_bracket: - if leaf is opening_bracket: - opening_bracket = None - elif leaf.type in CLOSING_BRACKETS: - prev = line.leaves[index - 1] if index > 0 else None - if ( - prev - and prev.type == token.COMMA - and leaf.opening_bracket is not None - and not is_one_sequence_between( - leaf.opening_bracket, leaf, line.leaves - ) - ): - # Never omit bracket pairs with trailing commas. - # We need to explode on those. - break - - inner_brackets.add(id(leaf)) - elif leaf.type in CLOSING_BRACKETS: - prev = line.leaves[index - 1] if index > 0 else None - if prev and prev.type in OPENING_BRACKETS: - # Empty brackets would fail a split so treat them as "inner" - # brackets (e.g. only add them to the `omit` set if another - # pair of brackets was good enough. - inner_brackets.add(id(leaf)) - continue - - if closing_bracket: - omit.add(id(closing_bracket)) - omit.update(inner_brackets) - inner_brackets.clear() - yield omit - - if ( - prev - and prev.type == token.COMMA - and leaf.opening_bracket is not None - and not is_one_sequence_between(leaf.opening_bracket, leaf, line.leaves) - ): - # Never omit bracket pairs with trailing commas. - # We need to explode on those. - break - - if leaf.value: - opening_bracket = leaf.opening_bracket - closing_bracket = leaf - - -def run_transformer( - line: Line, - transform: Transformer, - mode: Mode, - features: Collection[Feature], - *, - line_str: str = "", -) -> list[Line]: - if not line_str: - line_str = line_to_string(line) - result: list[Line] = [] - for transformed_line in transform(line, features, mode): - if str(transformed_line).strip("\n") == line_str: - raise CannotTransform("Line transformer returned an unchanged result") - - result.extend(transform_line(transformed_line, mode=mode, features=features)) - - features_set = set(features) - if ( - Feature.FORCE_OPTIONAL_PARENTHESES in features_set - or transform.__class__.__name__ != "rhs" - or not line.bracket_tracker.invisible - or any(bracket.value for bracket in line.bracket_tracker.invisible) - or line.contains_multiline_strings() - or result[0].contains_uncollapsable_type_comments() - or result[0].contains_unsplittable_type_ignore() - or is_line_short_enough(result[0], mode=mode) - # If any leaves have no parents (which _can_ occur since - # `transform(line)` potentially destroys the line's underlying node - # structure), then we can't proceed. Doing so would cause the below - # call to `append_leaves()` to fail. - or any(leaf.parent is None for leaf in line.leaves) - ): - return result - - line_copy = line.clone() - append_leaves(line_copy, line, line.leaves) - features_fop = features_set | {Feature.FORCE_OPTIONAL_PARENTHESES} - second_opinion = run_transformer( - line_copy, transform, mode, features_fop, line_str=line_str - ) - if all(is_line_short_enough(ln, mode=mode) for ln in second_opinion): - result = second_opinion - return result diff --git a/venv/lib/python3.12/site-packages/black/lines.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/black/lines.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 6875fa4..0000000 Binary files a/venv/lib/python3.12/site-packages/black/lines.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/lines.py b/venv/lib/python3.12/site-packages/black/lines.py deleted file mode 100644 index 3c7b6bb..0000000 --- a/venv/lib/python3.12/site-packages/black/lines.py +++ /dev/null @@ -1,1121 +0,0 @@ -import itertools -import math -from collections.abc import Callable, Iterator, Sequence -from dataclasses import dataclass, field -from typing import Optional, TypeVar, Union, cast - -from black.brackets import COMMA_PRIORITY, DOT_PRIORITY, BracketTracker -from black.mode import Mode -from black.nodes import ( - BRACKETS, - CLOSING_BRACKETS, - OPENING_BRACKETS, - STANDALONE_COMMENT, - TEST_DESCENDANTS, - child_towards, - is_docstring, - is_import, - is_multiline_string, - is_one_sequence_between, - is_type_comment, - is_type_ignore_comment, - is_with_or_async_with_stmt, - make_simple_prefix, - replace_child, - syms, - whitespace, -) -from black.strings import str_width -from blib2to3.pgen2 import token -from blib2to3.pytree import Leaf, Node - -# types -T = TypeVar("T") -Index = int -LeafID = int -LN = Union[Leaf, Node] - - -@dataclass -class Line: - """Holds leaves and comments. Can be printed with `str(line)`.""" - - mode: Mode = field(repr=False) - depth: int = 0 - leaves: list[Leaf] = field(default_factory=list) - # keys ordered like `leaves` - comments: dict[LeafID, list[Leaf]] = field(default_factory=dict) - bracket_tracker: BracketTracker = field(default_factory=BracketTracker) - inside_brackets: bool = False - should_split_rhs: bool = False - magic_trailing_comma: Leaf | None = None - - def append( - self, leaf: Leaf, preformatted: bool = False, track_bracket: bool = False - ) -> None: - """Add a new `leaf` to the end of the line. - - Unless `preformatted` is True, the `leaf` will receive a new consistent - whitespace prefix and metadata applied by :class:`BracketTracker`. - Trailing commas are maybe removed, unpacked for loop variables are - demoted from being delimiters. - - Inline comments are put aside. - """ - has_value = ( - leaf.type in BRACKETS - # empty fstring and tstring middles must not be truncated - or leaf.type in (token.FSTRING_MIDDLE, token.TSTRING_MIDDLE) - or bool(leaf.value.strip()) - ) - if not has_value: - return - - if leaf.type == token.COLON and self.is_class_paren_empty: - del self.leaves[-2:] - if self.leaves and not preformatted: - # Note: at this point leaf.prefix should be empty except for - # imports, for which we only preserve newlines. - leaf.prefix += whitespace( - leaf, - complex_subscript=self.is_complex_subscript(leaf), - mode=self.mode, - ) - if self.inside_brackets or not preformatted or track_bracket: - self.bracket_tracker.mark(leaf) - if self.mode.magic_trailing_comma: - if self.has_magic_trailing_comma(leaf): - self.magic_trailing_comma = leaf - elif self.has_magic_trailing_comma(leaf): - self.remove_trailing_comma() - if not self.append_comment(leaf): - self.leaves.append(leaf) - - def append_safe(self, leaf: Leaf, preformatted: bool = False) -> None: - """Like :func:`append()` but disallow invalid standalone comment structure. - - Raises ValueError when any `leaf` is appended after a standalone comment - or when a standalone comment is not the first leaf on the line. - """ - if ( - self.bracket_tracker.depth == 0 - or self.bracket_tracker.any_open_for_or_lambda() - ): - if self.is_comment: - raise ValueError("cannot append to standalone comments") - - if self.leaves and leaf.type == STANDALONE_COMMENT: - raise ValueError( - "cannot append standalone comments to a populated line" - ) - - self.append(leaf, preformatted=preformatted) - - @property - def is_comment(self) -> bool: - """Is this line a standalone comment?""" - return len(self.leaves) == 1 and self.leaves[0].type == STANDALONE_COMMENT - - @property - def is_decorator(self) -> bool: - """Is this line a decorator?""" - return bool(self) and self.leaves[0].type == token.AT - - @property - def is_import(self) -> bool: - """Is this an import line?""" - return bool(self) and is_import(self.leaves[0]) - - @property - def is_with_or_async_with_stmt(self) -> bool: - """Is this a with_stmt line?""" - return bool(self) and is_with_or_async_with_stmt(self.leaves[0]) - - @property - def is_class(self) -> bool: - """Is this line a class definition?""" - return ( - bool(self) - and self.leaves[0].type == token.NAME - and self.leaves[0].value == "class" - ) - - @property - def is_stub_class(self) -> bool: - """Is this line a class definition with a body consisting only of "..."?""" - return self.is_class and self.leaves[-3:] == [ - Leaf(token.DOT, ".") for _ in range(3) - ] - - @property - def is_def(self) -> bool: - """Is this a function definition? (Also returns True for async defs.)""" - try: - first_leaf = self.leaves[0] - except IndexError: - return False - - try: - second_leaf: Leaf | None = self.leaves[1] - except IndexError: - second_leaf = None - return (first_leaf.type == token.NAME and first_leaf.value == "def") or ( - first_leaf.type == token.ASYNC - and second_leaf is not None - and second_leaf.type == token.NAME - and second_leaf.value == "def" - ) - - @property - def is_stub_def(self) -> bool: - """Is this line a function definition with a body consisting only of "..."?""" - return self.is_def and self.leaves[-4:] == [Leaf(token.COLON, ":")] + [ - Leaf(token.DOT, ".") for _ in range(3) - ] - - @property - def is_class_paren_empty(self) -> bool: - """Is this a class with no base classes but using parentheses? - - Those are unnecessary and should be removed. - """ - return ( - bool(self) - and len(self.leaves) == 4 - and self.is_class - and self.leaves[2].type == token.LPAR - and self.leaves[2].value == "(" - and self.leaves[3].type == token.RPAR - and self.leaves[3].value == ")" - ) - - @property - def _is_triple_quoted_string(self) -> bool: - """Is the line a triple quoted string?""" - if not self or self.leaves[0].type != token.STRING: - return False - value = self.leaves[0].value - if value.startswith(('"""', "'''")): - return True - if value.startswith(("r'''", 'r"""', "R'''", 'R"""')): - return True - return False - - @property - def is_docstring(self) -> bool: - """Is the line a docstring?""" - return bool(self) and is_docstring(self.leaves[0]) - - @property - def is_chained_assignment(self) -> bool: - """Is the line a chained assignment""" - return [leaf.type for leaf in self.leaves].count(token.EQUAL) > 1 - - @property - def opens_block(self) -> bool: - """Does this line open a new level of indentation.""" - if len(self.leaves) == 0: - return False - return self.leaves[-1].type == token.COLON - - def is_fmt_pass_converted( - self, *, first_leaf_matches: Callable[[Leaf], bool] | None = None - ) -> bool: - """Is this line converted from fmt off/skip code? - - If first_leaf_matches is not None, it only returns True if the first - leaf of converted code matches. - """ - if len(self.leaves) != 1: - return False - leaf = self.leaves[0] - if ( - leaf.type != STANDALONE_COMMENT - or leaf.fmt_pass_converted_first_leaf is None - ): - return False - return first_leaf_matches is None or first_leaf_matches( - leaf.fmt_pass_converted_first_leaf - ) - - def contains_standalone_comments(self) -> bool: - """If so, needs to be split before emitting.""" - for leaf in self.leaves: - if leaf.type == STANDALONE_COMMENT: - return True - - return False - - def contains_implicit_multiline_string_with_comments(self) -> bool: - """Chck if we have an implicit multiline string with comments on the line""" - for leaf_type, leaf_group_iterator in itertools.groupby( - self.leaves, lambda leaf: leaf.type - ): - if leaf_type != token.STRING: - continue - leaf_list = list(leaf_group_iterator) - if len(leaf_list) == 1: - continue - for leaf in leaf_list: - if self.comments_after(leaf): - return True - return False - - def contains_uncollapsable_type_comments(self) -> bool: - ignored_ids = set() - try: - last_leaf = self.leaves[-1] - ignored_ids.add(id(last_leaf)) - if last_leaf.type == token.COMMA or ( - last_leaf.type == token.RPAR and not last_leaf.value - ): - # When trailing commas or optional parens are inserted by Black for - # consistency, comments after the previous last element are not moved - # (they don't have to, rendering will still be correct). So we ignore - # trailing commas and invisible. - last_leaf = self.leaves[-2] - ignored_ids.add(id(last_leaf)) - except IndexError: - return False - - # A type comment is uncollapsable if it is attached to a leaf - # that isn't at the end of the line (since that could cause it - # to get associated to a different argument) or if there are - # comments before it (since that could cause it to get hidden - # behind a comment. - comment_seen = False - for leaf_id, comments in self.comments.items(): - for comment in comments: - if is_type_comment(comment, mode=self.mode): - if comment_seen or ( - not is_type_ignore_comment(comment, mode=self.mode) - and leaf_id not in ignored_ids - ): - return True - - comment_seen = True - - return False - - def contains_unsplittable_type_ignore(self) -> bool: - if not self.leaves: - return False - - # If a 'type: ignore' is attached to the end of a line, we - # can't split the line, because we can't know which of the - # subexpressions the ignore was meant to apply to. - # - # We only want this to apply to actual physical lines from the - # original source, though: we don't want the presence of a - # 'type: ignore' at the end of a multiline expression to - # justify pushing it all onto one line. Thus we - # (unfortunately) need to check the actual source lines and - # only report an unsplittable 'type: ignore' if this line was - # one line in the original code. - - # Grab the first and last line numbers, skipping generated leaves - first_line = next((leaf.lineno for leaf in self.leaves if leaf.lineno != 0), 0) - last_line = next( - (leaf.lineno for leaf in reversed(self.leaves) if leaf.lineno != 0), 0 - ) - - if first_line == last_line: - # We look at the last two leaves since a comma or an - # invisible paren could have been added at the end of the - # line. - for node in self.leaves[-2:]: - for comment in self.comments.get(id(node), []): - if is_type_ignore_comment(comment, mode=self.mode): - return True - - return False - - def contains_multiline_strings(self) -> bool: - return any(is_multiline_string(leaf) for leaf in self.leaves) - - def has_magic_trailing_comma(self, closing: Leaf) -> bool: - """Return True if we have a magic trailing comma, that is when: - - there's a trailing comma here - - it's not from single-element square bracket indexing - - it's not a one-tuple - """ - if not ( - closing.type in CLOSING_BRACKETS - and self.leaves - and self.leaves[-1].type == token.COMMA - ): - return False - - if closing.type == token.RBRACE: - return True - - if closing.type == token.RSQB: - if ( - closing.parent is not None - and closing.parent.type == syms.trailer - and closing.opening_bracket is not None - and is_one_sequence_between( - closing.opening_bracket, - closing, - self.leaves, - brackets=(token.LSQB, token.RSQB), - ) - ): - assert closing.prev_sibling is not None - assert closing.prev_sibling.type == syms.subscriptlist - return False - - return True - - if self.is_import: - return True - - if closing.opening_bracket is not None and not is_one_sequence_between( - closing.opening_bracket, closing, self.leaves - ): - return True - - return False - - def append_comment(self, comment: Leaf) -> bool: - """Add an inline or standalone comment to the line.""" - if ( - comment.type == STANDALONE_COMMENT - and self.bracket_tracker.any_open_brackets() - ): - comment.prefix = "" - return False - - if comment.type != token.COMMENT: - return False - - if not self.leaves: - comment.type = STANDALONE_COMMENT - comment.prefix = "" - return False - - last_leaf = self.leaves[-1] - if ( - last_leaf.type == token.RPAR - and not last_leaf.value - and last_leaf.parent - and len(list(last_leaf.parent.leaves())) <= 3 - and not is_type_comment(comment, mode=self.mode) - ): - # Comments on an optional parens wrapping a single leaf should belong to - # the wrapped node except if it's a type comment. Pinning the comment like - # this avoids unstable formatting caused by comment migration. - if len(self.leaves) < 2: - comment.type = STANDALONE_COMMENT - comment.prefix = "" - return False - - last_leaf = self.leaves[-2] - self.comments.setdefault(id(last_leaf), []).append(comment) - return True - - def comments_after(self, leaf: Leaf) -> list[Leaf]: - """Generate comments that should appear directly after `leaf`.""" - return self.comments.get(id(leaf), []) - - def remove_trailing_comma(self) -> None: - """Remove the trailing comma and moves the comments attached to it.""" - trailing_comma = self.leaves.pop() - trailing_comma_comments = self.comments.pop(id(trailing_comma), []) - self.comments.setdefault(id(self.leaves[-1]), []).extend( - trailing_comma_comments - ) - - def is_complex_subscript(self, leaf: Leaf) -> bool: - """Return True iff `leaf` is part of a slice with non-trivial exprs.""" - open_lsqb = self.bracket_tracker.get_open_lsqb() - if open_lsqb is None: - return False - - subscript_start = open_lsqb.next_sibling - - if isinstance(subscript_start, Node): - if subscript_start.type == syms.listmaker: - return False - - if subscript_start.type == syms.subscriptlist: - subscript_start = child_towards(subscript_start, leaf) - - return subscript_start is not None and any( - n.type in TEST_DESCENDANTS for n in subscript_start.pre_order() - ) - - def enumerate_with_length( - self, is_reversed: bool = False - ) -> Iterator[tuple[Index, Leaf, int]]: - """Return an enumeration of leaves with their length. - - Stops prematurely on multiline strings and standalone comments. - """ - op = cast( - Callable[[Sequence[Leaf]], Iterator[tuple[Index, Leaf]]], - enumerate_reversed if is_reversed else enumerate, - ) - for index, leaf in op(self.leaves): - length = len(leaf.prefix) + len(leaf.value) - if "\n" in leaf.value: - return # Multiline strings, we can't continue. - - for comment in self.comments_after(leaf): - length += len(comment.value) - - yield index, leaf, length - - def clone(self) -> "Line": - return Line( - mode=self.mode, - depth=self.depth, - inside_brackets=self.inside_brackets, - should_split_rhs=self.should_split_rhs, - magic_trailing_comma=self.magic_trailing_comma, - ) - - def __str__(self) -> str: - """Render the line.""" - if not self: - return "\n" - - indent = " " * self.depth - leaves = iter(self.leaves) - first = next(leaves) - res = f"{first.prefix}{indent}{first.value}" - res += "".join(str(leaf) for leaf in leaves) - comments_iter = itertools.chain.from_iterable(self.comments.values()) - comments = [str(comment) for comment in comments_iter] - res += "".join(comments) - - return res + "\n" - - def __bool__(self) -> bool: - """Return True if the line has leaves or comments.""" - return bool(self.leaves or self.comments) - - -@dataclass -class RHSResult: - """Intermediate split result from a right hand split.""" - - head: Line - body: Line - tail: Line - opening_bracket: Leaf - closing_bracket: Leaf - - -@dataclass -class LinesBlock: - """Class that holds information about a block of formatted lines. - - This is introduced so that the EmptyLineTracker can look behind the standalone - comments and adjust their empty lines for class or def lines. - """ - - mode: Mode - previous_block: Optional["LinesBlock"] - original_line: Line - before: int = 0 - content_lines: list[str] = field(default_factory=list) - after: int = 0 - form_feed: bool = False - - def all_lines(self) -> list[str]: - empty_line = str(Line(mode=self.mode)) - prefix = make_simple_prefix(self.before, self.form_feed, empty_line) - return [prefix] + self.content_lines + [empty_line * self.after] - - -@dataclass -class EmptyLineTracker: - """Provides a stateful method that returns the number of potential extra - empty lines needed before and after the currently processed line. - - Note: this tracker works on lines that haven't been split yet. It assumes - the prefix of the first leaf consists of optional newlines. Those newlines - are consumed by `maybe_empty_lines()` and included in the computation. - """ - - mode: Mode - previous_line: Line | None = None - previous_block: LinesBlock | None = None - previous_defs: list[Line] = field(default_factory=list) - semantic_leading_comment: LinesBlock | None = None - - def maybe_empty_lines(self, current_line: Line) -> LinesBlock: - """Return the number of extra empty lines before and after the `current_line`. - - This is for separating `def`, `async def` and `class` with extra empty - lines (two on module-level). - """ - form_feed = ( - current_line.depth == 0 - and bool(current_line.leaves) - and "\f\n" in current_line.leaves[0].prefix - ) - before, after = self._maybe_empty_lines(current_line) - previous_after = self.previous_block.after if self.previous_block else 0 - before = max(0, before - previous_after) - - # Always have one empty line after a module docstring - if self._line_is_module_docstring(current_line): - before = 1 - - block = LinesBlock( - mode=self.mode, - previous_block=self.previous_block, - original_line=current_line, - before=before, - after=after, - form_feed=form_feed, - ) - - # Maintain the semantic_leading_comment state. - if current_line.is_comment: - if self.previous_line is None or ( - not self.previous_line.is_decorator - # `or before` means this comment already has an empty line before - and (not self.previous_line.is_comment or before) - and (self.semantic_leading_comment is None or before) - ): - self.semantic_leading_comment = block - # `or before` means this decorator already has an empty line before - elif not current_line.is_decorator or before: - self.semantic_leading_comment = None - - self.previous_line = current_line - self.previous_block = block - return block - - def _line_is_module_docstring(self, current_line: Line) -> bool: - previous_block = self.previous_block - if not previous_block: - return False - if ( - len(previous_block.original_line.leaves) != 1 - or not previous_block.original_line.is_docstring - or current_line.is_class - or current_line.is_def - ): - return False - while previous_block := previous_block.previous_block: - if not previous_block.original_line.is_comment: - return False - return True - - def _maybe_empty_lines(self, current_line: Line) -> tuple[int, int]: - max_allowed = 1 - if current_line.depth == 0: - max_allowed = 1 if self.mode.is_pyi else 2 - - if current_line.leaves: - # Consume the first leaf's extra newlines. - first_leaf = current_line.leaves[0] - before = first_leaf.prefix.count("\n") - before = min(before, max_allowed) - first_leaf.prefix = "" - else: - before = 0 - - user_had_newline = bool(before) - depth = current_line.depth - - # Mutate self.previous_defs, remainder of this function should be pure - previous_def = None - while self.previous_defs and self.previous_defs[-1].depth >= depth: - previous_def = self.previous_defs.pop() - if current_line.is_def or current_line.is_class: - self.previous_defs.append(current_line) - - if self.previous_line is None: - # Don't insert empty lines before the first line in the file. - return 0, 0 - - if current_line.is_docstring: - if self.previous_line.is_class: - return 0, 1 - if self.previous_line.opens_block and self.previous_line.is_def: - return 0, 0 - - if previous_def is not None: - assert self.previous_line is not None - if self.mode.is_pyi: - if previous_def.is_class and not previous_def.is_stub_class: - before = 1 - elif depth and not current_line.is_def and self.previous_line.is_def: - # Empty lines between attributes and methods should be preserved. - before = 1 if user_had_newline else 0 - elif depth: - before = 0 - else: - before = 1 - else: - if depth: - before = 1 - elif ( - not depth - and previous_def.depth - and current_line.leaves[-1].type == token.COLON - and ( - current_line.leaves[0].value - not in ("with", "try", "for", "while", "if", "match") - ) - ): - # We shouldn't add two newlines between an indented function and - # a dependent non-indented clause. This is to avoid issues with - # conditional function definitions that are technically top-level - # and therefore get two trailing newlines, but look weird and - # inconsistent when they're followed by elif, else, etc. This is - # worse because these functions only get *one* preceding newline - # already. - before = 1 - else: - before = 2 - - if current_line.is_decorator or current_line.is_def or current_line.is_class: - return self._maybe_empty_lines_for_class_or_def( - current_line, before, user_had_newline - ) - - if ( - self.previous_line.is_import - and self.previous_line.depth == 0 - and current_line.depth == 0 - and not current_line.is_import - and not current_line.is_fmt_pass_converted(first_leaf_matches=is_import) - ): - return 1, 0 - - if ( - self.previous_line.is_import - and not current_line.is_import - and not current_line.is_fmt_pass_converted(first_leaf_matches=is_import) - and depth == self.previous_line.depth - ): - return (before or 1), 0 - - return before, 0 - - def _maybe_empty_lines_for_class_or_def( - self, current_line: Line, before: int, user_had_newline: bool - ) -> tuple[int, int]: - assert self.previous_line is not None - - if self.previous_line.is_decorator: - if self.mode.is_pyi and current_line.is_stub_class: - # Insert an empty line after a decorated stub class - return 0, 1 - return 0, 0 - - if self.previous_line.depth < current_line.depth and ( - self.previous_line.is_class or self.previous_line.is_def - ): - if self.mode.is_pyi: - return 0, 0 - return 1 if user_had_newline else 0, 0 - - comment_to_add_newlines: LinesBlock | None = None - if ( - self.previous_line.is_comment - and self.previous_line.depth == current_line.depth - and before == 0 - ): - slc = self.semantic_leading_comment - if ( - slc is not None - and slc.previous_block is not None - and not slc.previous_block.original_line.is_class - and not slc.previous_block.original_line.opens_block - and slc.before <= 1 - ): - comment_to_add_newlines = slc - else: - return 0, 0 - - if self.mode.is_pyi: - if current_line.is_class or self.previous_line.is_class: - if self.previous_line.depth < current_line.depth: - newlines = 0 - elif self.previous_line.depth > current_line.depth: - newlines = 1 - elif current_line.is_stub_class and self.previous_line.is_stub_class: - # No blank line between classes with an empty body - newlines = 0 - else: - newlines = 1 - # Don't inspect the previous line if it's part of the body of the previous - # statement in the same level, we always want a blank line if there's - # something with a body preceding. - elif self.previous_line.depth > current_line.depth: - newlines = 1 - elif ( - current_line.is_def or current_line.is_decorator - ) and not self.previous_line.is_def: - if current_line.depth: - # In classes empty lines between attributes and methods should - # be preserved. - newlines = min(1, before) - else: - # Blank line between a block of functions (maybe with preceding - # decorators) and a block of non-functions - newlines = 1 - else: - newlines = 0 - else: - newlines = 1 if current_line.depth else 2 - # If a user has left no space after a dummy implementation, don't insert - # new lines. This is useful for instance for @overload or Protocols. - if self.previous_line.is_stub_def and not user_had_newline: - newlines = 0 - if comment_to_add_newlines is not None: - previous_block = comment_to_add_newlines.previous_block - if previous_block is not None: - comment_to_add_newlines.before = ( - max(comment_to_add_newlines.before, newlines) - previous_block.after - ) - newlines = 0 - return newlines, 0 - - -def enumerate_reversed(sequence: Sequence[T]) -> Iterator[tuple[Index, T]]: - """Like `reversed(enumerate(sequence))` if that were possible.""" - index = len(sequence) - 1 - for element in reversed(sequence): - yield (index, element) - index -= 1 - - -def append_leaves( - new_line: Line, old_line: Line, leaves: list[Leaf], preformatted: bool = False -) -> None: - """ - Append leaves (taken from @old_line) to @new_line, making sure to fix the - underlying Node structure where appropriate. - - All of the leaves in @leaves are duplicated. The duplicates are then - appended to @new_line and used to replace their originals in the underlying - Node structure. Any comments attached to the old leaves are reattached to - the new leaves. - - Pre-conditions: - set(@leaves) is a subset of set(@old_line.leaves). - """ - for old_leaf in leaves: - new_leaf = Leaf(old_leaf.type, old_leaf.value) - replace_child(old_leaf, new_leaf) - new_line.append(new_leaf, preformatted=preformatted) - - for comment_leaf in old_line.comments_after(old_leaf): - new_line.append(comment_leaf, preformatted=True) - - -def is_line_short_enough(line: Line, *, mode: Mode, line_str: str = "") -> bool: - """For non-multiline strings, return True if `line` is no longer than `line_length`. - For multiline strings, looks at the context around `line` to determine - if it should be inlined or split up. - Uses the provided `line_str` rendering, if any, otherwise computes a new one. - """ - if not line_str: - line_str = line_to_string(line) - - if line.contains_standalone_comments(): - return False - if "\n" not in line_str: - # No multiline strings (MLS) present - return str_width(line_str) <= mode.line_length - - first, *_, last = line_str.split("\n") - if str_width(first) > mode.line_length or str_width(last) > mode.line_length: - return False - - # Traverse the AST to examine the context of the multiline string (MLS), - # tracking aspects such as depth and comma existence, - # to determine whether to split the MLS or keep it together. - # Depth (which is based on the existing bracket_depth concept) - # is needed to determine nesting level of the MLS. - # Includes special case for trailing commas. - commas: list[int] = [] # tracks number of commas per depth level - multiline_string: Leaf | None = None - # store the leaves that contain parts of the MLS - multiline_string_contexts: list[LN] = [] - - max_level_to_update: int | float = math.inf # track the depth of the MLS - for i, leaf in enumerate(line.leaves): - if max_level_to_update == math.inf: - had_comma: int | None = None - if leaf.bracket_depth + 1 > len(commas): - commas.append(0) - elif leaf.bracket_depth + 1 < len(commas): - had_comma = commas.pop() - if ( - had_comma is not None - and multiline_string is not None - and multiline_string.bracket_depth == leaf.bracket_depth + 1 - ): - # Have left the level with the MLS, stop tracking commas - max_level_to_update = leaf.bracket_depth - if had_comma > 0: - # MLS was in parens with at least one comma - force split - return False - - if leaf.bracket_depth <= max_level_to_update and leaf.type == token.COMMA: - # Inside brackets, ignore trailing comma - # directly after MLS/MLS-containing expression - ignore_ctxs: list[LN | None] = [None] - ignore_ctxs += multiline_string_contexts - if (line.inside_brackets or leaf.bracket_depth > 0) and ( - i != len(line.leaves) - 1 or leaf.prev_sibling not in ignore_ctxs - ): - commas[leaf.bracket_depth] += 1 - if max_level_to_update != math.inf: - max_level_to_update = min(max_level_to_update, leaf.bracket_depth) - - if is_multiline_string(leaf): - if leaf.parent and ( - leaf.parent.type == syms.test - or (leaf.parent.parent and leaf.parent.parent.type == syms.dictsetmaker) - ): - # Keep ternary and dictionary values parenthesized - return False - if len(multiline_string_contexts) > 0: - # >1 multiline string cannot fit on a single line - force split - return False - multiline_string = leaf - ctx: LN = leaf - # fetch the leaf components of the MLS in the AST - while str(ctx) in line_str: - multiline_string_contexts.append(ctx) - if ctx.parent is None: - break - ctx = ctx.parent - - # May not have a triple-quoted multiline string at all, - # in case of a regular string with embedded newlines and line continuations - if len(multiline_string_contexts) == 0: - return True - - return all(val == 0 for val in commas) - - -def can_be_split(line: Line) -> bool: - """Return False if the line cannot be split *for sure*. - - This is not an exhaustive search but a cheap heuristic that we can use to - avoid some unfortunate formattings (mostly around wrapping unsplittable code - in unnecessary parentheses). - """ - leaves = line.leaves - if len(leaves) < 2: - return False - - if leaves[0].type == token.STRING and leaves[1].type == token.DOT: - call_count = 0 - dot_count = 0 - next = leaves[-1] - for leaf in leaves[-2::-1]: - if leaf.type in OPENING_BRACKETS: - if next.type not in CLOSING_BRACKETS: - return False - - call_count += 1 - elif leaf.type == token.DOT: - dot_count += 1 - elif leaf.type == token.NAME: - if not (next.type == token.DOT or next.type in OPENING_BRACKETS): - return False - - elif leaf.type not in CLOSING_BRACKETS: - return False - - if dot_count > 1 and call_count > 1: - return False - - return True - - -def can_omit_invisible_parens( - rhs: RHSResult, - line_length: int, -) -> bool: - """Does `rhs.body` have a shape safe to reformat without optional parens around it? - - Returns True for only a subset of potentially nice looking formattings but - the point is to not return false positives that end up producing lines that - are too long. - """ - line = rhs.body - - # We can't omit parens if doing so would result in a type: ignore comment - # sharing a line with other comments, as that breaks type: ignore parsing. - # Check if the opening bracket (last leaf of head) has comments that would merge - # with comments from the first line of the body. - if rhs.head.leaves: - opening_bracket = rhs.head.leaves[-1] - head_comments = rhs.head.comments.get(id(opening_bracket), []) - - # If there are comments on the opening bracket line, check if any would - # conflict with type: ignore comments in the body - if head_comments: - has_type_ignore_in_head = any( - is_type_ignore_comment(comment, mode=rhs.head.mode) - for comment in head_comments - ) - has_other_comment_in_head = any( - not is_type_ignore_comment(comment, mode=rhs.head.mode) - for comment in head_comments - ) - - # Check for comments in the body that would potentially end up on the - # same line as the head comments when parens are removed - has_type_ignore_in_body = False - has_other_comment_in_body = False - for leaf in rhs.body.leaves: - for comment in rhs.body.comments.get(id(leaf), []): - if is_type_ignore_comment(comment, mode=rhs.body.mode): - has_type_ignore_in_body = True - else: - has_other_comment_in_body = True - - # Preserve parens if we have both type: ignore and other comments that - # could end up on the same line - if (has_type_ignore_in_head and has_other_comment_in_body) or ( - has_other_comment_in_head and has_type_ignore_in_body - ): - return False - - # We need optional parens in order to split standalone comments to their own lines - # if there are no nested parens around the standalone comments - closing_bracket: Leaf | None = None - for leaf in reversed(line.leaves): - if closing_bracket and leaf is closing_bracket.opening_bracket: - closing_bracket = None - if leaf.type == STANDALONE_COMMENT and not closing_bracket: - return False - if ( - not closing_bracket - and leaf.type in CLOSING_BRACKETS - and leaf.opening_bracket in line.leaves - and leaf.value - ): - closing_bracket = leaf - - bt = line.bracket_tracker - if not bt.delimiters: - # Without delimiters the optional parentheses are useless. - return True - - max_priority = bt.max_delimiter_priority() - delimiter_count = bt.delimiter_count_with_priority(max_priority) - if delimiter_count > 1: - # With more than one delimiter of a kind the optional parentheses read better. - return False - - if delimiter_count == 1: - if max_priority == COMMA_PRIORITY and rhs.head.is_with_or_async_with_stmt: - # For two context manager with statements, the optional parentheses read - # better. In this case, `rhs.body` is the context managers part of - # the with statement. `rhs.head` is the `with (` part on the previous - # line. - return False - # Otherwise it may also read better, but we don't do it today and requires - # careful considerations for all possible cases. See - # https://github.com/psf/black/issues/2156. - - if max_priority == DOT_PRIORITY: - # A single stranded method call doesn't require optional parentheses. - return True - - assert len(line.leaves) >= 2, "Stranded delimiter" - - # With a single delimiter, omit if the expression starts or ends with - # a bracket. - first = line.leaves[0] - second = line.leaves[1] - if first.type in OPENING_BRACKETS and second.type not in CLOSING_BRACKETS: - if _can_omit_opening_paren(line, first=first, line_length=line_length): - return True - - # Note: we are not returning False here because a line might have *both* - # a leading opening bracket and a trailing closing bracket. If the - # opening bracket doesn't match our rule, maybe the closing will. - - penultimate = line.leaves[-2] - last = line.leaves[-1] - - if ( - last.type == token.RPAR - or last.type == token.RBRACE - or ( - # don't use indexing for omitting optional parentheses; - # it looks weird - last.type == token.RSQB - and last.parent - and last.parent.type != syms.trailer - ) - ): - if penultimate.type in OPENING_BRACKETS: - # Empty brackets don't help. - return False - - if is_multiline_string(first): - # Additional wrapping of a multiline string in this situation is - # unnecessary. - return True - - if _can_omit_closing_paren(line, last=last, line_length=line_length): - return True - - return False - - -def _can_omit_opening_paren(line: Line, *, first: Leaf, line_length: int) -> bool: - """See `can_omit_invisible_parens`.""" - remainder = False - length = 4 * line.depth - _index = -1 - for _index, leaf, leaf_length in line.enumerate_with_length(): - if leaf.type in CLOSING_BRACKETS and leaf.opening_bracket is first: - remainder = True - if remainder: - length += leaf_length - if length > line_length: - break - - if leaf.type in OPENING_BRACKETS: - # There are brackets we can further split on. - remainder = False - - else: - # checked the entire string and line length wasn't exceeded - if len(line.leaves) == _index + 1: - return True - - return False - - -def _can_omit_closing_paren(line: Line, *, last: Leaf, line_length: int) -> bool: - """See `can_omit_invisible_parens`.""" - length = 4 * line.depth - seen_other_brackets = False - for _index, leaf, leaf_length in line.enumerate_with_length(): - length += leaf_length - if leaf is last.opening_bracket: - if seen_other_brackets or length <= line_length: - return True - - elif leaf.type in OPENING_BRACKETS: - # There are brackets we can further split on. - seen_other_brackets = True - - return False - - -def line_to_string(line: Line) -> str: - """Returns the string representation of @line. - - WARNING: This is known to be computationally expensive. - """ - return str(line).strip("\n") diff --git a/venv/lib/python3.12/site-packages/black/mode.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/black/mode.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 17091d3..0000000 Binary files a/venv/lib/python3.12/site-packages/black/mode.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/mode.py b/venv/lib/python3.12/site-packages/black/mode.py deleted file mode 100644 index 2ed82d5..0000000 --- a/venv/lib/python3.12/site-packages/black/mode.py +++ /dev/null @@ -1,321 +0,0 @@ -"""Data structures configuring Black behavior. - -Mostly around Python language feature support per version and Black configuration -chosen by the user. -""" - -from dataclasses import dataclass, field -from enum import Enum, auto -from hashlib import sha256 -from operator import attrgetter -from typing import Final - -from black.const import DEFAULT_LINE_LENGTH - - -class TargetVersion(Enum): - PY33 = 3 - PY34 = 4 - PY35 = 5 - PY36 = 6 - PY37 = 7 - PY38 = 8 - PY39 = 9 - PY310 = 10 - PY311 = 11 - PY312 = 12 - PY313 = 13 - PY314 = 14 - - def pretty(self) -> str: - assert self.name[:2] == "PY" - return f"Python {self.name[2]}.{self.name[3:]}" - - -class Feature(Enum): - F_STRINGS = 2 - NUMERIC_UNDERSCORES = 3 - TRAILING_COMMA_IN_CALL = 4 - TRAILING_COMMA_IN_DEF = 5 - # The following two feature-flags are mutually exclusive, and exactly one should be - # set for every version of python. - ASYNC_IDENTIFIERS = 6 - ASYNC_KEYWORDS = 7 - ASSIGNMENT_EXPRESSIONS = 8 - POS_ONLY_ARGUMENTS = 9 - RELAXED_DECORATORS = 10 - PATTERN_MATCHING = 11 - UNPACKING_ON_FLOW = 12 - ANN_ASSIGN_EXTENDED_RHS = 13 - EXCEPT_STAR = 14 - VARIADIC_GENERICS = 15 - DEBUG_F_STRINGS = 16 - PARENTHESIZED_CONTEXT_MANAGERS = 17 - TYPE_PARAMS = 18 - # FSTRING_PARSING = 19 # unused - TYPE_PARAM_DEFAULTS = 20 - UNPARENTHESIZED_EXCEPT_TYPES = 21 - T_STRINGS = 22 - FORCE_OPTIONAL_PARENTHESES = 50 - - # __future__ flags - FUTURE_ANNOTATIONS = 51 - - -FUTURE_FLAG_TO_FEATURE: Final = { - "annotations": Feature.FUTURE_ANNOTATIONS, -} - - -VERSION_TO_FEATURES: dict[TargetVersion, set[Feature]] = { - TargetVersion.PY33: {Feature.ASYNC_IDENTIFIERS}, - TargetVersion.PY34: {Feature.ASYNC_IDENTIFIERS}, - TargetVersion.PY35: {Feature.TRAILING_COMMA_IN_CALL, Feature.ASYNC_IDENTIFIERS}, - TargetVersion.PY36: { - Feature.F_STRINGS, - Feature.NUMERIC_UNDERSCORES, - Feature.TRAILING_COMMA_IN_CALL, - Feature.TRAILING_COMMA_IN_DEF, - Feature.ASYNC_IDENTIFIERS, - }, - TargetVersion.PY37: { - Feature.F_STRINGS, - Feature.NUMERIC_UNDERSCORES, - Feature.TRAILING_COMMA_IN_CALL, - Feature.TRAILING_COMMA_IN_DEF, - Feature.ASYNC_KEYWORDS, - Feature.FUTURE_ANNOTATIONS, - }, - TargetVersion.PY38: { - Feature.F_STRINGS, - Feature.DEBUG_F_STRINGS, - Feature.NUMERIC_UNDERSCORES, - Feature.TRAILING_COMMA_IN_CALL, - Feature.TRAILING_COMMA_IN_DEF, - Feature.ASYNC_KEYWORDS, - Feature.FUTURE_ANNOTATIONS, - Feature.ASSIGNMENT_EXPRESSIONS, - Feature.POS_ONLY_ARGUMENTS, - Feature.UNPACKING_ON_FLOW, - Feature.ANN_ASSIGN_EXTENDED_RHS, - }, - TargetVersion.PY39: { - Feature.F_STRINGS, - Feature.DEBUG_F_STRINGS, - Feature.NUMERIC_UNDERSCORES, - Feature.TRAILING_COMMA_IN_CALL, - Feature.TRAILING_COMMA_IN_DEF, - Feature.ASYNC_KEYWORDS, - Feature.FUTURE_ANNOTATIONS, - Feature.ASSIGNMENT_EXPRESSIONS, - Feature.RELAXED_DECORATORS, - Feature.POS_ONLY_ARGUMENTS, - Feature.UNPACKING_ON_FLOW, - Feature.ANN_ASSIGN_EXTENDED_RHS, - Feature.PARENTHESIZED_CONTEXT_MANAGERS, - }, - TargetVersion.PY310: { - Feature.F_STRINGS, - Feature.DEBUG_F_STRINGS, - Feature.NUMERIC_UNDERSCORES, - Feature.TRAILING_COMMA_IN_CALL, - Feature.TRAILING_COMMA_IN_DEF, - Feature.ASYNC_KEYWORDS, - Feature.FUTURE_ANNOTATIONS, - Feature.ASSIGNMENT_EXPRESSIONS, - Feature.RELAXED_DECORATORS, - Feature.POS_ONLY_ARGUMENTS, - Feature.UNPACKING_ON_FLOW, - Feature.ANN_ASSIGN_EXTENDED_RHS, - Feature.PARENTHESIZED_CONTEXT_MANAGERS, - Feature.PATTERN_MATCHING, - }, - TargetVersion.PY311: { - Feature.F_STRINGS, - Feature.DEBUG_F_STRINGS, - Feature.NUMERIC_UNDERSCORES, - Feature.TRAILING_COMMA_IN_CALL, - Feature.TRAILING_COMMA_IN_DEF, - Feature.ASYNC_KEYWORDS, - Feature.FUTURE_ANNOTATIONS, - Feature.ASSIGNMENT_EXPRESSIONS, - Feature.RELAXED_DECORATORS, - Feature.POS_ONLY_ARGUMENTS, - Feature.UNPACKING_ON_FLOW, - Feature.ANN_ASSIGN_EXTENDED_RHS, - Feature.PARENTHESIZED_CONTEXT_MANAGERS, - Feature.PATTERN_MATCHING, - Feature.EXCEPT_STAR, - Feature.VARIADIC_GENERICS, - }, - TargetVersion.PY312: { - Feature.F_STRINGS, - Feature.DEBUG_F_STRINGS, - Feature.NUMERIC_UNDERSCORES, - Feature.TRAILING_COMMA_IN_CALL, - Feature.TRAILING_COMMA_IN_DEF, - Feature.ASYNC_KEYWORDS, - Feature.FUTURE_ANNOTATIONS, - Feature.ASSIGNMENT_EXPRESSIONS, - Feature.RELAXED_DECORATORS, - Feature.POS_ONLY_ARGUMENTS, - Feature.UNPACKING_ON_FLOW, - Feature.ANN_ASSIGN_EXTENDED_RHS, - Feature.PARENTHESIZED_CONTEXT_MANAGERS, - Feature.PATTERN_MATCHING, - Feature.EXCEPT_STAR, - Feature.VARIADIC_GENERICS, - Feature.TYPE_PARAMS, - }, - TargetVersion.PY313: { - Feature.F_STRINGS, - Feature.DEBUG_F_STRINGS, - Feature.NUMERIC_UNDERSCORES, - Feature.TRAILING_COMMA_IN_CALL, - Feature.TRAILING_COMMA_IN_DEF, - Feature.ASYNC_KEYWORDS, - Feature.FUTURE_ANNOTATIONS, - Feature.ASSIGNMENT_EXPRESSIONS, - Feature.RELAXED_DECORATORS, - Feature.POS_ONLY_ARGUMENTS, - Feature.UNPACKING_ON_FLOW, - Feature.ANN_ASSIGN_EXTENDED_RHS, - Feature.PARENTHESIZED_CONTEXT_MANAGERS, - Feature.PATTERN_MATCHING, - Feature.EXCEPT_STAR, - Feature.VARIADIC_GENERICS, - Feature.TYPE_PARAMS, - Feature.TYPE_PARAM_DEFAULTS, - }, - TargetVersion.PY314: { - Feature.F_STRINGS, - Feature.DEBUG_F_STRINGS, - Feature.NUMERIC_UNDERSCORES, - Feature.TRAILING_COMMA_IN_CALL, - Feature.TRAILING_COMMA_IN_DEF, - Feature.ASYNC_KEYWORDS, - Feature.FUTURE_ANNOTATIONS, - Feature.ASSIGNMENT_EXPRESSIONS, - Feature.RELAXED_DECORATORS, - Feature.POS_ONLY_ARGUMENTS, - Feature.UNPACKING_ON_FLOW, - Feature.ANN_ASSIGN_EXTENDED_RHS, - Feature.PARENTHESIZED_CONTEXT_MANAGERS, - Feature.PATTERN_MATCHING, - Feature.EXCEPT_STAR, - Feature.VARIADIC_GENERICS, - Feature.TYPE_PARAMS, - Feature.TYPE_PARAM_DEFAULTS, - Feature.UNPARENTHESIZED_EXCEPT_TYPES, - Feature.T_STRINGS, - }, -} - - -def supports_feature(target_versions: set[TargetVersion], feature: Feature) -> bool: - if not target_versions: - raise ValueError("At least one target Python version must be specified.") - - return all(feature in VERSION_TO_FEATURES[version] for version in target_versions) - - -class Preview(Enum): - """Individual preview style features.""" - - # NOTE: string_processing requires wrap_long_dict_values_in_parens - # for https://github.com/psf/black/issues/3117 to be fixed. - string_processing = auto() - hug_parens_with_braces_and_square_brackets = auto() - wrap_comprehension_in = auto() - simplify_power_operator_hugging = auto() - wrap_long_dict_values_in_parens = auto() - fix_if_guard_explosion_in_case_statement = auto() - - -UNSTABLE_FEATURES: set[Preview] = { - # Many issues, see summary in https://github.com/psf/black/issues/4208 - Preview.string_processing, - # See issue #4036 (crash), #4098, #4099 (proposed tweaks) - Preview.hug_parens_with_braces_and_square_brackets, -} - - -_MAX_CACHE_KEY_PART_LENGTH: Final = 32 - - -@dataclass -class Mode: - target_versions: set[TargetVersion] = field(default_factory=set) - line_length: int = DEFAULT_LINE_LENGTH - string_normalization: bool = True - is_pyi: bool = False - is_ipynb: bool = False - skip_source_first_line: bool = False - magic_trailing_comma: bool = True - python_cell_magics: set[str] = field(default_factory=set) - preview: bool = False - unstable: bool = False - enabled_features: set[Preview] = field(default_factory=set) - - def __contains__(self, feature: Preview) -> bool: - """ - Provide `Preview.FEATURE in Mode` syntax that mirrors the ``preview`` flag. - - In unstable mode, all features are enabled. In preview mode, all features - except those in UNSTABLE_FEATURES are enabled. Any features in - `self.enabled_features` are also enabled. - """ - if self.unstable: - return True - if feature in self.enabled_features: - return True - return self.preview and feature not in UNSTABLE_FEATURES - - def get_cache_key(self) -> str: - if self.target_versions: - version_str = ",".join( - str(version.value) - for version in sorted(self.target_versions, key=attrgetter("value")) - ) - else: - version_str = "-" - if len(version_str) > _MAX_CACHE_KEY_PART_LENGTH: - version_str = sha256(version_str.encode()).hexdigest()[ - :_MAX_CACHE_KEY_PART_LENGTH - ] - features_and_magics = ( - ",".join(sorted(f.name for f in self.enabled_features)) - + "@" - + ",".join(sorted(self.python_cell_magics)) - ) - features_and_magics = sha256(features_and_magics.encode()).hexdigest()[ - :_MAX_CACHE_KEY_PART_LENGTH - ] - parts = [ - version_str, - str(self.line_length), - str(int(self.string_normalization)), - str(int(self.is_pyi)), - str(int(self.is_ipynb)), - str(int(self.skip_source_first_line)), - str(int(self.magic_trailing_comma)), - str(int(self.preview)), - str(int(self.unstable)), - features_and_magics, - ] - return ".".join(parts) - - def __hash__(self) -> int: - return hash(( - frozenset(self.target_versions), - self.line_length, - self.string_normalization, - self.is_pyi, - self.is_ipynb, - self.skip_source_first_line, - self.magic_trailing_comma, - frozenset(self.python_cell_magics), - self.preview, - self.unstable, - frozenset(self.enabled_features), - )) diff --git a/venv/lib/python3.12/site-packages/black/nodes.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/black/nodes.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 818e6fc..0000000 Binary files a/venv/lib/python3.12/site-packages/black/nodes.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/nodes.py b/venv/lib/python3.12/site-packages/black/nodes.py deleted file mode 100644 index 3558b18..0000000 --- a/venv/lib/python3.12/site-packages/black/nodes.py +++ /dev/null @@ -1,1108 +0,0 @@ -""" -blib2to3 Node/Leaf transformation-related utility functions. -""" - -from collections.abc import Iterator -from typing import Final, Generic, Literal, TypeGuard, TypeVar, Union - -from mypy_extensions import mypyc_attr - -from black.cache import CACHE_DIR -from black.mode import Mode, Preview -from black.strings import get_string_prefix, has_triple_quotes -from blib2to3 import pygram -from blib2to3.pgen2 import token -from blib2to3.pytree import NL, Leaf, Node, type_repr - -pygram.initialize(CACHE_DIR) -syms: Final = pygram.python_symbols - - -# types -T = TypeVar("T") -LN = Union[Leaf, Node] -LeafID = int -NodeType = int - - -WHITESPACE: Final = {token.DEDENT, token.INDENT, token.NEWLINE} -STATEMENT: Final = { - syms.if_stmt, - syms.while_stmt, - syms.for_stmt, - syms.try_stmt, - syms.except_clause, - syms.with_stmt, - syms.funcdef, - syms.classdef, - syms.match_stmt, - syms.case_block, -} -STANDALONE_COMMENT: Final = 153 -token.tok_name[STANDALONE_COMMENT] = "STANDALONE_COMMENT" -LOGIC_OPERATORS: Final = {"and", "or"} -COMPARATORS: Final = { - token.LESS, - token.GREATER, - token.EQEQUAL, - token.NOTEQUAL, - token.LESSEQUAL, - token.GREATEREQUAL, -} -MATH_OPERATORS: Final = { - token.VBAR, - token.CIRCUMFLEX, - token.AMPER, - token.LEFTSHIFT, - token.RIGHTSHIFT, - token.PLUS, - token.MINUS, - token.STAR, - token.SLASH, - token.DOUBLESLASH, - token.PERCENT, - token.AT, - token.TILDE, - token.DOUBLESTAR, -} -STARS: Final = {token.STAR, token.DOUBLESTAR} -VARARGS_SPECIALS: Final = STARS | {token.SLASH} -VARARGS_PARENTS: Final = { - syms.arglist, - syms.argument, # double star in arglist - syms.trailer, # single argument to call - syms.typedargslist, - syms.varargslist, # lambdas -} -UNPACKING_PARENTS: Final = { - syms.atom, # single element of a list or set literal - syms.dictsetmaker, - syms.listmaker, - syms.testlist_gexp, - syms.testlist_star_expr, - syms.subject_expr, - syms.pattern, -} -TEST_DESCENDANTS: Final = { - syms.test, - syms.lambdef, - syms.or_test, - syms.and_test, - syms.not_test, - syms.comparison, - syms.star_expr, - syms.expr, - syms.xor_expr, - syms.and_expr, - syms.shift_expr, - syms.arith_expr, - syms.trailer, - syms.term, - syms.power, - syms.namedexpr_test, -} -TYPED_NAMES: Final = {syms.tname, syms.tname_star} -ASSIGNMENTS: Final = { - "=", - "+=", - "-=", - "*=", - "@=", - "/=", - "%=", - "&=", - "|=", - "^=", - "<<=", - ">>=", - "**=", - "//=", - ":", -} - -IMPLICIT_TUPLE: Final = {syms.testlist, syms.testlist_star_expr, syms.exprlist} -BRACKET: Final = { - token.LPAR: token.RPAR, - token.LSQB: token.RSQB, - token.LBRACE: token.RBRACE, -} -OPENING_BRACKETS: Final = set(BRACKET.keys()) -CLOSING_BRACKETS: Final = set(BRACKET.values()) -BRACKETS: Final = OPENING_BRACKETS | CLOSING_BRACKETS -ALWAYS_NO_SPACE: Final = CLOSING_BRACKETS | { - token.COMMA, - STANDALONE_COMMENT, - token.FSTRING_MIDDLE, - token.FSTRING_END, - token.TSTRING_MIDDLE, - token.TSTRING_END, - token.BANG, -} - -RARROW = 55 - - -@mypyc_attr(allow_interpreted_subclasses=True) -class Visitor(Generic[T]): - """Basic lib2to3 visitor that yields things of type `T` on `visit()`.""" - - def visit(self, node: LN) -> Iterator[T]: - """Main method to visit `node` and its children. - - It tries to find a `visit_*()` method for the given `node.type`, like - `visit_simple_stmt` for Node objects or `visit_INDENT` for Leaf objects. - If no dedicated `visit_*()` method is found, chooses `visit_default()` - instead. - - Then yields objects of type `T` from the selected visitor. - """ - if node.type < 256: - name = token.tok_name[node.type] - else: - name = str(type_repr(node.type)) - # We explicitly branch on whether a visitor exists (instead of - # using self.visit_default as the default arg to getattr) in order - # to save needing to create a bound method object and so mypyc can - # generate a native call to visit_default. - visitf = getattr(self, f"visit_{name}", None) - if visitf: - yield from visitf(node) - else: - yield from self.visit_default(node) - - def visit_default(self, node: LN) -> Iterator[T]: - """Default `visit_*()` implementation. Recurses to children of `node`.""" - if isinstance(node, Node): - for child in node.children: - yield from self.visit(child) - - -def whitespace(leaf: Leaf, *, complex_subscript: bool, mode: Mode) -> str: - """Return whitespace prefix if needed for the given `leaf`. - - `complex_subscript` signals whether the given leaf is part of a subscription - which has non-trivial arguments, like arithmetic expressions or function calls. - """ - NO: Final[str] = "" - SPACE: Final[str] = " " - DOUBLESPACE: Final[str] = " " - t = leaf.type - p = leaf.parent - v = leaf.value - if t in ALWAYS_NO_SPACE: - return NO - - if t == token.COMMENT: - return DOUBLESPACE - - assert p is not None, f"INTERNAL ERROR: hand-made leaf without parent: {leaf!r}" - if t == token.COLON and p.type not in { - syms.subscript, - syms.subscriptlist, - syms.sliceop, - }: - return NO - - if t == token.LBRACE and p.type in ( - syms.fstring_replacement_field, - syms.tstring_replacement_field, - ): - return NO - - prev = leaf.prev_sibling - if not prev: - prevp = preceding_leaf(p) - if not prevp or prevp.type in OPENING_BRACKETS: - return NO - - if t == token.COLON: - if prevp.type == token.COLON: - return NO - - elif prevp.type != token.COMMA and not complex_subscript: - return NO - - return SPACE - - if prevp.type == token.EQUAL: - if prevp.parent: - if prevp.parent.type in { - syms.arglist, - syms.argument, - syms.parameters, - syms.varargslist, - }: - return NO - - elif prevp.parent.type == syms.typedargslist: - # A bit hacky: if the equal sign has whitespace, it means we - # previously found it's a typed argument. So, we're using - # that, too. - return prevp.prefix - - elif ( - prevp.type == token.STAR - and parent_type(prevp) == syms.star_expr - and parent_type(prevp.parent) in (syms.subscriptlist, syms.tname_star) - ): - # No space between typevar tuples or unpacking them. - return NO - - elif prevp.type in VARARGS_SPECIALS: - if is_vararg(prevp, within=VARARGS_PARENTS | UNPACKING_PARENTS): - return NO - - elif prevp.type == token.COLON: - if prevp.parent and prevp.parent.type in {syms.subscript, syms.sliceop}: - return SPACE if complex_subscript else NO - - elif ( - prevp.parent - and prevp.parent.type == syms.factor - and prevp.type in MATH_OPERATORS - ): - return NO - - elif prevp.type == token.AT and p.parent and p.parent.type == syms.decorator: - # no space in decorators - return NO - - elif prev.type in OPENING_BRACKETS: - return NO - - elif prev.type == token.BANG: - return NO - - if p.type in {syms.parameters, syms.arglist}: - # untyped function signatures or calls - if not prev or prev.type != token.COMMA: - return NO - - elif p.type == syms.varargslist: - # lambdas - if prev and prev.type != token.COMMA: - return NO - - elif p.type == syms.typedargslist: - # typed function signatures - if not prev: - return NO - - if t == token.EQUAL: - if prev.type not in TYPED_NAMES: - return NO - - elif prev.type == token.EQUAL: - # A bit hacky: if the equal sign has whitespace, it means we - # previously found it's a typed argument. So, we're using that, too. - return prev.prefix - - elif prev.type != token.COMMA: - return NO - - elif p.type in TYPED_NAMES: - # type names - if not prev: - prevp = preceding_leaf(p) - if not prevp or prevp.type != token.COMMA: - return NO - - elif p.type == syms.trailer: - # attributes and calls - if t == token.LPAR or t == token.RPAR: - return NO - - if not prev: - if t == token.DOT or t == token.LSQB: - return NO - - elif prev.type != token.COMMA: - return NO - - elif p.type == syms.argument: - # single argument - if t == token.EQUAL: - return NO - - if not prev: - prevp = preceding_leaf(p) - if not prevp or prevp.type == token.LPAR: - return NO - - elif prev.type in {token.EQUAL} | VARARGS_SPECIALS: - return NO - - elif p.type == syms.decorator: - # decorators - return NO - - elif p.type == syms.dotted_name: - if prev: - return NO - - prevp = preceding_leaf(p) - if not prevp or prevp.type == token.AT or prevp.type == token.DOT: - return NO - - elif p.type == syms.classdef: - if t == token.LPAR: - return NO - - if prev and prev.type == token.LPAR: - return NO - - elif p.type in {syms.subscript, syms.sliceop}: - # indexing - if not prev: - assert p.parent is not None, "subscripts are always parented" - if p.parent.type == syms.subscriptlist: - return SPACE - - return NO - - elif t == token.COLONEQUAL or prev.type == token.COLONEQUAL: - return SPACE - - elif not complex_subscript: - return NO - - elif p.type == syms.atom: - if prev and t == token.DOT: - # dots, but not the first one. - return NO - - elif p.type == syms.dictsetmaker: - # dict unpacking - if prev and prev.type == token.DOUBLESTAR: - return NO - - elif p.type in {syms.factor, syms.star_expr}: - # unary ops - if not prev: - prevp = preceding_leaf(p) - if not prevp or prevp.type in OPENING_BRACKETS: - return NO - - prevp_parent = prevp.parent - assert prevp_parent is not None - if prevp.type == token.COLON and prevp_parent.type in { - syms.subscript, - syms.sliceop, - }: - return NO - - elif prevp.type == token.EQUAL and prevp_parent.type == syms.argument: - return NO - - elif t in {token.NAME, token.NUMBER, token.STRING}: - return NO - - elif p.type == syms.import_from: - if t == token.DOT: - if prev and prev.type == token.DOT: - return NO - - elif t == token.NAME: - if v == "import": - return SPACE - - if prev and prev.type == token.DOT: - return NO - - elif p.type == syms.sliceop: - return NO - - elif p.type == syms.except_clause: - if t == token.STAR: - return NO - - if Preview.simplify_power_operator_hugging in mode: - # Power operator hugging - if t == token.DOUBLESTAR and is_simple_exponentiation(p): - return NO - prevp = preceding_leaf(leaf) - if prevp and prevp.type == token.DOUBLESTAR: - if prevp.parent and is_simple_exponentiation(prevp.parent): - return NO - - return SPACE - - -def make_simple_prefix(nl_count: int, form_feed: bool, empty_line: str = "\n") -> str: - """Generate a normalized prefix string.""" - if form_feed: - return (empty_line * (nl_count - 1)) + "\f" + empty_line - return empty_line * nl_count - - -def preceding_leaf(node: LN | None) -> Leaf | None: - """Return the first leaf that precedes `node`, if any.""" - while node: - res = node.prev_sibling - if res: - if isinstance(res, Leaf): - return res - - try: - return list(res.leaves())[-1] - - except IndexError: - return None - - node = node.parent - return None - - -def prev_siblings_are(node: LN | None, tokens: list[NodeType | None]) -> bool: - """Return if the `node` and its previous siblings match types against the provided - list of tokens; the provided `node`has its type matched against the last element in - the list. `None` can be used as the first element to declare that the start of the - list is anchored at the start of its parent's children.""" - if not tokens: - return True - if tokens[-1] is None: - return node is None - if not node: - return False - if node.type != tokens[-1]: - return False - return prev_siblings_are(node.prev_sibling, tokens[:-1]) - - -def parent_type(node: LN | None) -> NodeType | None: - """ - Returns: - @node.parent.type, if @node is not None and has a parent. - OR - None, otherwise. - """ - if node is None or node.parent is None: - return None - - return node.parent.type - - -def child_towards(ancestor: Node, descendant: LN) -> LN | None: - """Return the child of `ancestor` that contains `descendant`.""" - node: LN | None = descendant - while node and node.parent != ancestor: - node = node.parent - return node - - -def replace_child(old_child: LN, new_child: LN) -> None: - """ - Side Effects: - * If @old_child.parent is set, replace @old_child with @new_child in - @old_child's underlying Node structure. - OR - * Otherwise, this function does nothing. - """ - parent = old_child.parent - if not parent: - return - - child_idx = old_child.remove() - if child_idx is not None: - parent.insert_child(child_idx, new_child) - - -def container_of(leaf: Leaf) -> LN: - """Return `leaf` or one of its ancestors that is the topmost container of it. - - By "container" we mean a node where `leaf` is the very first child. - """ - same_prefix = leaf.prefix - container: LN = leaf - while container: - parent = container.parent - if parent is None: - break - - if parent.children[0].prefix != same_prefix: - break - - if parent.type == syms.file_input: - break - - if parent.prev_sibling is not None and parent.prev_sibling.type in BRACKETS: - break - - container = parent - return container - - -def first_leaf_of(node: LN) -> Leaf | None: - """Returns the first leaf of the node tree.""" - if isinstance(node, Leaf): - return node - if node.children: - return first_leaf_of(node.children[0]) - else: - return None - - -def is_arith_like(node: LN) -> bool: - """Whether node is an arithmetic or a binary arithmetic expression""" - return node.type in { - syms.arith_expr, - syms.shift_expr, - syms.xor_expr, - syms.and_expr, - } - - -def is_simple_exponentiation(node: LN) -> bool: - """Whether whitespace around `**` should be removed.""" - - def is_simple(node: LN) -> bool: - if isinstance(node, Leaf): - return node.type in (token.NAME, token.NUMBER, token.DOT, token.DOUBLESTAR) - elif node.type == syms.factor: # unary operators - return is_simple(node.children[1]) - else: - return all(is_simple(child) for child in node.children) - - return ( - node.type == syms.power - and len(node.children) >= 3 - and node.children[-2].type == token.DOUBLESTAR - and is_simple(node) - ) - - -def is_docstring(node: NL) -> bool: - if isinstance(node, Leaf): - if node.type != token.STRING: - return False - - prefix = get_string_prefix(node.value) - if set(prefix).intersection("bBfF"): - return False - - if ( - node.parent - and node.parent.type == syms.simple_stmt - and not node.parent.prev_sibling - and node.parent.parent - and node.parent.parent.type == syms.file_input - ): - return True - - if prev_siblings_are( - node.parent, [None, token.NEWLINE, token.INDENT, syms.simple_stmt] - ): - return True - - # Multiline docstring on the same line as the `def`. - if prev_siblings_are(node.parent, [syms.parameters, token.COLON, syms.simple_stmt]): - # `syms.parameters` is only used in funcdefs and async_funcdefs in the Python - # grammar. We're safe to return True without further checks. - return True - - return False - - -def is_empty_tuple(node: LN) -> bool: - """Return True if `node` holds an empty tuple.""" - return ( - node.type == syms.atom - and len(node.children) == 2 - and node.children[0].type == token.LPAR - and node.children[1].type == token.RPAR - ) - - -def is_one_tuple(node: LN) -> bool: - """Return True if `node` holds a tuple with one element, with or without parens.""" - if node.type == syms.atom: - gexp = unwrap_singleton_parenthesis(node) - if gexp is None or gexp.type != syms.testlist_gexp: - return False - - return len(gexp.children) == 2 and gexp.children[1].type == token.COMMA - - return ( - node.type in IMPLICIT_TUPLE - and len(node.children) == 2 - and node.children[1].type == token.COMMA - ) - - -def is_tuple(node: LN) -> bool: - """Return True if `node` holds a tuple.""" - if node.type != syms.atom: - return False - gexp = unwrap_singleton_parenthesis(node) - if gexp is None or gexp.type != syms.testlist_gexp: - return False - - return True - - -def is_tuple_containing_walrus(node: LN) -> bool: - """Return True if `node` holds a tuple that contains a walrus operator.""" - if node.type != syms.atom: - return False - gexp = unwrap_singleton_parenthesis(node) - if gexp is None or gexp.type != syms.testlist_gexp: - return False - - return any(child.type == syms.namedexpr_test for child in gexp.children) - - -def is_tuple_containing_star(node: LN) -> bool: - """Return True if `node` holds a tuple that contains a star operator.""" - if node.type != syms.atom: - return False - gexp = unwrap_singleton_parenthesis(node) - if gexp is None or gexp.type != syms.testlist_gexp: - return False - - return any(child.type == syms.star_expr for child in gexp.children) - - -def is_generator(node: LN) -> bool: - """Return True if `node` holds a generator.""" - if node.type != syms.atom: - return False - gexp = unwrap_singleton_parenthesis(node) - if gexp is None or gexp.type != syms.testlist_gexp: - return False - - return any(child.type == syms.old_comp_for for child in gexp.children) - - -def is_one_sequence_between( - opening: Leaf, - closing: Leaf, - leaves: list[Leaf], - brackets: tuple[int, int] = (token.LPAR, token.RPAR), -) -> bool: - """Return True if content between `opening` and `closing` is a one-sequence.""" - if (opening.type, closing.type) != brackets: - return False - - depth = closing.bracket_depth + 1 - for _opening_index, leaf in enumerate(leaves): - if leaf is opening: - break - - else: - return False - - commas = 0 - _opening_index += 1 - for leaf in leaves[_opening_index:]: - if leaf is closing: - break - - bracket_depth = leaf.bracket_depth - if bracket_depth == depth and leaf.type == token.COMMA: - commas += 1 - if leaf.parent and leaf.parent.type in { - syms.arglist, - syms.typedargslist, - }: - commas += 1 - break - - return commas < 2 - - -def is_walrus_assignment(node: LN) -> bool: - """Return True iff `node` is of the shape ( test := test )""" - inner = unwrap_singleton_parenthesis(node) - return inner is not None and inner.type == syms.namedexpr_test - - -def is_simple_decorator_trailer(node: LN, last: bool = False) -> bool: - """Return True iff `node` is a trailer valid in a simple decorator""" - return node.type == syms.trailer and ( - ( - len(node.children) == 2 - and node.children[0].type == token.DOT - and node.children[1].type == token.NAME - ) - # last trailer can be an argument-less parentheses pair - or ( - last - and len(node.children) == 2 - and node.children[0].type == token.LPAR - and node.children[1].type == token.RPAR - ) - # last trailer can be arguments - or ( - last - and len(node.children) == 3 - and node.children[0].type == token.LPAR - # and node.children[1].type == syms.argument - and node.children[2].type == token.RPAR - ) - ) - - -def is_simple_decorator_expression(node: LN) -> bool: - """Return True iff `node` could be a 'dotted name' decorator - - This function takes the node of the 'namedexpr_test' of the new decorator - grammar and test if it would be valid under the old decorator grammar. - - The old grammar was: decorator: @ dotted_name [arguments] NEWLINE - The new grammar is : decorator: @ namedexpr_test NEWLINE - """ - if node.type == token.NAME: - return True - if node.type == syms.power: - if node.children: - return ( - node.children[0].type == token.NAME - and all(map(is_simple_decorator_trailer, node.children[1:-1])) - and ( - len(node.children) < 2 - or is_simple_decorator_trailer(node.children[-1], last=True) - ) - ) - return False - - -def is_yield(node: LN) -> bool: - """Return True if `node` holds a `yield` or `yield from` expression.""" - if node.type == syms.yield_expr: - return True - - if is_name_token(node) and node.value == "yield": - return True - - if node.type != syms.atom: - return False - - if len(node.children) != 3: - return False - - lpar, expr, rpar = node.children - if lpar.type == token.LPAR and rpar.type == token.RPAR: - return is_yield(expr) - - return False - - -def is_vararg(leaf: Leaf, within: set[NodeType]) -> bool: - """Return True if `leaf` is a star or double star in a vararg or kwarg. - - If `within` includes VARARGS_PARENTS, this applies to function signatures. - If `within` includes UNPACKING_PARENTS, it applies to right hand-side - extended iterable unpacking (PEP 3132) and additional unpacking - generalizations (PEP 448). - """ - if leaf.type not in VARARGS_SPECIALS or not leaf.parent: - return False - - p = leaf.parent - if p.type == syms.star_expr: - # Star expressions are also used as assignment targets in extended - # iterable unpacking (PEP 3132). See what its parent is instead. - if not p.parent: - return False - - p = p.parent - - return p.type in within - - -def is_fstring(node: Node) -> bool: - """Return True if the node is an f-string""" - return node.type == syms.fstring - - -def fstring_tstring_to_string(node: Node) -> Leaf: - """Converts an fstring or tstring node back to a string node.""" - string_without_prefix = str(node)[len(node.prefix) :] - string_leaf = Leaf(token.STRING, string_without_prefix, prefix=node.prefix) - string_leaf.lineno = node.get_lineno() or 0 - return string_leaf - - -def is_multiline_string(node: LN) -> bool: - """Return True if `leaf` is a multiline string that actually spans many lines.""" - if isinstance(node, Node) and is_fstring(node): - leaf = fstring_tstring_to_string(node) - elif isinstance(node, Leaf): - leaf = node - else: - return False - - return has_triple_quotes(leaf.value) and "\n" in leaf.value - - -def is_parent_function_or_class(node: Node) -> bool: - assert node.type in {syms.suite, syms.simple_stmt} - assert node.parent is not None - # Note this works for suites / simple_stmts in async def as well - return node.parent.type in {syms.funcdef, syms.classdef} - - -def is_stub_suite(node: Node) -> bool: - """Return True if `node` is a suite with a stub body.""" - if node.parent is not None and not is_parent_function_or_class(node): - return False - - # If there is a comment, we want to keep it. - if node.prefix.strip(): - return False - - if ( - len(node.children) != 4 - or node.children[0].type != token.NEWLINE - or node.children[1].type != token.INDENT - or node.children[3].type != token.DEDENT - ): - return False - - if node.children[3].prefix.strip(): - return False - - return is_stub_body(node.children[2]) - - -def is_stub_body(node: LN) -> bool: - """Return True if `node` is a simple statement containing an ellipsis.""" - if not isinstance(node, Node) or node.type != syms.simple_stmt: - return False - - if len(node.children) != 2: - return False - - child = node.children[0] - return ( - not child.prefix.strip() - and child.type == syms.atom - and len(child.children) == 3 - and all(leaf == Leaf(token.DOT, ".") for leaf in child.children) - ) - - -def is_atom_with_invisible_parens(node: LN) -> bool: - """Given a `LN`, determines whether it's an atom `node` with invisible - parens. Useful in dedupe-ing and normalizing parens. - """ - if isinstance(node, Leaf) or node.type != syms.atom: - return False - - first, last = node.children[0], node.children[-1] - return ( - isinstance(first, Leaf) - and first.type == token.LPAR - and first.value == "" - and isinstance(last, Leaf) - and last.type == token.RPAR - and last.value == "" - ) - - -def is_empty_par(leaf: Leaf) -> bool: - return is_empty_lpar(leaf) or is_empty_rpar(leaf) - - -def is_empty_lpar(leaf: Leaf) -> bool: - return leaf.type == token.LPAR and leaf.value == "" - - -def is_empty_rpar(leaf: Leaf) -> bool: - return leaf.type == token.RPAR and leaf.value == "" - - -def is_import(leaf: Leaf) -> bool: - """Return True if the given leaf starts an import statement.""" - p = leaf.parent - t = leaf.type - v = leaf.value - return bool( - t == token.NAME - and ( - (v == "import" and p and p.type == syms.import_name) - or (v == "from" and p and p.type == syms.import_from) - ) - ) - - -def is_with_or_async_with_stmt(leaf: Leaf) -> bool: - """Return True if the given leaf starts a with or async with statement.""" - return bool( - leaf.type == token.NAME - and leaf.value == "with" - and leaf.parent - and leaf.parent.type == syms.with_stmt - ) or bool( - leaf.type == token.ASYNC - and leaf.next_sibling - and leaf.next_sibling.type == syms.with_stmt - ) - - -def is_async_stmt_or_funcdef(leaf: Leaf) -> bool: - """Return True if the given leaf starts an async def/for/with statement. - - Note that `async def` can be either an `async_stmt` or `async_funcdef`, - the latter is used when it has decorators. - """ - return bool( - leaf.type == token.ASYNC - and leaf.parent - and leaf.parent.type in {syms.async_stmt, syms.async_funcdef} - ) - - -def is_type_comment(leaf: Leaf, mode: Mode) -> bool: - """Return True if the given leaf is a type comment. This function should only - be used for general type comments (excluding ignore annotations, which should - use `is_type_ignore_comment`). Note that general type comments are no longer - used in modern version of Python, this function may be deprecated in the future.""" - t = leaf.type - v = leaf.value - return t in {token.COMMENT, STANDALONE_COMMENT} and is_type_comment_string(v, mode) - - -def is_type_comment_string(value: str, mode: Mode) -> bool: - return value.startswith("#") and value[1:].lstrip().startswith("type:") - - -def is_type_ignore_comment(leaf: Leaf, mode: Mode) -> bool: - """Return True if the given leaf is a type comment with ignore annotation.""" - t = leaf.type - v = leaf.value - return t in {token.COMMENT, STANDALONE_COMMENT} and is_type_ignore_comment_string( - v, mode - ) - - -def is_type_ignore_comment_string(value: str, mode: Mode) -> bool: - """Return True if the given string match with type comment with - ignore annotation.""" - return is_type_comment_string(value, mode) and value.split(":", 1)[ - 1 - ].lstrip().startswith("ignore") - - -def wrap_in_parentheses(parent: Node, child: LN, *, visible: bool = True) -> None: - """Wrap `child` in parentheses. - - This replaces `child` with an atom holding the parentheses and the old - child. That requires moving the prefix. - - If `visible` is False, the leaves will be valueless (and thus invisible). - """ - lpar = Leaf(token.LPAR, "(" if visible else "") - rpar = Leaf(token.RPAR, ")" if visible else "") - prefix = child.prefix - child.prefix = "" - index = child.remove() or 0 - new_child = Node(syms.atom, [lpar, child, rpar]) - new_child.prefix = prefix - parent.insert_child(index, new_child) - - -def unwrap_singleton_parenthesis(node: LN) -> LN | None: - """Returns `wrapped` if `node` is of the shape ( wrapped ). - - Parenthesis can be optional. Returns None otherwise""" - if len(node.children) != 3: - return None - - lpar, wrapped, rpar = node.children - if not (lpar.type == token.LPAR and rpar.type == token.RPAR): - return None - - return wrapped - - -def ensure_visible(leaf: Leaf) -> None: - """Make sure parentheses are visible. - - They could be invisible as part of some statements (see - :func:`normalize_invisible_parens` and :func:`visit_import_from`). - """ - if leaf.type == token.LPAR: - leaf.value = "(" - elif leaf.type == token.RPAR: - leaf.value = ")" - - -def is_name_token(nl: NL) -> TypeGuard[Leaf]: - return nl.type == token.NAME - - -def is_lpar_token(nl: NL) -> TypeGuard[Leaf]: - return nl.type == token.LPAR - - -def is_rpar_token(nl: NL) -> TypeGuard[Leaf]: - return nl.type == token.RPAR - - -def is_number_token(nl: NL) -> TypeGuard[Leaf]: - return nl.type == token.NUMBER - - -def get_annotation_type(leaf: Leaf) -> Literal["return", "param", None]: - """Returns the type of annotation this leaf is part of, if any.""" - ancestor = leaf.parent - while ancestor is not None: - if ancestor.prev_sibling and ancestor.prev_sibling.type == token.RARROW: - return "return" - if ancestor.parent and ancestor.parent.type == syms.tname: - return "param" - ancestor = ancestor.parent - return None - - -def is_part_of_annotation(leaf: Leaf) -> bool: - """Returns whether this leaf is part of a type annotation.""" - assert leaf.parent is not None - return get_annotation_type(leaf) is not None - - -def first_leaf(node: LN) -> Leaf | None: - """Returns the first leaf of the ancestor node.""" - if isinstance(node, Leaf): - return node - elif not node.children: - return None - else: - return first_leaf(node.children[0]) - - -def last_leaf(node: LN) -> Leaf | None: - """Returns the last leaf of the ancestor node.""" - if isinstance(node, Leaf): - return node - elif not node.children: - return None - else: - return last_leaf(node.children[-1]) - - -def furthest_ancestor_with_last_leaf(leaf: Leaf) -> LN: - """Returns the furthest ancestor that has this leaf node as the last leaf.""" - node: LN = leaf - while node.parent and node.parent.children and node is node.parent.children[-1]: - node = node.parent - return node - - -def has_sibling_with_type(node: LN, type: int) -> bool: - # Check previous siblings - sibling = node.prev_sibling - while sibling is not None: - if sibling.type == type: - return True - sibling = sibling.prev_sibling - - # Check next siblings - sibling = node.next_sibling - while sibling is not None: - if sibling.type == type: - return True - sibling = sibling.next_sibling - - return False diff --git a/venv/lib/python3.12/site-packages/black/numerics.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/black/numerics.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 5815541..0000000 Binary files a/venv/lib/python3.12/site-packages/black/numerics.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/numerics.py b/venv/lib/python3.12/site-packages/black/numerics.py deleted file mode 100644 index 3040de0..0000000 --- a/venv/lib/python3.12/site-packages/black/numerics.py +++ /dev/null @@ -1,61 +0,0 @@ -""" -Formatting numeric literals. -""" - -from blib2to3.pytree import Leaf - - -def format_hex(text: str) -> str: - """ - Formats a hexadecimal string like "0x12B3" - """ - before, after = text[:2], text[2:] - return f"{before}{after.upper()}" - - -def format_scientific_notation(text: str) -> str: - """Formats a numeric string utilizing scientific notation""" - before, after = text.split("e") - sign = "" - if after.startswith("-"): - after = after[1:] - sign = "-" - elif after.startswith("+"): - after = after[1:] - before = format_float_or_int_string(before) - return f"{before}e{sign}{after}" - - -def format_complex_number(text: str) -> str: - """Formats a complex string like `10j`""" - number = text[:-1] - suffix = text[-1] - return f"{format_float_or_int_string(number)}{suffix}" - - -def format_float_or_int_string(text: str) -> str: - """Formats a float string like "1.0".""" - if "." not in text: - return text - - before, after = text.split(".") - return f"{before or 0}.{after or 0}" - - -def normalize_numeric_literal(leaf: Leaf) -> None: - """Normalizes numeric (float, int, and complex) literals. - - All letters used in the representation are normalized to lowercase.""" - text = leaf.value.lower() - if text.startswith(("0o", "0b")): - # Leave octal and binary literals alone. - pass - elif text.startswith("0x"): - text = format_hex(text) - elif "e" in text: - text = format_scientific_notation(text) - elif text.endswith("j"): - text = format_complex_number(text) - else: - text = format_float_or_int_string(text) - leaf.value = text diff --git a/venv/lib/python3.12/site-packages/black/output.py b/venv/lib/python3.12/site-packages/black/output.py deleted file mode 100644 index 76c28c3..0000000 --- a/venv/lib/python3.12/site-packages/black/output.py +++ /dev/null @@ -1,122 +0,0 @@ -"""Nice output for Black. - -The double calls are for patching purposes in tests. -""" - -import json -import re -import tempfile -from typing import Any - -from click import echo, style -from mypy_extensions import mypyc_attr - - -@mypyc_attr(patchable=True) -def _out(message: str | None = None, nl: bool = True, **styles: Any) -> None: - if message is not None: - if "bold" not in styles: - styles["bold"] = True - message = style(message, **styles) - echo(message, nl=nl, err=True) - - -@mypyc_attr(patchable=True) -def _err(message: str | None = None, nl: bool = True, **styles: Any) -> None: - if message is not None: - if "fg" not in styles: - styles["fg"] = "red" - message = style(message, **styles) - echo(message, nl=nl, err=True) - - -@mypyc_attr(patchable=True) -def out(message: str | None = None, nl: bool = True, **styles: Any) -> None: - _out(message, nl=nl, **styles) - - -def err(message: str | None = None, nl: bool = True, **styles: Any) -> None: - _err(message, nl=nl, **styles) - - -def ipynb_diff(a: str, b: str, a_name: str, b_name: str) -> str: - """Return a unified diff string between each cell in notebooks `a` and `b`.""" - a_nb = json.loads(a) - b_nb = json.loads(b) - diff_lines = [ - diff( - "".join(a_nb["cells"][cell_number]["source"]) + "\n", - "".join(b_nb["cells"][cell_number]["source"]) + "\n", - f"{a_name}:cell_{cell_number}", - f"{b_name}:cell_{cell_number}", - ) - for cell_number, cell in enumerate(a_nb["cells"]) - if cell["cell_type"] == "code" - ] - return "".join(diff_lines) - - -_line_pattern = re.compile(r"(.*?(?:\r\n|\n|\r|$))") - - -def _splitlines_no_ff(source: str) -> list[str]: - """Split a string into lines ignoring form feed and other chars. - - This mimics how the Python parser splits source code. - - A simplified version of the function with the same name in Lib/ast.py - """ - result = [match[0] for match in _line_pattern.finditer(source)] - if result[-1] == "": - result.pop(-1) - return result - - -def diff(a: str, b: str, a_name: str, b_name: str) -> str: - """Return a unified diff string between strings `a` and `b`.""" - import difflib - - a_lines = _splitlines_no_ff(a) - b_lines = _splitlines_no_ff(b) - diff_lines = [] - for line in difflib.unified_diff( - a_lines, b_lines, fromfile=a_name, tofile=b_name, n=5 - ): - # Work around https://bugs.python.org/issue2142 - # See: - # https://www.gnu.org/software/diffutils/manual/html_node/Incomplete-Lines.html - if line[-1] == "\n": - diff_lines.append(line) - else: - diff_lines.append(line + "\n") - diff_lines.append("\\ No newline at end of file\n") - return "".join(diff_lines) - - -def color_diff(contents: str) -> str: - """Inject the ANSI color codes to the diff.""" - lines = contents.split("\n") - for i, line in enumerate(lines): - if line.startswith("+++") or line.startswith("---"): - line = "\033[1m" + line + "\033[0m" # bold, reset - elif line.startswith("@@"): - line = "\033[36m" + line + "\033[0m" # cyan, reset - elif line.startswith("+"): - line = "\033[32m" + line + "\033[0m" # green, reset - elif line.startswith("-"): - line = "\033[31m" + line + "\033[0m" # red, reset - lines[i] = line - return "\n".join(lines) - - -@mypyc_attr(patchable=True) -def dump_to_file(*output: str, ensure_final_newline: bool = True) -> str: - """Dump `output` to a temporary file. Return path to the file.""" - with tempfile.NamedTemporaryFile( - mode="w", prefix="blk_", suffix=".log", delete=False, encoding="utf8" - ) as f: - for lines in output: - f.write(lines) - if ensure_final_newline and lines and lines[-1] != "\n": - f.write("\n") - return f.name diff --git a/venv/lib/python3.12/site-packages/black/parsing.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/black/parsing.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 0760eff..0000000 Binary files a/venv/lib/python3.12/site-packages/black/parsing.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/parsing.py b/venv/lib/python3.12/site-packages/black/parsing.py deleted file mode 100644 index cb4f715..0000000 --- a/venv/lib/python3.12/site-packages/black/parsing.py +++ /dev/null @@ -1,244 +0,0 @@ -""" -Parse Python code and perform AST validation. -""" - -import ast -import sys -import warnings -from collections.abc import Collection, Iterator - -from black.mode import VERSION_TO_FEATURES, Feature, TargetVersion, supports_feature -from black.nodes import syms -from blib2to3 import pygram -from blib2to3.pgen2 import driver -from blib2to3.pgen2.grammar import Grammar -from blib2to3.pgen2.parse import ParseError -from blib2to3.pgen2.tokenize import TokenError -from blib2to3.pytree import Leaf, Node - - -class InvalidInput(ValueError): - """Raised when input source code fails all parse attempts.""" - - -def get_grammars(target_versions: set[TargetVersion]) -> list[Grammar]: - if not target_versions: - # No target_version specified, so try all grammars. - return [ - # Python 3.7-3.9 - pygram.python_grammar_async_keywords, - # Python 3.0-3.6 - pygram.python_grammar, - # Python 3.10+ - pygram.python_grammar_soft_keywords, - ] - - grammars = [] - # If we have to parse both, try to parse async as a keyword first - if not supports_feature( - target_versions, Feature.ASYNC_IDENTIFIERS - ) and not supports_feature(target_versions, Feature.PATTERN_MATCHING): - # Python 3.7-3.9 - grammars.append(pygram.python_grammar_async_keywords) - if not supports_feature(target_versions, Feature.ASYNC_KEYWORDS): - # Python 3.0-3.6 - grammars.append(pygram.python_grammar) - if any(Feature.PATTERN_MATCHING in VERSION_TO_FEATURES[v] for v in target_versions): - # Python 3.10+ - grammars.append(pygram.python_grammar_soft_keywords) - - # At least one of the above branches must have been taken, because every Python - # version has exactly one of the two 'ASYNC_*' flags - return grammars - - -def lib2to3_parse( - src_txt: str, target_versions: Collection[TargetVersion] = () -) -> Node: - """Given a string with source, return the lib2to3 Node.""" - if not src_txt.endswith("\n"): - src_txt += "\n" - - grammars = get_grammars(set(target_versions)) - if target_versions: - max_tv = max(target_versions, key=lambda tv: tv.value) - tv_str = f" for target version {max_tv.pretty()}" - else: - tv_str = "" - - errors = {} - for grammar in grammars: - drv = driver.Driver(grammar) - try: - result = drv.parse_string(src_txt, False) - break - - except ParseError as pe: - lineno, column = pe.context[1] - lines = src_txt.splitlines() - try: - faulty_line = lines[lineno - 1] - except IndexError: - faulty_line = "" - errors[grammar.version] = InvalidInput( - f"Cannot parse{tv_str}: {lineno}:{column}: {faulty_line}" - ) - - except TokenError as te: - # In edge cases these are raised; and typically don't have a "faulty_line". - lineno, column = te.args[1] - errors[grammar.version] = InvalidInput( - f"Cannot parse{tv_str}: {lineno}:{column}: {te.args[0]}" - ) - - else: - # Choose the latest version when raising the actual parsing error. - assert len(errors) >= 1 - exc = errors[max(errors)] - raise exc from None - - if isinstance(result, Leaf): - result = Node(syms.file_input, [result]) - return result - - -class ASTSafetyError(Exception): - """Raised when Black's generated code is not equivalent to the old AST.""" - - -def _parse_single_version( - src: str, version: tuple[int, int], *, type_comments: bool -) -> ast.AST: - filename = "" - with warnings.catch_warnings(): - warnings.simplefilter("ignore", SyntaxWarning) - warnings.simplefilter("ignore", DeprecationWarning) - return ast.parse( - src, filename, feature_version=version, type_comments=type_comments - ) - - -def parse_ast(src: str) -> ast.AST: - # TODO: support Python 4+ ;) - versions = [(3, minor) for minor in range(3, sys.version_info[1] + 1)] - - first_error = "" - for version in sorted(versions, reverse=True): - try: - return _parse_single_version(src, version, type_comments=True) - except SyntaxError as e: - if not first_error: - first_error = str(e) - - # Try to parse without type comments - for version in sorted(versions, reverse=True): - try: - return _parse_single_version(src, version, type_comments=False) - except SyntaxError: - pass - - raise SyntaxError(first_error) - - -def _normalize(lineend: str, value: str) -> str: - # To normalize, we strip any leading and trailing space from - # each line... - stripped: list[str] = [i.strip() for i in value.splitlines()] - normalized = lineend.join(stripped) - # ...and remove any blank lines at the beginning and end of - # the whole string - return normalized.strip() - - -def stringify_ast(node: ast.AST) -> Iterator[str]: - """Simple visitor generating strings to compare ASTs by content.""" - return _stringify_ast(node, []) - - -def _stringify_ast_with_new_parent( - node: ast.AST, parent_stack: list[ast.AST], new_parent: ast.AST -) -> Iterator[str]: - parent_stack.append(new_parent) - yield from _stringify_ast(node, parent_stack) - parent_stack.pop() - - -def _stringify_ast(node: ast.AST, parent_stack: list[ast.AST]) -> Iterator[str]: - if ( - isinstance(node, ast.Constant) - and isinstance(node.value, str) - and node.kind == "u" - ): - # It's a quirk of history that we strip the u prefix over here. We used to - # rewrite the AST nodes for Python version compatibility and we never copied - # over the kind - node.kind = None - - yield f"{' ' * len(parent_stack)}{node.__class__.__name__}(" - - for field in sorted(node._fields): - # TypeIgnore has only one field 'lineno' which breaks this comparison - if isinstance(node, ast.TypeIgnore): - break - - try: - value: object = getattr(node, field) - except AttributeError: - continue - - yield f"{' ' * (len(parent_stack) + 1)}{field}=" - - if isinstance(value, list): - for item in value: - # Ignore nested tuples within del statements, because we may insert - # parentheses and they change the AST. - if ( - field == "targets" - and isinstance(node, ast.Delete) - and isinstance(item, ast.Tuple) - ): - for elt in _unwrap_tuples(item): - yield from _stringify_ast_with_new_parent( - elt, parent_stack, node - ) - - elif isinstance(item, ast.AST): - yield from _stringify_ast_with_new_parent(item, parent_stack, node) - - elif isinstance(value, ast.AST): - yield from _stringify_ast_with_new_parent(value, parent_stack, node) - - else: - normalized: object - if ( - isinstance(node, ast.Constant) - and field == "value" - and isinstance(value, str) - and len(parent_stack) >= 2 - # Any standalone string, ideally this would - # exactly match black.nodes.is_docstring - and isinstance(parent_stack[-1], ast.Expr) - ): - # Constant strings may be indented across newlines, if they are - # docstrings; fold spaces after newlines when comparing. Similarly, - # trailing and leading space may be removed. - normalized = _normalize("\n", value) - elif field == "type_comment" and isinstance(value, str): - # Trailing whitespace in type comments is removed. - normalized = value.rstrip() - else: - normalized = value - yield ( - f"{' ' * (len(parent_stack) + 1)}{normalized!r}, #" - f" {value.__class__.__name__}" - ) - - yield f"{' ' * len(parent_stack)}) # /{node.__class__.__name__}" - - -def _unwrap_tuples(node: ast.Tuple) -> Iterator[ast.AST]: - for elt in node.elts: - if isinstance(elt, ast.Tuple): - yield from _unwrap_tuples(elt) - else: - yield elt diff --git a/venv/lib/python3.12/site-packages/black/py.typed b/venv/lib/python3.12/site-packages/black/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/black/ranges.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/black/ranges.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index db3b577..0000000 Binary files a/venv/lib/python3.12/site-packages/black/ranges.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/ranges.py b/venv/lib/python3.12/site-packages/black/ranges.py deleted file mode 100644 index d7e003d..0000000 --- a/venv/lib/python3.12/site-packages/black/ranges.py +++ /dev/null @@ -1,534 +0,0 @@ -"""Functions related to Black's formatting by line ranges feature.""" - -import difflib -from collections.abc import Collection, Iterator, Sequence -from dataclasses import dataclass - -from black.nodes import ( - LN, - STANDALONE_COMMENT, - Leaf, - Node, - Visitor, - first_leaf, - furthest_ancestor_with_last_leaf, - last_leaf, - syms, -) -from blib2to3.pgen2.token import ASYNC, NEWLINE - - -def parse_line_ranges(line_ranges: Sequence[str]) -> list[tuple[int, int]]: - lines: list[tuple[int, int]] = [] - for lines_str in line_ranges: - parts = lines_str.split("-") - if len(parts) != 2: - raise ValueError( - "Incorrect --line-ranges format, expect 'START-END', found" - f" {lines_str!r}" - ) - try: - start = int(parts[0]) - end = int(parts[1]) - except ValueError: - raise ValueError( - "Incorrect --line-ranges value, expect integer ranges, found" - f" {lines_str!r}" - ) from None - else: - lines.append((start, end)) - return lines - - -def is_valid_line_range(lines: tuple[int, int]) -> bool: - """Returns whether the line range is valid.""" - return not lines or lines[0] <= lines[1] - - -def sanitized_lines( - lines: Collection[tuple[int, int]], src_contents: str -) -> Collection[tuple[int, int]]: - """Returns the valid line ranges for the given source. - - This removes ranges that are entirely outside the valid lines. - - Other ranges are normalized so that the start values are at least 1 and the - end values are at most the (1-based) index of the last source line. - """ - if not src_contents: - return [] - good_lines = [] - src_line_count = src_contents.count("\n") - if not src_contents.endswith("\n"): - src_line_count += 1 - for start, end in lines: - if start > src_line_count: - continue - # line-ranges are 1-based - start = max(start, 1) - if end < start: - continue - end = min(end, src_line_count) - good_lines.append((start, end)) - return good_lines - - -def adjusted_lines( - lines: Collection[tuple[int, int]], - original_source: str, - modified_source: str, -) -> list[tuple[int, int]]: - """Returns the adjusted line ranges based on edits from the original code. - - This computes the new line ranges by diffing original_source and - modified_source, and adjust each range based on how the range overlaps with - the diffs. - - Note the diff can contain lines outside of the original line ranges. This can - happen when the formatting has to be done in adjacent to maintain consistent - local results. For example: - - 1. def my_func(arg1, arg2, - 2. arg3,): - 3. pass - - If it restricts to line 2-2, it can't simply reformat line 2, it also has - to reformat line 1: - - 1. def my_func( - 2. arg1, - 3. arg2, - 4. arg3, - 5. ): - 6. pass - - In this case, we will expand the line ranges to also include the whole diff - block. - - Args: - lines: a collection of line ranges. - original_source: the original source. - modified_source: the modified source. - """ - lines_mappings = _calculate_lines_mappings(original_source, modified_source) - - new_lines = [] - # Keep an index of the current search. Since the lines and lines_mappings are - # sorted, this makes the search complexity linear. - current_mapping_index = 0 - for start, end in sorted(lines): - start_mapping_index = _find_lines_mapping_index( - start, - lines_mappings, - current_mapping_index, - ) - end_mapping_index = _find_lines_mapping_index( - end, - lines_mappings, - start_mapping_index, - ) - current_mapping_index = start_mapping_index - if start_mapping_index >= len(lines_mappings) or end_mapping_index >= len( - lines_mappings - ): - # Protect against invalid inputs. - continue - start_mapping = lines_mappings[start_mapping_index] - end_mapping = lines_mappings[end_mapping_index] - if start_mapping.is_changed_block: - # When the line falls into a changed block, expands to the whole block. - new_start = start_mapping.modified_start - else: - new_start = ( - start - start_mapping.original_start + start_mapping.modified_start - ) - if end_mapping.is_changed_block: - # When the line falls into a changed block, expands to the whole block. - new_end = end_mapping.modified_end - else: - new_end = end - end_mapping.original_start + end_mapping.modified_start - new_range = (new_start, new_end) - if is_valid_line_range(new_range): - new_lines.append(new_range) - return new_lines - - -def convert_unchanged_lines(src_node: Node, lines: Collection[tuple[int, int]]) -> None: - r"""Converts unchanged lines to STANDALONE_COMMENT. - - The idea is similar to how `# fmt: on/off` is implemented. It also converts the - nodes between those markers as a single `STANDALONE_COMMENT` leaf node with - the unformatted code as its value. `STANDALONE_COMMENT` is a "fake" token - that will be formatted as-is with its prefix normalized. - - Here we perform two passes: - - 1. Visit the top-level statements, and convert them to a single - `STANDALONE_COMMENT` when unchanged. This speeds up formatting when some - of the top-level statements aren't changed. - 2. Convert unchanged "unwrapped lines" to `STANDALONE_COMMENT` nodes line by - line. "unwrapped lines" are divided by the `NEWLINE` token. e.g. a - multi-line statement is *one* "unwrapped line" that ends with `NEWLINE`, - even though this statement itself can span multiple lines, and the - tokenizer only sees the last '\n' as the `NEWLINE` token. - - NOTE: During pass (2), comment prefixes and indentations are ALWAYS - normalized even when the lines aren't changed. This is fixable by moving - more formatting to pass (1). However, it's hard to get it correct when - incorrect indentations are used. So we defer this to future optimizations. - """ - lines_set: set[int] = set() - for start, end in lines: - lines_set.update(range(start, end + 1)) - visitor = _TopLevelStatementsVisitor(lines_set) - _ = list(visitor.visit(src_node)) # Consume all results. - _convert_unchanged_line_by_line(src_node, lines_set) - - -def _contains_standalone_comment(node: LN) -> bool: - if isinstance(node, Leaf): - return node.type == STANDALONE_COMMENT - else: - for child in node.children: - if _contains_standalone_comment(child): - return True - return False - - -class _TopLevelStatementsVisitor(Visitor[None]): - """ - A node visitor that converts unchanged top-level statements to - STANDALONE_COMMENT. - - This is used in addition to _convert_unchanged_line_by_line, to - speed up formatting when there are unchanged top-level - classes/functions/statements. - """ - - def __init__(self, lines_set: set[int]): - self._lines_set = lines_set - - def visit_simple_stmt(self, node: Node) -> Iterator[None]: - # This is only called for top-level statements, since `visit_suite` - # won't visit its children nodes. - yield from [] - newline_leaf = last_leaf(node) - if not newline_leaf: - return - assert ( - newline_leaf.type == NEWLINE - ), f"Unexpectedly found leaf.type={newline_leaf.type}" - # We need to find the furthest ancestor with the NEWLINE as the last - # leaf, since a `suite` can simply be a `simple_stmt` when it puts - # its body on the same line. Example: `if cond: pass`. - ancestor = furthest_ancestor_with_last_leaf(newline_leaf) - if not _get_line_range(ancestor).intersection(self._lines_set): - _convert_node_to_standalone_comment(ancestor) - - def visit_suite(self, node: Node) -> Iterator[None]: - yield from [] - # If there is a STANDALONE_COMMENT node, it means parts of the node tree - # have fmt on/off/skip markers. Those STANDALONE_COMMENT nodes can't - # be simply converted by calling str(node). So we just don't convert - # here. - if _contains_standalone_comment(node): - return - # Find the semantic parent of this suite. For `async_stmt` and - # `async_funcdef`, the ASYNC token is defined on a separate level by the - # grammar. - semantic_parent = node.parent - if semantic_parent is not None: - if ( - semantic_parent.prev_sibling is not None - and semantic_parent.prev_sibling.type == ASYNC - ): - semantic_parent = semantic_parent.parent - if semantic_parent is not None and not _get_line_range( - semantic_parent - ).intersection(self._lines_set): - _convert_node_to_standalone_comment(semantic_parent) - - -def _convert_unchanged_line_by_line(node: Node, lines_set: set[int]) -> None: - """Converts unchanged to STANDALONE_COMMENT line by line.""" - for leaf in node.leaves(): - if leaf.type != NEWLINE: - # We only consider "unwrapped lines", which are divided by the NEWLINE - # token. - continue - if leaf.parent and leaf.parent.type == syms.match_stmt: - # The `suite` node is defined as: - # match_stmt: "match" subject_expr ':' NEWLINE INDENT case_block+ DEDENT - # Here we need to check `subject_expr`. The `case_block+` will be - # checked by their own NEWLINEs. - nodes_to_ignore: list[LN] = [] - prev_sibling = leaf.prev_sibling - while prev_sibling: - nodes_to_ignore.insert(0, prev_sibling) - prev_sibling = prev_sibling.prev_sibling - if not _get_line_range(nodes_to_ignore).intersection(lines_set): - _convert_nodes_to_standalone_comment(nodes_to_ignore, newline=leaf) - elif leaf.parent and leaf.parent.type == syms.suite: - # The `suite` node is defined as: - # suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT - # We will check `simple_stmt` and `stmt+` separately against the lines set - parent_sibling = leaf.parent.prev_sibling - nodes_to_ignore = [] - while parent_sibling and parent_sibling.type != syms.suite: - # NOTE: Multiple suite nodes can exist as siblings in e.g. `if_stmt`. - nodes_to_ignore.insert(0, parent_sibling) - parent_sibling = parent_sibling.prev_sibling - # Special case for `async_stmt` and `async_funcdef` where the ASYNC - # token is on the grandparent node. - grandparent = leaf.parent.parent - if ( - grandparent is not None - and grandparent.prev_sibling is not None - and grandparent.prev_sibling.type == ASYNC - ): - nodes_to_ignore.insert(0, grandparent.prev_sibling) - if not _get_line_range(nodes_to_ignore).intersection(lines_set): - _convert_nodes_to_standalone_comment(nodes_to_ignore, newline=leaf) - else: - ancestor = furthest_ancestor_with_last_leaf(leaf) - # Consider multiple decorators as a whole block, as their - # newlines have different behaviors than the rest of the grammar. - if ( - ancestor.type == syms.decorator - and ancestor.parent - and ancestor.parent.type == syms.decorators - ): - ancestor = ancestor.parent - if not _get_line_range(ancestor).intersection(lines_set): - _convert_node_to_standalone_comment(ancestor) - - -def _convert_node_to_standalone_comment(node: LN) -> None: - """Convert node to STANDALONE_COMMENT by modifying the tree inline.""" - parent = node.parent - if not parent: - return - first = first_leaf(node) - last = last_leaf(node) - if not first or not last: - return - if first is last: - # This can happen on the following edge cases: - # 1. A block of `# fmt: off/on` code except the `# fmt: on` is placed - # on the end of the last line instead of on a new line. - # 2. A single backslash on its own line followed by a comment line. - # Ideally we don't want to format them when not requested, but fixing - # isn't easy. These cases are also badly formatted code, so it isn't - # too bad we reformat them. - return - # The prefix contains comments and indentation whitespaces. They are - # reformatted accordingly to the correct indentation level. - # This also means the indentation will be changed on the unchanged lines, and - # this is actually required to not break incremental reformatting. - prefix = first.prefix - first.prefix = "" - index = node.remove() - if index is not None: - # Because of the special handling of multiple decorators, if the decorated - # item is a single line then there will be a missing newline between the - # decorator and item, so add it back. This doesn't affect any other case - # since a decorated item with a newline would hit the earlier suite case - # in _convert_unchanged_line_by_line that correctly handles the newlines. - if node.type == syms.decorated: - # A leaf of type decorated wouldn't make sense, since it should always - # have at least the decorator + the decorated item, so if this assert - # hits that means there's a problem in the parser. - assert isinstance(node, Node) - # 1 will always be the correct index since before this function is - # called all the decorators are collapsed into a single leaf - node.insert_child(1, Leaf(NEWLINE, "\n")) - # Remove the '\n', as STANDALONE_COMMENT will have '\n' appended when - # generating the formatted code. - value = str(node)[:-1] - parent.insert_child( - index, - Leaf( - STANDALONE_COMMENT, - value, - prefix=prefix, - fmt_pass_converted_first_leaf=first, - ), - ) - - -def _convert_nodes_to_standalone_comment(nodes: Sequence[LN], *, newline: Leaf) -> None: - """Convert nodes to STANDALONE_COMMENT by modifying the tree inline.""" - if not nodes: - return - parent = nodes[0].parent - first = first_leaf(nodes[0]) - if not parent or not first: - return - prefix = first.prefix - first.prefix = "" - value = "".join(str(node) for node in nodes) - # The prefix comment on the NEWLINE leaf is the trailing comment of the statement. - if newline.prefix: - value += newline.prefix - newline.prefix = "" - index = nodes[0].remove() - for node in nodes[1:]: - node.remove() - if index is not None: - parent.insert_child( - index, - Leaf( - STANDALONE_COMMENT, - value, - prefix=prefix, - fmt_pass_converted_first_leaf=first, - ), - ) - - -def _leaf_line_end(leaf: Leaf) -> int: - """Returns the line number of the leaf node's last line.""" - if leaf.type == NEWLINE: - return leaf.lineno - else: - # Leaf nodes like multiline strings can occupy multiple lines. - return leaf.lineno + str(leaf).count("\n") - - -def _get_line_range(node_or_nodes: LN | list[LN]) -> set[int]: - """Returns the line range of this node or list of nodes.""" - if isinstance(node_or_nodes, list): - nodes = node_or_nodes - if not nodes: - return set() - first = first_leaf(nodes[0]) - last = last_leaf(nodes[-1]) - if first and last: - line_start = first.lineno - line_end = _leaf_line_end(last) - return set(range(line_start, line_end + 1)) - else: - return set() - else: - node = node_or_nodes - if isinstance(node, Leaf): - return set(range(node.lineno, _leaf_line_end(node) + 1)) - else: - first = first_leaf(node) - last = last_leaf(node) - if first and last: - return set(range(first.lineno, _leaf_line_end(last) + 1)) - else: - return set() - - -@dataclass -class _LinesMapping: - """1-based lines mapping from original source to modified source. - - Lines [original_start, original_end] from original source - are mapped to [modified_start, modified_end]. - - The ranges are inclusive on both ends. - """ - - original_start: int - original_end: int - modified_start: int - modified_end: int - # Whether this range corresponds to a changed block, or an unchanged block. - is_changed_block: bool - - -def _calculate_lines_mappings( - original_source: str, - modified_source: str, -) -> Sequence[_LinesMapping]: - """Returns a sequence of _LinesMapping by diffing the sources. - - For example, given the following diff: - import re - - def func(arg1, - - arg2, arg3): - + def func(arg1, arg2, arg3): - pass - It returns the following mappings: - original -> modified - (1, 1) -> (1, 1), is_changed_block=False (the "import re" line) - (2, 3) -> (2, 2), is_changed_block=True (the diff) - (4, 4) -> (3, 3), is_changed_block=False (the "pass" line) - - You can think of this visually as if it brings up a side-by-side diff, and tries - to map the line ranges from the left side to the right side: - - (1, 1)->(1, 1) 1. import re 1. import re - (2, 3)->(2, 2) 2. def func(arg1, 2. def func(arg1, arg2, arg3): - 3. arg2, arg3): - (4, 4)->(3, 3) 4. pass 3. pass - - Args: - original_source: the original source. - modified_source: the modified source. - """ - matcher = difflib.SequenceMatcher( - None, - original_source.splitlines(keepends=True), - modified_source.splitlines(keepends=True), - ) - matching_blocks = matcher.get_matching_blocks() - lines_mappings: list[_LinesMapping] = [] - # matching_blocks is a sequence of "same block of code ranges", see - # https://docs.python.org/3/library/difflib.html#difflib.SequenceMatcher.get_matching_blocks - # Each block corresponds to a _LinesMapping with is_changed_block=False, - # and the ranges between two blocks corresponds to a _LinesMapping with - # is_changed_block=True, - # NOTE: matching_blocks is 0-based, but _LinesMapping is 1-based. - for i, block in enumerate(matching_blocks): - if i == 0: - if block.a != 0 or block.b != 0: - lines_mappings.append( - _LinesMapping( - original_start=1, - original_end=block.a, - modified_start=1, - modified_end=block.b, - is_changed_block=False, - ) - ) - else: - previous_block = matching_blocks[i - 1] - lines_mappings.append( - _LinesMapping( - original_start=previous_block.a + previous_block.size + 1, - original_end=block.a, - modified_start=previous_block.b + previous_block.size + 1, - modified_end=block.b, - is_changed_block=True, - ) - ) - if i < len(matching_blocks) - 1: - lines_mappings.append( - _LinesMapping( - original_start=block.a + 1, - original_end=block.a + block.size, - modified_start=block.b + 1, - modified_end=block.b + block.size, - is_changed_block=False, - ) - ) - return lines_mappings - - -def _find_lines_mapping_index( - original_line: int, - lines_mappings: Sequence[_LinesMapping], - start_index: int, -) -> int: - """Returns the original index of the lines mappings for the original line.""" - index = start_index - while index < len(lines_mappings): - mapping = lines_mappings[index] - if mapping.original_start <= original_line <= mapping.original_end: - return index - index += 1 - return index diff --git a/venv/lib/python3.12/site-packages/black/report.py b/venv/lib/python3.12/site-packages/black/report.py deleted file mode 100644 index 89899f2..0000000 --- a/venv/lib/python3.12/site-packages/black/report.py +++ /dev/null @@ -1,107 +0,0 @@ -""" -Summarize Black runs to users. -""" - -from dataclasses import dataclass -from enum import Enum -from pathlib import Path - -from click import style - -from black.output import err, out - - -class Changed(Enum): - NO = 0 - CACHED = 1 - YES = 2 - - -class NothingChanged(UserWarning): - """Raised when reformatted code is the same as source.""" - - -@dataclass -class Report: - """Provides a reformatting counter. Can be rendered with `str(report)`.""" - - check: bool = False - diff: bool = False - quiet: bool = False - verbose: bool = False - change_count: int = 0 - same_count: int = 0 - failure_count: int = 0 - - def done(self, src: Path, changed: Changed) -> None: - """Increment the counter for successful reformatting. Write out a message.""" - if changed is Changed.YES: - reformatted = "would reformat" if self.check or self.diff else "reformatted" - if self.verbose or not self.quiet: - out(f"{reformatted} {src}") - self.change_count += 1 - else: - if self.verbose: - if changed is Changed.NO: - msg = f"{src} already well formatted, good job." - else: - msg = f"{src} wasn't modified on disk since last run." - out(msg, bold=False) - self.same_count += 1 - - def failed(self, src: Path, message: str) -> None: - """Increment the counter for failed reformatting. Write out a message.""" - err(f"error: cannot format {src}: {message}") - self.failure_count += 1 - - def path_ignored(self, path: Path, message: str) -> None: - if self.verbose: - out(f"{path} ignored: {message}", bold=False) - - @property - def return_code(self) -> int: - """Return the exit code that the app should use. - - This considers the current state of changed files and failures: - - if there were any failures, return 123; - - if any files were changed and --check is being used, return 1; - - otherwise return 0. - """ - # According to http://tldp.org/LDP/abs/html/exitcodes.html starting with - # 126 we have special return codes reserved by the shell. - if self.failure_count: - return 123 - - elif self.change_count and self.check: - return 1 - - return 0 - - def __str__(self) -> str: - """Render a color report of the current state. - - Use `click.unstyle` to remove colors. - """ - if self.check or self.diff: - reformatted = "would be reformatted" - unchanged = "would be left unchanged" - failed = "would fail to reformat" - else: - reformatted = "reformatted" - unchanged = "left unchanged" - failed = "failed to reformat" - report = [] - if self.change_count: - s = "s" if self.change_count > 1 else "" - report.append( - style(f"{self.change_count} file{s} ", bold=True, fg="blue") - + style(f"{reformatted}", bold=True) - ) - - if self.same_count: - s = "s" if self.same_count > 1 else "" - report.append(style(f"{self.same_count} file{s} ", fg="blue") + unchanged) - if self.failure_count: - s = "s" if self.failure_count > 1 else "" - report.append(style(f"{self.failure_count} file{s} {failed}", fg="red")) - return ", ".join(report) + "." diff --git a/venv/lib/python3.12/site-packages/black/resources/__init__.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/black/resources/__init__.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 1b91344..0000000 Binary files a/venv/lib/python3.12/site-packages/black/resources/__init__.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/resources/__init__.py b/venv/lib/python3.12/site-packages/black/resources/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/black/resources/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/black/resources/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 8aaa96d..0000000 Binary files a/venv/lib/python3.12/site-packages/black/resources/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/resources/black.schema.json b/venv/lib/python3.12/site-packages/black/resources/black.schema.json deleted file mode 100644 index b2b1a03..0000000 --- a/venv/lib/python3.12/site-packages/black/resources/black.schema.json +++ /dev/null @@ -1,154 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://github.com/psf/black/blob/main/src/black/resources/black.schema.json", - "$comment": "tool.black table in pyproject.toml", - "type": "object", - "additionalProperties": false, - "properties": { - "code": { - "type": "string", - "description": "Format the code passed in as a string." - }, - "line-length": { - "type": "integer", - "description": "How many characters per line to allow.", - "default": 88 - }, - "target-version": { - "type": "array", - "items": { - "enum": [ - "py33", - "py34", - "py35", - "py36", - "py37", - "py38", - "py39", - "py310", - "py311", - "py312", - "py313", - "py314" - ] - }, - "description": "Python versions that should be supported by Black's output. You should include all versions that your code supports. By default, Black will infer target versions from the project metadata in pyproject.toml. If this does not yield conclusive results, Black will use per-file auto-detection." - }, - "pyi": { - "type": "boolean", - "description": "Format all input files like typing stubs regardless of file extension. This is useful when piping source on standard input.", - "default": false - }, - "ipynb": { - "type": "boolean", - "description": "Format all input files like Jupyter Notebooks regardless of file extension. This is useful when piping source on standard input.", - "default": false - }, - "python-cell-magics": { - "type": "array", - "items": { - "type": "string" - }, - "description": "When processing Jupyter Notebooks, add the given magic to the list of known python-magics (capture, prun, pypy, python, python3, time, timeit). Useful for formatting cells with custom python magics." - }, - "skip-source-first-line": { - "type": "boolean", - "description": "Skip the first line of the source code.", - "default": false - }, - "skip-string-normalization": { - "type": "boolean", - "description": "Don't normalize string quotes or prefixes.", - "default": false - }, - "skip-magic-trailing-comma": { - "type": "boolean", - "description": "Don't use trailing commas as a reason to split lines.", - "default": false - }, - "preview": { - "type": "boolean", - "description": "Enable potentially disruptive style changes that may be added to Black's main functionality in the next major release.", - "default": false - }, - "unstable": { - "type": "boolean", - "description": "Enable potentially disruptive style changes that have known bugs or are not currently expected to make it into the stable style Black's next major release. Implies --preview.", - "default": false - }, - "enable-unstable-feature": { - "type": "array", - "items": { - "enum": [ - "string_processing", - "hug_parens_with_braces_and_square_brackets", - "wrap_comprehension_in", - "simplify_power_operator_hugging", - "wrap_long_dict_values_in_parens", - "fix_if_guard_explosion_in_case_statement" - ] - }, - "description": "Enable specific features included in the `--unstable` style. Requires `--preview`. No compatibility guarantees are provided on the behavior or existence of any unstable features." - }, - "check": { - "type": "boolean", - "description": "Don't write the files back, just return the status. Return code 0 means nothing would change. Return code 1 means some files would be reformatted. Return code 123 means there was an internal error.", - "default": false - }, - "diff": { - "type": "boolean", - "description": "Don't write the files back, just output a diff to indicate what changes Black would've made. They are printed to stdout so capturing them is simple.", - "default": false - }, - "color": { - "type": "boolean", - "description": "Show (or do not show) colored diff. Only applies when --diff is given.", - "default": false - }, - "fast": { - "type": "boolean", - "description": "By default, Black performs an AST safety check after formatting your code. The --fast flag turns off this check and the --safe flag explicitly enables it. [default: --safe]", - "default": false - }, - "required-version": { - "type": "string", - "description": "Require a specific version of Black to be running. This is useful for ensuring that all contributors to your project are using the same version, because different versions of Black may format code a little differently. This option can be set in a configuration file for consistent results across environments." - }, - "exclude": { - "type": "string", - "description": "A regular expression that matches files and directories that should be excluded on recursive searches. An empty value means no paths are excluded. Use forward slashes for directories on all platforms (Windows, too). By default, Black also ignores all paths listed in .gitignore. Changing this value will override all default exclusions. [default: /(\\.direnv|\\.eggs|\\.git|\\.hg|\\.ipynb_checkpoints|\\.mypy_cache|\\.nox|\\.pytest_cache|\\.ruff_cache|\\.tox|\\.svn|\\.venv|\\.vscode|__pypackages__|_build|buck-out|build|dist|venv)/]" - }, - "extend-exclude": { - "type": "string", - "description": "Like --exclude, but adds additional files and directories on top of the default values instead of overriding them." - }, - "force-exclude": { - "type": "string", - "description": "Like --exclude, but files and directories matching this regex will be excluded even when they are passed explicitly as arguments. This is useful when invoking Black programmatically on changed files, such as in a pre-commit hook or editor plugin." - }, - "include": { - "type": "string", - "description": "A regular expression that matches files and directories that should be included on recursive searches. An empty value means all files are included regardless of the name. Use forward slashes for directories on all platforms (Windows, too). Overrides all exclusions, including from .gitignore and command line options.", - "default": "(\\.pyi?|\\.ipynb)$" - }, - "workers": { - "type": "integer", - "description": "When Black formats multiple files, it may use a process pool to speed up formatting. This option controls the number of parallel workers. This can also be specified via the BLACK_NUM_WORKERS environment variable. Defaults to the number of CPUs in the system." - }, - "quiet": { - "type": "boolean", - "description": "Stop emitting all non-critical output. Error messages will still be emitted (which can silenced by 2>/dev/null).", - "default": false - }, - "verbose": { - "type": "boolean", - "description": "Emit messages about files that were not changed or were ignored due to exclusion patterns. If Black is using a configuration file, a message detailing which one it is using will be emitted.", - "default": false - }, - "no-cache": { - "type": "boolean", - "description": "Skip reading and writing the cache, forcing Black to reformat all included files.", - "default": false - } - } -} diff --git a/venv/lib/python3.12/site-packages/black/rusty.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/black/rusty.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index aa28a80..0000000 Binary files a/venv/lib/python3.12/site-packages/black/rusty.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/rusty.py b/venv/lib/python3.12/site-packages/black/rusty.py deleted file mode 100644 index ebd4c05..0000000 --- a/venv/lib/python3.12/site-packages/black/rusty.py +++ /dev/null @@ -1,28 +0,0 @@ -"""An error-handling model influenced by that used by the Rust programming language - -See https://doc.rust-lang.org/book/ch09-00-error-handling.html. -""" - -from typing import Generic, TypeVar, Union - -T = TypeVar("T") -E = TypeVar("E", bound=Exception) - - -class Ok(Generic[T]): - def __init__(self, value: T) -> None: - self._value = value - - def ok(self) -> T: - return self._value - - -class Err(Generic[E]): - def __init__(self, e: E) -> None: - self._e = e - - def err(self) -> E: - return self._e - - -Result = Union[Ok[T], Err[E]] diff --git a/venv/lib/python3.12/site-packages/black/schema.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/black/schema.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 9edaf1c..0000000 Binary files a/venv/lib/python3.12/site-packages/black/schema.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/schema.py b/venv/lib/python3.12/site-packages/black/schema.py deleted file mode 100644 index f534dbb..0000000 --- a/venv/lib/python3.12/site-packages/black/schema.py +++ /dev/null @@ -1,15 +0,0 @@ -import importlib.resources -import json -from typing import Any - - -def get_schema(tool_name: str = "black") -> Any: - """Get the stored complete schema for black's settings.""" - assert tool_name == "black", "Only black is supported." - - pkg = "black.resources" - fname = "black.schema.json" - - schema = importlib.resources.files(pkg).joinpath(fname) - with schema.open(encoding="utf-8") as f: - return json.load(f) diff --git a/venv/lib/python3.12/site-packages/black/strings.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/black/strings.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index e342969..0000000 Binary files a/venv/lib/python3.12/site-packages/black/strings.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/strings.py b/venv/lib/python3.12/site-packages/black/strings.py deleted file mode 100644 index c92e224..0000000 --- a/venv/lib/python3.12/site-packages/black/strings.py +++ /dev/null @@ -1,391 +0,0 @@ -""" -Simple formatting on strings. Further string formatting code is in trans.py. -""" - -import re -import sys -from functools import lru_cache -from re import Match, Pattern -from typing import Final - -from black._width_table import WIDTH_TABLE -from blib2to3.pytree import Leaf - -STRING_PREFIX_CHARS: Final = "fturbFTURB" # All possible string prefix characters. -STRING_PREFIX_RE: Final = re.compile( - r"^([" + STRING_PREFIX_CHARS + r"]*)(.*)$", re.DOTALL -) -UNICODE_ESCAPE_RE: Final = re.compile( - r"(?P\\+)(?P" - r"(u(?P[a-fA-F0-9]{4}))" # Character with 16-bit hex value xxxx - r"|(U(?P[a-fA-F0-9]{8}))" # Character with 32-bit hex value xxxxxxxx - r"|(x(?P[a-fA-F0-9]{2}))" # Character with hex value hh - r"|(N\{(?P[a-zA-Z0-9 \-]{2,})\})" # Character named name in the Unicode database - r")", - re.VERBOSE, -) - - -def sub_twice(regex: Pattern[str], replacement: str, original: str) -> str: - """Replace `regex` with `replacement` twice on `original`. - - This is used by string normalization to perform replaces on - overlapping matches. - """ - return regex.sub(replacement, regex.sub(replacement, original)) - - -def has_triple_quotes(string: str) -> bool: - """ - Returns: - True iff @string starts with three quotation characters. - """ - raw_string = string.lstrip(STRING_PREFIX_CHARS) - return raw_string[:3] in {'"""', "'''"} - - -def lines_with_leading_tabs_expanded(s: str) -> list[str]: - """ - Splits string into lines and expands only leading tabs (following the normal - Python rules) - """ - lines = [] - for line in s.splitlines(): - stripped_line = line.lstrip() - if not stripped_line or stripped_line == line: - lines.append(line) - else: - prefix_length = len(line) - len(stripped_line) - prefix = line[:prefix_length].expandtabs() - lines.append(prefix + stripped_line) - if s.endswith("\n"): - lines.append("") - return lines - - -def fix_multiline_docstring(docstring: str, prefix: str) -> str: - # https://www.python.org/dev/peps/pep-0257/#handling-docstring-indentation - assert docstring, "INTERNAL ERROR: Multiline docstrings cannot be empty" - lines = lines_with_leading_tabs_expanded(docstring) - # Determine minimum indentation (first line doesn't count): - indent = sys.maxsize - for line in lines[1:]: - stripped = line.lstrip() - if stripped: - indent = min(indent, len(line) - len(stripped)) - # Remove indentation (first line is special): - trimmed = [lines[0].strip()] - if indent < sys.maxsize: - last_line_idx = len(lines) - 2 - for i, line in enumerate(lines[1:]): - stripped_line = line[indent:].rstrip() - if stripped_line or i == last_line_idx: - trimmed.append(prefix + stripped_line) - else: - trimmed.append("") - return "\n".join(trimmed) - - -def get_string_prefix(string: str) -> str: - """ - Pre-conditions: - * assert_is_leaf_string(@string) - - Returns: - @string's prefix (e.g. '', 'r', 'f', or 'rf'). - """ - assert_is_leaf_string(string) - - prefix = [] - for char in string: - if char in STRING_PREFIX_CHARS: - prefix.append(char) - else: - break - return "".join(prefix) - - -def assert_is_leaf_string(string: str) -> None: - """ - Checks the pre-condition that @string has the format that you would expect - of `leaf.value` where `leaf` is some Leaf such that `leaf.type == - token.STRING`. A more precise description of the pre-conditions that are - checked are listed below. - - Pre-conditions: - * @string starts with either ', ", ', or " where - `set()` is some subset of `set(STRING_PREFIX_CHARS)`. - * @string ends with a quote character (' or "). - - Raises: - AssertionError(...) if the pre-conditions listed above are not - satisfied. - """ - dquote_idx = string.find('"') - squote_idx = string.find("'") - if -1 in [dquote_idx, squote_idx]: - quote_idx = max(dquote_idx, squote_idx) - else: - quote_idx = min(squote_idx, dquote_idx) - - assert ( - 0 <= quote_idx < len(string) - 1 - ), f"{string!r} is missing a starting quote character (' or \")." - assert string[-1] in ( - "'", - '"', - ), f"{string!r} is missing an ending quote character (' or \")." - assert set(string[:quote_idx]).issubset( - set(STRING_PREFIX_CHARS) - ), f"{set(string[:quote_idx])} is NOT a subset of {set(STRING_PREFIX_CHARS)}." - - -def normalize_string_prefix(s: str) -> str: - """Make all string prefixes lowercase.""" - match = STRING_PREFIX_RE.match(s) - assert match is not None, f"failed to match string {s!r}" - orig_prefix = match.group(1) - new_prefix = ( - orig_prefix.replace("F", "f") - .replace("B", "b") - .replace("U", "") - .replace("u", "") - ) - - # Python syntax guarantees max 2 prefixes and that one of them is "r" - if len(new_prefix) == 2 and new_prefix[0].lower() != "r": - new_prefix = new_prefix[::-1] - return f"{new_prefix}{match.group(2)}" - - -# Re(gex) does actually cache patterns internally but this still improves -# performance on a long list literal of strings by 5-9% since lru_cache's -# caching overhead is much lower. -@lru_cache(maxsize=64) -def _cached_compile(pattern: str) -> Pattern[str]: - return re.compile(pattern) - - -def normalize_string_quotes(s: str) -> str: - """Prefer double quotes but only if it doesn't cause more escaping. - - Adds or removes backslashes as appropriate. - """ - value = s.lstrip(STRING_PREFIX_CHARS) - if value[:3] == '"""': - return s - - elif value[:3] == "'''": - orig_quote = "'''" - new_quote = '"""' - elif value[0] == '"': - orig_quote = '"' - new_quote = "'" - else: - orig_quote = "'" - new_quote = '"' - first_quote_pos = s.find(orig_quote) - assert first_quote_pos != -1, f"INTERNAL ERROR: Malformed string {s!r}" - - prefix = s[:first_quote_pos] - unescaped_new_quote = _cached_compile(rf"(([^\\]|^)(\\\\)*){new_quote}") - escaped_new_quote = _cached_compile(rf"([^\\]|^)\\((?:\\\\)*){new_quote}") - escaped_orig_quote = _cached_compile(rf"([^\\]|^)\\((?:\\\\)*){orig_quote}") - body = s[first_quote_pos + len(orig_quote) : -len(orig_quote)] - if "r" in prefix.casefold(): - if unescaped_new_quote.search(body): - # There's at least one unescaped new_quote in this raw string - # so converting is impossible - return s - - # Do not introduce or remove backslashes in raw strings - new_body = body - else: - # remove unnecessary escapes - new_body = sub_twice(escaped_new_quote, rf"\1\2{new_quote}", body) - if body != new_body: - # Consider the string without unnecessary escapes as the original - body = new_body - s = f"{prefix}{orig_quote}{body}{orig_quote}" - new_body = sub_twice(escaped_orig_quote, rf"\1\2{orig_quote}", new_body) - new_body = sub_twice(unescaped_new_quote, rf"\1\\{new_quote}", new_body) - - if "f" in prefix.casefold(): - matches = re.findall( - r""" - (?:(? orig_escape_count: - return s # Do not introduce more escaping - - if new_escape_count == orig_escape_count and orig_quote == '"': - return s # Prefer double quotes - - return f"{prefix}{new_quote}{new_body}{new_quote}" - - -def normalize_fstring_quotes( - quote: str, - middles: list[Leaf], - is_raw_fstring: bool, -) -> tuple[list[Leaf], str]: - """Prefer double quotes but only if it doesn't cause more escaping. - - Adds or removes backslashes as appropriate. - """ - if quote == '"""': - return middles, quote - - elif quote == "'''": - new_quote = '"""' - elif quote == '"': - new_quote = "'" - else: - new_quote = '"' - - unescaped_new_quote = _cached_compile(rf"(([^\\]|^)(\\\\)*){new_quote}") - escaped_new_quote = _cached_compile(rf"([^\\]|^)\\((?:\\\\)*){new_quote}") - escaped_orig_quote = _cached_compile(rf"([^\\]|^)\\((?:\\\\)*){quote}") - if is_raw_fstring: - for middle in middles: - if unescaped_new_quote.search(middle.value): - # There's at least one unescaped new_quote in this raw string - # so converting is impossible - return middles, quote - - # Do not introduce or remove backslashes in raw strings, just use double quote - return middles, '"' - - new_segments = [] - for middle in middles: - segment = middle.value - # remove unnecessary escapes - new_segment = sub_twice(escaped_new_quote, rf"\1\2{new_quote}", segment) - if segment != new_segment: - # Consider the string without unnecessary escapes as the original - middle.value = new_segment - - new_segment = sub_twice(escaped_orig_quote, rf"\1\2{quote}", new_segment) - new_segment = sub_twice(unescaped_new_quote, rf"\1\\{new_quote}", new_segment) - new_segments.append(new_segment) - - if new_quote == '"""' and new_segments[-1].endswith('"'): - # edge case: - new_segments[-1] = new_segments[-1][:-1] + '\\"' - - orig_escape_count = 0 - new_escape_count = 0 - for middle, new_segment in zip(middles, new_segments, strict=True): - orig_escape_count += middle.value.count("\\") - new_escape_count += new_segment.count("\\") - - if new_escape_count > orig_escape_count: - return middles, quote # Do not introduce more escaping - - if new_escape_count == orig_escape_count and quote == '"': - return middles, quote # Prefer double quotes - - for middle, new_segment in zip(middles, new_segments, strict=True): - middle.value = new_segment - - return middles, new_quote - - -def normalize_unicode_escape_sequences(leaf: Leaf) -> None: - """Replace hex codes in Unicode escape sequences with lowercase representation.""" - text = leaf.value - prefix = get_string_prefix(text) - if "r" in prefix.lower(): - return - - def replace(m: Match[str]) -> str: - groups = m.groupdict() - back_slashes = groups["backslashes"] - - if len(back_slashes) % 2 == 0: - return back_slashes + groups["body"] - - if groups["u"]: - # \u - return back_slashes + "u" + groups["u"].lower() - elif groups["U"]: - # \U - return back_slashes + "U" + groups["U"].lower() - elif groups["x"]: - # \x - return back_slashes + "x" + groups["x"].lower() - else: - assert groups["N"], f"Unexpected match: {m}" - # \N{} - return back_slashes + "N{" + groups["N"].upper() + "}" - - leaf.value = re.sub(UNICODE_ESCAPE_RE, replace, text) - - -@lru_cache(maxsize=4096) -def char_width(char: str) -> int: - """Return the width of a single character as it would be displayed in a - terminal or editor (which respects Unicode East Asian Width). - - Full width characters are counted as 2, while half width characters are - counted as 1. Also control characters are counted as 0. - """ - table = WIDTH_TABLE - codepoint = ord(char) - highest = len(table) - 1 - lowest = 0 - idx = highest // 2 - while True: - start_codepoint, end_codepoint, width = table[idx] - if codepoint < start_codepoint: - highest = idx - 1 - elif codepoint > end_codepoint: - lowest = idx + 1 - else: - return 0 if width < 0 else width - if highest < lowest: - break - idx = (highest + lowest) // 2 - return 1 - - -def str_width(line_str: str) -> int: - """Return the width of `line_str` as it would be displayed in a terminal - or editor (which respects Unicode East Asian Width). - - You could utilize this function to determine, for example, if a string - is too wide to display in a terminal or editor. - """ - if line_str.isascii(): - # Fast path for a line consisting of only ASCII characters - return len(line_str) - return sum(map(char_width, line_str)) - - -def count_chars_in_width(line_str: str, max_width: int) -> int: - """Count the number of characters in `line_str` that would fit in a - terminal or editor of `max_width` (which respects Unicode East Asian - Width). - """ - total_width = 0 - for i, char in enumerate(line_str): - width = char_width(char) - if width + total_width > max_width: - return i - total_width += width - return len(line_str) diff --git a/venv/lib/python3.12/site-packages/black/trans.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/black/trans.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 88803ff..0000000 Binary files a/venv/lib/python3.12/site-packages/black/trans.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/black/trans.py b/venv/lib/python3.12/site-packages/black/trans.py deleted file mode 100644 index 8d8ea2e..0000000 --- a/venv/lib/python3.12/site-packages/black/trans.py +++ /dev/null @@ -1,2560 +0,0 @@ -""" -String transformers that can split and merge strings. -""" - -import re -from abc import ABC, abstractmethod -from collections import defaultdict -from collections.abc import Callable, Collection, Iterable, Iterator, Sequence -from dataclasses import dataclass -from typing import Any, ClassVar, Final, Literal, TypeVar, Union - -from mypy_extensions import trait - -from black.comments import contains_pragma_comment -from black.lines import Line, append_leaves -from black.mode import Feature, Mode -from black.nodes import ( - CLOSING_BRACKETS, - OPENING_BRACKETS, - STANDALONE_COMMENT, - is_empty_lpar, - is_empty_par, - is_empty_rpar, - is_part_of_annotation, - parent_type, - replace_child, - syms, -) -from black.rusty import Err, Ok, Result -from black.strings import ( - assert_is_leaf_string, - count_chars_in_width, - get_string_prefix, - has_triple_quotes, - normalize_string_quotes, - str_width, -) -from blib2to3.pgen2 import token -from blib2to3.pytree import Leaf, Node - - -class CannotTransform(Exception): - """Base class for errors raised by Transformers.""" - - -# types -T = TypeVar("T") -LN = Union[Leaf, Node] -Transformer = Callable[[Line, Collection[Feature], Mode], Iterator[Line]] -Index = int -NodeType = int -ParserState = int -StringID = int -TResult = Result[T, CannotTransform] # (T)ransform Result -TMatchResult = TResult[list[Index]] - -SPLIT_SAFE_CHARS = frozenset(["\u3001", "\u3002", "\uff0c"]) # East Asian stops - - -def TErr(err_msg: str) -> Err[CannotTransform]: - """(T)ransform Err - - Convenience function used when working with the TResult type. - """ - cant_transform = CannotTransform(err_msg) - return Err(cant_transform) - - -# Remove when `simplify_power_operator_hugging` becomes stable. -def hug_power_op( - line: Line, features: Collection[Feature], mode: Mode -) -> Iterator[Line]: - """A transformer which normalizes spacing around power operators.""" - - # Performance optimization to avoid unnecessary Leaf clones and other ops. - for leaf in line.leaves: - if leaf.type == token.DOUBLESTAR: - break - else: - raise CannotTransform("No doublestar token was found in the line.") - - def is_simple_lookup(index: int, kind: Literal[1, -1]) -> bool: - # Brackets and parentheses indicate calls, subscripts, etc. ... - # basically stuff that doesn't count as "simple". Only a NAME lookup - # or dotted lookup (eg. NAME.NAME) is OK. - if kind == -1: - return handle_is_simple_look_up_prev(line, index, {token.RPAR, token.RSQB}) - else: - return handle_is_simple_lookup_forward( - line, index, {token.LPAR, token.LSQB} - ) - - def is_simple_operand(index: int, kind: Literal[1, -1]) -> bool: - # An operand is considered "simple" if's a NAME, a numeric CONSTANT, a simple - # lookup (see above), with or without a preceding unary operator. - start = line.leaves[index] - if start.type in {token.NAME, token.NUMBER}: - return is_simple_lookup(index, kind) - - if start.type in {token.PLUS, token.MINUS, token.TILDE}: - if line.leaves[index + 1].type in {token.NAME, token.NUMBER}: - # kind is always one as bases with a preceding unary op will be checked - # for simplicity starting from the next token (so it'll hit the check - # above). - return is_simple_lookup(index + 1, kind=1) - - return False - - new_line = line.clone() - should_hug = False - for idx, leaf in enumerate(line.leaves): - new_leaf = leaf.clone() - if should_hug: - new_leaf.prefix = "" - should_hug = False - - should_hug = ( - (0 < idx < len(line.leaves) - 1) - and leaf.type == token.DOUBLESTAR - and is_simple_operand(idx - 1, kind=-1) - and line.leaves[idx - 1].value != "lambda" - and is_simple_operand(idx + 1, kind=1) - ) - if should_hug: - new_leaf.prefix = "" - - # We have to be careful to make a new line properly: - # - bracket related metadata must be maintained (handled by Line.append) - # - comments need to copied over, updating the leaf IDs they're attached to - new_line.append(new_leaf, preformatted=True) - for comment_leaf in line.comments_after(leaf): - new_line.append(comment_leaf, preformatted=True) - - yield new_line - - -# Remove when `simplify_power_operator_hugging` becomes stable. -def handle_is_simple_look_up_prev(line: Line, index: int, disallowed: set[int]) -> bool: - """ - Handling the determination of is_simple_lookup for the lines prior to the doublestar - token. This is required because of the need to isolate the chained expression - to determine the bracket or parenthesis belong to the single expression. - """ - contains_disallowed = False - chain = [] - - while 0 <= index < len(line.leaves): - current = line.leaves[index] - chain.append(current) - if not contains_disallowed and current.type in disallowed: - contains_disallowed = True - if not is_expression_chained(chain): - return not contains_disallowed - - index -= 1 - - return True - - -# Remove when `simplify_power_operator_hugging` becomes stable. -def handle_is_simple_lookup_forward( - line: Line, index: int, disallowed: set[int] -) -> bool: - """ - Handling decision is_simple_lookup for the lines behind the doublestar token. - This function is simplified to keep consistent with the prior logic and the forward - case are more straightforward and do not need to care about chained expressions. - """ - while 0 <= index < len(line.leaves): - current = line.leaves[index] - if current.type in disallowed: - return False - if current.type not in {token.NAME, token.DOT} or ( - current.type == token.NAME and current.value == "for" - ): - # If the current token isn't disallowed, we'll assume this is simple as - # only the disallowed tokens are semantically attached to this lookup - # expression we're checking. Also, stop early if we hit the 'for' bit - # of a comprehension. - return True - - index += 1 - - return True - - -# Remove when `simplify_power_operator_hugging` becomes stable. -def is_expression_chained(chained_leaves: list[Leaf]) -> bool: - """ - Function to determine if the variable is a chained call. - (e.g., foo.lookup, foo().lookup, (foo.lookup())) will be recognized as chained call) - """ - if len(chained_leaves) < 2: - return True - - current_leaf = chained_leaves[-1] - past_leaf = chained_leaves[-2] - - if past_leaf.type == token.NAME: - return current_leaf.type in {token.DOT} - elif past_leaf.type in {token.RPAR, token.RSQB}: - return current_leaf.type in {token.RSQB, token.RPAR} - elif past_leaf.type in {token.LPAR, token.LSQB}: - return current_leaf.type in {token.NAME, token.LPAR, token.LSQB} - else: - return False - - -class StringTransformer(ABC): - """ - An implementation of the Transformer protocol that relies on its - subclasses overriding the template methods `do_match(...)` and - `do_transform(...)`. - - This Transformer works exclusively on strings (for example, by merging - or splitting them). - - The following sections can be found among the docstrings of each concrete - StringTransformer subclass. - - Requirements: - Which requirements must be met of the given Line for this - StringTransformer to be applied? - - Transformations: - If the given Line meets all of the above requirements, which string - transformations can you expect to be applied to it by this - StringTransformer? - - Collaborations: - What contractual agreements does this StringTransformer have with other - StringTransfomers? Such collaborations should be eliminated/minimized - as much as possible. - """ - - __name__: Final = "StringTransformer" - - # Ideally this would be a dataclass, but unfortunately mypyc breaks when used with - # `abc.ABC`. - def __init__(self, line_length: int, normalize_strings: bool) -> None: - self.line_length = line_length - self.normalize_strings = normalize_strings - - @abstractmethod - def do_match(self, line: Line) -> TMatchResult: - """ - Returns: - * Ok(string_indices) such that for each index, `line.leaves[index]` - is our target string if a match was able to be made. For - transformers that don't result in more lines (e.g. StringMerger, - StringParenStripper), multiple matches and transforms are done at - once to reduce the complexity. - OR - * Err(CannotTransform), if no match could be made. - """ - - @abstractmethod - def do_transform( - self, line: Line, string_indices: list[int] - ) -> Iterator[TResult[Line]]: - """ - Yields: - * Ok(new_line) where new_line is the new transformed line. - OR - * Err(CannotTransform) if the transformation failed for some reason. The - `do_match(...)` template method should usually be used to reject - the form of the given Line, but in some cases it is difficult to - know whether or not a Line meets the StringTransformer's - requirements until the transformation is already midway. - - Side Effects: - This method should NOT mutate @line directly, but it MAY mutate the - Line's underlying Node structure. (WARNING: If the underlying Node - structure IS altered, then this method should NOT be allowed to - yield an CannotTransform after that point.) - """ - - def __call__( - self, line: Line, _features: Collection[Feature], _mode: Mode - ) -> Iterator[Line]: - """ - StringTransformer instances have a call signature that mirrors that of - the Transformer type. - - Raises: - CannotTransform(...) if the concrete StringTransformer class is unable - to transform @line. - """ - # Optimization to avoid calling `self.do_match(...)` when the line does - # not contain any string. - if not any(leaf.type == token.STRING for leaf in line.leaves): - raise CannotTransform("There are no strings in this line.") - - match_result = self.do_match(line) - - if isinstance(match_result, Err): - cant_transform = match_result.err() - raise CannotTransform( - f"The string transformer {self.__class__.__name__} does not recognize" - " this line as one that it can transform." - ) from cant_transform - - string_indices = match_result.ok() - - for line_result in self.do_transform(line, string_indices): - if isinstance(line_result, Err): - cant_transform = line_result.err() - raise CannotTransform( - "StringTransformer failed while attempting to transform string." - ) from cant_transform - line = line_result.ok() - yield line - - -@dataclass -class CustomSplit: - """A custom (i.e. manual) string split. - - A single CustomSplit instance represents a single substring. - - Examples: - Consider the following string: - ``` - "Hi there friend." - " This is a custom" - f" string {split}." - ``` - - This string will correspond to the following three CustomSplit instances: - ``` - CustomSplit(False, 16) - CustomSplit(False, 17) - CustomSplit(True, 16) - ``` - """ - - has_prefix: bool - break_idx: int - - -CustomSplitMapKey = tuple[StringID, str] - - -@trait -class CustomSplitMapMixin: - """ - This mixin class is used to map merged strings to a sequence of - CustomSplits, which will then be used to re-split the strings iff none of - the resultant substrings go over the configured max line length. - """ - - _CUSTOM_SPLIT_MAP: ClassVar[dict[CustomSplitMapKey, tuple[CustomSplit, ...]]] = ( - defaultdict(tuple) - ) - - @staticmethod - def _get_key(string: str) -> CustomSplitMapKey: - """ - Returns: - A unique identifier that is used internally to map @string to a - group of custom splits. - """ - return (id(string), string) - - def add_custom_splits( - self, string: str, custom_splits: Iterable[CustomSplit] - ) -> None: - """Custom Split Map Setter Method - - Side Effects: - Adds a mapping from @string to the custom splits @custom_splits. - """ - key = self._get_key(string) - self._CUSTOM_SPLIT_MAP[key] = tuple(custom_splits) - - def pop_custom_splits(self, string: str) -> list[CustomSplit]: - """Custom Split Map Getter Method - - Returns: - * A list of the custom splits that are mapped to @string, if any - exist. - OR - * [], otherwise. - - Side Effects: - Deletes the mapping between @string and its associated custom - splits (which are returned to the caller). - """ - key = self._get_key(string) - - custom_splits = self._CUSTOM_SPLIT_MAP[key] - del self._CUSTOM_SPLIT_MAP[key] - - return list(custom_splits) - - def has_custom_splits(self, string: str) -> bool: - """ - Returns: - True iff @string is associated with a set of custom splits. - """ - key = self._get_key(string) - return key in self._CUSTOM_SPLIT_MAP - - -class StringMerger(StringTransformer, CustomSplitMapMixin): - """StringTransformer that merges strings together. - - Requirements: - (A) The line contains adjacent strings such that ALL of the validation checks - listed in StringMerger._validate_msg(...)'s docstring pass. - OR - (B) The line contains a string which uses line continuation backslashes. - - Transformations: - Depending on which of the two requirements above where met, either: - - (A) The string group associated with the target string is merged. - OR - (B) All line-continuation backslashes are removed from the target string. - - Collaborations: - StringMerger provides custom split information to StringSplitter. - """ - - def do_match(self, line: Line) -> TMatchResult: - LL = line.leaves - - is_valid_index = is_valid_index_factory(LL) - - string_indices = [] - idx = 0 - while is_valid_index(idx): - leaf = LL[idx] - if ( - leaf.type == token.STRING - and is_valid_index(idx + 1) - and LL[idx + 1].type == token.STRING - ): - # Let's check if the string group contains an inline comment - # If we have a comment inline, we don't merge the strings - contains_comment = False - i = idx - while is_valid_index(i): - if LL[i].type != token.STRING: - break - if line.comments_after(LL[i]): - contains_comment = True - break - i += 1 - - if not contains_comment and not is_part_of_annotation(leaf): - string_indices.append(idx) - - # Advance to the next non-STRING leaf. - idx += 2 - while is_valid_index(idx) and LL[idx].type == token.STRING: - idx += 1 - - elif leaf.type == token.STRING and "\\\n" in leaf.value: - string_indices.append(idx) - # Advance to the next non-STRING leaf. - idx += 1 - while is_valid_index(idx) and LL[idx].type == token.STRING: - idx += 1 - - else: - idx += 1 - - if string_indices: - return Ok(string_indices) - else: - return TErr("This line has no strings that need merging.") - - def do_transform( - self, line: Line, string_indices: list[int] - ) -> Iterator[TResult[Line]]: - new_line = line - - rblc_result = self._remove_backslash_line_continuation_chars( - new_line, string_indices - ) - if isinstance(rblc_result, Ok): - new_line = rblc_result.ok() - - msg_result = self._merge_string_group(new_line, string_indices) - if isinstance(msg_result, Ok): - new_line = msg_result.ok() - - if isinstance(rblc_result, Err) and isinstance(msg_result, Err): - msg_cant_transform = msg_result.err() - rblc_cant_transform = rblc_result.err() - cant_transform = CannotTransform( - "StringMerger failed to merge any strings in this line." - ) - - # Chain the errors together using `__cause__`. - msg_cant_transform.__cause__ = rblc_cant_transform - cant_transform.__cause__ = msg_cant_transform - - yield Err(cant_transform) - else: - yield Ok(new_line) - - @staticmethod - def _remove_backslash_line_continuation_chars( - line: Line, string_indices: list[int] - ) -> TResult[Line]: - """ - Merge strings that were split across multiple lines using - line-continuation backslashes. - - Returns: - Ok(new_line), if @line contains backslash line-continuation - characters. - OR - Err(CannotTransform), otherwise. - """ - LL = line.leaves - - indices_to_transform = [] - for string_idx in string_indices: - string_leaf = LL[string_idx] - if ( - string_leaf.type == token.STRING - and "\\\n" in string_leaf.value - and not has_triple_quotes(string_leaf.value) - ): - indices_to_transform.append(string_idx) - - if not indices_to_transform: - return TErr( - "Found no string leaves that contain backslash line continuation" - " characters." - ) - - new_line = line.clone() - new_line.comments = line.comments.copy() - append_leaves(new_line, line, LL) - - for string_idx in indices_to_transform: - new_string_leaf = new_line.leaves[string_idx] - new_string_leaf.value = new_string_leaf.value.replace("\\\n", "") - - return Ok(new_line) - - def _merge_string_group( - self, line: Line, string_indices: list[int] - ) -> TResult[Line]: - """ - Merges string groups (i.e. set of adjacent strings). - - Each index from `string_indices` designates one string group's first - leaf in `line.leaves`. - - Returns: - Ok(new_line), if ALL of the validation checks found in - _validate_msg(...) pass. - OR - Err(CannotTransform), otherwise. - """ - LL = line.leaves - - is_valid_index = is_valid_index_factory(LL) - - # A dict of {string_idx: tuple[num_of_strings, string_leaf]}. - merged_string_idx_dict: dict[int, tuple[int, Leaf]] = {} - for string_idx in string_indices: - vresult = self._validate_msg(line, string_idx) - if isinstance(vresult, Err): - continue - merged_string_idx_dict[string_idx] = self._merge_one_string_group( - LL, string_idx, is_valid_index - ) - - if not merged_string_idx_dict: - return TErr("No string group is merged") - - # Build the final line ('new_line') that this method will later return. - new_line = line.clone() - previous_merged_string_idx = -1 - previous_merged_num_of_strings = -1 - for i, leaf in enumerate(LL): - if i in merged_string_idx_dict: - previous_merged_string_idx = i - previous_merged_num_of_strings, string_leaf = merged_string_idx_dict[i] - new_line.append(string_leaf) - - if ( - previous_merged_string_idx - <= i - < previous_merged_string_idx + previous_merged_num_of_strings - ): - for comment_leaf in line.comments_after(leaf): - new_line.append(comment_leaf, preformatted=True) - continue - - append_leaves(new_line, line, [leaf]) - - return Ok(new_line) - - def _merge_one_string_group( - self, LL: list[Leaf], string_idx: int, is_valid_index: Callable[[int], bool] - ) -> tuple[int, Leaf]: - """ - Merges one string group where the first string in the group is - `LL[string_idx]`. - - Returns: - A tuple of `(num_of_strings, leaf)` where `num_of_strings` is the - number of strings merged and `leaf` is the newly merged string - to be replaced in the new line. - """ - # If the string group is wrapped inside an Atom node, we must make sure - # to later replace that Atom with our new (merged) string leaf. - atom_node = LL[string_idx].parent - - # We will place BREAK_MARK in between every two substrings that we - # merge. We will then later go through our final result and use the - # various instances of BREAK_MARK we find to add the right values to - # the custom split map. - BREAK_MARK = "@@@@@ BLACK BREAKPOINT MARKER @@@@@" - - QUOTE = LL[string_idx].value[-1] - - def make_naked(string: str, string_prefix: str) -> str: - """Strip @string (i.e. make it a "naked" string) - - Pre-conditions: - * assert_is_leaf_string(@string) - - Returns: - A string that is identical to @string except that - @string_prefix has been stripped, the surrounding QUOTE - characters have been removed, and any remaining QUOTE - characters have been escaped. - """ - assert_is_leaf_string(string) - if "f" in string_prefix: - f_expressions = [ - string[span[0] + 1 : span[1] - 1] # +-1 to get rid of curly braces - for span in iter_fexpr_spans(string) - ] - debug_expressions_contain_visible_quotes = any( - re.search(r".*[\'\"].*(?= 0 - ), "Logic error while filling the custom string breakpoint cache." - - temp_string = temp_string[mark_idx + len(BREAK_MARK) :] - breakpoint_idx = mark_idx + (len(prefix) if has_prefix else 0) + 1 - custom_splits.append(CustomSplit(has_prefix, breakpoint_idx)) - - string_leaf = Leaf(token.STRING, S_leaf.value.replace(BREAK_MARK, "")) - - if atom_node is not None: - # If not all children of the atom node are merged (this can happen - # when there is a standalone comment in the middle) ... - if non_string_idx - string_idx < len(atom_node.children): - # We need to replace the old STRING leaves with the new string leaf. - first_child_idx = LL[string_idx].remove() - for idx in range(string_idx + 1, non_string_idx): - LL[idx].remove() - if first_child_idx is not None: - atom_node.insert_child(first_child_idx, string_leaf) - else: - # Else replace the atom node with the new string leaf. - replace_child(atom_node, string_leaf) - - self.add_custom_splits(string_leaf.value, custom_splits) - return num_of_strings, string_leaf - - @staticmethod - def _validate_msg(line: Line, string_idx: int) -> TResult[None]: - """Validate (M)erge (S)tring (G)roup - - Transform-time string validation logic for _merge_string_group(...). - - Returns: - * Ok(None), if ALL validation checks (listed below) pass. - OR - * Err(CannotTransform), if any of the following are true: - - The target string group does not contain ANY stand-alone comments. - - The target string is not in a string group (i.e. it has no - adjacent strings). - - The string group has more than one inline comment. - - The string group has an inline comment that appears to be a pragma. - - The set of all string prefixes in the string group is of - length greater than one and is not equal to {"", "f"}. - - The string group consists of raw strings. - - The string group would merge f-strings with different quote types - and internal quotes. - - The string group is stringified type annotations. We don't want to - process stringified type annotations since pyright doesn't support - them spanning multiple string values. (NOTE: mypy, pytype, pyre do - support them, so we can change if pyright also gains support in the - future. See https://github.com/microsoft/pyright/issues/4359.) - """ - # We first check for "inner" stand-alone comments (i.e. stand-alone - # comments that have a string leaf before them AND after them). - for inc in [1, -1]: - i = string_idx - found_sa_comment = False - is_valid_index = is_valid_index_factory(line.leaves) - while is_valid_index(i) and line.leaves[i].type in [ - token.STRING, - STANDALONE_COMMENT, - ]: - if line.leaves[i].type == STANDALONE_COMMENT: - found_sa_comment = True - elif found_sa_comment: - return TErr( - "StringMerger does NOT merge string groups which contain " - "stand-alone comments." - ) - - i += inc - - QUOTE = line.leaves[string_idx].value[-1] - - num_of_inline_string_comments = 0 - set_of_prefixes = set() - num_of_strings = 0 - for leaf in line.leaves[string_idx:]: - if leaf.type != token.STRING: - # If the string group is trailed by a comma, we count the - # comments trailing the comma to be one of the string group's - # comments. - if leaf.type == token.COMMA and id(leaf) in line.comments: - num_of_inline_string_comments += 1 - break - - if has_triple_quotes(leaf.value): - return TErr("StringMerger does NOT merge multiline strings.") - - num_of_strings += 1 - prefix = get_string_prefix(leaf.value).lower() - if "r" in prefix: - return TErr("StringMerger does NOT merge raw strings.") - - set_of_prefixes.add(prefix) - - if ( - "f" in prefix - and leaf.value[-1] != QUOTE - and ( - "'" in leaf.value[len(prefix) + 1 : -1] - or '"' in leaf.value[len(prefix) + 1 : -1] - ) - ): - return TErr( - "StringMerger does NOT merge f-strings with different quote types" - " and internal quotes." - ) - - if id(leaf) in line.comments: - num_of_inline_string_comments += 1 - if contains_pragma_comment(line.comments[id(leaf)]): - return TErr("Cannot merge strings which have pragma comments.") - - if num_of_strings < 2: - return TErr( - f"Not enough strings to merge (num_of_strings={num_of_strings})." - ) - - if num_of_inline_string_comments > 1: - return TErr( - f"Too many inline string comments ({num_of_inline_string_comments})." - ) - - if len(set_of_prefixes) > 1 and set_of_prefixes != {"", "f"}: - return TErr(f"Too many different prefixes ({set_of_prefixes}).") - - return Ok(None) - - -class StringParenStripper(StringTransformer): - """StringTransformer that strips surrounding parentheses from strings. - - Requirements: - The line contains a string which is surrounded by parentheses and: - - The target string is NOT the only argument to a function call. - - The target string is NOT a "pointless" string. - - The target string is NOT a dictionary value. - - If the target string contains a PERCENT, the brackets are not - preceded or followed by an operator with higher precedence than - PERCENT. - - Transformations: - The parentheses mentioned in the 'Requirements' section are stripped. - - Collaborations: - StringParenStripper has its own inherent usefulness, but it is also - relied on to clean up the parentheses created by StringParenWrapper (in - the event that they are no longer needed). - """ - - def do_match(self, line: Line) -> TMatchResult: - LL = line.leaves - - is_valid_index = is_valid_index_factory(LL) - - string_indices = [] - - idx = -1 - while True: - idx += 1 - if idx >= len(LL): - break - leaf = LL[idx] - - # Should be a string... - if leaf.type != token.STRING: - continue - - # If this is a "pointless" string... - if ( - leaf.parent - and leaf.parent.parent - and leaf.parent.parent.type == syms.simple_stmt - ): - continue - - # Should be preceded by a non-empty LPAR... - if ( - not is_valid_index(idx - 1) - or LL[idx - 1].type != token.LPAR - or is_empty_lpar(LL[idx - 1]) - ): - continue - - # That LPAR should NOT be preceded by a colon (which could be a - # dictionary value), function name, or a closing bracket (which - # could be a function returning a function or a list/dictionary - # containing a function)... - if is_valid_index(idx - 2) and ( - LL[idx - 2].type == token.COLON - or LL[idx - 2].type == token.NAME - or LL[idx - 2].type in CLOSING_BRACKETS - ): - continue - - string_idx = idx - - # Skip the string trailer, if one exists. - string_parser = StringParser() - next_idx = string_parser.parse(LL, string_idx) - - # if the leaves in the parsed string include a PERCENT, we need to - # make sure the initial LPAR is NOT preceded by an operator with - # higher or equal precedence to PERCENT - if is_valid_index(idx - 2): - # mypy can't quite follow unless we name this - before_lpar = LL[idx - 2] - if token.PERCENT in {leaf.type for leaf in LL[idx - 1 : next_idx]} and ( - ( - before_lpar.type - in { - token.STAR, - token.AT, - token.SLASH, - token.DOUBLESLASH, - token.PERCENT, - token.TILDE, - token.DOUBLESTAR, - token.AWAIT, - token.LSQB, - token.LPAR, - } - ) - or ( - # only unary PLUS/MINUS - before_lpar.parent - and before_lpar.parent.type == syms.factor - and (before_lpar.type in {token.PLUS, token.MINUS}) - ) - ): - continue - - # Should be followed by a non-empty RPAR... - if ( - is_valid_index(next_idx) - and LL[next_idx].type == token.RPAR - and not is_empty_rpar(LL[next_idx]) - ): - # That RPAR should NOT be followed by anything with higher - # precedence than PERCENT - if is_valid_index(next_idx + 1) and LL[next_idx + 1].type in { - token.DOUBLESTAR, - token.LSQB, - token.LPAR, - token.DOT, - }: - continue - - string_indices.append(string_idx) - idx = string_idx - while idx < len(LL) - 1 and LL[idx + 1].type == token.STRING: - idx += 1 - - if string_indices: - return Ok(string_indices) - return TErr("This line has no strings wrapped in parens.") - - def do_transform( - self, line: Line, string_indices: list[int] - ) -> Iterator[TResult[Line]]: - LL = line.leaves - - string_and_rpar_indices: list[int] = [] - for string_idx in string_indices: - string_parser = StringParser() - rpar_idx = string_parser.parse(LL, string_idx) - - should_transform = True - for leaf in (LL[string_idx - 1], LL[rpar_idx]): - if line.comments_after(leaf): - # Should not strip parentheses which have comments attached - # to them. - should_transform = False - break - if should_transform: - string_and_rpar_indices.extend((string_idx, rpar_idx)) - - if string_and_rpar_indices: - yield Ok(self._transform_to_new_line(line, string_and_rpar_indices)) - else: - yield Err( - CannotTransform("All string groups have comments attached to them.") - ) - - def _transform_to_new_line( - self, line: Line, string_and_rpar_indices: list[int] - ) -> Line: - LL = line.leaves - - new_line = line.clone() - new_line.comments = line.comments.copy() - - previous_idx = -1 - # We need to sort the indices, since string_idx and its matching - # rpar_idx may not come in order, e.g. in - # `("outer" % ("inner".join(items)))`, the "inner" string's - # string_idx is smaller than "outer" string's rpar_idx. - for idx in sorted(string_and_rpar_indices): - leaf = LL[idx] - lpar_or_rpar_idx = idx - 1 if leaf.type == token.STRING else idx - append_leaves(new_line, line, LL[previous_idx + 1 : lpar_or_rpar_idx]) - if leaf.type == token.STRING: - string_leaf = Leaf(token.STRING, LL[idx].value) - LL[lpar_or_rpar_idx].remove() # Remove lpar. - replace_child(LL[idx], string_leaf) - new_line.append(string_leaf) - # replace comments - old_comments = new_line.comments.pop(id(LL[idx]), []) - new_line.comments.setdefault(id(string_leaf), []).extend(old_comments) - else: - LL[lpar_or_rpar_idx].remove() # This is a rpar. - - previous_idx = idx - - # Append the leaves after the last idx: - append_leaves(new_line, line, LL[idx + 1 :]) - - return new_line - - -class BaseStringSplitter(StringTransformer): - """ - Abstract class for StringTransformers which transform a Line's strings by splitting - them or placing them on their own lines where necessary to avoid going over - the configured line length. - - Requirements: - * The target string value is responsible for the line going over the - line length limit. It follows that after all of black's other line - split methods have been exhausted, this line (or one of the resulting - lines after all line splits are performed) would still be over the - line_length limit unless we split this string. - AND - - * The target string is NOT a "pointless" string (i.e. a string that has - no parent or siblings). - AND - - * The target string is not followed by an inline comment that appears - to be a pragma. - AND - - * The target string is not a multiline (i.e. triple-quote) string. - """ - - STRING_OPERATORS: Final = [ - token.EQEQUAL, - token.GREATER, - token.GREATEREQUAL, - token.LESS, - token.LESSEQUAL, - token.NOTEQUAL, - token.PERCENT, - token.PLUS, - token.STAR, - ] - - @abstractmethod - def do_splitter_match(self, line: Line) -> TMatchResult: - """ - BaseStringSplitter asks its clients to override this method instead of - `StringTransformer.do_match(...)`. - - Follows the same protocol as `StringTransformer.do_match(...)`. - - Refer to `help(StringTransformer.do_match)` for more information. - """ - - def do_match(self, line: Line) -> TMatchResult: - match_result = self.do_splitter_match(line) - if isinstance(match_result, Err): - return match_result - - string_indices = match_result.ok() - assert len(string_indices) == 1, ( - f"{self.__class__.__name__} should only find one match at a time, found" - f" {len(string_indices)}" - ) - string_idx = string_indices[0] - vresult = self._validate(line, string_idx) - if isinstance(vresult, Err): - return vresult - - return match_result - - def _validate(self, line: Line, string_idx: int) -> TResult[None]: - """ - Checks that @line meets all of the requirements listed in this classes' - docstring. Refer to `help(BaseStringSplitter)` for a detailed - description of those requirements. - - Returns: - * Ok(None), if ALL of the requirements are met. - OR - * Err(CannotTransform), if ANY of the requirements are NOT met. - """ - LL = line.leaves - - string_leaf = LL[string_idx] - - max_string_length = self._get_max_string_length(line, string_idx) - if len(string_leaf.value) <= max_string_length: - return TErr( - "The string itself is not what is causing this line to be too long." - ) - - if not string_leaf.parent or [L.type for L in string_leaf.parent.children] == [ - token.STRING, - token.NEWLINE, - ]: - return TErr( - f"This string ({string_leaf.value}) appears to be pointless (i.e. has" - " no parent)." - ) - - if id(line.leaves[string_idx]) in line.comments and contains_pragma_comment( - line.comments[id(line.leaves[string_idx])] - ): - return TErr( - "Line appears to end with an inline pragma comment. Splitting the line" - " could modify the pragma's behavior." - ) - - if has_triple_quotes(string_leaf.value): - return TErr("We cannot split multiline strings.") - - return Ok(None) - - def _get_max_string_length(self, line: Line, string_idx: int) -> int: - """ - Calculates the max string length used when attempting to determine - whether or not the target string is responsible for causing the line to - go over the line length limit. - - WARNING: This method is tightly coupled to both StringSplitter and - (especially) StringParenWrapper. There is probably a better way to - accomplish what is being done here. - - Returns: - max_string_length: such that `line.leaves[string_idx].value > - max_string_length` implies that the target string IS responsible - for causing this line to exceed the line length limit. - """ - LL = line.leaves - - is_valid_index = is_valid_index_factory(LL) - - # We use the shorthand "WMA4" in comments to abbreviate "We must - # account for". When giving examples, we use STRING to mean some/any - # valid string. - # - # Finally, we use the following convenience variables: - # - # P: The leaf that is before the target string leaf. - # N: The leaf that is after the target string leaf. - # NN: The leaf that is after N. - - # WMA4 the whitespace at the beginning of the line. - offset = line.depth * 4 - - if is_valid_index(string_idx - 1): - p_idx = string_idx - 1 - if ( - LL[string_idx - 1].type == token.LPAR - and LL[string_idx - 1].value == "" - and string_idx >= 2 - ): - # If the previous leaf is an empty LPAR placeholder, we should skip it. - p_idx -= 1 - - P = LL[p_idx] - if P.type in self.STRING_OPERATORS: - # WMA4 a space and a string operator (e.g. `+ STRING` or `== STRING`). - offset += len(str(P)) + 1 - - if P.type == token.COMMA: - # WMA4 a space, a comma, and a closing bracket [e.g. `), STRING`]. - offset += 3 - - if P.type in [token.COLON, token.EQUAL, token.PLUSEQUAL, token.NAME]: - # This conditional branch is meant to handle dictionary keys, - # variable assignments, 'return STRING' statement lines, and - # 'else STRING' ternary expression lines. - - # WMA4 a single space. - offset += 1 - - # WMA4 the lengths of any leaves that came before that space, - # but after any closing bracket before that space. - for leaf in reversed(LL[: p_idx + 1]): - offset += len(str(leaf)) - if leaf.type in CLOSING_BRACKETS: - break - - if is_valid_index(string_idx + 1): - N = LL[string_idx + 1] - if N.type == token.RPAR and N.value == "" and len(LL) > string_idx + 2: - # If the next leaf is an empty RPAR placeholder, we should skip it. - N = LL[string_idx + 2] - - if N.type == token.COMMA: - # WMA4 a single comma at the end of the string (e.g `STRING,`). - offset += 1 - - if is_valid_index(string_idx + 2): - NN = LL[string_idx + 2] - - if N.type == token.DOT and NN.type == token.NAME: - # This conditional branch is meant to handle method calls invoked - # off of a string literal up to and including the LPAR character. - - # WMA4 the '.' character. - offset += 1 - - if ( - is_valid_index(string_idx + 3) - and LL[string_idx + 3].type == token.LPAR - ): - # WMA4 the left parenthesis character. - offset += 1 - - # WMA4 the length of the method's name. - offset += len(NN.value) - - has_comments = False - for comment_leaf in line.comments_after(LL[string_idx]): - if not has_comments: - has_comments = True - # WMA4 two spaces before the '#' character. - offset += 2 - - # WMA4 the length of the inline comment. - offset += len(comment_leaf.value) - - max_string_length = count_chars_in_width(str(line), self.line_length - offset) - return max_string_length - - @staticmethod - def _prefer_paren_wrap_match(LL: list[Leaf]) -> int | None: - """ - Returns: - string_idx such that @LL[string_idx] is equal to our target (i.e. - matched) string, if this line matches the "prefer paren wrap" statement - requirements listed in the 'Requirements' section of the StringParenWrapper - class's docstring. - OR - None, otherwise. - """ - # The line must start with a string. - if LL[0].type != token.STRING: - return None - - matching_nodes = [ - syms.listmaker, - syms.dictsetmaker, - syms.testlist_gexp, - ] - # If the string is an immediate child of a list/set/tuple literal... - if ( - parent_type(LL[0]) in matching_nodes - or parent_type(LL[0].parent) in matching_nodes - ): - # And the string is surrounded by commas (or is the first/last child)... - prev_sibling = LL[0].prev_sibling - next_sibling = LL[0].next_sibling - if ( - not prev_sibling - and not next_sibling - and parent_type(LL[0]) == syms.atom - ): - # If it's an atom string, we need to check the parent atom's siblings. - parent = LL[0].parent - assert parent is not None # For type checkers. - prev_sibling = parent.prev_sibling - next_sibling = parent.next_sibling - if (not prev_sibling or prev_sibling.type == token.COMMA) and ( - not next_sibling or next_sibling.type == token.COMMA - ): - return 0 - - return None - - -def iter_fexpr_spans(s: str) -> Iterator[tuple[int, int]]: - """ - Yields spans corresponding to expressions in a given f-string. - Spans are half-open ranges (left inclusive, right exclusive). - Assumes the input string is a valid f-string, but will not crash if the input - string is invalid. - """ - stack: list[int] = [] # our curly paren stack - i = 0 - while i < len(s): - if s[i] == "{": - # if we're in a string part of the f-string, ignore escaped curly braces - if not stack and i + 1 < len(s) and s[i + 1] == "{": - i += 2 - continue - stack.append(i) - i += 1 - continue - - if s[i] == "}": - if not stack: - i += 1 - continue - j = stack.pop() - # we've made it back out of the expression! yield the span - if not stack: - yield (j, i + 1) - i += 1 - continue - - # if we're in an expression part of the f-string, fast-forward through strings - # note that backslashes are not legal in the expression portion of f-strings - if stack: - delim = None - if s[i : i + 3] in ("'''", '"""'): - delim = s[i : i + 3] - elif s[i] in ("'", '"'): - delim = s[i] - if delim: - i += len(delim) - while i < len(s) and s[i : i + len(delim)] != delim: - i += 1 - i += len(delim) - continue - i += 1 - - -def fstring_contains_expr(s: str) -> bool: - return any(iter_fexpr_spans(s)) - - -def _toggle_fexpr_quotes(fstring: str, old_quote: str) -> str: - """ - Toggles quotes used in f-string expressions that are `old_quote`. - - f-string expressions can't contain backslashes, so we need to toggle the - quotes if the f-string itself will end up using the same quote. We can - simply toggle without escaping because, quotes can't be reused in f-string - expressions. They will fail to parse. - - NOTE: If PEP 701 is accepted, above statement will no longer be true. - Though if quotes can be reused, we can simply reuse them without updates or - escaping, once Black figures out how to parse the new grammar. - """ - new_quote = "'" if old_quote == '"' else '"' - parts = [] - previous_index = 0 - for start, end in iter_fexpr_spans(fstring): - parts.append(fstring[previous_index:start]) - parts.append(fstring[start:end].replace(old_quote, new_quote)) - previous_index = end - parts.append(fstring[previous_index:]) - return "".join(parts) - - -class StringSplitter(BaseStringSplitter, CustomSplitMapMixin): - """ - StringTransformer that splits "atom" strings (i.e. strings which exist on - lines by themselves). - - Requirements: - * The line consists ONLY of a single string (possibly prefixed by a - string operator [e.g. '+' or '==']), MAYBE a string trailer, and MAYBE - a trailing comma. - AND - * All of the requirements listed in BaseStringSplitter's docstring. - - Transformations: - The string mentioned in the 'Requirements' section is split into as - many substrings as necessary to adhere to the configured line length. - - In the final set of substrings, no substring should be smaller than - MIN_SUBSTR_SIZE characters. - - The string will ONLY be split on spaces (i.e. each new substring should - start with a space). Note that the string will NOT be split on a space - which is escaped with a backslash. - - If the string is an f-string, it will NOT be split in the middle of an - f-expression (e.g. in f"FooBar: {foo() if x else bar()}", {foo() if x - else bar()} is an f-expression). - - If the string that is being split has an associated set of custom split - records and those custom splits will NOT result in any line going over - the configured line length, those custom splits are used. Otherwise the - string is split as late as possible (from left-to-right) while still - adhering to the transformation rules listed above. - - Collaborations: - StringSplitter relies on StringMerger to construct the appropriate - CustomSplit objects and add them to the custom split map. - """ - - MIN_SUBSTR_SIZE: Final = 6 - - def do_splitter_match(self, line: Line) -> TMatchResult: - LL = line.leaves - - if self._prefer_paren_wrap_match(LL) is not None: - return TErr("Line needs to be wrapped in parens first.") - - # If the line is just STRING + COMMA (a one-item tuple) and not inside - # brackets, we need to defer to StringParenWrapper to wrap it first. - # Otherwise, splitting the string would create multiple expressions where - # only the last has the comma, breaking AST equivalence. See issue #4912. - if ( - not line.inside_brackets - and len(LL) == 2 - and LL[0].type == token.STRING - and LL[1].type == token.COMMA - ): - return TErr( - "Line with trailing comma tuple needs to be wrapped in parens first." - ) - - is_valid_index = is_valid_index_factory(LL) - - idx = 0 - - # The first two leaves MAY be the 'not in' keywords... - if ( - is_valid_index(idx) - and is_valid_index(idx + 1) - and [LL[idx].type, LL[idx + 1].type] == [token.NAME, token.NAME] - and str(LL[idx]) + str(LL[idx + 1]) == "not in" - ): - idx += 2 - # Else the first leaf MAY be a string operator symbol or the 'in' keyword... - elif is_valid_index(idx) and ( - LL[idx].type in self.STRING_OPERATORS - or LL[idx].type == token.NAME - and str(LL[idx]) == "in" - ): - idx += 1 - - # The next/first leaf MAY be an empty LPAR... - if is_valid_index(idx) and is_empty_lpar(LL[idx]): - idx += 1 - - # The next/first leaf MUST be a string... - if not is_valid_index(idx) or LL[idx].type != token.STRING: - return TErr("Line does not start with a string.") - - string_idx = idx - - # Skip the string trailer, if one exists. - string_parser = StringParser() - idx = string_parser.parse(LL, string_idx) - - # That string MAY be followed by an empty RPAR... - if is_valid_index(idx) and is_empty_rpar(LL[idx]): - idx += 1 - - # That string / empty RPAR leaf MAY be followed by a comma... - if is_valid_index(idx) and LL[idx].type == token.COMMA: - idx += 1 - - # But no more leaves are allowed... - if is_valid_index(idx): - return TErr("This line does not end with a string.") - - return Ok([string_idx]) - - def do_transform( - self, line: Line, string_indices: list[int] - ) -> Iterator[TResult[Line]]: - LL = line.leaves - assert len(string_indices) == 1, ( - f"{self.__class__.__name__} should only find one match at a time, found" - f" {len(string_indices)}" - ) - string_idx = string_indices[0] - - QUOTE = LL[string_idx].value[-1] - - is_valid_index = is_valid_index_factory(LL) - insert_str_child = insert_str_child_factory(LL[string_idx]) - - prefix = get_string_prefix(LL[string_idx].value).lower() - - # We MAY choose to drop the 'f' prefix from substrings that don't - # contain any f-expressions, but ONLY if the original f-string - # contains at least one f-expression. Otherwise, we will alter the AST - # of the program. - drop_pointless_f_prefix = ("f" in prefix) and fstring_contains_expr( - LL[string_idx].value - ) - - first_string_line = True - - string_op_leaves = self._get_string_operator_leaves(LL) - string_op_leaves_length = ( - sum(len(str(prefix_leaf)) for prefix_leaf in string_op_leaves) + 1 - if string_op_leaves - else 0 - ) - - def maybe_append_string_operators(new_line: Line) -> None: - """ - Side Effects: - If @line starts with a string operator and this is the first - line we are constructing, this function appends the string - operator to @new_line and replaces the old string operator leaf - in the node structure. Otherwise this function does nothing. - """ - maybe_prefix_leaves = string_op_leaves if first_string_line else [] - for i, prefix_leaf in enumerate(maybe_prefix_leaves): - replace_child(LL[i], prefix_leaf) - new_line.append(prefix_leaf) - - ends_with_comma = ( - is_valid_index(string_idx + 1) and LL[string_idx + 1].type == token.COMMA - ) - - def max_last_string_column() -> int: - """ - Returns: - The max allowed width of the string value used for the last - line we will construct. Note that this value means the width - rather than the number of characters (e.g., many East Asian - characters expand to two columns). - """ - result = self.line_length - result -= line.depth * 4 - result -= 1 if ends_with_comma else 0 - result -= string_op_leaves_length - return result - - # --- Calculate Max Break Width (for string value) - # We start with the line length limit - max_break_width = self.line_length - # The last index of a string of length N is N-1. - max_break_width -= 1 - # Leading whitespace is not present in the string value (e.g. Leaf.value). - max_break_width -= line.depth * 4 - if max_break_width < 0: - yield TErr( - f"Unable to split {LL[string_idx].value} at such high of a line depth:" - f" {line.depth}" - ) - return - - # Check if StringMerger registered any custom splits. - custom_splits = self.pop_custom_splits(LL[string_idx].value) - # We use them ONLY if none of them would produce lines that exceed the - # line limit. - use_custom_breakpoints = bool( - custom_splits - and all(csplit.break_idx <= max_break_width for csplit in custom_splits) - ) - - # Temporary storage for the remaining chunk of the string line that - # can't fit onto the line currently being constructed. - rest_value = LL[string_idx].value - - def more_splits_should_be_made() -> bool: - """ - Returns: - True iff `rest_value` (the remaining string value from the last - split), should be split again. - """ - if use_custom_breakpoints: - return len(custom_splits) > 1 - else: - return str_width(rest_value) > max_last_string_column() - - string_line_results: list[Ok[Line]] = [] - while more_splits_should_be_made(): - if use_custom_breakpoints: - # Custom User Split (manual) - csplit = custom_splits.pop(0) - break_idx = csplit.break_idx - else: - # Algorithmic Split (automatic) - max_bidx = ( - count_chars_in_width(rest_value, max_break_width) - - string_op_leaves_length - ) - maybe_break_idx = self._get_break_idx(rest_value, max_bidx) - if maybe_break_idx is None: - # If we are unable to algorithmically determine a good split - # and this string has custom splits registered to it, we - # fall back to using them--which means we have to start - # over from the beginning. - if custom_splits: - rest_value = LL[string_idx].value - string_line_results = [] - first_string_line = True - use_custom_breakpoints = True - continue - - # Otherwise, we stop splitting here. - break - - break_idx = maybe_break_idx - - # --- Construct `next_value` - next_value = rest_value[:break_idx] + QUOTE - - # HACK: The following 'if' statement is a hack to fix the custom - # breakpoint index in the case of either: (a) substrings that were - # f-strings but will have the 'f' prefix removed OR (b) substrings - # that were not f-strings but will now become f-strings because of - # redundant use of the 'f' prefix (i.e. none of the substrings - # contain f-expressions but one or more of them had the 'f' prefix - # anyway; in which case, we will prepend 'f' to _all_ substrings). - # - # There is probably a better way to accomplish what is being done - # here... - # - # If this substring is an f-string, we _could_ remove the 'f' - # prefix, and the current custom split did NOT originally use a - # prefix... - if ( - use_custom_breakpoints - and not csplit.has_prefix - and ( - # `next_value == prefix + QUOTE` happens when the custom - # split is an empty string. - next_value == prefix + QUOTE - or next_value != self._normalize_f_string(next_value, prefix) - ) - ): - # Then `csplit.break_idx` will be off by one after removing - # the 'f' prefix. - break_idx += 1 - next_value = rest_value[:break_idx] + QUOTE - - if drop_pointless_f_prefix: - next_value = self._normalize_f_string(next_value, prefix) - - # --- Construct `next_leaf` - next_leaf = Leaf(token.STRING, next_value) - insert_str_child(next_leaf) - self._maybe_normalize_string_quotes(next_leaf) - - # --- Construct `next_line` - next_line = line.clone() - maybe_append_string_operators(next_line) - next_line.append(next_leaf) - string_line_results.append(Ok(next_line)) - - rest_value = prefix + QUOTE + rest_value[break_idx:] - first_string_line = False - - yield from string_line_results - - if drop_pointless_f_prefix: - rest_value = self._normalize_f_string(rest_value, prefix) - - rest_leaf = Leaf(token.STRING, rest_value) - insert_str_child(rest_leaf) - - # NOTE: I could not find a test case that verifies that the following - # line is actually necessary, but it seems to be. Otherwise we risk - # not normalizing the last substring, right? - self._maybe_normalize_string_quotes(rest_leaf) - - last_line = line.clone() - maybe_append_string_operators(last_line) - - # If there are any leaves to the right of the target string... - if is_valid_index(string_idx + 1): - # We use `temp_value` here to determine how long the last line - # would be if we were to append all the leaves to the right of the - # target string to the last string line. - temp_value = rest_value - for leaf in LL[string_idx + 1 :]: - temp_value += str(leaf) - if leaf.type == token.LPAR: - break - - # Try to fit them all on the same line with the last substring... - if ( - str_width(temp_value) <= max_last_string_column() - or LL[string_idx + 1].type == token.COMMA - ): - last_line.append(rest_leaf) - append_leaves(last_line, line, LL[string_idx + 1 :]) - yield Ok(last_line) - # Otherwise, place the last substring on one line and everything - # else on a line below that... - else: - last_line.append(rest_leaf) - yield Ok(last_line) - - non_string_line = line.clone() - append_leaves(non_string_line, line, LL[string_idx + 1 :]) - yield Ok(non_string_line) - # Else the target string was the last leaf... - else: - last_line.append(rest_leaf) - last_line.comments = line.comments.copy() - yield Ok(last_line) - - def _iter_nameescape_slices(self, string: str) -> Iterator[tuple[Index, Index]]: - r""" - Yields: - All ranges of @string which, if @string were to be split there, - would result in the splitting of an \N{...} expression (which is NOT - allowed). - """ - # True - the previous backslash was unescaped - # False - the previous backslash was escaped *or* there was no backslash - previous_was_unescaped_backslash = False - it = iter(enumerate(string)) - for idx, c in it: - if c == "\\": - previous_was_unescaped_backslash = not previous_was_unescaped_backslash - continue - if not previous_was_unescaped_backslash or c != "N": - previous_was_unescaped_backslash = False - continue - previous_was_unescaped_backslash = False - - begin = idx - 1 # the position of backslash before \N{...} - for idx, c in it: - if c == "}": - end = idx - break - else: - # malformed nameescape expression? - # should have been detected by AST parsing earlier... - raise RuntimeError(f"{self.__class__.__name__} LOGIC ERROR!") - yield begin, end - - def _iter_fexpr_slices(self, string: str) -> Iterator[tuple[Index, Index]]: - """ - Yields: - All ranges of @string which, if @string were to be split there, - would result in the splitting of an f-expression (which is NOT - allowed). - """ - if "f" not in get_string_prefix(string).lower(): - return - yield from iter_fexpr_spans(string) - - def _get_illegal_split_indices(self, string: str) -> set[Index]: - illegal_indices: set[Index] = set() - iterators = [ - self._iter_fexpr_slices(string), - self._iter_nameescape_slices(string), - ] - for it in iterators: - for begin, end in it: - illegal_indices.update(range(begin, end)) - return illegal_indices - - def _get_break_idx(self, string: str, max_break_idx: int) -> int | None: - """ - This method contains the algorithm that StringSplitter uses to - determine which character to split each string at. - - Args: - @string: The substring that we are attempting to split. - @max_break_idx: The ideal break index. We will return this value if it - meets all the necessary conditions. In the likely event that it - doesn't we will try to find the closest index BELOW @max_break_idx - that does. If that fails, we will expand our search by also - considering all valid indices ABOVE @max_break_idx. - - Pre-Conditions: - * assert_is_leaf_string(@string) - * 0 <= @max_break_idx < len(@string) - - Returns: - break_idx, if an index is able to be found that meets all of the - conditions listed in the 'Transformations' section of this classes' - docstring. - OR - None, otherwise. - """ - is_valid_index = is_valid_index_factory(string) - - assert is_valid_index(max_break_idx) - assert_is_leaf_string(string) - - _illegal_split_indices = self._get_illegal_split_indices(string) - - def breaks_unsplittable_expression(i: Index) -> bool: - """ - Returns: - True iff returning @i would result in the splitting of an - unsplittable expression (which is NOT allowed). - """ - return i in _illegal_split_indices - - def passes_all_checks(i: Index) -> bool: - """ - Returns: - True iff ALL of the conditions listed in the 'Transformations' - section of this classes' docstring would be met by returning @i. - """ - is_space = string[i] == " " - is_split_safe = is_valid_index(i - 1) and string[i - 1] in SPLIT_SAFE_CHARS - - is_not_escaped = True - j = i - 1 - while is_valid_index(j) and string[j] == "\\": - is_not_escaped = not is_not_escaped - j -= 1 - - is_big_enough = ( - len(string[i:]) >= self.MIN_SUBSTR_SIZE - and len(string[:i]) >= self.MIN_SUBSTR_SIZE - ) - return ( - (is_space or is_split_safe) - and is_not_escaped - and is_big_enough - and not breaks_unsplittable_expression(i) - ) - - # First, we check all indices BELOW @max_break_idx. - break_idx = max_break_idx - while is_valid_index(break_idx - 1) and not passes_all_checks(break_idx): - break_idx -= 1 - - if not passes_all_checks(break_idx): - # If that fails, we check all indices ABOVE @max_break_idx. - # - # If we are able to find a valid index here, the next line is going - # to be longer than the specified line length, but it's probably - # better than doing nothing at all. - break_idx = max_break_idx + 1 - while is_valid_index(break_idx + 1) and not passes_all_checks(break_idx): - break_idx += 1 - - if not is_valid_index(break_idx) or not passes_all_checks(break_idx): - return None - - return break_idx - - def _maybe_normalize_string_quotes(self, leaf: Leaf) -> None: - if self.normalize_strings: - leaf.value = normalize_string_quotes(leaf.value) - - def _normalize_f_string(self, string: str, prefix: str) -> str: - """ - Pre-Conditions: - * assert_is_leaf_string(@string) - - Returns: - * If @string is an f-string that contains no f-expressions, we - return a string identical to @string except that the 'f' prefix - has been stripped and all double braces (i.e. '{{' or '}}') have - been normalized (i.e. turned into '{' or '}'). - OR - * Otherwise, we return @string. - """ - assert_is_leaf_string(string) - - if "f" in prefix and not fstring_contains_expr(string): - new_prefix = prefix.replace("f", "") - - temp = string[len(prefix) :] - temp = re.sub(r"\{\{", "{", temp) - temp = re.sub(r"\}\}", "}", temp) - new_string = temp - - return f"{new_prefix}{new_string}" - else: - return string - - def _get_string_operator_leaves(self, leaves: Iterable[Leaf]) -> list[Leaf]: - LL = list(leaves) - - string_op_leaves = [] - i = 0 - while LL[i].type in self.STRING_OPERATORS + [token.NAME]: - prefix_leaf = Leaf(LL[i].type, str(LL[i]).strip()) - string_op_leaves.append(prefix_leaf) - i += 1 - return string_op_leaves - - -class StringParenWrapper(BaseStringSplitter, CustomSplitMapMixin): - """ - StringTransformer that wraps strings in parens and then splits at the LPAR. - - Requirements: - All of the requirements listed in BaseStringSplitter's docstring in - addition to the requirements listed below: - - * The line is a return/yield statement, which returns/yields a string. - OR - * The line is part of a ternary expression (e.g. `x = y if cond else - z`) such that the line starts with `else `, where is - some string. - OR - * The line is an assert statement, which ends with a string. - OR - * The line is an assignment statement (e.g. `x = ` or `x += - `) such that the variable is being assigned the value of some - string. - OR - * The line is a dictionary key assignment where some valid key is being - assigned the value of some string. - OR - * The line is an lambda expression and the value is a string. - OR - * The line starts with an "atom" string that prefers to be wrapped in - parens. It's preferred to be wrapped when it's is an immediate child of - a list/set/tuple literal, AND the string is surrounded by commas (or is - the first/last child). - - Transformations: - The chosen string is wrapped in parentheses and then split at the LPAR. - - We then have one line which ends with an LPAR and another line that - starts with the chosen string. The latter line is then split again at - the RPAR. This results in the RPAR (and possibly a trailing comma) - being placed on its own line. - - NOTE: If any leaves exist to the right of the chosen string (except - for a trailing comma, which would be placed after the RPAR), those - leaves are placed inside the parentheses. In effect, the chosen - string is not necessarily being "wrapped" by parentheses. We can, - however, count on the LPAR being placed directly before the chosen - string. - - In other words, StringParenWrapper creates "atom" strings. These - can then be split again by StringSplitter, if necessary. - - Collaborations: - In the event that a string line split by StringParenWrapper is - changed such that it no longer needs to be given its own line, - StringParenWrapper relies on StringParenStripper to clean up the - parentheses it created. - - For "atom" strings that prefers to be wrapped in parens, it requires - StringSplitter to hold the split until the string is wrapped in parens. - """ - - def do_splitter_match(self, line: Line) -> TMatchResult: - LL = line.leaves - - if line.leaves[-1].type in OPENING_BRACKETS: - return TErr( - "Cannot wrap parens around a line that ends in an opening bracket." - ) - - string_idx = ( - self._return_match(LL) - or self._else_match(LL) - or self._assert_match(LL) - or self._assign_match(LL) - or self._dict_or_lambda_match(LL) - ) - - if string_idx is None: - string_idx = self._trailing_comma_tuple_match(line) - - if string_idx is None: - string_idx = self._prefer_paren_wrap_match(LL) - - if string_idx is not None: - string_value = line.leaves[string_idx].value - # If the string has neither spaces nor East Asian stops... - if not any( - char == " " or char in SPLIT_SAFE_CHARS for char in string_value - ): - # And will still violate the line length limit when split... - max_string_width = self.line_length - ((line.depth + 1) * 4) - if str_width(string_value) > max_string_width: - # And has no associated custom splits... - if not self.has_custom_splits(string_value): - # Then we should NOT put this string on its own line. - return TErr( - "We do not wrap long strings in parentheses when the" - " resultant line would still be over the specified line" - " length and can't be split further by StringSplitter." - ) - return Ok([string_idx]) - - return TErr("This line does not contain any non-atomic strings.") - - @staticmethod - def _return_match(LL: list[Leaf]) -> int | None: - """ - Returns: - string_idx such that @LL[string_idx] is equal to our target (i.e. - matched) string, if this line matches the return/yield statement - requirements listed in the 'Requirements' section of this classes' - docstring. - OR - None, otherwise. - """ - # If this line is a part of a return/yield statement and the first leaf - # contains either the "return" or "yield" keywords... - if parent_type(LL[0]) in [syms.return_stmt, syms.yield_expr] and LL[ - 0 - ].value in ["return", "yield"]: - is_valid_index = is_valid_index_factory(LL) - - idx = 2 if is_valid_index(1) and is_empty_par(LL[1]) else 1 - # The next visible leaf MUST contain a string... - if is_valid_index(idx) and LL[idx].type == token.STRING: - return idx - - return None - - @staticmethod - def _else_match(LL: list[Leaf]) -> int | None: - """ - Returns: - string_idx such that @LL[string_idx] is equal to our target (i.e. - matched) string, if this line matches the ternary expression - requirements listed in the 'Requirements' section of this classes' - docstring. - OR - None, otherwise. - """ - # If this line is a part of a ternary expression and the first leaf - # contains the "else" keyword... - if ( - parent_type(LL[0]) == syms.test - and LL[0].type == token.NAME - and LL[0].value == "else" - ): - is_valid_index = is_valid_index_factory(LL) - - idx = 2 if is_valid_index(1) and is_empty_par(LL[1]) else 1 - # The next visible leaf MUST contain a string... - if is_valid_index(idx) and LL[idx].type == token.STRING: - return idx - - return None - - @staticmethod - def _assert_match(LL: list[Leaf]) -> int | None: - """ - Returns: - string_idx such that @LL[string_idx] is equal to our target (i.e. - matched) string, if this line matches the assert statement - requirements listed in the 'Requirements' section of this classes' - docstring. - OR - None, otherwise. - """ - # If this line is a part of an assert statement and the first leaf - # contains the "assert" keyword... - if parent_type(LL[0]) == syms.assert_stmt and LL[0].value == "assert": - is_valid_index = is_valid_index_factory(LL) - - for i, leaf in enumerate(LL): - # We MUST find a comma... - if leaf.type == token.COMMA: - idx = i + 2 if is_empty_par(LL[i + 1]) else i + 1 - - # That comma MUST be followed by a string... - if is_valid_index(idx) and LL[idx].type == token.STRING: - string_idx = idx - - # Skip the string trailer, if one exists. - string_parser = StringParser() - idx = string_parser.parse(LL, string_idx) - - # But no more leaves are allowed... - if not is_valid_index(idx): - return string_idx - - return None - - @staticmethod - def _assign_match(LL: list[Leaf]) -> int | None: - """ - Returns: - string_idx such that @LL[string_idx] is equal to our target (i.e. - matched) string, if this line matches the assignment statement - requirements listed in the 'Requirements' section of this classes' - docstring. - OR - None, otherwise. - """ - # If this line is a part of an expression statement or is a function - # argument AND the first leaf contains a variable name... - if ( - parent_type(LL[0]) in [syms.expr_stmt, syms.argument, syms.power] - and LL[0].type == token.NAME - ): - is_valid_index = is_valid_index_factory(LL) - - for i, leaf in enumerate(LL): - # We MUST find either an '=' or '+=' symbol... - if leaf.type in [token.EQUAL, token.PLUSEQUAL]: - idx = i + 2 if is_empty_par(LL[i + 1]) else i + 1 - - # That symbol MUST be followed by a string... - if is_valid_index(idx) and LL[idx].type == token.STRING: - string_idx = idx - - # Skip the string trailer, if one exists. - string_parser = StringParser() - idx = string_parser.parse(LL, string_idx) - - # The next leaf MAY be a comma iff this line is a part - # of a function argument... - if ( - parent_type(LL[0]) == syms.argument - and is_valid_index(idx) - and LL[idx].type == token.COMMA - ): - idx += 1 - - # But no more leaves are allowed... - if not is_valid_index(idx): - return string_idx - - return None - - @staticmethod - def _dict_or_lambda_match(LL: list[Leaf]) -> int | None: - """ - Returns: - string_idx such that @LL[string_idx] is equal to our target (i.e. - matched) string, if this line matches the dictionary key assignment - statement or lambda expression requirements listed in the - 'Requirements' section of this classes' docstring. - OR - None, otherwise. - """ - # If this line is a part of a dictionary key assignment or lambda expression... - parent_types = [parent_type(LL[0]), parent_type(LL[0].parent)] - if syms.dictsetmaker in parent_types or syms.lambdef in parent_types: - is_valid_index = is_valid_index_factory(LL) - - for i, leaf in enumerate(LL): - # We MUST find a colon, it can either be dict's or lambda's colon... - if leaf.type == token.COLON and i < len(LL) - 1: - idx = i + 2 if is_empty_par(LL[i + 1]) else i + 1 - - # That colon MUST be followed by a string... - if is_valid_index(idx) and LL[idx].type == token.STRING: - string_idx = idx - - # Skip the string trailer, if one exists. - string_parser = StringParser() - idx = string_parser.parse(LL, string_idx) - - # That string MAY be followed by a comma... - if is_valid_index(idx) and LL[idx].type == token.COMMA: - idx += 1 - - # But no more leaves are allowed... - if not is_valid_index(idx): - return string_idx - - return None - - @staticmethod - def _trailing_comma_tuple_match(line: Line) -> int | None: - """ - Returns: - string_idx such that @line.leaves[string_idx] is equal to our target - (i.e. matched) string, if the line is a bare trailing comma tuple - (STRING + COMMA) not inside brackets. - OR - None, otherwise. - - This handles the case from issue #4912 where a long string with a - trailing comma (making it a one-item tuple) needs to be wrapped in - parentheses before splitting to preserve AST equivalence. - """ - LL = line.leaves - # Match: STRING followed by COMMA, not inside brackets - if ( - not line.inside_brackets - and len(LL) == 2 - and LL[0].type == token.STRING - and LL[1].type == token.COMMA - ): - return 0 - - return None - - def do_transform( - self, line: Line, string_indices: list[int] - ) -> Iterator[TResult[Line]]: - LL = line.leaves - assert len(string_indices) == 1, ( - f"{self.__class__.__name__} should only find one match at a time, found" - f" {len(string_indices)}" - ) - string_idx = string_indices[0] - - is_valid_index = is_valid_index_factory(LL) - insert_str_child = insert_str_child_factory(LL[string_idx]) - - comma_idx = -1 - ends_with_comma = False - if LL[comma_idx].type == token.COMMA: - ends_with_comma = True - - leaves_to_steal_comments_from = [LL[string_idx]] - if ends_with_comma: - leaves_to_steal_comments_from.append(LL[comma_idx]) - - # --- First Line - first_line = line.clone() - left_leaves = LL[:string_idx] - - # We have to remember to account for (possibly invisible) LPAR and RPAR - # leaves that already wrapped the target string. If these leaves do - # exist, we will replace them with our own LPAR and RPAR leaves. - old_parens_exist = False - if left_leaves and left_leaves[-1].type == token.LPAR: - old_parens_exist = True - leaves_to_steal_comments_from.append(left_leaves[-1]) - left_leaves.pop() - - append_leaves(first_line, line, left_leaves) - - lpar_leaf = Leaf(token.LPAR, "(") - if old_parens_exist: - replace_child(LL[string_idx - 1], lpar_leaf) - else: - insert_str_child(lpar_leaf) - first_line.append(lpar_leaf) - - # We throw inline comments that were originally to the right of the - # target string to the top line. They will now be shown to the right of - # the LPAR. - for leaf in leaves_to_steal_comments_from: - for comment_leaf in line.comments_after(leaf): - first_line.append(comment_leaf, preformatted=True) - - yield Ok(first_line) - - # --- Middle (String) Line - # We only need to yield one (possibly too long) string line, since the - # `StringSplitter` will break it down further if necessary. - string_value = LL[string_idx].value - string_line = Line( - mode=line.mode, - depth=line.depth + 1, - inside_brackets=True, - should_split_rhs=line.should_split_rhs, - magic_trailing_comma=line.magic_trailing_comma, - ) - string_leaf = Leaf(token.STRING, string_value) - insert_str_child(string_leaf) - string_line.append(string_leaf) - - old_rpar_leaf = None - if is_valid_index(string_idx + 1): - right_leaves = LL[string_idx + 1 :] - if ends_with_comma: - right_leaves.pop() - - if old_parens_exist: - assert right_leaves and right_leaves[-1].type == token.RPAR, ( - "Apparently, old parentheses do NOT exist?!" - f" (left_leaves={left_leaves}, right_leaves={right_leaves})" - ) - old_rpar_leaf = right_leaves.pop() - elif right_leaves and right_leaves[-1].type == token.RPAR: - # Special case for lambda expressions as dict's value, e.g.: - # my_dict = { - # "key": lambda x: f"formatted: {x}", - # } - # After wrapping the dict's value with parentheses, the string is - # followed by a RPAR but its opening bracket is lambda's, not - # the string's: - # "key": (lambda x: f"formatted: {x}"), - opening_bracket = right_leaves[-1].opening_bracket - if opening_bracket is not None and opening_bracket in left_leaves: - index = left_leaves.index(opening_bracket) - if ( - 0 < index < len(left_leaves) - 1 - and left_leaves[index - 1].type == token.COLON - and left_leaves[index + 1].value == "lambda" - ): - right_leaves.pop() - - append_leaves(string_line, line, right_leaves) - - yield Ok(string_line) - - # --- Last Line - last_line = line.clone() - last_line.bracket_tracker = first_line.bracket_tracker - - new_rpar_leaf = Leaf(token.RPAR, ")") - if old_rpar_leaf is not None: - replace_child(old_rpar_leaf, new_rpar_leaf) - else: - insert_str_child(new_rpar_leaf) - last_line.append(new_rpar_leaf) - - # If the target string ended with a comma, we place this comma to the - # right of the RPAR on the last line. - if ends_with_comma: - comma_leaf = Leaf(token.COMMA, ",") - replace_child(LL[comma_idx], comma_leaf) - last_line.append(comma_leaf) - - yield Ok(last_line) - - -class StringParser: - """ - A state machine that aids in parsing a string's "trailer", which can be - either non-existent, an old-style formatting sequence (e.g. `% varX` or `% - (varX, varY)`), or a method-call / attribute access (e.g. `.format(varX, - varY)`). - - NOTE: A new StringParser object MUST be instantiated for each string - trailer we need to parse. - - Examples: - We shall assume that `line` equals the `Line` object that corresponds - to the following line of python code: - ``` - x = "Some {}.".format("String") + some_other_string - ``` - - Furthermore, we will assume that `string_idx` is some index such that: - ``` - assert line.leaves[string_idx].value == "Some {}." - ``` - - The following code snippet then holds: - ``` - string_parser = StringParser() - idx = string_parser.parse(line.leaves, string_idx) - assert line.leaves[idx].type == token.PLUS - ``` - """ - - DEFAULT_TOKEN: Final = 20210605 - - # String Parser States - START: Final = 1 - DOT: Final = 2 - NAME: Final = 3 - PERCENT: Final = 4 - SINGLE_FMT_ARG: Final = 5 - LPAR: Final = 6 - RPAR: Final = 7 - DONE: Final = 8 - - # Lookup Table for Next State - _goto: Final[dict[tuple[ParserState, NodeType], ParserState]] = { - # A string trailer may start with '.' OR '%'. - (START, token.DOT): DOT, - (START, token.PERCENT): PERCENT, - (START, DEFAULT_TOKEN): DONE, - # A '.' MUST be followed by an attribute or method name. - (DOT, token.NAME): NAME, - # A method name MUST be followed by an '(', whereas an attribute name - # is the last symbol in the string trailer. - (NAME, token.LPAR): LPAR, - (NAME, DEFAULT_TOKEN): DONE, - # A '%' symbol can be followed by an '(' or a single argument (e.g. a - # string or variable name). - (PERCENT, token.LPAR): LPAR, - (PERCENT, DEFAULT_TOKEN): SINGLE_FMT_ARG, - # If a '%' symbol is followed by a single argument, that argument is - # the last leaf in the string trailer. - (SINGLE_FMT_ARG, DEFAULT_TOKEN): DONE, - # If present, a ')' symbol is the last symbol in a string trailer. - # (NOTE: LPARS and nested RPARS are not included in this lookup table, - # since they are treated as a special case by the parsing logic in this - # classes' implementation.) - (RPAR, DEFAULT_TOKEN): DONE, - } - - def __init__(self) -> None: - self._state = self.START - self._unmatched_lpars = 0 - - def parse(self, leaves: list[Leaf], string_idx: int) -> int: - """ - Pre-conditions: - * @leaves[@string_idx].type == token.STRING - - Returns: - The index directly after the last leaf which is a part of the string - trailer, if a "trailer" exists. - OR - @string_idx + 1, if no string "trailer" exists. - """ - assert leaves[string_idx].type == token.STRING - - idx = string_idx + 1 - while idx < len(leaves) and self._next_state(leaves[idx]): - idx += 1 - return idx - - def _next_state(self, leaf: Leaf) -> bool: - """ - Pre-conditions: - * On the first call to this function, @leaf MUST be the leaf that - was directly after the string leaf in question (e.g. if our target - string is `line.leaves[i]` then the first call to this method must - be `line.leaves[i + 1]`). - * On the next call to this function, the leaf parameter passed in - MUST be the leaf directly following @leaf. - - Returns: - True iff @leaf is a part of the string's trailer. - """ - # We ignore empty LPAR or RPAR leaves. - if is_empty_par(leaf): - return True - - next_token = leaf.type - if next_token == token.LPAR: - self._unmatched_lpars += 1 - - current_state = self._state - - # The LPAR parser state is a special case. We will return True until we - # find the matching RPAR token. - if current_state == self.LPAR: - if next_token == token.RPAR: - self._unmatched_lpars -= 1 - if self._unmatched_lpars == 0: - self._state = self.RPAR - # Otherwise, we use a lookup table to determine the next state. - else: - # If the lookup table matches the current state to the next - # token, we use the lookup table. - if (current_state, next_token) in self._goto: - self._state = self._goto[current_state, next_token] - else: - # Otherwise, we check if a the current state was assigned a - # default. - if (current_state, self.DEFAULT_TOKEN) in self._goto: - self._state = self._goto[current_state, self.DEFAULT_TOKEN] - # If no default has been assigned, then this parser has a logic - # error. - else: - raise RuntimeError(f"{self.__class__.__name__} LOGIC ERROR!") - - if self._state == self.DONE: - return False - - return True - - -def insert_str_child_factory(string_leaf: Leaf) -> Callable[[LN], None]: - """ - Factory for a convenience function that is used to orphan @string_leaf - and then insert multiple new leaves into the same part of the node - structure that @string_leaf had originally occupied. - - Examples: - Let `string_leaf = Leaf(token.STRING, '"foo"')` and `N = - string_leaf.parent`. Assume the node `N` has the following - original structure: - - Node( - expr_stmt, [ - Leaf(NAME, 'x'), - Leaf(EQUAL, '='), - Leaf(STRING, '"foo"'), - ] - ) - - We then run the code snippet shown below. - ``` - insert_str_child = insert_str_child_factory(string_leaf) - - lpar = Leaf(token.LPAR, '(') - insert_str_child(lpar) - - bar = Leaf(token.STRING, '"bar"') - insert_str_child(bar) - - rpar = Leaf(token.RPAR, ')') - insert_str_child(rpar) - ``` - - After which point, it follows that `string_leaf.parent is None` and - the node `N` now has the following structure: - - Node( - expr_stmt, [ - Leaf(NAME, 'x'), - Leaf(EQUAL, '='), - Leaf(LPAR, '('), - Leaf(STRING, '"bar"'), - Leaf(RPAR, ')'), - ] - ) - """ - string_parent = string_leaf.parent - string_child_idx = string_leaf.remove() - - def insert_str_child(child: LN) -> None: - nonlocal string_child_idx - - assert string_parent is not None - assert string_child_idx is not None - - string_parent.insert_child(string_child_idx, child) - string_child_idx += 1 - - return insert_str_child - - -def is_valid_index_factory(seq: Sequence[Any]) -> Callable[[int], bool]: - """ - Examples: - ``` - my_list = [1, 2, 3] - - is_valid_index = is_valid_index_factory(my_list) - - assert is_valid_index(0) - assert is_valid_index(2) - - assert not is_valid_index(3) - assert not is_valid_index(-1) - ``` - """ - - def is_valid_index(idx: int) -> bool: - """ - Returns: - True iff @idx is positive AND seq[@idx] does NOT raise an - IndexError. - """ - return 0 <= idx < len(seq) - - return is_valid_index diff --git a/venv/lib/python3.12/site-packages/blackd/__init__.py b/venv/lib/python3.12/site-packages/blackd/__init__.py deleted file mode 100644 index 4646e91..0000000 --- a/venv/lib/python3.12/site-packages/blackd/__init__.py +++ /dev/null @@ -1,334 +0,0 @@ -import asyncio -import logging -import os -from concurrent.futures import Executor, ProcessPoolExecutor -from datetime import datetime, timezone -from functools import cache, partial -from multiprocessing import freeze_support - -try: - from aiohttp import web - from multidict import MultiMapping - - from .middlewares import cors -except ImportError as ie: - raise ImportError( - f"aiohttp dependency is not installed: {ie}. " - + "Please re-install black with the '[d]' extra install " - + "to obtain aiohttp_cors: `pip install black[d]`" - ) from None - -import click - -import black -from _black_version import version as __version__ -from black.concurrency import maybe_use_uvloop - -# This is used internally by tests to shut down the server prematurely -_stop_signal = asyncio.Event() - -# Request headers -PROTOCOL_VERSION_HEADER = "X-Protocol-Version" -LINE_LENGTH_HEADER = "X-Line-Length" -PYTHON_VARIANT_HEADER = "X-Python-Variant" -SKIP_SOURCE_FIRST_LINE = "X-Skip-Source-First-Line" -SKIP_STRING_NORMALIZATION_HEADER = "X-Skip-String-Normalization" -SKIP_MAGIC_TRAILING_COMMA = "X-Skip-Magic-Trailing-Comma" -PREVIEW = "X-Preview" -UNSTABLE = "X-Unstable" -ENABLE_UNSTABLE_FEATURE = "X-Enable-Unstable-Feature" -FAST_OR_SAFE_HEADER = "X-Fast-Or-Safe" -DIFF_HEADER = "X-Diff" - -BLACK_HEADERS = [ - PROTOCOL_VERSION_HEADER, - LINE_LENGTH_HEADER, - PYTHON_VARIANT_HEADER, - SKIP_SOURCE_FIRST_LINE, - SKIP_STRING_NORMALIZATION_HEADER, - SKIP_MAGIC_TRAILING_COMMA, - PREVIEW, - UNSTABLE, - ENABLE_UNSTABLE_FEATURE, - FAST_OR_SAFE_HEADER, - DIFF_HEADER, -] - -# Response headers -BLACK_VERSION_HEADER = "X-Black-Version" -DEFAULT_MAX_BODY_SIZE = 5 * 1024 * 1024 -DEFAULT_WORKERS = os.cpu_count() or 1 - - -class HeaderError(Exception): - pass - - -class InvalidVariantHeader(Exception): - pass - - -@click.command(context_settings={"help_option_names": ["-h", "--help"]}) -@click.option( - "--bind-host", - type=str, - help="Address to bind the server to.", - default="localhost", - show_default=True, -) -@click.option( - "--bind-port", type=int, help="Port to listen on", default=45484, show_default=True -) -@click.option( - "--cors-allow-origin", - "cors_allow_origins", - multiple=True, - help="Origin allowed to access blackd over CORS. Can be passed multiple times.", -) -@click.option( - "--max-body-size", - type=click.IntRange(min=1), - default=DEFAULT_MAX_BODY_SIZE, - show_default=True, - help="Maximum request body size in bytes.", -) -@click.version_option(version=black.__version__) -def main( - bind_host: str, - bind_port: int, - cors_allow_origins: tuple[str, ...], - max_body_size: int, -) -> None: - logging.basicConfig(level=logging.INFO) - app = make_app(cors_allow_origins=cors_allow_origins, max_body_size=max_body_size) - ver = black.__version__ - black.out(f"blackd version {ver} listening on {bind_host} port {bind_port}") - loop = maybe_use_uvloop() - try: - web.run_app( - app, - host=bind_host, - port=bind_port, - handle_signals=True, - print=None, - loop=loop, - ) - finally: - if not loop.is_closed(): - loop.close() - - -@cache -def executor() -> Executor: - return ProcessPoolExecutor(max_workers=DEFAULT_WORKERS) - - -def make_app( - *, - cors_allow_origins: tuple[str, ...] = (), - max_body_size: int = DEFAULT_MAX_BODY_SIZE, -) -> web.Application: - app = web.Application( - client_max_size=max_body_size, - middlewares=[ - cors( - allow_headers=(*BLACK_HEADERS, "Content-Type"), - allow_origins=frozenset(cors_allow_origins), - expose_headers=(BLACK_VERSION_HEADER,), - ) - ], - ) - app.add_routes([ - web.post( - "/", - partial( - handle, - executor=executor(), - executor_semaphore=asyncio.BoundedSemaphore(DEFAULT_WORKERS), - ), - ) - ]) - return app - - -async def handle( - request: web.Request, - executor: Executor, - executor_semaphore: asyncio.BoundedSemaphore, -) -> web.Response: - headers = {BLACK_VERSION_HEADER: __version__} - try: - if request.headers.get(PROTOCOL_VERSION_HEADER, "1") != "1": - return web.Response( - status=501, text="This server only supports protocol version 1" - ) - - fast = False - if request.headers.get(FAST_OR_SAFE_HEADER, "safe") == "fast": - fast = True - try: - mode = parse_mode(request.headers) - except HeaderError as e: - return web.Response(status=400, text=e.args[0]) - req_bytes = await request.read() - charset = request.charset if request.charset is not None else "utf8" - req_str = req_bytes.decode(charset) - then = datetime.now(timezone.utc) - - header = "" - if mode.skip_source_first_line: - first_newline_position: int = req_str.find("\n") + 1 - header = req_str[:first_newline_position] - req_str = req_str[first_newline_position:] - - only_diff = bool(request.headers.get(DIFF_HEADER, False)) - formatted_str = await format_code( - req_str=req_str, - fast=fast, - mode=mode, - then=then, - only_diff=only_diff, - executor=executor, - executor_semaphore=executor_semaphore, - ) - - # Put the source first line back - req_str = header + req_str - formatted_str = header + formatted_str - - return web.Response( - content_type=request.content_type, - charset=charset, - headers=headers, - text=formatted_str, - ) - except black.NothingChanged: - return web.Response(status=204, headers=headers) - except black.InvalidInput as e: - return web.Response(status=400, headers=headers, text=str(e)) - except web.HTTPException: - raise - except Exception as e: - logging.exception("Exception during handling a request") - return web.Response(status=500, headers=headers, text=str(e)) - - -async def format_code( - *, - req_str: str, - fast: bool, - mode: black.FileMode, - then: datetime, - only_diff: bool, - executor: Executor, - executor_semaphore: asyncio.BoundedSemaphore, -) -> str: - async with executor_semaphore: - loop = asyncio.get_event_loop() - formatted_str = await loop.run_in_executor( - executor, partial(black.format_file_contents, req_str, fast=fast, mode=mode) - ) - - if not only_diff: - return formatted_str - - now = datetime.now(timezone.utc) - src_name = f"In\t{then}" - dst_name = f"Out\t{now}" - return await loop.run_in_executor( - executor, - partial(black.diff, req_str, formatted_str, src_name, dst_name), - ) - - -def parse_mode(headers: MultiMapping[str]) -> black.Mode: - try: - line_length = int(headers.get(LINE_LENGTH_HEADER, black.DEFAULT_LINE_LENGTH)) - except ValueError: - raise HeaderError("Invalid line length header value") from None - - if PYTHON_VARIANT_HEADER in headers: - value = headers[PYTHON_VARIANT_HEADER] - try: - pyi, versions = parse_python_variant_header(value) - except InvalidVariantHeader as e: - raise HeaderError( - f"Invalid value for {PYTHON_VARIANT_HEADER}: {e.args[0]}", - ) from None - else: - pyi = False - versions = set() - - skip_string_normalization = bool( - headers.get(SKIP_STRING_NORMALIZATION_HEADER, False) - ) - skip_magic_trailing_comma = bool(headers.get(SKIP_MAGIC_TRAILING_COMMA, False)) - skip_source_first_line = bool(headers.get(SKIP_SOURCE_FIRST_LINE, False)) - - preview = bool(headers.get(PREVIEW, False)) - unstable = bool(headers.get(UNSTABLE, False)) - enable_features: set[black.Preview] = set() - enable_unstable_features = headers.get(ENABLE_UNSTABLE_FEATURE, "").split(",") - for piece in enable_unstable_features: - piece = piece.strip() - if piece: - try: - enable_features.add(black.Preview[piece]) - except KeyError: - raise HeaderError( - f"Invalid value for {ENABLE_UNSTABLE_FEATURE}: {piece}", - ) from None - - return black.FileMode( - target_versions=versions, - is_pyi=pyi, - line_length=line_length, - skip_source_first_line=skip_source_first_line, - string_normalization=not skip_string_normalization, - magic_trailing_comma=not skip_magic_trailing_comma, - preview=preview, - unstable=unstable, - enabled_features=enable_features, - ) - - -def parse_python_variant_header(value: str) -> tuple[bool, set[black.TargetVersion]]: - if value == "pyi": - return True, set() - else: - versions = set() - for version in value.split(","): - if version.startswith("py"): - version = version[len("py") :] - if "." in version: - major_str, *rest = version.split(".") - else: - major_str = version[0] - rest = [version[1:]] if len(version) > 1 else [] - try: - major = int(major_str) - if major not in (2, 3): - raise InvalidVariantHeader("major version must be 2 or 3") - if len(rest) > 0: - minor = int(rest[0]) - if major == 2: - raise InvalidVariantHeader("Python 2 is not supported") - else: - # Default to lowest supported minor version. - minor = 7 if major == 2 else 3 - version_str = f"PY{major}{minor}" - if major == 3 and not hasattr(black.TargetVersion, version_str): - raise InvalidVariantHeader(f"3.{minor} is not supported") - versions.add(black.TargetVersion[version_str]) - except (KeyError, ValueError): - raise InvalidVariantHeader("expected e.g. '3.7', 'py3.5'") from None - return False, versions - - -def patched_main() -> None: - freeze_support() - main() - - -if __name__ == "__main__": - patched_main() diff --git a/venv/lib/python3.12/site-packages/blackd/__main__.py b/venv/lib/python3.12/site-packages/blackd/__main__.py deleted file mode 100644 index b5a4b13..0000000 --- a/venv/lib/python3.12/site-packages/blackd/__main__.py +++ /dev/null @@ -1,3 +0,0 @@ -import blackd - -blackd.patched_main() diff --git a/venv/lib/python3.12/site-packages/blackd/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/blackd/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 35111f1..0000000 Binary files a/venv/lib/python3.12/site-packages/blackd/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blackd/__pycache__/__main__.cpython-312.pyc b/venv/lib/python3.12/site-packages/blackd/__pycache__/__main__.cpython-312.pyc deleted file mode 100644 index cf7c06d..0000000 Binary files a/venv/lib/python3.12/site-packages/blackd/__pycache__/__main__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blackd/__pycache__/client.cpython-312.pyc b/venv/lib/python3.12/site-packages/blackd/__pycache__/client.cpython-312.pyc deleted file mode 100644 index 8a30e67..0000000 Binary files a/venv/lib/python3.12/site-packages/blackd/__pycache__/client.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blackd/__pycache__/middlewares.cpython-312.pyc b/venv/lib/python3.12/site-packages/blackd/__pycache__/middlewares.cpython-312.pyc deleted file mode 100644 index 1903e77..0000000 Binary files a/venv/lib/python3.12/site-packages/blackd/__pycache__/middlewares.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blackd/client.py b/venv/lib/python3.12/site-packages/blackd/client.py deleted file mode 100644 index c36759a..0000000 --- a/venv/lib/python3.12/site-packages/blackd/client.py +++ /dev/null @@ -1,92 +0,0 @@ -import aiohttp -from aiohttp.typedefs import StrOrURL - -import black - -_DEFAULT_HEADERS = {"Content-Type": "text/plain; charset=utf-8"} - - -class BlackDClient: - def __init__( - self, - url: StrOrURL = "http://localhost:9090", - line_length: int | None = None, - skip_source_first_line: bool = False, - skip_string_normalization: bool = False, - skip_magic_trailing_comma: bool = False, - preview: bool = False, - fast: bool = False, - python_variant: str | None = None, - diff: bool = False, - headers: dict[str, str] | None = None, - ): - """ - Initialize a BlackDClient object. - :param url: The URL of the BlackD server. - :param line_length: The maximum line length. - Corresponds to the ``--line-length`` CLI option. - :param skip_source_first_line: True to skip the first line of the source. - Corresponds to the ``--skip-source-first-line`` CLI option. - :param skip_string_normalization: True to skip string normalization. - Corresponds to the ``--skip-string-normalization`` CLI option. - :param skip_magic_trailing_comma: True to skip magic trailing comma. - Corresponds to the ``--skip-magic-trailing-comma`` CLI option. - :param preview: True to enable experimental preview mode. - Corresponds to the ``--preview`` CLI option. - :param fast: True to enable fast mode. - Corresponds to the ``--fast`` CLI option. - :param python_variant: The Python variant to use. - Corresponds to the ``--pyi`` CLI option if this is "pyi". - Otherwise, corresponds to the ``--target-version`` CLI option. - :param diff: True to enable diff mode. - Corresponds to the ``--diff`` CLI option. - :param headers: A dictionary of additional custom headers to send with - the request. - """ - self.url = url - self.headers = _DEFAULT_HEADERS.copy() - - if line_length is not None: - self.headers["X-Line-Length"] = str(line_length) - if skip_source_first_line: - self.headers["X-Skip-Source-First-Line"] = "yes" - if skip_string_normalization: - self.headers["X-Skip-String-Normalization"] = "yes" - if skip_magic_trailing_comma: - self.headers["X-Skip-Magic-Trailing-Comma"] = "yes" - if preview: - self.headers["X-Preview"] = "yes" - if fast: - self.headers["X-Fast-Or-Safe"] = "fast" - if python_variant is not None: - self.headers["X-Python-Variant"] = python_variant - if diff: - self.headers["X-Diff"] = "yes" - - if headers is not None: - self.headers.update(headers) - - async def format_code(self, unformatted_code: str) -> str: - async with aiohttp.ClientSession() as session: - async with session.post( - self.url, headers=self.headers, data=unformatted_code.encode("utf-8") - ) as response: - if response.status == 204: - # Input is already well-formatted - return unformatted_code - elif response.status == 200: - # Formatting was needed - return await response.text() - elif response.status == 400: - # Input contains a syntax error - error_message = await response.text() - raise black.InvalidInput(error_message) - elif response.status == 500: - # Other kind of error while formatting - error_message = await response.text() - raise RuntimeError(f"Error while formatting: {error_message}") - else: - # Unexpected response status code - raise RuntimeError( - f"Unexpected response status code: {response.status}" - ) diff --git a/venv/lib/python3.12/site-packages/blackd/middlewares.py b/venv/lib/python3.12/site-packages/blackd/middlewares.py deleted file mode 100644 index 4b2ccc9..0000000 --- a/venv/lib/python3.12/site-packages/blackd/middlewares.py +++ /dev/null @@ -1,45 +0,0 @@ -from collections.abc import Awaitable, Callable, Collection, Iterable - -from aiohttp import web -from aiohttp.typedefs import Middleware -from aiohttp.web_middlewares import middleware -from aiohttp.web_request import Request -from aiohttp.web_response import StreamResponse - -Handler = Callable[[Request], Awaitable[StreamResponse]] - - -def cors( - *, - allow_headers: Iterable[str], - allow_origins: Collection[str], - expose_headers: Iterable[str], -) -> Middleware: - @middleware - async def impl(request: Request, handler: Handler) -> StreamResponse: - origin = request.headers.get("Origin") - if not origin: - return await handler(request) - - if origin not in allow_origins: - return web.Response(status=403, text="CORS origin is not allowed") - - is_options = request.method == "OPTIONS" - is_preflight = is_options and "Access-Control-Request-Method" in request.headers - if is_preflight: - resp = StreamResponse() - else: - resp = await handler(request) - - resp.headers["Access-Control-Allow-Origin"] = origin - if expose_headers: - resp.headers["Access-Control-Expose-Headers"] = ", ".join(expose_headers) - if is_options: - resp.headers["Access-Control-Allow-Headers"] = ", ".join(allow_headers) - resp.headers["Access-Control-Allow-Methods"] = ", ".join( - ("OPTIONS", "POST") - ) - - return resp - - return impl diff --git a/venv/lib/python3.12/site-packages/blib2to3/Grammar.txt b/venv/lib/python3.12/site-packages/blib2to3/Grammar.txt deleted file mode 100644 index a2161da..0000000 --- a/venv/lib/python3.12/site-packages/blib2to3/Grammar.txt +++ /dev/null @@ -1,266 +0,0 @@ -# Grammar for 2to3. This grammar supports Python 2.x and 3.x. - -# NOTE WELL: You should also follow all the steps listed at -# https://devguide.python.org/grammar/ - -# Start symbols for the grammar: -# file_input is a module or sequence of commands read from an input file; -# single_input is a single interactive statement; -# eval_input is the input for the eval() and input() functions. -# NB: compound_stmt in single_input is followed by extra NEWLINE! -file_input: (NEWLINE | stmt)* ENDMARKER -single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE -eval_input: testlist NEWLINE* ENDMARKER - -typevar: NAME [':' test] ['=' test] -paramspec: '**' NAME ['=' test] -typevartuple: '*' NAME ['=' (test|star_expr)] -typeparam: typevar | paramspec | typevartuple -typeparams: '[' typeparam (',' typeparam)* [','] ']' - -decorator: '@' namedexpr_test NEWLINE -decorators: decorator+ -decorated: decorators (classdef | funcdef | async_funcdef) -async_funcdef: ASYNC funcdef -funcdef: 'def' NAME [typeparams] parameters ['->' test] ':' suite -parameters: '(' [typedargslist] ')' - -# The following definition for typedarglist is equivalent to this set of rules: -# -# arguments = argument (',' argument)* -# argument = tfpdef ['=' test] -# kwargs = '**' tname [','] -# args = '*' [tname_star] -# kwonly_kwargs = (',' argument)* [',' [kwargs]] -# args_kwonly_kwargs = args kwonly_kwargs | kwargs -# poskeyword_args_kwonly_kwargs = arguments [',' [args_kwonly_kwargs]] -# typedargslist_no_posonly = poskeyword_args_kwonly_kwargs | args_kwonly_kwargs -# typedarglist = arguments ',' '/' [',' [typedargslist_no_posonly]])|(typedargslist_no_posonly)" -# -# It needs to be fully expanded to allow our LL(1) parser to work on it. - -typedargslist: tfpdef ['=' test] (',' tfpdef ['=' test])* ',' '/' [ - ',' [((tfpdef ['=' test] ',')* ('*' [tname_star] (',' tname ['=' test])* - [',' ['**' tname [',']]] | '**' tname [',']) - | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])] - ] | ((tfpdef ['=' test] ',')* ('*' [tname_star] (',' tname ['=' test])* - [',' ['**' tname [',']]] | '**' tname [',']) - | tfpdef ['=' test] (',' tfpdef ['=' test])* [',']) - -tname: NAME [':' test] -tname_star: NAME [':' (test|star_expr)] -tfpdef: tname | '(' tfplist ')' -tfplist: tfpdef (',' tfpdef)* [','] - -# The following definition for varargslist is equivalent to this set of rules: -# -# arguments = argument (',' argument )* -# argument = vfpdef ['=' test] -# kwargs = '**' vname [','] -# args = '*' [vname] -# kwonly_kwargs = (',' argument )* [',' [kwargs]] -# args_kwonly_kwargs = args kwonly_kwargs | kwargs -# poskeyword_args_kwonly_kwargs = arguments [',' [args_kwonly_kwargs]] -# vararglist_no_posonly = poskeyword_args_kwonly_kwargs | args_kwonly_kwargs -# varargslist = arguments ',' '/' [','[(vararglist_no_posonly)]] | (vararglist_no_posonly) -# -# It needs to be fully expanded to allow our LL(1) parser to work on it. - -varargslist: vfpdef ['=' test ](',' vfpdef ['=' test])* ',' '/' [',' [ - ((vfpdef ['=' test] ',')* ('*' [vname] (',' vname ['=' test])* - [',' ['**' vname [',']]] | '**' vname [',']) - | vfpdef ['=' test] (',' vfpdef ['=' test])* [',']) - ]] | ((vfpdef ['=' test] ',')* - ('*' [vname] (',' vname ['=' test])* [',' ['**' vname [',']]]| '**' vname [',']) - | vfpdef ['=' test] (',' vfpdef ['=' test])* [',']) - -vname: NAME -vfpdef: vname | '(' vfplist ')' -vfplist: vfpdef (',' vfpdef)* [','] - -stmt: simple_stmt | compound_stmt -simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE -small_stmt: (type_stmt | expr_stmt | del_stmt | pass_stmt | flow_stmt | - import_stmt | global_stmt | assert_stmt) -expr_stmt: testlist_star_expr (annassign | augassign (yield_expr|testlist) | - ('=' (yield_expr|testlist_star_expr))*) -annassign: ':' test ['=' (yield_expr|testlist_star_expr)] -testlist_star_expr: (test|star_expr) (',' (test|star_expr))* [','] -augassign: ('+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' | - '<<=' | '>>=' | '**=' | '//=') -# For normal and annotated assignments, additional restrictions enforced by the interpreter -del_stmt: 'del' exprlist -pass_stmt: 'pass' -flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | yield_stmt -break_stmt: 'break' -continue_stmt: 'continue' -return_stmt: 'return' [testlist_star_expr] -yield_stmt: yield_expr -raise_stmt: 'raise' [test ['from' test | ',' test [',' test]]] -import_stmt: import_name | import_from -import_name: 'import' dotted_as_names -import_from: ('from' ('.'* dotted_name | '.'+) - 'import' ('*' | '(' import_as_names ')' | import_as_names)) -import_as_name: NAME ['as' NAME] -dotted_as_name: dotted_name ['as' NAME] -import_as_names: import_as_name (',' import_as_name)* [','] -dotted_as_names: dotted_as_name (',' dotted_as_name)* -dotted_name: NAME ('.' NAME)* -global_stmt: ('global' | 'nonlocal') NAME (',' NAME)* -assert_stmt: 'assert' test [',' test] -type_stmt: "type" NAME [typeparams] '=' test - -compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated | async_stmt | match_stmt -async_stmt: ASYNC (funcdef | with_stmt | for_stmt) -if_stmt: 'if' namedexpr_test ':' suite ('elif' namedexpr_test ':' suite)* ['else' ':' suite] -while_stmt: 'while' namedexpr_test ':' suite ['else' ':' suite] -for_stmt: 'for' exprlist 'in' testlist_star_expr ':' suite ['else' ':' suite] -try_stmt: ('try' ':' suite - ((except_clause ':' suite)+ - ['else' ':' suite] - ['finally' ':' suite] | - 'finally' ':' suite)) -with_stmt: 'with' asexpr_test (',' asexpr_test)* ':' suite - -# NB compile.c makes sure that the default except clause is last -except_clause: 'except' ['*'] [testlist ['as' test]] -suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT - -# Backward compatibility cruft to support: -# [ x for x in lambda: True, lambda: False if x() ] -# even while also allowing: -# lambda x: 5 if x else 2 -# (But not a mix of the two) -testlist_safe: old_test [(',' old_test)+ [',']] -old_test: or_test | old_lambdef -old_lambdef: 'lambda' [varargslist] ':' old_test - -namedexpr_test: asexpr_test [':=' asexpr_test] - -# This is actually not a real rule, though since the parser is very -# limited in terms of the strategy about match/case rules, we are inserting -# a virtual case ( as ) as a valid expression. Unless a better -# approach is thought, the only side effect of this seem to be just allowing -# more stuff to be parser (which would fail on the ast). -asexpr_test: test ['as' test] - -test: or_test ['if' or_test 'else' test] | lambdef -or_test: and_test ('or' and_test)* -and_test: not_test ('and' not_test)* -not_test: 'not' not_test | comparison -comparison: expr (comp_op expr)* -comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not' -star_expr: '*' expr -expr: xor_expr ('|' xor_expr)* -xor_expr: and_expr ('^' and_expr)* -and_expr: shift_expr ('&' shift_expr)* -shift_expr: arith_expr (('<<'|'>>') arith_expr)* -arith_expr: term (('+'|'-') term)* -term: factor (('*'|'@'|'/'|'%'|'//') factor)* -factor: ('+'|'-'|'~') factor | power -power: [AWAIT] atom trailer* ['**' factor] -atom: ('(' [yield_expr|testlist_gexp] ')' | - '[' [listmaker] ']' | - '{' [dictsetmaker] '}' | - '`' testlist1 '`' | - NAME | NUMBER | (STRING | fstring | tstring)+ | '.' '.' '.') -listmaker: (namedexpr_test|star_expr) ( old_comp_for | (',' (namedexpr_test|star_expr))* [','] ) -testlist_gexp: (namedexpr_test|star_expr) ( old_comp_for | (',' (namedexpr_test|star_expr))* [','] ) -lambdef: 'lambda' [varargslist] ':' test -trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME -subscriptlist: (subscript|star_expr) (',' (subscript|star_expr))* [','] -subscript: test [':=' test] | [test] ':' [test] [sliceop] -sliceop: ':' [test] -exprlist: (expr|star_expr) (',' (expr|star_expr))* [','] -testlist: test (',' test)* [','] -dictsetmaker: ( ((test ':' asexpr_test | '**' expr) - (comp_for | (',' (test ':' asexpr_test | '**' expr))* [','])) | - ((test [':=' test] | star_expr) - (comp_for | (',' (test [':=' test] | star_expr))* [','])) ) - -classdef: 'class' NAME [typeparams] ['(' [arglist] ')'] ':' suite - -arglist: argument (',' argument)* [','] - -# "test '=' test" is really "keyword '=' test", but we have no such token. -# These need to be in a single rule to avoid grammar that is ambiguous -# to our LL(1) parser. Even though 'test' includes '*expr' in star_expr, -# we explicitly match '*' here, too, to give it proper precedence. -# Illegal combinations and orderings are blocked in ast.c: -# multiple (test comp_for) arguments are blocked; keyword unpackings -# that precede iterable unpackings are blocked; etc. -argument: ( test [comp_for] | - test ':=' test [comp_for] | - test 'as' test | - test '=' asexpr_test | - '**' test | - '*' test ) - -comp_iter: comp_for | comp_if -comp_for: [ASYNC] 'for' exprlist 'in' or_test [comp_iter] -comp_if: 'if' old_test [comp_iter] - -# As noted above, testlist_safe extends the syntax allowed in list -# comprehensions and generators. We can't use it indiscriminately in all -# derivations using a comp_for-like pattern because the testlist_safe derivation -# contains comma which clashes with trailing comma in arglist. -# -# This was an issue because the parser would not follow the correct derivation -# when parsing syntactically valid Python code. Since testlist_safe was created -# specifically to handle list comprehensions and generator expressions enclosed -# with parentheses, it's safe to only use it in those. That avoids the issue; we -# can parse code like set(x for x in [],). -# -# The syntax supported by this set of rules is not a valid Python 3 syntax, -# hence the prefix "old". -# -# See https://bugs.python.org/issue27494 -old_comp_iter: old_comp_for | old_comp_if -old_comp_for: [ASYNC] 'for' exprlist 'in' testlist_safe [old_comp_iter] -old_comp_if: 'if' old_test [old_comp_iter] - -testlist1: test (',' test)* - -# not used in grammar, but may appear in "node" passed from Parser to Compiler -encoding_decl: NAME - -yield_expr: 'yield' [yield_arg] -yield_arg: 'from' test | testlist_star_expr - - -# 3.10 match statement definition - -# PS: normally the grammar is much much more restricted, but -# at this moment for not trying to bother much with encoding the -# exact same DSL in a LL(1) parser, we will just accept an expression -# and let the ast.parse() step of the safe mode to reject invalid -# grammar. - -# The reason why it is more restricted is that, patterns are some -# sort of a DSL (more advanced than our LHS on assignments, but -# still in a very limited python subset). They are not really -# expressions, but who cares. If we can parse them, that is enough -# to reformat them. - -match_stmt: "match" subject_expr ':' NEWLINE INDENT case_block+ DEDENT - -# This is more permissive than the actual version. For example it -# accepts `match *something:`, even though single-item starred expressions -# are forbidden. -subject_expr: (namedexpr_test|star_expr) (',' (namedexpr_test|star_expr))* [','] - -# cases -case_block: "case" patterns [guard] ':' suite -guard: 'if' namedexpr_test -patterns: pattern (',' pattern)* [','] -pattern: (expr|star_expr) ['as' expr] - -fstring: FSTRING_START fstring_middle* FSTRING_END -fstring_middle: fstring_replacement_field | FSTRING_MIDDLE -fstring_replacement_field: '{' (yield_expr | testlist_star_expr) ['='] [ "!" NAME ] [ ':' fstring_format_spec* ] '}' -fstring_format_spec: FSTRING_MIDDLE | fstring_replacement_field - -tstring: TSTRING_START tstring_middle* TSTRING_END -tstring_middle: tstring_replacement_field | TSTRING_MIDDLE -tstring_replacement_field: '{' (yield_expr | testlist_star_expr) ['='] [ "!" NAME ] [ ':' tstring_format_spec* ] '}' -tstring_format_spec: TSTRING_MIDDLE | tstring_replacement_field diff --git a/venv/lib/python3.12/site-packages/blib2to3/LICENSE b/venv/lib/python3.12/site-packages/blib2to3/LICENSE deleted file mode 100644 index ef8df06..0000000 --- a/venv/lib/python3.12/site-packages/blib2to3/LICENSE +++ /dev/null @@ -1,254 +0,0 @@ -A. HISTORY OF THE SOFTWARE -========================== - -Python was created in the early 1990s by Guido van Rossum at Stichting -Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands -as a successor of a language called ABC. Guido remains Python's -principal author, although it includes many contributions from others. - -In 1995, Guido continued his work on Python at the Corporation for -National Research Initiatives (CNRI, see https://www.cnri.reston.va.us) -in Reston, Virginia where he released several versions of the -software. - -In May 2000, Guido and the Python core development team moved to -BeOpen.com to form the BeOpen PythonLabs team. In October of the same -year, the PythonLabs team moved to Digital Creations, which became -Zope Corporation. In 2001, the Python Software Foundation (PSF, see -https://www.python.org/psf/) was formed, a non-profit organization -created specifically to own Python-related Intellectual Property. -Zope Corporation was a sponsoring member of the PSF. - -All Python releases are Open Source (see https://opensource.org for -the Open Source Definition). Historically, most, but not all, Python -releases have also been GPL-compatible; the table below summarizes -the various releases. - - Release Derived Year Owner GPL- - from compatible? (1) - - 0.9.0 thru 1.2 1991-1995 CWI yes - 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes - 1.6 1.5.2 2000 CNRI no - 2.0 1.6 2000 BeOpen.com no - 1.6.1 1.6 2001 CNRI yes (2) - 2.1 2.0+1.6.1 2001 PSF no - 2.0.1 2.0+1.6.1 2001 PSF yes - 2.1.1 2.1+2.0.1 2001 PSF yes - 2.1.2 2.1.1 2002 PSF yes - 2.1.3 2.1.2 2002 PSF yes - 2.2 and above 2.1.1 2001-now PSF yes - -Footnotes: - -(1) GPL-compatible doesn't mean that we're distributing Python under - the GPL. All Python licenses, unlike the GPL, let you distribute - a modified version without making your changes open source. The - GPL-compatible licenses make it possible to combine Python with - other software that is released under the GPL; the others don't. - -(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, - because its license has a choice of law clause. According to - CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 - is "not incompatible" with the GPL. - -Thanks to the many outside volunteers who have worked under Guido's -direction to make these releases possible. - - -B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON -=============================================================== - -PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 --------------------------------------------- - -1. This LICENSE AGREEMENT is between the Python Software Foundation -("PSF"), and the Individual or Organization ("Licensee") accessing and -otherwise using this software ("Python") in source or binary form and -its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, PSF hereby -grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, -analyze, test, perform and/or display publicly, prepare derivative works, -distribute, and otherwise use Python alone or in any derivative version, -provided, however, that PSF's License Agreement and PSF's notice of copyright, -i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 Python Software Foundation; All -Rights Reserved" are retained in Python alone or in any derivative version -prepared by Licensee. - -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python. - -4. PSF is making Python available to Licensee on an "AS IS" -basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. Nothing in this License Agreement shall be deemed to create any -relationship of agency, partnership, or joint venture between PSF and -Licensee. This License Agreement does not grant permission to use PSF -trademarks or trade name in a trademark sense to endorse or promote -products or services of Licensee, or any third party. - -8. By copying, installing or otherwise using Python, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. - - -BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 -------------------------------------------- - -BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 - -1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an -office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the -Individual or Organization ("Licensee") accessing and otherwise using -this software in source or binary form and its associated -documentation ("the Software"). - -2. Subject to the terms and conditions of this BeOpen Python License -Agreement, BeOpen hereby grants Licensee a non-exclusive, -royalty-free, world-wide license to reproduce, analyze, test, perform -and/or display publicly, prepare derivative works, distribute, and -otherwise use the Software alone or in any derivative version, -provided, however, that the BeOpen Python License is retained in the -Software, alone or in any derivative version prepared by Licensee. - -3. BeOpen is making the Software available to Licensee on an "AS IS" -basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE -SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS -AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY -DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -5. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -6. This License Agreement shall be governed by and interpreted in all -respects by the law of the State of California, excluding conflict of -law provisions. Nothing in this License Agreement shall be deemed to -create any relationship of agency, partnership, or joint venture -between BeOpen and Licensee. This License Agreement does not grant -permission to use BeOpen trademarks or trade names in a trademark -sense to endorse or promote products or services of Licensee, or any -third party. As an exception, the "BeOpen Python" logos available at -http://www.pythonlabs.com/logos.html may be used according to the -permissions granted on that web page. - -7. By copying, installing or otherwise using the software, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. - - -CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 ---------------------------------------- - -1. This LICENSE AGREEMENT is between the Corporation for National -Research Initiatives, having an office at 1895 Preston White Drive, -Reston, VA 20191 ("CNRI"), and the Individual or Organization -("Licensee") accessing and otherwise using Python 1.6.1 software in -source or binary form and its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, CNRI -hereby grants Licensee a nonexclusive, royalty-free, world-wide -license to reproduce, analyze, test, perform and/or display publicly, -prepare derivative works, distribute, and otherwise use Python 1.6.1 -alone or in any derivative version, provided, however, that CNRI's -License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) -1995-2001 Corporation for National Research Initiatives; All Rights -Reserved" are retained in Python 1.6.1 alone or in any derivative -version prepared by Licensee. Alternately, in lieu of CNRI's License -Agreement, Licensee may substitute the following text (omitting the -quotes): "Python 1.6.1 is made available subject to the terms and -conditions in CNRI's License Agreement. This Agreement together with -Python 1.6.1 may be located on the Internet using the following -unique, persistent identifier (known as a handle): 1895.22/1013. This -Agreement may also be obtained from a proxy server on the Internet -using the following URL: http://hdl.handle.net/1895.22/1013". - -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python 1.6.1 or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python 1.6.1. - -4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" -basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. This License Agreement shall be governed by the federal -intellectual property law of the United States, including without -limitation the federal copyright law, and, to the extent such -U.S. federal law does not apply, by the law of the Commonwealth of -Virginia, excluding Virginia's conflict of law provisions. -Notwithstanding the foregoing, with regard to derivative works based -on Python 1.6.1 that incorporate non-separable material that was -previously distributed under the GNU General Public License (GPL), the -law of the Commonwealth of Virginia shall govern this License -Agreement only as to issues arising under or with respect to -Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this -License Agreement shall be deemed to create any relationship of -agency, partnership, or joint venture between CNRI and Licensee. This -License Agreement does not grant permission to use CNRI trademarks or -trade name in a trademark sense to endorse or promote products or -services of Licensee, or any third party. - -8. By clicking on the "ACCEPT" button where indicated, or by copying, -installing or otherwise using Python 1.6.1, Licensee agrees to be -bound by the terms and conditions of this License Agreement. - - ACCEPT - - -CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 --------------------------------------------------- - -Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, -The Netherlands. All rights reserved. - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of Stichting Mathematisch -Centrum or CWI not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO -THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE -FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/venv/lib/python3.12/site-packages/blib2to3/PatternGrammar.txt b/venv/lib/python3.12/site-packages/blib2to3/PatternGrammar.txt deleted file mode 100644 index e4b7981..0000000 --- a/venv/lib/python3.12/site-packages/blib2to3/PatternGrammar.txt +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright 2006 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -# A grammar to describe tree matching patterns. -# Not shown here: -# - 'TOKEN' stands for any token (leaf node) -# - 'any' stands for any node (leaf or interior) -# With 'any' we can still specify the sub-structure. - -# The start symbol is 'Matcher'. - -Matcher: Alternatives ENDMARKER - -Alternatives: Alternative ('|' Alternative)* - -Alternative: (Unit | NegatedUnit)+ - -Unit: [NAME '='] ( STRING [Repeater] - | NAME [Details] [Repeater] - | '(' Alternatives ')' [Repeater] - | '[' Alternatives ']' - ) - -NegatedUnit: 'not' (STRING | NAME [Details] | '(' Alternatives ')') - -Repeater: '*' | '+' | '{' NUMBER [',' NUMBER] '}' - -Details: '<' Alternatives '>' diff --git a/venv/lib/python3.12/site-packages/blib2to3/README b/venv/lib/python3.12/site-packages/blib2to3/README deleted file mode 100644 index 38b0415..0000000 --- a/venv/lib/python3.12/site-packages/blib2to3/README +++ /dev/null @@ -1,24 +0,0 @@ -A subset of lib2to3 taken from Python 3.7.0b2. Commit hash: -9c17e3a1987004b8bcfbe423953aad84493a7984 - -Reasons for forking: - -- consistent handling of f-strings for users of Python < 3.6.2 -- backport of BPO-33064 that fixes parsing files with trailing commas after \*args and - \*\*kwargs -- backport of GH-6143 that restores the ability to reformat legacy usage of `async` -- support all types of string literals -- better ability to debug (better reprs) -- INDENT and DEDENT don't hold whitespace and comment prefixes -- ability to Cythonize - -Change Log: - -- Changes default logger used by Driver -- Backported the following upstream parser changes: - - "bpo-42381: Allow walrus in set literals and set comprehensions (GH-23332)" - https://github.com/python/cpython/commit/cae60187cf7a7b26281d012e1952fafe4e2e97e9 - - "bpo-42316: Allow unparenthesized walrus operator in indexes (GH-23317)" - https://github.com/python/cpython/commit/b0aba1fcdc3da952698d99aec2334faa79a8b68c -- Tweaks to help mypyc compile faster code (including inlining type information, - "Final-ing", etc.) diff --git a/venv/lib/python3.12/site-packages/blib2to3/__init__.py b/venv/lib/python3.12/site-packages/blib2to3/__init__.py deleted file mode 100644 index 1bb8bf6..0000000 --- a/venv/lib/python3.12/site-packages/blib2to3/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# empty diff --git a/venv/lib/python3.12/site-packages/blib2to3/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/blib2to3/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 2bc3f3b..0000000 Binary files a/venv/lib/python3.12/site-packages/blib2to3/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blib2to3/__pycache__/pygram.cpython-312.pyc b/venv/lib/python3.12/site-packages/blib2to3/__pycache__/pygram.cpython-312.pyc deleted file mode 100644 index 45938db..0000000 Binary files a/venv/lib/python3.12/site-packages/blib2to3/__pycache__/pygram.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blib2to3/__pycache__/pytree.cpython-312.pyc b/venv/lib/python3.12/site-packages/blib2to3/__pycache__/pytree.cpython-312.pyc deleted file mode 100644 index 118e7b8..0000000 Binary files a/venv/lib/python3.12/site-packages/blib2to3/__pycache__/pytree.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/__init__.py b/venv/lib/python3.12/site-packages/blib2to3/pgen2/__init__.py deleted file mode 100644 index af39048..0000000 --- a/venv/lib/python3.12/site-packages/blib2to3/pgen2/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""The pgen2 package.""" diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 631f979..0000000 Binary files a/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/conv.cpython-312.pyc b/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/conv.cpython-312.pyc deleted file mode 100644 index 50572db..0000000 Binary files a/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/conv.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/driver.cpython-312.pyc b/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/driver.cpython-312.pyc deleted file mode 100644 index 2a8575f..0000000 Binary files a/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/driver.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/grammar.cpython-312.pyc b/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/grammar.cpython-312.pyc deleted file mode 100644 index fad0d68..0000000 Binary files a/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/grammar.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/literals.cpython-312.pyc b/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/literals.cpython-312.pyc deleted file mode 100644 index fa6f37b..0000000 Binary files a/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/literals.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/parse.cpython-312.pyc b/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/parse.cpython-312.pyc deleted file mode 100644 index 3976262..0000000 Binary files a/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/parse.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/pgen.cpython-312.pyc b/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/pgen.cpython-312.pyc deleted file mode 100644 index f28b0c9..0000000 Binary files a/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/pgen.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/token.cpython-312.pyc b/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/token.cpython-312.pyc deleted file mode 100644 index 7bfc7d9..0000000 Binary files a/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/token.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/tokenize.cpython-312.pyc b/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/tokenize.cpython-312.pyc deleted file mode 100644 index 81074c6..0000000 Binary files a/venv/lib/python3.12/site-packages/blib2to3/pgen2/__pycache__/tokenize.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/conv.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/blib2to3/pgen2/conv.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 6f38e01..0000000 Binary files a/venv/lib/python3.12/site-packages/blib2to3/pgen2/conv.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/conv.py b/venv/lib/python3.12/site-packages/blib2to3/pgen2/conv.py deleted file mode 100644 index b936465..0000000 --- a/venv/lib/python3.12/site-packages/blib2to3/pgen2/conv.py +++ /dev/null @@ -1,256 +0,0 @@ -# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -# mypy: ignore-errors - -"""Convert graminit.[ch] spit out by pgen to Python code. - -Pgen is the Python parser generator. It is useful to quickly create a -parser from a grammar file in Python's grammar notation. But I don't -want my parsers to be written in C (yet), so I'm translating the -parsing tables to Python data structures and writing a Python parse -engine. - -Note that the token numbers are constants determined by the standard -Python tokenizer. The standard token module defines these numbers and -their names (the names are not used much). The token numbers are -hardcoded into the Python tokenizer and into pgen. A Python -implementation of the Python tokenizer is also available, in the -standard tokenize module. - -On the other hand, symbol numbers (representing the grammar's -non-terminals) are assigned by pgen based on the actual grammar -input. - -Note: this module is pretty much obsolete; the pgen module generates -equivalent grammar tables directly from the Grammar.txt input file -without having to invoke the Python pgen C program. - -""" - -# Python imports -import re - -# Local imports -from blib2to3.pgen2 import grammar, token - - -class Converter(grammar.Grammar): - """Grammar subclass that reads classic pgen output files. - - The run() method reads the tables as produced by the pgen parser - generator, typically contained in two C files, graminit.h and - graminit.c. The other methods are for internal use only. - - See the base class for more documentation. - - """ - - def run(self, graminit_h, graminit_c): - """Load the grammar tables from the text files written by pgen.""" - self.parse_graminit_h(graminit_h) - self.parse_graminit_c(graminit_c) - self.finish_off() - - def parse_graminit_h(self, filename): - """Parse the .h file written by pgen. (Internal) - - This file is a sequence of #define statements defining the - nonterminals of the grammar as numbers. We build two tables - mapping the numbers to names and back. - - """ - try: - f = open(filename) - except OSError as err: - print(f"Can't open {filename}: {err}") - return False - self.symbol2number = {} - self.number2symbol = {} - lineno = 0 - for line in f: - lineno += 1 - mo = re.match(r"^#define\s+(\w+)\s+(\d+)$", line) - if not mo and line.strip(): - print(f"{filename}({lineno}): can't parse {line.strip()}") - else: - symbol, number = mo.groups() - number = int(number) - assert symbol not in self.symbol2number - assert number not in self.number2symbol - self.symbol2number[symbol] = number - self.number2symbol[number] = symbol - return True - - def parse_graminit_c(self, filename): - """Parse the .c file written by pgen. (Internal) - - The file looks as follows. The first two lines are always this: - - #include "pgenheaders.h" - #include "grammar.h" - - After that come four blocks: - - 1) one or more state definitions - 2) a table defining dfas - 3) a table defining labels - 4) a struct defining the grammar - - A state definition has the following form: - - one or more arc arrays, each of the form: - static arc arcs__[] = { - {, }, - ... - }; - - followed by a state array, of the form: - static state states_[] = { - {, arcs__}, - ... - }; - - """ - try: - f = open(filename) - except OSError as err: - print(f"Can't open {filename}: {err}") - return False - # The code below essentially uses f's iterator-ness! - lineno = 0 - - # Expect the two #include lines - lineno, line = lineno + 1, next(f) - assert line == '#include "pgenheaders.h"\n', (lineno, line) - lineno, line = lineno + 1, next(f) - assert line == '#include "grammar.h"\n', (lineno, line) - - # Parse the state definitions - lineno, line = lineno + 1, next(f) - allarcs = {} - states = [] - while line.startswith("static arc "): - while line.startswith("static arc "): - mo = re.match(r"static arc arcs_(\d+)_(\d+)\[(\d+)\] = {$", line) - assert mo, (lineno, line) - n, m, k = list(map(int, mo.groups())) - arcs = [] - for _ in range(k): - lineno, line = lineno + 1, next(f) - mo = re.match(r"\s+{(\d+), (\d+)},$", line) - assert mo, (lineno, line) - i, j = list(map(int, mo.groups())) - arcs.append((i, j)) - lineno, line = lineno + 1, next(f) - assert line == "};\n", (lineno, line) - allarcs[(n, m)] = arcs - lineno, line = lineno + 1, next(f) - mo = re.match(r"static state states_(\d+)\[(\d+)\] = {$", line) - assert mo, (lineno, line) - s, t = list(map(int, mo.groups())) - assert s == len(states), (lineno, line) - state = [] - for _ in range(t): - lineno, line = lineno + 1, next(f) - mo = re.match(r"\s+{(\d+), arcs_(\d+)_(\d+)},$", line) - assert mo, (lineno, line) - k, n, m = list(map(int, mo.groups())) - arcs = allarcs[n, m] - assert k == len(arcs), (lineno, line) - state.append(arcs) - states.append(state) - lineno, line = lineno + 1, next(f) - assert line == "};\n", (lineno, line) - lineno, line = lineno + 1, next(f) - self.states = states - - # Parse the dfas - dfas = {} - mo = re.match(r"static dfa dfas\[(\d+)\] = {$", line) - assert mo, (lineno, line) - ndfas = int(mo.group(1)) - for i in range(ndfas): - lineno, line = lineno + 1, next(f) - mo = re.match(r'\s+{(\d+), "(\w+)", (\d+), (\d+), states_(\d+),$', line) - assert mo, (lineno, line) - symbol = mo.group(2) - number, x, y, z = list(map(int, mo.group(1, 3, 4, 5))) - assert self.symbol2number[symbol] == number, (lineno, line) - assert self.number2symbol[number] == symbol, (lineno, line) - assert x == 0, (lineno, line) - state = states[z] - assert y == len(state), (lineno, line) - lineno, line = lineno + 1, next(f) - mo = re.match(r'\s+("(?:\\\d\d\d)*")},$', line) - assert mo, (lineno, line) - first = {} - rawbitset = eval(mo.group(1)) - for i, c in enumerate(rawbitset): - byte = ord(c) - for j in range(8): - if byte & (1 << j): - first[i * 8 + j] = 1 - dfas[number] = (state, first) - lineno, line = lineno + 1, next(f) - assert line == "};\n", (lineno, line) - self.dfas = dfas - - # Parse the labels - labels = [] - lineno, line = lineno + 1, next(f) - mo = re.match(r"static label labels\[(\d+)\] = {$", line) - assert mo, (lineno, line) - nlabels = int(mo.group(1)) - for i in range(nlabels): - lineno, line = lineno + 1, next(f) - mo = re.match(r'\s+{(\d+), (0|"\w+")},$', line) - assert mo, (lineno, line) - x, y = mo.groups() - x = int(x) - if y == "0": - y = None - else: - y = eval(y) - labels.append((x, y)) - lineno, line = lineno + 1, next(f) - assert line == "};\n", (lineno, line) - self.labels = labels - - # Parse the grammar struct - lineno, line = lineno + 1, next(f) - assert line == "grammar _PyParser_Grammar = {\n", (lineno, line) - lineno, line = lineno + 1, next(f) - mo = re.match(r"\s+(\d+),$", line) - assert mo, (lineno, line) - ndfas = int(mo.group(1)) - assert ndfas == len(self.dfas) - lineno, line = lineno + 1, next(f) - assert line == "\tdfas,\n", (lineno, line) - lineno, line = lineno + 1, next(f) - mo = re.match(r"\s+{(\d+), labels},$", line) - assert mo, (lineno, line) - nlabels = int(mo.group(1)) - assert nlabels == len(self.labels), (lineno, line) - lineno, line = lineno + 1, next(f) - mo = re.match(r"\s+(\d+)$", line) - assert mo, (lineno, line) - start = int(mo.group(1)) - assert start in self.number2symbol, (lineno, line) - self.start = start - lineno, line = lineno + 1, next(f) - assert line == "};\n", (lineno, line) - try: - lineno, line = lineno + 1, next(f) - except StopIteration: - pass - else: - assert 0, (lineno, line) - - def finish_off(self): - """Create additional useful structures. (Internal).""" - self.keywords = {} # map from keyword strings to arc labels - self.tokens = {} # map from numeric token values to arc labels - for ilabel, (type, value) in enumerate(self.labels): - if type == token.NAME and value is not None: - self.keywords[value] = ilabel - elif value is None: - self.tokens[type] = ilabel diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/driver.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/blib2to3/pgen2/driver.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 1b84e70..0000000 Binary files a/venv/lib/python3.12/site-packages/blib2to3/pgen2/driver.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/driver.py b/venv/lib/python3.12/site-packages/blib2to3/pgen2/driver.py deleted file mode 100644 index 924c4bd..0000000 --- a/venv/lib/python3.12/site-packages/blib2to3/pgen2/driver.py +++ /dev/null @@ -1,313 +0,0 @@ -# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -# Modifications: -# Copyright 2006 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Parser driver. - -This provides a high-level interface to parse a file into a syntax tree. - -""" - -__author__ = "Guido van Rossum " - -__all__ = ["Driver", "load_grammar"] - -# Python imports -import io -import logging -import os -import pkgutil -import sys -from collections.abc import Iterable, Iterator -from contextlib import contextmanager -from dataclasses import dataclass, field -from logging import Logger -from typing import Any, Union, cast - -from blib2to3.pgen2.grammar import Grammar -from blib2to3.pgen2.tokenize import TokenInfo -from blib2to3.pytree import NL - -# Pgen imports -from . import grammar, parse, pgen, token, tokenize - -Path = Union[str, "os.PathLike[str]"] - - -@dataclass -class ReleaseRange: - start: int - end: int | None = None - tokens: list[Any] = field(default_factory=list) - - def lock(self) -> None: - total_eaten = len(self.tokens) - self.end = self.start + total_eaten - - -class TokenProxy: - def __init__(self, generator: Any) -> None: - self._tokens = generator - self._counter = 0 - self._release_ranges: list[ReleaseRange] = [] - - @contextmanager - def release(self) -> Iterator["TokenProxy"]: - release_range = ReleaseRange(self._counter) - self._release_ranges.append(release_range) - try: - yield self - finally: - # Lock the last release range to the final position that - # has been eaten. - release_range.lock() - - def eat(self, point: int) -> Any: - eaten_tokens = self._release_ranges[-1].tokens - if point < len(eaten_tokens): - return eaten_tokens[point] - else: - while point >= len(eaten_tokens): - token = next(self._tokens) - eaten_tokens.append(token) - return token - - def __iter__(self) -> "TokenProxy": - return self - - def __next__(self) -> Any: - # If the current position is already compromised (looked up) - # return the eaten token, if not just go further on the given - # token producer. - for release_range in self._release_ranges: - assert release_range.end is not None - - start, end = release_range.start, release_range.end - if start <= self._counter < end: - token = release_range.tokens[self._counter - start] - break - else: - token = next(self._tokens) - self._counter += 1 - return token - - def can_advance(self, to: int) -> bool: - # Try to eat, fail if it can't. The eat operation is cached - # so there won't be any additional cost of eating here - try: - self.eat(to) - except StopIteration: - return False - else: - return True - - -class Driver: - def __init__(self, grammar: Grammar, logger: Logger | None = None) -> None: - self.grammar = grammar - if logger is None: - logger = logging.getLogger(__name__) - self.logger = logger - - def parse_tokens(self, tokens: Iterable[TokenInfo], debug: bool = False) -> NL: - """Parse a series of tokens and return the syntax tree.""" - # XXX Move the prefix computation into a wrapper around tokenize. - proxy = TokenProxy(tokens) - - p = parse.Parser(self.grammar) - p.setup(proxy=proxy) - - lineno = 1 - column = 0 - indent_columns: list[int] = [] - type = value = start = end = line_text = None - prefix = "" - - for quintuple in proxy: - type, value, start, end, line_text = quintuple - if start != (lineno, column): - assert (lineno, column) <= start, ((lineno, column), start) - s_lineno, s_column = start - if lineno < s_lineno: - prefix += "\n" * (s_lineno - lineno) - lineno = s_lineno - column = 0 - if column < s_column: - prefix += line_text[column:s_column] - column = s_column - if type in (tokenize.COMMENT, tokenize.NL): - prefix += value - lineno, column = end - if value.endswith("\n"): - lineno += 1 - column = 0 - continue - if type == token.OP: - type = grammar.opmap[value] - if debug: - assert type is not None - self.logger.debug( - "%s %r (prefix=%r)", token.tok_name[type], value, prefix - ) - if type == token.INDENT: - indent_columns.append(len(value)) - _prefix = prefix + value - prefix = "" - value = "" - elif type == token.DEDENT: - _indent_col = indent_columns.pop() - prefix, _prefix = self._partially_consume_prefix(prefix, _indent_col) - if p.addtoken(cast(int, type), value, (prefix, start)): - if debug: - self.logger.debug("Stop.") - break - prefix = "" - if type in {token.INDENT, token.DEDENT}: - prefix = _prefix - lineno, column = end - # FSTRING_MIDDLE and TSTRING_MIDDLE are the only token that can end with a - # newline, and `end` will point to the next line. For that case, don't - # increment lineno. - if value.endswith("\n") and type not in ( - token.FSTRING_MIDDLE, - token.TSTRING_MIDDLE, - ): - lineno += 1 - column = 0 - else: - # We never broke out -- EOF is too soon (how can this happen???) - assert start is not None - raise parse.ParseError("incomplete input", type, value, (prefix, start)) - assert p.rootnode is not None - return p.rootnode - - def parse_file( - self, filename: Path, encoding: str | None = None, debug: bool = False - ) -> NL: - """Parse a file and return the syntax tree.""" - with open(filename, encoding=encoding) as stream: - text = stream.read() - return self.parse_string(text, debug) - - def parse_string(self, text: str, debug: bool = False) -> NL: - """Parse a string and return the syntax tree.""" - tokens = tokenize.tokenize(text, grammar=self.grammar) - return self.parse_tokens(tokens, debug) - - def _partially_consume_prefix(self, prefix: str, column: int) -> tuple[str, str]: - lines: list[str] = [] - current_line = "" - current_column = 0 - wait_for_nl = False - for char in prefix: - current_line += char - if wait_for_nl: - if char == "\n": - if current_line.strip() and current_column < column: - res = "".join(lines) - return res, prefix[len(res) :] - - lines.append(current_line) - current_line = "" - current_column = 0 - wait_for_nl = False - elif char in " \t": - current_column += 1 - elif char == "\n": - # unexpected empty line - current_column = 0 - elif char == "\f": - current_column = 0 - else: - # indent is finished - wait_for_nl = True - return "".join(lines), current_line - - -def _generate_pickle_name(gt: Path, cache_dir: Path | None = None) -> str: - head, tail = os.path.splitext(gt) - if tail == ".txt": - tail = "" - name = head + tail + ".".join(map(str, sys.version_info)) + ".pickle" - if cache_dir: - return os.path.join(cache_dir, os.path.basename(name)) - else: - return name - - -def load_grammar( - gt: str = "Grammar.txt", - gp: str | None = None, - save: bool = True, - force: bool = False, - logger: Logger | None = None, -) -> Grammar: - """Load the grammar (maybe from a pickle).""" - if logger is None: - logger = logging.getLogger(__name__) - gp = _generate_pickle_name(gt) if gp is None else gp - if force or not _newer(gp, gt): - g: grammar.Grammar = pgen.generate_grammar(gt) - if save: - try: - g.dump(gp) - except OSError: - # Ignore error, caching is not vital. - pass - else: - g = grammar.Grammar() - g.load(gp) - return g - - -def _newer(a: str, b: str) -> bool: - """Inquire whether file a was written since file b.""" - if not os.path.exists(a): - return False - if not os.path.exists(b): - return True - return os.path.getmtime(a) >= os.path.getmtime(b) - - -def load_packaged_grammar( - package: str, grammar_source: str, cache_dir: Path | None = None -) -> grammar.Grammar: - """Normally, loads a pickled grammar by doing - pkgutil.get_data(package, pickled_grammar) - where *pickled_grammar* is computed from *grammar_source* by adding the - Python version and using a ``.pickle`` extension. - - However, if *grammar_source* is an extant file, load_grammar(grammar_source) - is called instead. This facilitates using a packaged grammar file when needed - but preserves load_grammar's automatic regeneration behavior when possible. - - """ - if os.path.isfile(grammar_source): - gp = _generate_pickle_name(grammar_source, cache_dir) if cache_dir else None - return load_grammar(grammar_source, gp=gp) - pickled_name = _generate_pickle_name(os.path.basename(grammar_source), cache_dir) - data = pkgutil.get_data(package, pickled_name) - assert data is not None - g = grammar.Grammar() - g.loads(data) - return g - - -def main(*args: str) -> bool: - """Main program, when run as a script: produce grammar pickle files. - - Calls load_grammar for each argument, a path to a grammar text file. - """ - if not args: - args = tuple(sys.argv[1:]) - logging.basicConfig(level=logging.INFO, stream=sys.stdout, format="%(message)s") - for gt in args: - load_grammar(gt, save=True, force=True) - return True - - -if __name__ == "__main__": - sys.exit(int(not main())) diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/grammar.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/blib2to3/pgen2/grammar.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index c693add..0000000 Binary files a/venv/lib/python3.12/site-packages/blib2to3/pgen2/grammar.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/grammar.py b/venv/lib/python3.12/site-packages/blib2to3/pgen2/grammar.py deleted file mode 100644 index 9cf2403..0000000 --- a/venv/lib/python3.12/site-packages/blib2to3/pgen2/grammar.py +++ /dev/null @@ -1,228 +0,0 @@ -# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""This module defines the data structures used to represent a grammar. - -These are a bit arcane because they are derived from the data -structures used by Python's 'pgen' parser generator. - -There's also a table here mapping operators to their names in the -token module; the Python tokenize module reports all operators as the -fallback token code OP, but the parser needs the actual token code. - -""" - -# Python imports -import os -import pickle -import tempfile -from typing import Any, Optional, TypeVar, Union - -# Local imports -from . import token - -_P = TypeVar("_P", bound="Grammar") -Label = tuple[int, Optional[str]] -DFA = list[list[tuple[int, int]]] -DFAS = tuple[DFA, dict[int, int]] -Path = Union[str, "os.PathLike[str]"] - - -class Grammar: - """Pgen parsing tables conversion class. - - Once initialized, this class supplies the grammar tables for the - parsing engine implemented by parse.py. The parsing engine - accesses the instance variables directly. The class here does not - provide initialization of the tables; several subclasses exist to - do this (see the conv and pgen modules). - - The load() method reads the tables from a pickle file, which is - much faster than the other ways offered by subclasses. The pickle - file is written by calling dump() (after loading the grammar - tables using a subclass). The report() method prints a readable - representation of the tables to stdout, for debugging. - - The instance variables are as follows: - - symbol2number -- a dict mapping symbol names to numbers. Symbol - numbers are always 256 or higher, to distinguish - them from token numbers, which are between 0 and - 255 (inclusive). - - number2symbol -- a dict mapping numbers to symbol names; - these two are each other's inverse. - - states -- a list of DFAs, where each DFA is a list of - states, each state is a list of arcs, and each - arc is a (i, j) pair where i is a label and j is - a state number. The DFA number is the index into - this list. (This name is slightly confusing.) - Final states are represented by a special arc of - the form (0, j) where j is its own state number. - - dfas -- a dict mapping symbol numbers to (DFA, first) - pairs, where DFA is an item from the states list - above, and first is a set of tokens that can - begin this grammar rule (represented by a dict - whose values are always 1). - - labels -- a list of (x, y) pairs where x is either a token - number or a symbol number, and y is either None - or a string; the strings are keywords. The label - number is the index in this list; label numbers - are used to mark state transitions (arcs) in the - DFAs. - - start -- the number of the grammar's start symbol. - - keywords -- a dict mapping keyword strings to arc labels. - - tokens -- a dict mapping token numbers to arc labels. - - """ - - def __init__(self) -> None: - self.symbol2number: dict[str, int] = {} - self.number2symbol: dict[int, str] = {} - self.states: list[DFA] = [] - self.dfas: dict[int, DFAS] = {} - self.labels: list[Label] = [(0, "EMPTY")] - self.keywords: dict[str, int] = {} - self.soft_keywords: dict[str, int] = {} - self.tokens: dict[int, int] = {} - self.symbol2label: dict[str, int] = {} - self.version: tuple[int, int] = (0, 0) - self.start = 256 - # Python 3.7+ parses async as a keyword, not an identifier - self.async_keywords = False - - def dump(self, filename: Path) -> None: - """Dump the grammar tables to a pickle file.""" - - # mypyc generates objects that don't have a __dict__, but they - # do have __getstate__ methods that will return an equivalent - # dictionary - if hasattr(self, "__dict__"): - d = self.__dict__ - else: - d = self.__getstate__() # type: ignore - - with tempfile.NamedTemporaryFile( - dir=os.path.dirname(filename), delete=False - ) as f: - pickle.dump(d, f, pickle.HIGHEST_PROTOCOL) - os.replace(f.name, filename) - - def _update(self, attrs: dict[str, Any]) -> None: - for k, v in attrs.items(): - setattr(self, k, v) - - def load(self, filename: Path) -> None: - """Load the grammar tables from a pickle file.""" - with open(filename, "rb") as f: - d = pickle.load(f) - self._update(d) - - def loads(self, pkl: bytes) -> None: - """Load the grammar tables from a pickle bytes object.""" - self._update(pickle.loads(pkl)) - - def copy(self: _P) -> _P: - """ - Copy the grammar. - """ - new = self.__class__() - for dict_attr in ( - "symbol2number", - "number2symbol", - "dfas", - "keywords", - "soft_keywords", - "tokens", - "symbol2label", - ): - setattr(new, dict_attr, getattr(self, dict_attr).copy()) - new.labels = self.labels[:] - new.states = self.states[:] - new.start = self.start - new.version = self.version - new.async_keywords = self.async_keywords - return new - - def report(self) -> None: - """Dump the grammar tables to standard output, for debugging.""" - from pprint import pprint - - print("s2n") - pprint(self.symbol2number) - print("n2s") - pprint(self.number2symbol) - print("states") - pprint(self.states) - print("dfas") - pprint(self.dfas) - print("labels") - pprint(self.labels) - print("start", self.start) - - -# Map from operator to number (since tokenize doesn't do this) - -opmap_raw = """ -( LPAR -) RPAR -[ LSQB -] RSQB -: COLON -, COMMA -; SEMI -+ PLUS -- MINUS -* STAR -/ SLASH -| VBAR -& AMPER -< LESS -> GREATER -= EQUAL -. DOT -% PERCENT -` BACKQUOTE -{ LBRACE -} RBRACE -@ AT -@= ATEQUAL -== EQEQUAL -!= NOTEQUAL -<> NOTEQUAL -<= LESSEQUAL ->= GREATEREQUAL -~ TILDE -^ CIRCUMFLEX -<< LEFTSHIFT ->> RIGHTSHIFT -** DOUBLESTAR -+= PLUSEQUAL --= MINEQUAL -*= STAREQUAL -/= SLASHEQUAL -%= PERCENTEQUAL -&= AMPEREQUAL -|= VBAREQUAL -^= CIRCUMFLEXEQUAL -<<= LEFTSHIFTEQUAL ->>= RIGHTSHIFTEQUAL -**= DOUBLESTAREQUAL -// DOUBLESLASH -//= DOUBLESLASHEQUAL --> RARROW -:= COLONEQUAL -! BANG -""" - -opmap = {} -for line in opmap_raw.splitlines(): - if line: - op, name = line.split() - opmap[op] = getattr(token, name) diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/literals.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/blib2to3/pgen2/literals.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index c43927a..0000000 Binary files a/venv/lib/python3.12/site-packages/blib2to3/pgen2/literals.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/literals.py b/venv/lib/python3.12/site-packages/blib2to3/pgen2/literals.py deleted file mode 100644 index a384c08..0000000 --- a/venv/lib/python3.12/site-packages/blib2to3/pgen2/literals.py +++ /dev/null @@ -1,65 +0,0 @@ -# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Safely evaluate Python string literals without using eval().""" - -import re - -simple_escapes: dict[str, str] = { - "a": "\a", - "b": "\b", - "f": "\f", - "n": "\n", - "r": "\r", - "t": "\t", - "v": "\v", - "'": "'", - '"': '"', - "\\": "\\", -} - - -def escape(m: re.Match[str]) -> str: - all, tail = m.group(0, 1) - assert all.startswith("\\") - esc = simple_escapes.get(tail) - if esc is not None: - return esc - if tail.startswith("x"): - hexes = tail[1:] - if len(hexes) < 2: - raise ValueError(f"invalid hex string escape ('\\{tail}')") - try: - i = int(hexes, 16) - except ValueError: - raise ValueError(f"invalid hex string escape ('\\{tail}')") from None - else: - try: - i = int(tail, 8) - except ValueError: - raise ValueError(f"invalid octal string escape ('\\{tail}')") from None - return chr(i) - - -def evalString(s: str) -> str: - assert s.startswith("'") or s.startswith('"'), repr(s[:1]) - q = s[0] - if s[:3] == q * 3: - q = q * 3 - assert s.endswith(q), repr(s[-len(q) :]) - assert len(s) >= 2 * len(q) - s = s[len(q) : -len(q)] - return re.sub(r"\\(\'|\"|\\|[abfnrtv]|x.{0,2}|[0-7]{1,3})", escape, s) - - -def test() -> None: - for i in range(256): - c = chr(i) - s = repr(c) - e = evalString(s) - if e != c: - print(i, c, s, e) - - -if __name__ == "__main__": - test() diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/parse.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/blib2to3/pgen2/parse.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 18cbb7b..0000000 Binary files a/venv/lib/python3.12/site-packages/blib2to3/pgen2/parse.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/parse.py b/venv/lib/python3.12/site-packages/blib2to3/pgen2/parse.py deleted file mode 100644 index 4efce75..0000000 --- a/venv/lib/python3.12/site-packages/blib2to3/pgen2/parse.py +++ /dev/null @@ -1,395 +0,0 @@ -# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Parser engine for the grammar tables generated by pgen. - -The grammar table must be loaded first. - -See Parser/parser.c in the Python distribution for additional info on -how this parsing engine works. - -""" - -from collections.abc import Callable, Iterator -from contextlib import contextmanager -from typing import TYPE_CHECKING, Union, cast - -from blib2to3.pgen2.grammar import Grammar -from blib2to3.pytree import NL, Context, Leaf, Node, RawNode, convert - -# Local imports -from . import grammar, token, tokenize - -if TYPE_CHECKING: - from blib2to3.pgen2.driver import TokenProxy - - -Results = dict[str, NL] -Convert = Callable[[Grammar, RawNode], Union[Node, Leaf]] -DFA = list[list[tuple[int, int]]] -DFAS = tuple[DFA, dict[int, int]] - - -def lam_sub(grammar: Grammar, node: RawNode) -> NL: - assert node[3] is not None - return Node(type=node[0], children=node[3], context=node[2]) - - -# A placeholder node, used when parser is backtracking. -DUMMY_NODE = (-1, None, None, None) - - -def stack_copy( - stack: list[tuple[DFAS, int, RawNode]], -) -> list[tuple[DFAS, int, RawNode]]: - """Nodeless stack copy.""" - return [(dfa, label, DUMMY_NODE) for dfa, label, _ in stack] - - -class Recorder: - def __init__(self, parser: "Parser", ilabels: list[int], context: Context) -> None: - self.parser = parser - self._ilabels = ilabels - self.context = context # not really matter - - self._dead_ilabels: set[int] = set() - self._start_point = self.parser.stack - self._points = {ilabel: stack_copy(self._start_point) for ilabel in ilabels} - - @property - def ilabels(self) -> set[int]: - return self._dead_ilabels.symmetric_difference(self._ilabels) - - @contextmanager - def switch_to(self, ilabel: int) -> Iterator[None]: - with self.backtrack(): - self.parser.stack = self._points[ilabel] - try: - yield - except ParseError: - self._dead_ilabels.add(ilabel) - finally: - self.parser.stack = self._start_point - - @contextmanager - def backtrack(self) -> Iterator[None]: - """ - Use the node-level invariant ones for basic parsing operations (push/pop/shift). - These still will operate on the stack; but they won't create any new nodes, or - modify the contents of any other existing nodes. - - This saves us a ton of time when we are backtracking, since we - want to restore to the initial state as quick as possible, which - can only be done by having as little mutatations as possible. - """ - is_backtracking = self.parser.is_backtracking - try: - self.parser.is_backtracking = True - yield - finally: - self.parser.is_backtracking = is_backtracking - - def add_token(self, tok_type: int, tok_val: str, raw: bool = False) -> None: - for ilabel in self.ilabels: - with self.switch_to(ilabel): - if raw: - self.parser._addtoken(ilabel, tok_type, tok_val, self.context) - else: - self.parser.addtoken(tok_type, tok_val, self.context) - - def determine_route( - self, value: str | None = None, force: bool = False - ) -> int | None: - alive_ilabels = self.ilabels - if len(alive_ilabels) == 0: - *_, most_successful_ilabel = self._dead_ilabels - raise ParseError("bad input", most_successful_ilabel, value, self.context) - - ilabel, *rest = alive_ilabels - if force or not rest: - return ilabel - else: - return None - - -class ParseError(Exception): - """Exception to signal the parser is stuck.""" - - def __init__( - self, msg: str, type: int | None, value: str | None, context: Context - ) -> None: - Exception.__init__( - self, f"{msg}: type={type!r}, value={value!r}, context={context!r}" - ) - self.msg = msg - self.type = type - self.value = value - self.context = context - - -class Parser: - """Parser engine. - - The proper usage sequence is: - - p = Parser(grammar, [converter]) # create instance - p.setup([start]) # prepare for parsing - : - if p.addtoken(...): # parse a token; may raise ParseError - break - root = p.rootnode # root of abstract syntax tree - - A Parser instance may be reused by calling setup() repeatedly. - - A Parser instance contains state pertaining to the current token - sequence, and should not be used concurrently by different threads - to parse separate token sequences. - - See driver.py for how to get input tokens by tokenizing a file or - string. - - Parsing is complete when addtoken() returns True; the root of the - abstract syntax tree can then be retrieved from the rootnode - instance variable. When a syntax error occurs, addtoken() raises - the ParseError exception. There is no error recovery; the parser - cannot be used after a syntax error was reported (but it can be - reinitialized by calling setup()). - - """ - - def __init__(self, grammar: Grammar, convert: Convert | None = None) -> None: - """Constructor. - - The grammar argument is a grammar.Grammar instance; see the - grammar module for more information. - - The parser is not ready yet for parsing; you must call the - setup() method to get it started. - - The optional convert argument is a function mapping concrete - syntax tree nodes to abstract syntax tree nodes. If not - given, no conversion is done and the syntax tree produced is - the concrete syntax tree. If given, it must be a function of - two arguments, the first being the grammar (a grammar.Grammar - instance), and the second being the concrete syntax tree node - to be converted. The syntax tree is converted from the bottom - up. - - **post-note: the convert argument is ignored since for Black's - usage, convert will always be blib2to3.pytree.convert. Allowing - this to be dynamic hurts mypyc's ability to use early binding. - These docs are left for historical and informational value. - - A concrete syntax tree node is a (type, value, context, nodes) - tuple, where type is the node type (a token or symbol number), - value is None for symbols and a string for tokens, context is - None or an opaque value used for error reporting (typically a - (lineno, offset) pair), and nodes is a list of children for - symbols, and None for tokens. - - An abstract syntax tree node may be anything; this is entirely - up to the converter function. - - """ - self.grammar = grammar - # See note in docstring above. TL;DR this is ignored. - self.convert = convert or lam_sub - self.is_backtracking = False - self.last_token: int | None = None - - def setup(self, proxy: "TokenProxy", start: int | None = None) -> None: - """Prepare for parsing. - - This *must* be called before starting to parse. - - The optional argument is an alternative start symbol; it - defaults to the grammar's start symbol. - - You can use a Parser instance to parse any number of programs; - each time you call setup() the parser is reset to an initial - state determined by the (implicit or explicit) start symbol. - - """ - if start is None: - start = self.grammar.start - # Each stack entry is a tuple: (dfa, state, node). - # A node is a tuple: (type, value, context, children), - # where children is a list of nodes or None, and context may be None. - newnode: RawNode = (start, None, None, []) - stackentry = (self.grammar.dfas[start], 0, newnode) - self.stack: list[tuple[DFAS, int, RawNode]] = [stackentry] - self.rootnode: NL | None = None - self.used_names: set[str] = set() - self.proxy = proxy - self.last_token = None - - def addtoken(self, type: int, value: str, context: Context) -> bool: - """Add a token; return True iff this is the end of the program.""" - # Map from token to label - ilabels = self.classify(type, value, context) - assert len(ilabels) >= 1 - - # If we have only one state to advance, we'll directly - # take it as is. - if len(ilabels) == 1: - [ilabel] = ilabels - return self._addtoken(ilabel, type, value, context) - - # If there are multiple states which we can advance (only - # happen under soft-keywords), then we will try all of them - # in parallel and as soon as one state can reach further than - # the rest, we'll choose that one. This is a pretty hacky - # and hopefully temporary algorithm. - # - # For a more detailed explanation, check out this post: - # https://tree.science/what-the-backtracking.html - - with self.proxy.release() as proxy: - counter, force = 0, False - recorder = Recorder(self, ilabels, context) - recorder.add_token(type, value, raw=True) - - next_token_value = value - while recorder.determine_route(next_token_value) is None: - if not proxy.can_advance(counter): - force = True - break - - next_token_type, next_token_value, *_ = proxy.eat(counter) - if next_token_type in (tokenize.COMMENT, tokenize.NL): - counter += 1 - continue - - if next_token_type == tokenize.OP: - next_token_type = grammar.opmap[next_token_value] - - recorder.add_token(next_token_type, next_token_value) - counter += 1 - - ilabel = cast(int, recorder.determine_route(next_token_value, force=force)) - assert ilabel is not None - - return self._addtoken(ilabel, type, value, context) - - def _addtoken(self, ilabel: int, type: int, value: str, context: Context) -> bool: - # Loop until the token is shifted; may raise exceptions - while True: - dfa, state, node = self.stack[-1] - states, first = dfa - arcs = states[state] - # Look for a state with this label - for i, newstate in arcs: - t = self.grammar.labels[i][0] - if t >= 256: - # See if it's a symbol and if we're in its first set - itsdfa = self.grammar.dfas[t] - itsstates, itsfirst = itsdfa - if ilabel in itsfirst: - # Push a symbol - self.push(t, itsdfa, newstate, context) - break # To continue the outer while loop - - elif ilabel == i: - # Look it up in the list of labels - # Shift a token; we're done with it - self.shift(type, value, newstate, context) - # Pop while we are in an accept-only state - state = newstate - while states[state] == [(0, state)]: - self.pop() - if not self.stack: - # Done parsing! - return True - dfa, state, node = self.stack[-1] - states, first = dfa - # Done with this token - self.last_token = type - return False - - else: - if (0, state) in arcs: - # An accepting state, pop it and try something else - self.pop() - if not self.stack: - # Done parsing, but another token is input - raise ParseError("too much input", type, value, context) - else: - # No success finding a transition - raise ParseError("bad input", type, value, context) - - def classify(self, type: int, value: str, context: Context) -> list[int]: - """Turn a token into a label. (Internal) - - Depending on whether the value is a soft-keyword or not, - this function may return multiple labels to choose from.""" - if type == token.NAME: - # Keep a listing of all used names - self.used_names.add(value) - # Check for reserved words - if value in self.grammar.keywords: - return [self.grammar.keywords[value]] - elif value in self.grammar.soft_keywords: - assert type in self.grammar.tokens - # Current soft keywords (match, case, type) can only appear at the - # beginning of a statement. So as a shortcut, don't try to treat them - # like keywords in any other context. - # ('_' is also a soft keyword in the real grammar, but for our grammar - # it's just an expression, so we don't need to treat it specially.) - if self.last_token not in ( - None, - token.INDENT, - token.DEDENT, - token.NEWLINE, - token.SEMI, - token.COLON, - ): - return [self.grammar.tokens[type]] - return [ - self.grammar.tokens[type], - self.grammar.soft_keywords[value], - ] - - ilabel = self.grammar.tokens.get(type) - if ilabel is None: - raise ParseError("bad token", type, value, context) - return [ilabel] - - def shift(self, type: int, value: str, newstate: int, context: Context) -> None: - """Shift a token. (Internal)""" - if self.is_backtracking: - dfa, state, _ = self.stack[-1] - self.stack[-1] = (dfa, newstate, DUMMY_NODE) - else: - dfa, state, node = self.stack[-1] - rawnode: RawNode = (type, value, context, None) - newnode = convert(self.grammar, rawnode) - assert node[-1] is not None - node[-1].append(newnode) - self.stack[-1] = (dfa, newstate, node) - - def push(self, type: int, newdfa: DFAS, newstate: int, context: Context) -> None: - """Push a nonterminal. (Internal)""" - if self.is_backtracking: - dfa, state, _ = self.stack[-1] - self.stack[-1] = (dfa, newstate, DUMMY_NODE) - self.stack.append((newdfa, 0, DUMMY_NODE)) - else: - dfa, state, node = self.stack[-1] - newnode: RawNode = (type, None, context, []) - self.stack[-1] = (dfa, newstate, node) - self.stack.append((newdfa, 0, newnode)) - - def pop(self) -> None: - """Pop a nonterminal. (Internal)""" - if self.is_backtracking: - self.stack.pop() - else: - popdfa, popstate, popnode = self.stack.pop() - newnode = convert(self.grammar, popnode) - if self.stack: - dfa, state, node = self.stack[-1] - assert node[-1] is not None - node[-1].append(newnode) - else: - self.rootnode = newnode - self.rootnode.used_names = self.used_names diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/pgen.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/blib2to3/pgen2/pgen.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index e68b692..0000000 Binary files a/venv/lib/python3.12/site-packages/blib2to3/pgen2/pgen.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/pgen.py b/venv/lib/python3.12/site-packages/blib2to3/pgen2/pgen.py deleted file mode 100644 index 7e6cdb4..0000000 --- a/venv/lib/python3.12/site-packages/blib2to3/pgen2/pgen.py +++ /dev/null @@ -1,411 +0,0 @@ -# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -import os -from collections.abc import Iterator, Sequence -from typing import IO, Any, NoReturn, Union - -from blib2to3.pgen2 import grammar, token, tokenize -from blib2to3.pgen2.tokenize import TokenInfo - -Path = Union[str, "os.PathLike[str]"] - - -class PgenGrammar(grammar.Grammar): - pass - - -class ParserGenerator: - filename: Path - stream: IO[str] - generator: Iterator[TokenInfo] - first: dict[str, dict[str, int] | None] - - def __init__(self, filename: Path, stream: IO[str] | None = None) -> None: - close_stream = None - if stream is None: - stream = open(filename, encoding="utf-8") - close_stream = stream.close - self.filename = filename - self.generator = tokenize.tokenize(stream.read()) - self.gettoken() # Initialize lookahead - self.dfas, self.startsymbol = self.parse() - if close_stream is not None: - close_stream() - self.first = {} # map from symbol name to set of tokens - self.addfirstsets() - - def make_grammar(self) -> PgenGrammar: - c = PgenGrammar() - names = list(self.dfas.keys()) - names.sort() - names.remove(self.startsymbol) - names.insert(0, self.startsymbol) - for name in names: - i = 256 + len(c.symbol2number) - c.symbol2number[name] = i - c.number2symbol[i] = name - for name in names: - dfa = self.dfas[name] - states = [] - for state in dfa: - arcs = [] - for label, next in sorted(state.arcs.items()): - arcs.append((self.make_label(c, label), dfa.index(next))) - if state.isfinal: - arcs.append((0, dfa.index(state))) - states.append(arcs) - c.states.append(states) - c.dfas[c.symbol2number[name]] = (states, self.make_first(c, name)) - c.start = c.symbol2number[self.startsymbol] - return c - - def make_first(self, c: PgenGrammar, name: str) -> dict[int, int]: - rawfirst = self.first[name] - assert rawfirst is not None - first = {} - for label in sorted(rawfirst): - ilabel = self.make_label(c, label) - ##assert ilabel not in first # XXX failed on <> ... != - first[ilabel] = 1 - return first - - def make_label(self, c: PgenGrammar, label: str) -> int: - # XXX Maybe this should be a method on a subclass of converter? - ilabel = len(c.labels) - if label[0].isalpha(): - # Either a symbol name or a named token - if label in c.symbol2number: - # A symbol name (a non-terminal) - if label in c.symbol2label: - return c.symbol2label[label] - else: - c.labels.append((c.symbol2number[label], None)) - c.symbol2label[label] = ilabel - return ilabel - else: - # A named token (NAME, NUMBER, STRING) - itoken = getattr(token, label, None) - assert isinstance(itoken, int), label - assert itoken in token.tok_name, label - if itoken in c.tokens: - return c.tokens[itoken] - else: - c.labels.append((itoken, None)) - c.tokens[itoken] = ilabel - return ilabel - else: - # Either a keyword or an operator - assert label[0] in ('"', "'"), label - value = eval(label) - if value[0].isalpha(): - if label[0] == '"': - keywords = c.soft_keywords - else: - keywords = c.keywords - - # A keyword - if value in keywords: - return keywords[value] - else: - c.labels.append((token.NAME, value)) - keywords[value] = ilabel - return ilabel - else: - # An operator (any non-numeric token) - itoken = grammar.opmap[value] # Fails if unknown token - if itoken in c.tokens: - return c.tokens[itoken] - else: - c.labels.append((itoken, None)) - c.tokens[itoken] = ilabel - return ilabel - - def addfirstsets(self) -> None: - names = list(self.dfas.keys()) - names.sort() - for name in names: - if name not in self.first: - self.calcfirst(name) - # print name, self.first[name].keys() - - def calcfirst(self, name: str) -> None: - dfa = self.dfas[name] - self.first[name] = None # dummy to detect left recursion - state = dfa[0] - totalset: dict[str, int] = {} - overlapcheck = {} - for label in state.arcs: - if label in self.dfas: - if label in self.first: - fset = self.first[label] - if fset is None: - raise ValueError(f"recursion for rule {name!r}") - else: - self.calcfirst(label) - fset = self.first[label] - assert fset is not None - totalset.update(fset) - overlapcheck[label] = fset - else: - totalset[label] = 1 - overlapcheck[label] = {label: 1} - inverse: dict[str, str] = {} - for label, itsfirst in overlapcheck.items(): - for symbol in itsfirst: - if symbol in inverse: - raise ValueError( - f"rule {name} is ambiguous; {symbol} is in the first sets of" - f" {label} as well as {inverse[symbol]}" - ) - inverse[symbol] = label - self.first[name] = totalset - - def parse(self) -> tuple[dict[str, list["DFAState"]], str]: - dfas = {} - startsymbol: str | None = None - # MSTART: (NEWLINE | RULE)* ENDMARKER - while self.type != token.ENDMARKER: - while self.type == token.NEWLINE: - self.gettoken() - # RULE: NAME ':' RHS NEWLINE - name = self.expect(token.NAME) - self.expect(token.OP, ":") - a, z = self.parse_rhs() - self.expect(token.NEWLINE) - # self.dump_nfa(name, a, z) - dfa = self.make_dfa(a, z) - # self.dump_dfa(name, dfa) - # oldlen = len(dfa) - self.simplify_dfa(dfa) - # newlen = len(dfa) - dfas[name] = dfa - # print name, oldlen, newlen - if startsymbol is None: - startsymbol = name - assert startsymbol is not None - return dfas, startsymbol - - def make_dfa(self, start: "NFAState", finish: "NFAState") -> list["DFAState"]: - # To turn an NFA into a DFA, we define the states of the DFA - # to correspond to *sets* of states of the NFA. Then do some - # state reduction. Let's represent sets as dicts with 1 for - # values. - assert isinstance(start, NFAState) - assert isinstance(finish, NFAState) - - def closure(state: NFAState) -> dict[NFAState, int]: - base: dict[NFAState, int] = {} - addclosure(state, base) - return base - - def addclosure(state: NFAState, base: dict[NFAState, int]) -> None: - assert isinstance(state, NFAState) - if state in base: - return - base[state] = 1 - for label, next in state.arcs: - if label is None: - addclosure(next, base) - - states = [DFAState(closure(start), finish)] - for state in states: # NB states grows while we're iterating - arcs: dict[str, dict[NFAState, int]] = {} - for nfastate in state.nfaset: - for label, next in nfastate.arcs: - if label is not None: - addclosure(next, arcs.setdefault(label, {})) - for label, nfaset in sorted(arcs.items()): - for st in states: - if st.nfaset == nfaset: - break - else: - st = DFAState(nfaset, finish) - states.append(st) - state.addarc(st, label) - return states # List of DFAState instances; first one is start - - def dump_nfa(self, name: str, start: "NFAState", finish: "NFAState") -> None: - print("Dump of NFA for", name) - todo = [start] - for i, state in enumerate(todo): - print(" State", i, state is finish and "(final)" or "") - for label, next in state.arcs: - if next in todo: - j = todo.index(next) - else: - j = len(todo) - todo.append(next) - if label is None: - print(f" -> {j}") - else: - print(f" {label} -> {j}") - - def dump_dfa(self, name: str, dfa: Sequence["DFAState"]) -> None: - print("Dump of DFA for", name) - for i, state in enumerate(dfa): - print(" State", i, state.isfinal and "(final)" or "") - for label, next in sorted(state.arcs.items()): - print(f" {label} -> {dfa.index(next)}") - - def simplify_dfa(self, dfa: list["DFAState"]) -> None: - # This is not theoretically optimal, but works well enough. - # Algorithm: repeatedly look for two states that have the same - # set of arcs (same labels pointing to the same nodes) and - # unify them, until things stop changing. - - # dfa is a list of DFAState instances - changes = True - while changes: - changes = False - for i, state_i in enumerate(dfa): - for j in range(i + 1, len(dfa)): - state_j = dfa[j] - if state_i == state_j: - # print " unify", i, j - del dfa[j] - for state in dfa: - state.unifystate(state_j, state_i) - changes = True - break - - def parse_rhs(self) -> tuple["NFAState", "NFAState"]: - # RHS: ALT ('|' ALT)* - a, z = self.parse_alt() - if self.value != "|": - return a, z - else: - aa = NFAState() - zz = NFAState() - aa.addarc(a) - z.addarc(zz) - while self.value == "|": - self.gettoken() - a, z = self.parse_alt() - aa.addarc(a) - z.addarc(zz) - return aa, zz - - def parse_alt(self) -> tuple["NFAState", "NFAState"]: - # ALT: ITEM+ - a, b = self.parse_item() - while self.value in ("(", "[") or self.type in (token.NAME, token.STRING): - c, d = self.parse_item() - b.addarc(c) - b = d - return a, b - - def parse_item(self) -> tuple["NFAState", "NFAState"]: - # ITEM: '[' RHS ']' | ATOM ['+' | '*'] - if self.value == "[": - self.gettoken() - a, z = self.parse_rhs() - self.expect(token.OP, "]") - a.addarc(z) - return a, z - else: - a, z = self.parse_atom() - value = self.value - if value not in ("+", "*"): - return a, z - self.gettoken() - z.addarc(a) - if value == "+": - return a, z - else: - return a, a - - def parse_atom(self) -> tuple["NFAState", "NFAState"]: - # ATOM: '(' RHS ')' | NAME | STRING - if self.value == "(": - self.gettoken() - a, z = self.parse_rhs() - self.expect(token.OP, ")") - return a, z - elif self.type in (token.NAME, token.STRING): - a = NFAState() - z = NFAState() - a.addarc(z, self.value) - self.gettoken() - return a, z - else: - self.raise_error( - f"expected (...) or NAME or STRING, got {self.type}/{self.value}" - ) - - def expect(self, type: int, value: Any | None = None) -> str: - if self.type != type or (value is not None and self.value != value): - self.raise_error(f"expected {type}/{value}, got {self.type}/{self.value}") - value = self.value - self.gettoken() - return value - - def gettoken(self) -> None: - tup = next(self.generator) - while tup[0] in (tokenize.COMMENT, tokenize.NL): - tup = next(self.generator) - self.type, self.value, self.begin, self.end, self.line = tup - # print token.tok_name[self.type], repr(self.value) - - def raise_error(self, msg: str) -> NoReturn: - raise SyntaxError( - msg, (str(self.filename), self.end[0], self.end[1], self.line) - ) - - -class NFAState: - arcs: list[tuple[str | None, "NFAState"]] - - def __init__(self) -> None: - self.arcs = [] # list of (label, NFAState) pairs - - def addarc(self, next: "NFAState", label: str | None = None) -> None: - assert label is None or isinstance(label, str) - assert isinstance(next, NFAState) - self.arcs.append((label, next)) - - -class DFAState: - nfaset: dict[NFAState, Any] - isfinal: bool - arcs: dict[str, "DFAState"] - - def __init__(self, nfaset: dict[NFAState, Any], final: NFAState) -> None: - assert isinstance(nfaset, dict) - assert isinstance(next(iter(nfaset)), NFAState) - assert isinstance(final, NFAState) - self.nfaset = nfaset - self.isfinal = final in nfaset - self.arcs = {} # map from label to DFAState - - def addarc(self, next: "DFAState", label: str) -> None: - assert isinstance(label, str) - assert label not in self.arcs - assert isinstance(next, DFAState) - self.arcs[label] = next - - def unifystate(self, old: "DFAState", new: "DFAState") -> None: - for label, next in self.arcs.items(): - if next is old: - self.arcs[label] = new - - def __eq__(self, other: Any) -> bool: - # Equality test -- ignore the nfaset instance variable - assert isinstance(other, DFAState) - if self.isfinal != other.isfinal: - return False - # Can't just return self.arcs == other.arcs, because that - # would invoke this method recursively, with cycles... - if len(self.arcs) != len(other.arcs): - return False - for label, next in self.arcs.items(): - if next is not other.arcs.get(label): - return False - return True - - __hash__: Any = None # For Py3 compatibility. - - -def generate_grammar(filename: Path = "Grammar.txt") -> PgenGrammar: - p = ParserGenerator(filename) - return p.make_grammar() diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/token.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/blib2to3/pgen2/token.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 5a47838..0000000 Binary files a/venv/lib/python3.12/site-packages/blib2to3/pgen2/token.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/token.py b/venv/lib/python3.12/site-packages/blib2to3/pgen2/token.py deleted file mode 100644 index 8b531ee..0000000 --- a/venv/lib/python3.12/site-packages/blib2to3/pgen2/token.py +++ /dev/null @@ -1,95 +0,0 @@ -"""Token constants (from "token.h").""" - -from typing import Final - -# Taken from Python (r53757) and modified to include some tokens -# originally monkeypatched in by pgen2.tokenize - -# --start constants-- -ENDMARKER: Final = 0 -NAME: Final = 1 -NUMBER: Final = 2 -STRING: Final = 3 -NEWLINE: Final = 4 -INDENT: Final = 5 -DEDENT: Final = 6 -LPAR: Final = 7 -RPAR: Final = 8 -LSQB: Final = 9 -RSQB: Final = 10 -COLON: Final = 11 -COMMA: Final = 12 -SEMI: Final = 13 -PLUS: Final = 14 -MINUS: Final = 15 -STAR: Final = 16 -SLASH: Final = 17 -VBAR: Final = 18 -AMPER: Final = 19 -LESS: Final = 20 -GREATER: Final = 21 -EQUAL: Final = 22 -DOT: Final = 23 -PERCENT: Final = 24 -BACKQUOTE: Final = 25 -LBRACE: Final = 26 -RBRACE: Final = 27 -EQEQUAL: Final = 28 -NOTEQUAL: Final = 29 -LESSEQUAL: Final = 30 -GREATEREQUAL: Final = 31 -TILDE: Final = 32 -CIRCUMFLEX: Final = 33 -LEFTSHIFT: Final = 34 -RIGHTSHIFT: Final = 35 -DOUBLESTAR: Final = 36 -PLUSEQUAL: Final = 37 -MINEQUAL: Final = 38 -STAREQUAL: Final = 39 -SLASHEQUAL: Final = 40 -PERCENTEQUAL: Final = 41 -AMPEREQUAL: Final = 42 -VBAREQUAL: Final = 43 -CIRCUMFLEXEQUAL: Final = 44 -LEFTSHIFTEQUAL: Final = 45 -RIGHTSHIFTEQUAL: Final = 46 -DOUBLESTAREQUAL: Final = 47 -DOUBLESLASH: Final = 48 -DOUBLESLASHEQUAL: Final = 49 -AT: Final = 50 -ATEQUAL: Final = 51 -OP: Final = 52 -COMMENT: Final = 53 -NL: Final = 54 -RARROW: Final = 55 -AWAIT: Final = 56 -ASYNC: Final = 57 -ERRORTOKEN: Final = 58 -COLONEQUAL: Final = 59 -FSTRING_START: Final = 60 -FSTRING_MIDDLE: Final = 61 -FSTRING_END: Final = 62 -BANG: Final = 63 -TSTRING_START: Final = 64 -TSTRING_MIDDLE: Final = 65 -TSTRING_END: Final = 66 -N_TOKENS: Final = 67 -NT_OFFSET: Final = 256 -# --end constants-- - -tok_name: Final[dict[int, str]] = {} -for _name, _value in list(globals().items()): - if type(_value) is int: - tok_name[_value] = _name - - -def ISTERMINAL(x: int) -> bool: - return x < NT_OFFSET - - -def ISNONTERMINAL(x: int) -> bool: - return x >= NT_OFFSET - - -def ISEOF(x: int) -> bool: - return x == ENDMARKER diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/tokenize.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/blib2to3/pgen2/tokenize.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index fcd64ba..0000000 Binary files a/venv/lib/python3.12/site-packages/blib2to3/pgen2/tokenize.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blib2to3/pgen2/tokenize.py b/venv/lib/python3.12/site-packages/blib2to3/pgen2/tokenize.py deleted file mode 100644 index 4e3761f..0000000 --- a/venv/lib/python3.12/site-packages/blib2to3/pgen2/tokenize.py +++ /dev/null @@ -1,226 +0,0 @@ -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Python Software Foundation. -# All rights reserved. - -# mypy: allow-untyped-defs, allow-untyped-calls - -"""Tokenization help for Python programs. - -generate_tokens(readline) is a generator that breaks a stream of -text into Python tokens. It accepts a readline-like method which is called -repeatedly to get the next line of input (or "" for EOF). It generates -5-tuples with these members: - - the token type (see token.py) - the token (a string) - the starting (row, column) indices of the token (a 2-tuple of ints) - the ending (row, column) indices of the token (a 2-tuple of ints) - the original line (string) - -It is designed to match the working of the Python tokenizer exactly, except -that it produces COMMENT tokens for comments and gives type OP for all -operators - -Older entry points - tokenize_loop(readline, tokeneater) - tokenize(readline, tokeneater=printtoken) -are the same, except instead of generating tokens, tokeneater is a callback -function to which the 5 fields described above are passed as 5 arguments, -each time a new token is found.""" - -import sys -from collections.abc import Iterator - -from blib2to3.pgen2.grammar import Grammar -from blib2to3.pgen2.token import ( - ASYNC, - AWAIT, - COMMENT, - DEDENT, - ENDMARKER, - FSTRING_END, - FSTRING_MIDDLE, - FSTRING_START, - INDENT, - NAME, - NEWLINE, - NL, - NUMBER, - OP, - STRING, - TSTRING_END, - TSTRING_MIDDLE, - TSTRING_START, - tok_name, -) - -__author__ = "Ka-Ping Yee " -__credits__ = "GvR, ESR, Tim Peters, Thomas Wouters, Fred Drake, Skip Montanaro" - -import pytokens -from pytokens import TokenType - -from . import token as _token - -__all__ = [x for x in dir(_token) if x[0] != "_"] + [ - "tokenize", - "generate_tokens", - "untokenize", -] -del _token - -Coord = tuple[int, int] -TokenInfo = tuple[int, str, Coord, Coord, str] - -TOKEN_TYPE_MAP = { - TokenType.indent: INDENT, - TokenType.dedent: DEDENT, - TokenType.newline: NEWLINE, - TokenType.nl: NL, - TokenType.comment: COMMENT, - TokenType.semicolon: OP, - TokenType.lparen: OP, - TokenType.rparen: OP, - TokenType.lbracket: OP, - TokenType.rbracket: OP, - TokenType.lbrace: OP, - TokenType.rbrace: OP, - TokenType.colon: OP, - TokenType.op: OP, - TokenType.identifier: NAME, - TokenType.number: NUMBER, - TokenType.string: STRING, - TokenType.fstring_start: FSTRING_START, - TokenType.fstring_middle: FSTRING_MIDDLE, - TokenType.fstring_end: FSTRING_END, - TokenType.tstring_start: TSTRING_START, - TokenType.tstring_middle: TSTRING_MIDDLE, - TokenType.tstring_end: TSTRING_END, - TokenType.endmarker: ENDMARKER, -} - - -class TokenError(Exception): ... - - -def transform_whitespace( - token: pytokens.Token, source: str, prev_token: pytokens.Token | None -) -> pytokens.Token: - r""" - Black treats `\\\n` at the end of a line as a 'NL' token, while it - is ignored as whitespace in the regular Python parser. - But, only the first one. If there's a `\\\n` following it - (as in, a \ just by itself on a line), that is not made into NL. - """ - if ( - token.type == TokenType.whitespace - and prev_token is not None - and prev_token.type not in (TokenType.nl, TokenType.newline) - ): - token_str = source[token.start_index : token.end_index] - if token_str.startswith("\\\r\n"): - return pytokens.Token( - TokenType.nl, - token.start_index, - token.start_index + 3, - token.start_line, - token.start_col, - token.start_line, - token.start_col + 3, - ) - elif token_str.startswith("\\\n") or token_str.startswith("\\\r"): - return pytokens.Token( - TokenType.nl, - token.start_index, - token.start_index + 2, - token.start_line, - token.start_col, - token.start_line, - token.start_col + 2, - ) - - return token - - -def tokenize(source: str, grammar: Grammar | None = None) -> Iterator[TokenInfo]: - lines = source.split("\n") - lines += [""] # For newline tokens in files that don't end in a newline - line, column = 1, 0 - - prev_token: pytokens.Token | None = None - try: - for token in pytokens.tokenize(source): - token = transform_whitespace(token, source, prev_token) - - line, column = token.start_line, token.start_col - if token.type == TokenType.whitespace: - continue - - token_str = source[token.start_index : token.end_index] - - if token.type == TokenType.newline and token_str == "": - # Black doesn't yield empty newline tokens at the end of a file - # if there's no newline at the end of a file. - prev_token = token - continue - - source_line = lines[token.start_line - 1] - - if token.type == TokenType.identifier and token_str in ("async", "await"): - # Black uses `async` and `await` token types just for those two keywords - yield ( - ASYNC if token_str == "async" else AWAIT, - token_str, - (token.start_line, token.start_col), - (token.end_line, token.end_col), - source_line, - ) - elif token.type == TokenType.op and token_str == "...": - # Black doesn't have an ellipsis token yet, yield 3 DOTs instead - assert token.start_line == token.end_line - assert token.end_col == token.start_col + 3 - - token_str = "." - for start_col in range(token.start_col, token.start_col + 3): - end_col = start_col + 1 - yield ( - TOKEN_TYPE_MAP[token.type], - token_str, - (token.start_line, start_col), - (token.end_line, end_col), - source_line, - ) - else: - token_type = TOKEN_TYPE_MAP.get(token.type) - if token_type is None: - raise ValueError(f"Unknown token type: {token.type!r}") - yield ( - TOKEN_TYPE_MAP[token.type], - token_str, - (token.start_line, token.start_col), - (token.end_line, token.end_col), - source_line, - ) - prev_token = token - - except pytokens.UnexpectedEOF: - raise TokenError("Unexpected EOF in multi-line statement", (line, column)) - except pytokens.TokenizeError as exc: - raise TokenError(f"Failed to parse: {type(exc).__name__}", (line, column)) - - -def printtoken( - type: int, token: str, srow_col: Coord, erow_col: Coord, line: str -) -> None: # for testing - srow, scol = srow_col - erow, ecol = erow_col - print(f"{srow},{scol}-{erow},{ecol}:\t{tok_name[type]}\t{token!r}") - - -if __name__ == "__main__": # testing - if len(sys.argv) > 1: - token_iterator = tokenize(open(sys.argv[1]).read()) - else: - token_iterator = tokenize(sys.stdin.read()) - - for tok in token_iterator: - printtoken(*tok) diff --git a/venv/lib/python3.12/site-packages/blib2to3/pygram.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/blib2to3/pygram.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 72c610c..0000000 Binary files a/venv/lib/python3.12/site-packages/blib2to3/pygram.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blib2to3/pygram.py b/venv/lib/python3.12/site-packages/blib2to3/pygram.py deleted file mode 100644 index 7fd701f..0000000 --- a/venv/lib/python3.12/site-packages/blib2to3/pygram.py +++ /dev/null @@ -1,208 +0,0 @@ -# Copyright 2006 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Export the Python grammar and symbols.""" - -# Python imports -import os -from typing import Union - -# Local imports -from .pgen2 import driver -from .pgen2.grammar import Grammar - -# Moved into initialize because mypyc can't handle __file__ (XXX bug) -# # The grammar file -# _GRAMMAR_FILE = os.path.join(os.path.dirname(__file__), "Grammar.txt") -# _PATTERN_GRAMMAR_FILE = os.path.join(os.path.dirname(__file__), -# "PatternGrammar.txt") - - -class Symbols: - def __init__(self, grammar: Grammar) -> None: - """Initializer. - - Creates an attribute for each grammar symbol (nonterminal), - whose value is the symbol's type (an int >= 256). - """ - for name, symbol in grammar.symbol2number.items(): - setattr(self, name, symbol) - - -class _python_symbols(Symbols): - and_expr: int - and_test: int - annassign: int - arglist: int - argument: int - arith_expr: int - asexpr_test: int - assert_stmt: int - async_funcdef: int - async_stmt: int - atom: int - augassign: int - break_stmt: int - case_block: int - classdef: int - comp_for: int - comp_if: int - comp_iter: int - comp_op: int - comparison: int - compound_stmt: int - continue_stmt: int - decorated: int - decorator: int - decorators: int - del_stmt: int - dictsetmaker: int - dotted_as_name: int - dotted_as_names: int - dotted_name: int - encoding_decl: int - eval_input: int - except_clause: int - expr: int - expr_stmt: int - exprlist: int - factor: int - file_input: int - flow_stmt: int - for_stmt: int - fstring: int - fstring_format_spec: int - fstring_middle: int - fstring_replacement_field: int - funcdef: int - global_stmt: int - guard: int - if_stmt: int - import_as_name: int - import_as_names: int - import_from: int - import_name: int - import_stmt: int - lambdef: int - listmaker: int - match_stmt: int - namedexpr_test: int - not_test: int - old_comp_for: int - old_comp_if: int - old_comp_iter: int - old_lambdef: int - old_test: int - or_test: int - parameters: int - paramspec: int - pass_stmt: int - pattern: int - patterns: int - power: int - raise_stmt: int - return_stmt: int - shift_expr: int - simple_stmt: int - single_input: int - sliceop: int - small_stmt: int - subject_expr: int - star_expr: int - stmt: int - subscript: int - subscriptlist: int - suite: int - term: int - test: int - testlist: int - testlist1: int - testlist_gexp: int - testlist_safe: int - testlist_star_expr: int - tfpdef: int - tfplist: int - tname: int - tname_star: int - trailer: int - try_stmt: int - tstring: int - tstring_format_spec: int - tstring_middle: int - tstring_replacement_field: int - type_stmt: int - typedargslist: int - typeparam: int - typeparams: int - typevar: int - typevartuple: int - varargslist: int - vfpdef: int - vfplist: int - vname: int - while_stmt: int - with_stmt: int - xor_expr: int - yield_arg: int - yield_expr: int - yield_stmt: int - - -class _pattern_symbols(Symbols): - Alternative: int - Alternatives: int - Details: int - Matcher: int - NegatedUnit: int - Repeater: int - Unit: int - - -python_grammar: Grammar -python_grammar_async_keywords: Grammar -python_grammar_soft_keywords: Grammar -pattern_grammar: Grammar -python_symbols: _python_symbols -pattern_symbols: _pattern_symbols - - -def initialize(cache_dir: Union[str, "os.PathLike[str]", None] = None) -> None: - global python_grammar - global python_grammar_async_keywords - global python_grammar_soft_keywords - global python_symbols - global pattern_grammar - global pattern_symbols - - # The grammar file - _GRAMMAR_FILE = os.path.join(os.path.dirname(__file__), "Grammar.txt") - _PATTERN_GRAMMAR_FILE = os.path.join( - os.path.dirname(__file__), "PatternGrammar.txt" - ) - - python_grammar = driver.load_packaged_grammar("blib2to3", _GRAMMAR_FILE, cache_dir) - assert "print" not in python_grammar.keywords - assert "exec" not in python_grammar.keywords - - soft_keywords = python_grammar.soft_keywords.copy() - python_grammar.soft_keywords.clear() - - python_symbols = _python_symbols(python_grammar) - - # Python 3.0-3.6 - python_grammar.version = (3, 0) - - # Python 3.7+ - python_grammar_async_keywords = python_grammar.copy() - python_grammar_async_keywords.async_keywords = True - python_grammar_async_keywords.version = (3, 7) - - # Python 3.10+ - python_grammar_soft_keywords = python_grammar_async_keywords.copy() - python_grammar_soft_keywords.soft_keywords = soft_keywords - python_grammar_soft_keywords.version = (3, 10) - - pattern_grammar = driver.load_packaged_grammar( - "blib2to3", _PATTERN_GRAMMAR_FILE, cache_dir - ) - pattern_symbols = _pattern_symbols(pattern_grammar) diff --git a/venv/lib/python3.12/site-packages/blib2to3/pytree.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/blib2to3/pytree.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index ac937a2..0000000 Binary files a/venv/lib/python3.12/site-packages/blib2to3/pytree.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/blib2to3/pytree.py b/venv/lib/python3.12/site-packages/blib2to3/pytree.py deleted file mode 100644 index cf44a43..0000000 --- a/venv/lib/python3.12/site-packages/blib2to3/pytree.py +++ /dev/null @@ -1,971 +0,0 @@ -# Copyright 2006 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -""" -Python parse tree definitions. - -This is a very concrete parse tree; we need to keep every token and -even the comments and whitespace between tokens. - -There's also a pattern matching implementation here. -""" - -# mypy: allow-untyped-defs, allow-incomplete-defs - -from collections.abc import Iterable, Iterator -from typing import Any, Optional, TypeVar, Union - -from blib2to3.pgen2.grammar import Grammar - -__author__ = "Guido van Rossum " - -import sys -from io import StringIO - -HUGE: int = 0x7FFFFFFF # maximum repeat count, default max - -_type_reprs: dict[int, str | int] = {} - - -def type_repr(type_num: int) -> str | int: - global _type_reprs - if not _type_reprs: - from . import pygram - - if not hasattr(pygram, "python_symbols"): - pygram.initialize(cache_dir=None) - - # printing tokens is possible but not as useful - # from .pgen2 import token // token.__dict__.items(): - for name in dir(pygram.python_symbols): - val = getattr(pygram.python_symbols, name) - if type(val) == int: - _type_reprs[val] = name - return _type_reprs.setdefault(type_num, type_num) - - -_P = TypeVar("_P", bound="Base") - -NL = Union["Node", "Leaf"] -Context = tuple[str, tuple[int, int]] -RawNode = tuple[int, Optional[str], Optional[Context], Optional[list[NL]]] - - -class Base: - """ - Abstract base class for Node and Leaf. - - This provides some default functionality and boilerplate using the - template pattern. - - A node may be a subnode of at most one parent. - """ - - # Default values for instance variables - type: int # int: token number (< 256) or symbol number (>= 256) - parent: Optional["Node"] = None # Parent node pointer, or None - children: list[NL] # List of subnodes - was_changed: bool = False - was_checked: bool = False - - def __new__(cls, *args, **kwds): - """Constructor that prevents Base from being instantiated.""" - assert cls is not Base, "Cannot instantiate Base" - return object.__new__(cls) - - def __eq__(self, other: Any) -> bool: - """ - Compare two nodes for equality. - - This calls the method _eq(). - """ - if self.__class__ is not other.__class__: - return NotImplemented - return self._eq(other) - - @property - def prefix(self) -> str: - raise NotImplementedError - - def _eq(self: _P, other: _P) -> bool: - """ - Compare two nodes for equality. - - This is called by __eq__ and __ne__. It is only called if the two nodes - have the same type. This must be implemented by the concrete subclass. - Nodes should be considered equal if they have the same structure, - ignoring the prefix string and other context information. - """ - raise NotImplementedError - - def __deepcopy__(self: _P, memo: Any) -> _P: - return self.clone() - - def clone(self: _P) -> _P: - """ - Return a cloned (deep) copy of self. - - This must be implemented by the concrete subclass. - """ - raise NotImplementedError - - def post_order(self) -> Iterator[NL]: - """ - Return a post-order iterator for the tree. - - This must be implemented by the concrete subclass. - """ - raise NotImplementedError - - def pre_order(self) -> Iterator[NL]: - """ - Return a pre-order iterator for the tree. - - This must be implemented by the concrete subclass. - """ - raise NotImplementedError - - def replace(self, new: NL | list[NL]) -> None: - """Replace this node with a new one in the parent.""" - assert self.parent is not None, str(self) - assert new is not None - if not isinstance(new, list): - new = [new] - l_children = [] - found = False - for ch in self.parent.children: - if ch is self: - assert not found, (self.parent.children, self, new) - if new is not None: - l_children.extend(new) - found = True - else: - l_children.append(ch) - assert found, (self.children, self, new) - self.parent.children = l_children - self.parent.changed() - self.parent.invalidate_sibling_maps() - for x in new: - x.parent = self.parent - self.parent = None - - def get_lineno(self) -> int | None: - """Return the line number which generated the invocant node.""" - node = self - while not isinstance(node, Leaf): - if not node.children: - return None - node = node.children[0] - return node.lineno - - def changed(self) -> None: - if self.was_changed: - return - if self.parent: - self.parent.changed() - self.was_changed = True - - def remove(self) -> int | None: - """ - Remove the node from the tree. Returns the position of the node in its - parent's children before it was removed. - """ - if self.parent: - for i, node in enumerate(self.parent.children): - if node is self: - del self.parent.children[i] - self.parent.changed() - self.parent.invalidate_sibling_maps() - self.parent = None - return i - return None - - @property - def next_sibling(self) -> NL | None: - """ - The node immediately following the invocant in their parent's children - list. If the invocant does not have a next sibling, it is None - """ - if self.parent is None: - return None - - if self.parent.next_sibling_map is None: - self.parent.update_sibling_maps() - assert self.parent.next_sibling_map is not None - return self.parent.next_sibling_map[id(self)] - - @property - def prev_sibling(self) -> NL | None: - """ - The node immediately preceding the invocant in their parent's children - list. If the invocant does not have a previous sibling, it is None. - """ - if self.parent is None: - return None - - if self.parent.prev_sibling_map is None: - self.parent.update_sibling_maps() - assert self.parent.prev_sibling_map is not None - return self.parent.prev_sibling_map[id(self)] - - def leaves(self) -> Iterator["Leaf"]: - for child in self.children: - yield from child.leaves() - - def depth(self) -> int: - if self.parent is None: - return 0 - return 1 + self.parent.depth() - - def get_suffix(self) -> str: - """ - Return the string immediately following the invocant node. This is - effectively equivalent to node.next_sibling.prefix - """ - next_sib = self.next_sibling - if next_sib is None: - return "" - prefix = next_sib.prefix - return prefix - - -class Node(Base): - """Concrete implementation for interior nodes.""" - - fixers_applied: list[Any] | None - used_names: set[str] | None - - def __init__( - self, - type: int, - children: list[NL], - context: Any | None = None, - prefix: str | None = None, - fixers_applied: list[Any] | None = None, - ) -> None: - """ - Initializer. - - Takes a type constant (a symbol number >= 256), a sequence of - child nodes, and an optional context keyword argument. - - As a side effect, the parent pointers of the children are updated. - """ - assert type >= 256, type - self.type = type - self.children = list(children) - for ch in self.children: - assert ch.parent is None, repr(ch) - ch.parent = self - self.invalidate_sibling_maps() - if prefix is not None: - self.prefix = prefix - if fixers_applied: - self.fixers_applied = fixers_applied[:] - else: - self.fixers_applied = None - - def __repr__(self) -> str: - """Return a canonical string representation.""" - assert self.type is not None - return f"{self.__class__.__name__}({type_repr(self.type)}, {self.children!r})" - - def __str__(self) -> str: - """ - Return a pretty string representation. - - This reproduces the input source exactly. - """ - return "".join(map(str, self.children)) - - def _eq(self, other: Base) -> bool: - """Compare two nodes for equality.""" - return (self.type, self.children) == (other.type, other.children) - - def clone(self) -> "Node": - assert self.type is not None - """Return a cloned (deep) copy of self.""" - return Node( - self.type, - [ch.clone() for ch in self.children], - fixers_applied=self.fixers_applied, - ) - - def post_order(self) -> Iterator[NL]: - """Return a post-order iterator for the tree.""" - for child in self.children: - yield from child.post_order() - yield self - - def pre_order(self) -> Iterator[NL]: - """Return a pre-order iterator for the tree.""" - yield self - for child in self.children: - yield from child.pre_order() - - @property - def prefix(self) -> str: - """ - The whitespace and comments preceding this node in the input. - """ - if not self.children: - return "" - return self.children[0].prefix - - @prefix.setter - def prefix(self, prefix: str) -> None: - if self.children: - self.children[0].prefix = prefix - - def set_child(self, i: int, child: NL) -> None: - """ - Equivalent to 'node.children[i] = child'. This method also sets the - child's parent attribute appropriately. - """ - child.parent = self - self.children[i].parent = None - self.children[i] = child - self.changed() - self.invalidate_sibling_maps() - - def insert_child(self, i: int, child: NL) -> None: - """ - Equivalent to 'node.children.insert(i, child)'. This method also sets - the child's parent attribute appropriately. - """ - child.parent = self - self.children.insert(i, child) - self.changed() - self.invalidate_sibling_maps() - - def append_child(self, child: NL) -> None: - """ - Equivalent to 'node.children.append(child)'. This method also sets the - child's parent attribute appropriately. - """ - child.parent = self - self.children.append(child) - self.changed() - self.invalidate_sibling_maps() - - def invalidate_sibling_maps(self) -> None: - self.prev_sibling_map: dict[int, NL | None] | None = None - self.next_sibling_map: dict[int, NL | None] | None = None - - def update_sibling_maps(self) -> None: - _prev: dict[int, NL | None] = {} - _next: dict[int, NL | None] = {} - self.prev_sibling_map = _prev - self.next_sibling_map = _next - previous: NL | None = None - for current in self.children: - _prev[id(current)] = previous - _next[id(previous)] = current - previous = current - _next[id(current)] = None - - -class Leaf(Base): - """Concrete implementation for leaf nodes.""" - - # Default values for instance variables - value: str - fixers_applied: list[Any] - bracket_depth: int - # Changed later in brackets.py - opening_bracket: Optional["Leaf"] = None - used_names: set[str] | None - _prefix = "" # Whitespace and comments preceding this token in the input - lineno: int = 0 # Line where this token starts in the input - column: int = 0 # Column where this token starts in the input - # If not None, this Leaf is created by converting a block of fmt off/skip - # code, and `fmt_pass_converted_first_leaf` points to the first Leaf in the - # converted code. - fmt_pass_converted_first_leaf: Optional["Leaf"] = None - - def __init__( - self, - type: int, - value: str, - context: Context | None = None, - prefix: str | None = None, - fixers_applied: list[Any] = [], - opening_bracket: Optional["Leaf"] = None, - fmt_pass_converted_first_leaf: Optional["Leaf"] = None, - ) -> None: - """ - Initializer. - - Takes a type constant (a token number < 256), a string value, and an - optional context keyword argument. - """ - - assert 0 <= type < 256, type - if context is not None: - self._prefix, (self.lineno, self.column) = context - self.type = type - self.value = value - if prefix is not None: - self._prefix = prefix - self.fixers_applied: list[Any] | None = fixers_applied[:] - self.children = [] - self.opening_bracket = opening_bracket - self.fmt_pass_converted_first_leaf = fmt_pass_converted_first_leaf - - def __repr__(self) -> str: - """Return a canonical string representation.""" - from .pgen2.token import tok_name - - assert self.type is not None - return ( - f"{self.__class__.__name__}({tok_name.get(self.type, self.type)}," - f" {self.value!r})" - ) - - def __str__(self) -> str: - """ - Return a pretty string representation. - - This reproduces the input source exactly. - """ - return self._prefix + str(self.value) - - def _eq(self, other: "Leaf") -> bool: - """Compare two nodes for equality.""" - return (self.type, self.value) == (other.type, other.value) - - def clone(self) -> "Leaf": - assert self.type is not None - """Return a cloned (deep) copy of self.""" - return Leaf( - self.type, - self.value, - (self.prefix, (self.lineno, self.column)), - fixers_applied=self.fixers_applied, - ) - - def leaves(self) -> Iterator["Leaf"]: - yield self - - def post_order(self) -> Iterator["Leaf"]: - """Return a post-order iterator for the tree.""" - yield self - - def pre_order(self) -> Iterator["Leaf"]: - """Return a pre-order iterator for the tree.""" - yield self - - @property - def prefix(self) -> str: - """ - The whitespace and comments preceding this token in the input. - """ - return self._prefix - - @prefix.setter - def prefix(self, prefix: str) -> None: - self.changed() - self._prefix = prefix - - -def convert(gr: Grammar, raw_node: RawNode) -> NL: - """ - Convert raw node information to a Node or Leaf instance. - - This is passed to the parser driver which calls it whenever a reduction of a - grammar rule produces a new complete node, so that the tree is build - strictly bottom-up. - """ - type, value, context, children = raw_node - if children or type in gr.number2symbol: - # If there's exactly one child, return that child instead of - # creating a new node. - assert children is not None - if len(children) == 1: - return children[0] - return Node(type, children, context=context) - else: - return Leaf(type, value or "", context=context) - - -_Results = dict[str, NL] - - -class BasePattern: - """ - A pattern is a tree matching pattern. - - It looks for a specific node type (token or symbol), and - optionally for a specific content. - - This is an abstract base class. There are three concrete - subclasses: - - - LeafPattern matches a single leaf node; - - NodePattern matches a single node (usually non-leaf); - - WildcardPattern matches a sequence of nodes of variable length. - """ - - # Defaults for instance variables - type: int | None - type = None # Node type (token if < 256, symbol if >= 256) - content: Any = None # Optional content matching pattern - name: str | None = None # Optional name used to store match in results dict - - def __new__(cls, *args, **kwds): - """Constructor that prevents BasePattern from being instantiated.""" - assert cls is not BasePattern, "Cannot instantiate BasePattern" - return object.__new__(cls) - - def __repr__(self) -> str: - assert self.type is not None - args = [type_repr(self.type), self.content, self.name] - while args and args[-1] is None: - del args[-1] - return f"{self.__class__.__name__}({', '.join(map(repr, args))})" - - def _submatch(self, node, results=None) -> bool: - raise NotImplementedError - - def optimize(self) -> "BasePattern": - """ - A subclass can define this as a hook for optimizations. - - Returns either self or another node with the same effect. - """ - return self - - def match(self, node: NL, results: _Results | None = None) -> bool: - """ - Does this pattern exactly match a node? - - Returns True if it matches, False if not. - - If results is not None, it must be a dict which will be - updated with the nodes matching named subpatterns. - - Default implementation for non-wildcard patterns. - """ - if self.type is not None and node.type != self.type: - return False - if self.content is not None: - r: _Results | None = None - if results is not None: - r = {} - if not self._submatch(node, r): - return False - if r: - assert results is not None - results.update(r) - if results is not None and self.name: - results[self.name] = node - return True - - def match_seq(self, nodes: list[NL], results: _Results | None = None) -> bool: - """ - Does this pattern exactly match a sequence of nodes? - - Default implementation for non-wildcard patterns. - """ - if len(nodes) != 1: - return False - return self.match(nodes[0], results) - - def generate_matches(self, nodes: list[NL]) -> Iterator[tuple[int, _Results]]: - """ - Generator yielding all matches for this pattern. - - Default implementation for non-wildcard patterns. - """ - r: _Results = {} - if nodes and self.match(nodes[0], r): - yield 1, r - - -class LeafPattern(BasePattern): - def __init__( - self, - type: int | None = None, - content: str | None = None, - name: str | None = None, - ) -> None: - """ - Initializer. Takes optional type, content, and name. - - The type, if given must be a token type (< 256). If not given, - this matches any *leaf* node; the content may still be required. - - The content, if given, must be a string. - - If a name is given, the matching node is stored in the results - dict under that key. - """ - if type is not None: - assert 0 <= type < 256, type - if content is not None: - assert isinstance(content, str), repr(content) - self.type = type - self.content = content - self.name = name - - def match(self, node: NL, results=None) -> bool: - """Override match() to insist on a leaf node.""" - if not isinstance(node, Leaf): - return False - return BasePattern.match(self, node, results) - - def _submatch(self, node, results=None): - """ - Match the pattern's content to the node's children. - - This assumes the node type matches and self.content is not None. - - Returns True if it matches, False if not. - - If results is not None, it must be a dict which will be - updated with the nodes matching named subpatterns. - - When returning False, the results dict may still be updated. - """ - return self.content == node.value - - -class NodePattern(BasePattern): - wildcards: bool = False - - def __init__( - self, - type: int | None = None, - content: Iterable[str] | None = None, - name: str | None = None, - ) -> None: - """ - Initializer. Takes optional type, content, and name. - - The type, if given, must be a symbol type (>= 256). If the - type is None this matches *any* single node (leaf or not), - except if content is not None, in which it only matches - non-leaf nodes that also match the content pattern. - - The content, if not None, must be a sequence of Patterns that - must match the node's children exactly. If the content is - given, the type must not be None. - - If a name is given, the matching node is stored in the results - dict under that key. - """ - if type is not None: - assert type >= 256, type - if content is not None: - assert not isinstance(content, str), repr(content) - newcontent = list(content) - for i, item in enumerate(newcontent): - assert isinstance(item, BasePattern), (i, item) - # I don't even think this code is used anywhere, but it does cause - # unreachable errors from mypy. This function's signature does look - # odd though *shrug*. - if isinstance(item, WildcardPattern): # type: ignore[unreachable] - self.wildcards = True # type: ignore[unreachable] - self.type = type - self.content = newcontent # TODO: this is unbound when content is None - self.name = name - - def _submatch(self, node, results=None) -> bool: - """ - Match the pattern's content to the node's children. - - This assumes the node type matches and self.content is not None. - - Returns True if it matches, False if not. - - If results is not None, it must be a dict which will be - updated with the nodes matching named subpatterns. - - When returning False, the results dict may still be updated. - """ - if self.wildcards: - for c, r in generate_matches(self.content, node.children): - if c == len(node.children): - if results is not None: - results.update(r) - return True - return False - if len(self.content) != len(node.children): - return False - for subpattern, child in zip(self.content, node.children): - if not subpattern.match(child, results): - return False - return True - - -class WildcardPattern(BasePattern): - """ - A wildcard pattern can match zero or more nodes. - - This has all the flexibility needed to implement patterns like: - - .* .+ .? .{m,n} - (a b c | d e | f) - (...)* (...)+ (...)? (...){m,n} - - except it always uses non-greedy matching. - """ - - min: int - max: int - - def __init__( - self, - content: str | None = None, - min: int = 0, - max: int = HUGE, - name: str | None = None, - ) -> None: - """ - Initializer. - - Args: - content: optional sequence of subsequences of patterns; - if absent, matches one node; - if present, each subsequence is an alternative [*] - min: optional minimum number of times to match, default 0 - max: optional maximum number of times to match, default HUGE - name: optional name assigned to this match - - [*] Thus, if content is [[a, b, c], [d, e], [f, g, h]] this is - equivalent to (a b c | d e | f g h); if content is None, - this is equivalent to '.' in regular expression terms. - The min and max parameters work as follows: - min=0, max=maxint: .* - min=1, max=maxint: .+ - min=0, max=1: .? - min=1, max=1: . - If content is not None, replace the dot with the parenthesized - list of alternatives, e.g. (a b c | d e | f g h)* - """ - assert 0 <= min <= max <= HUGE, (min, max) - if content is not None: - f = lambda s: tuple(s) - wrapped_content = tuple(map(f, content)) # Protect against alterations - # Check sanity of alternatives - assert len(wrapped_content), repr( - wrapped_content - ) # Can't have zero alternatives - for alt in wrapped_content: - assert len(alt), repr(alt) # Can have empty alternatives - self.content = wrapped_content - self.min = min - self.max = max - self.name = name - - def optimize(self) -> Any: - """Optimize certain stacked wildcard patterns.""" - subpattern = None - if ( - self.content is not None - and len(self.content) == 1 - and len(self.content[0]) == 1 - ): - subpattern = self.content[0][0] - if self.min == 1 and self.max == 1: - if self.content is None: - return NodePattern(name=self.name) - if subpattern is not None and self.name == subpattern.name: - return subpattern.optimize() - if ( - self.min <= 1 - and isinstance(subpattern, WildcardPattern) - and subpattern.min <= 1 - and self.name == subpattern.name - ): - return WildcardPattern( - subpattern.content, - self.min * subpattern.min, - self.max * subpattern.max, - subpattern.name, - ) - return self - - def match(self, node, results=None) -> bool: - """Does this pattern exactly match a node?""" - return self.match_seq([node], results) - - def match_seq(self, nodes, results=None) -> bool: - """Does this pattern exactly match a sequence of nodes?""" - for c, r in self.generate_matches(nodes): - if c == len(nodes): - if results is not None: - results.update(r) - if self.name: - results[self.name] = list(nodes) - return True - return False - - def generate_matches(self, nodes) -> Iterator[tuple[int, _Results]]: - """ - Generator yielding matches for a sequence of nodes. - - Args: - nodes: sequence of nodes - - Yields: - (count, results) tuples where: - count: the match comprises nodes[:count]; - results: dict containing named submatches. - """ - if self.content is None: - # Shortcut for special case (see __init__.__doc__) - for count in range(self.min, 1 + min(len(nodes), self.max)): - r = {} - if self.name: - r[self.name] = nodes[:count] - yield count, r - elif self.name == "bare_name": - yield self._bare_name_matches(nodes) - else: - # The reason for this is that hitting the recursion limit usually - # results in some ugly messages about how RuntimeErrors are being - # ignored. We only have to do this on CPython, though, because other - # implementations don't have this nasty bug in the first place. - if hasattr(sys, "getrefcount"): - save_stderr = sys.stderr - sys.stderr = StringIO() - try: - for count, r in self._recursive_matches(nodes, 0): - if self.name: - r[self.name] = nodes[:count] - yield count, r - except RuntimeError: - # We fall back to the iterative pattern matching scheme if the recursive - # scheme hits the recursion limit. - for count, r in self._iterative_matches(nodes): - if self.name: - r[self.name] = nodes[:count] - yield count, r - finally: - if hasattr(sys, "getrefcount"): - sys.stderr = save_stderr - - def _iterative_matches(self, nodes) -> Iterator[tuple[int, _Results]]: - """Helper to iteratively yield the matches.""" - nodelen = len(nodes) - if 0 >= self.min: - yield 0, {} - - results = [] - # generate matches that use just one alt from self.content - for alt in self.content: - for c, r in generate_matches(alt, nodes): - yield c, r - results.append((c, r)) - - # for each match, iterate down the nodes - while results: - new_results = [] - for c0, r0 in results: - # stop if the entire set of nodes has been matched - if c0 < nodelen and c0 <= self.max: - for alt in self.content: - for c1, r1 in generate_matches(alt, nodes[c0:]): - if c1 > 0: - r = {} - r.update(r0) - r.update(r1) - yield c0 + c1, r - new_results.append((c0 + c1, r)) - results = new_results - - def _bare_name_matches(self, nodes) -> tuple[int, _Results]: - """Special optimized matcher for bare_name.""" - count = 0 - r = {} # type: _Results - done = False - max = len(nodes) - while not done and count < max: - done = True - for leaf in self.content: - if leaf[0].match(nodes[count], r): - count += 1 - done = False - break - assert self.name is not None - r[self.name] = nodes[:count] - return count, r - - def _recursive_matches(self, nodes, count) -> Iterator[tuple[int, _Results]]: - """Helper to recursively yield the matches.""" - assert self.content is not None - if count >= self.min: - yield 0, {} - if count < self.max: - for alt in self.content: - for c0, r0 in generate_matches(alt, nodes): - for c1, r1 in self._recursive_matches(nodes[c0:], count + 1): - r = {} - r.update(r0) - r.update(r1) - yield c0 + c1, r - - -class NegatedPattern(BasePattern): - def __init__(self, content: BasePattern | None = None) -> None: - """ - Initializer. - - The argument is either a pattern or None. If it is None, this - only matches an empty sequence (effectively '$' in regex - lingo). If it is not None, this matches whenever the argument - pattern doesn't have any matches. - """ - if content is not None: - assert isinstance(content, BasePattern), repr(content) - self.content = content - - def match(self, node, results=None) -> bool: - # We never match a node in its entirety - return False - - def match_seq(self, nodes, results=None) -> bool: - # We only match an empty sequence of nodes in its entirety - return len(nodes) == 0 - - def generate_matches(self, nodes: list[NL]) -> Iterator[tuple[int, _Results]]: - if self.content is None: - # Return a match if there is an empty sequence - if len(nodes) == 0: - yield 0, {} - else: - # Return a match if the argument pattern has no matches - for c, r in self.content.generate_matches(nodes): - return - yield 0, {} - - -def generate_matches( - patterns: list[BasePattern], nodes: list[NL] -) -> Iterator[tuple[int, _Results]]: - """ - Generator yielding matches for a sequence of patterns and nodes. - - Args: - patterns: a sequence of patterns - nodes: a sequence of nodes - - Yields: - (count, results) tuples where: - count: the entire sequence of patterns matches nodes[:count]; - results: dict containing named submatches. - """ - if not patterns: - yield 0, {} - else: - p, rest = patterns[0], patterns[1:] - for c0, r0 in p.generate_matches(nodes): - if not rest: - yield c0, r0 - else: - for c1, r1 in generate_matches(rest, nodes[c0:]): - r = {} - r.update(r0) - r.update(r1) - yield c0 + c1, r diff --git a/venv/lib/python3.12/site-packages/certifi-2026.2.25.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/certifi-2026.2.25.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/certifi-2026.2.25.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/certifi-2026.2.25.dist-info/METADATA b/venv/lib/python3.12/site-packages/certifi-2026.2.25.dist-info/METADATA deleted file mode 100644 index 73df8c8..0000000 --- a/venv/lib/python3.12/site-packages/certifi-2026.2.25.dist-info/METADATA +++ /dev/null @@ -1,78 +0,0 @@ -Metadata-Version: 2.4 -Name: certifi -Version: 2026.2.25 -Summary: Python package for providing Mozilla's CA Bundle. -Home-page: https://github.com/certifi/python-certifi -Author: Kenneth Reitz -Author-email: me@kennethreitz.com -License: MPL-2.0 -Project-URL: Source, https://github.com/certifi/python-certifi -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0) -Classifier: Natural Language :: English -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: 3.14 -Requires-Python: >=3.7 -License-File: LICENSE -Dynamic: author -Dynamic: author-email -Dynamic: classifier -Dynamic: description -Dynamic: home-page -Dynamic: license -Dynamic: license-file -Dynamic: project-url -Dynamic: requires-python -Dynamic: summary - -Certifi: Python SSL Certificates -================================ - -Certifi provides Mozilla's carefully curated collection of Root Certificates for -validating the trustworthiness of SSL certificates while verifying the identity -of TLS hosts. It has been extracted from the `Requests`_ project. - -Installation ------------- - -``certifi`` is available on PyPI. Simply install it with ``pip``:: - - $ pip install certifi - -Usage ------ - -To reference the installed certificate authority (CA) bundle, you can use the -built-in function:: - - >>> import certifi - - >>> certifi.where() - '/usr/local/lib/python3.7/site-packages/certifi/cacert.pem' - -Or from the command line:: - - $ python -m certifi - /usr/local/lib/python3.7/site-packages/certifi/cacert.pem - -Enjoy! - -.. _`Requests`: https://requests.readthedocs.io/en/master/ - -Addition/Removal of Certificates --------------------------------- - -Certifi does not support any addition/removal or other modification of the -CA trust store content. This project is intended to provide a reliable and -highly portable root of trust to python deployments. Look to upstream projects -for methods to use alternate trust. diff --git a/venv/lib/python3.12/site-packages/certifi-2026.2.25.dist-info/RECORD b/venv/lib/python3.12/site-packages/certifi-2026.2.25.dist-info/RECORD deleted file mode 100644 index 8d4811a..0000000 --- a/venv/lib/python3.12/site-packages/certifi-2026.2.25.dist-info/RECORD +++ /dev/null @@ -1,14 +0,0 @@ -certifi-2026.2.25.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -certifi-2026.2.25.dist-info/METADATA,sha256=4NMuGXdg_hBiRA3paKVXYcDmE3VXEBWxTvCL2xlDyPU,2474 -certifi-2026.2.25.dist-info/RECORD,, -certifi-2026.2.25.dist-info/WHEEL,sha256=YCfwYGOYMi5Jhw2fU4yNgwErybb2IX5PEwBKV4ZbdBo,91 -certifi-2026.2.25.dist-info/licenses/LICENSE,sha256=6TcW2mucDVpKHfYP5pWzcPBpVgPSH2-D8FPkLPwQyvc,989 -certifi-2026.2.25.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 -certifi/__init__.py,sha256=c9eaYufv1pSLl0Q8QNcMiMLLH4WquDcxdPyKjmI4opY,94 -certifi/__main__.py,sha256=xBBoj905TUWBLRGANOcf7oi6e-3dMP4cEoG9OyMs11g,243 -certifi/__pycache__/__init__.cpython-312.pyc,, -certifi/__pycache__/__main__.cpython-312.pyc,, -certifi/__pycache__/core.cpython-312.pyc,, -certifi/cacert.pem,sha256=_JFloSQDJj5-v72te-ej6sD6XTJdPHBGXyjTaQByyig,272441 -certifi/core.py,sha256=XFXycndG5pf37ayeF8N32HUuDafsyhkVMbO4BAPWHa0,3394 -certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/venv/lib/python3.12/site-packages/certifi-2026.2.25.dist-info/WHEEL b/venv/lib/python3.12/site-packages/certifi-2026.2.25.dist-info/WHEEL deleted file mode 100644 index 1ef5583..0000000 --- a/venv/lib/python3.12/site-packages/certifi-2026.2.25.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (82.0.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv/lib/python3.12/site-packages/certifi-2026.2.25.dist-info/licenses/LICENSE b/venv/lib/python3.12/site-packages/certifi-2026.2.25.dist-info/licenses/LICENSE deleted file mode 100644 index 62b076c..0000000 --- a/venv/lib/python3.12/site-packages/certifi-2026.2.25.dist-info/licenses/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -This package contains a modified version of ca-bundle.crt: - -ca-bundle.crt -- Bundle of CA Root Certificates - -This is a bundle of X.509 certificates of public Certificate Authorities -(CA). These were automatically extracted from Mozilla's root certificates -file (certdata.txt). This file can be found in the mozilla source tree: -https://hg.mozilla.org/mozilla-central/file/tip/security/nss/lib/ckfw/builtins/certdata.txt -It contains the certificates in PEM format and therefore -can be directly used with curl / libcurl / php_curl, or with -an Apache+mod_ssl webserver for SSL client authentication. -Just configure this file as the SSLCACertificateFile.# - -***** BEGIN LICENSE BLOCK ***** -This Source Code Form is subject to the terms of the Mozilla Public License, -v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain -one at http://mozilla.org/MPL/2.0/. - -***** END LICENSE BLOCK ***** -@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $ diff --git a/venv/lib/python3.12/site-packages/certifi-2026.2.25.dist-info/top_level.txt b/venv/lib/python3.12/site-packages/certifi-2026.2.25.dist-info/top_level.txt deleted file mode 100644 index 963eac5..0000000 --- a/venv/lib/python3.12/site-packages/certifi-2026.2.25.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -certifi diff --git a/venv/lib/python3.12/site-packages/certifi/__init__.py b/venv/lib/python3.12/site-packages/certifi/__init__.py deleted file mode 100644 index 16c0c7c..0000000 --- a/venv/lib/python3.12/site-packages/certifi/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .core import contents, where - -__all__ = ["contents", "where"] -__version__ = "2026.02.25" diff --git a/venv/lib/python3.12/site-packages/certifi/__main__.py b/venv/lib/python3.12/site-packages/certifi/__main__.py deleted file mode 100644 index 8945b5d..0000000 --- a/venv/lib/python3.12/site-packages/certifi/__main__.py +++ /dev/null @@ -1,12 +0,0 @@ -import argparse - -from certifi import contents, where - -parser = argparse.ArgumentParser() -parser.add_argument("-c", "--contents", action="store_true") -args = parser.parse_args() - -if args.contents: - print(contents()) -else: - print(where()) diff --git a/venv/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index ee75ca8..0000000 Binary files a/venv/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/certifi/__pycache__/__main__.cpython-312.pyc b/venv/lib/python3.12/site-packages/certifi/__pycache__/__main__.cpython-312.pyc deleted file mode 100644 index 073b42a..0000000 Binary files a/venv/lib/python3.12/site-packages/certifi/__pycache__/__main__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/certifi/__pycache__/core.cpython-312.pyc b/venv/lib/python3.12/site-packages/certifi/__pycache__/core.cpython-312.pyc deleted file mode 100644 index ef463d1..0000000 Binary files a/venv/lib/python3.12/site-packages/certifi/__pycache__/core.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/certifi/cacert.pem b/venv/lib/python3.12/site-packages/certifi/cacert.pem deleted file mode 100644 index 5ec1afe..0000000 --- a/venv/lib/python3.12/site-packages/certifi/cacert.pem +++ /dev/null @@ -1,4494 +0,0 @@ - -# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2" -# Serial: 1289 -# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b -# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 -# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3" -# Serial: 1478 -# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf -# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 -# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK -4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root CA" -# Serial: 17154717934120587862167794914071425081 -# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 -# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 -# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root CA" -# Serial: 10944719598952040374951832963794454346 -# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e -# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 -# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert High Assurance EV Root CA" -# Serial: 3553400076410547919724730734378100087 -# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a -# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 -# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Label: "SwissSign Gold CA - G2" -# Serial: 13492815561806991280 -# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 -# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 -# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 ------BEGIN CERTIFICATE----- -MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV -BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln -biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF -MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT -d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 -76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ -bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c -6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE -emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd -MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt -MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y -MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y -FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi -aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM -gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB -qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 -lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn -8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov -L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 -45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO -UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 -O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC -bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv -GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a -77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC -hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 -92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp -Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w -ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt -Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ ------END CERTIFICATE----- - -# Issuer: CN=SecureTrust CA O=SecureTrust Corporation -# Subject: CN=SecureTrust CA O=SecureTrust Corporation -# Label: "SecureTrust CA" -# Serial: 17199774589125277788362757014266862032 -# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 -# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 -# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -# Issuer: CN=Secure Global CA O=SecureTrust Corporation -# Subject: CN=Secure Global CA O=SecureTrust Corporation -# Label: "Secure Global CA" -# Serial: 9751836167731051554232119481456978597 -# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de -# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b -# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO Certification Authority O=COMODO CA Limited -# Label: "COMODO Certification Authority" -# Serial: 104350513648249232941998508985834464573 -# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 -# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b -# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- - -# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Label: "COMODO ECC Certification Authority" -# Serial: 41578283867086692638256921589707938090 -# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 -# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 -# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -# Issuer: CN=Certigna O=Dhimyotis -# Subject: CN=Certigna O=Dhimyotis -# Label: "Certigna" -# Serial: 18364802974209362175 -# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff -# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 -# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV -BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X -DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ -BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 -QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny -gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw -zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q -130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 -JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw -ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT -AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj -AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG -9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h -bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc -fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu -HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w -t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Label: "ePKI Root Certification Authority" -# Serial: 28956088682735189655030529057352760477 -# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 -# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 -# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw -IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL -SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH -SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh -ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X -DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 -TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ -fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA -sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU -WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS -nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH -dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip -NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC -AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF -MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB -uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl -PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP -JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ -gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 -j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 -5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB -o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS -/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z -Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE -W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D -hNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -# Issuer: O=certSIGN OU=certSIGN ROOT CA -# Subject: O=certSIGN OU=certSIGN ROOT CA -# Label: "certSIGN ROOT CA" -# Serial: 35210227249154 -# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 -# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b -# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT -AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD -QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP -MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do -0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ -UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d -RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ -OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv -JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C -AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O -BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ -LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY -MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ -44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I -Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw -i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN -9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" -# Serial: 80544274841616 -# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 -# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 -# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG -EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 -MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl -cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR -dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB -pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM -b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz -IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT -lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz -AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 -VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG -ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 -BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG -AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M -U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh -bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C -+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F -uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 -XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Label: "Microsec e-Szigno Root CA 2009" -# Serial: 14014712776195784473 -# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 -# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e -# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G -CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y -OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx -FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp -Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP -kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc -cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U -fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 -N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC -xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 -+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM -Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG -SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h -mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk -ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c -2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t -HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Label: "GlobalSign Root CA - R3" -# Serial: 4835703278459759426209954 -# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 -# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad -# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- - -# Issuer: CN=Izenpe.com O=IZENPE S.A. -# Subject: CN=Izenpe.com O=IZENPE S.A. -# Label: "Izenpe.com" -# Serial: 917563065490389241595536686991402621 -# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 -# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 -# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f ------BEGIN CERTIFICATE----- -MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 -MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 -ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD -VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j -b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq -scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO -xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H -LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX -uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD -yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ -JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q -rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN -BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L -hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB -QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ -HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu -Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg -QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB -BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx -MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA -A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb -laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 -awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo -JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw -LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT -VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk -LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb -UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ -QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ -naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls -QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== ------END CERTIFICATE----- - -# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Label: "Go Daddy Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 -# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b -# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz -NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE -AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD -E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH -/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy -DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh -GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR -tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA -AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX -WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu -9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr -gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo -2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI -4uJEvlz36hz1 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 -# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e -# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw -MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp -Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg -nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 -HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N -Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN -dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 -HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G -CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU -sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 -4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg -8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 -mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Services Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 -# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f -# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs -ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy -ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy -dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p -OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 -8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K -Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe -hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk -6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q -AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI -bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB -ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z -qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn -0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN -sSi6 ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA" -# Serial: 279744 -# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 -# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e -# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM -MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D -ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU -cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 -WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg -Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw -IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH -UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM -TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU -BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM -kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x -AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV -HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y -sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL -I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 -J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY -VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Label: "TWCA Root Certification Authority" -# Serial: 1 -# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 -# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 -# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES -MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU -V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz -WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO -LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE -AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH -K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX -RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z -rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx -3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq -hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC -MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls -XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D -lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn -aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ -YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Label: "Security Communication RootCA2" -# Serial: 0 -# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 -# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 -# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX -DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy -dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj -YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV -OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr -zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM -VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ -hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO -ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw -awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs -OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF -coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc -okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 -t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy -1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ -SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Label: "Actalis Authentication Root CA" -# Serial: 6271844772424770508 -# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 -# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac -# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE -BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w -MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC -SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 -ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv -UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX -4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 -KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ -gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb -rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ -51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F -be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe -KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F -v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn -fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 -jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz -ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL -e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 -jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz -WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V -SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j -pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX -X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok -fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R -K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU -ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU -LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT -LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 2 Root CA" -# Serial: 2 -# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 -# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 -# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr -6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV -L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 -1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx -MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ -QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB -arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr -Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi -FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS -P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN -9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz -uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h -9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t -OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo -+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 -KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 -DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us -H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ -I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 -5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h -3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz -Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 3 Root CA" -# Serial: 2 -# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec -# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 -# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y -ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E -N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 -tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX -0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c -/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X -KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY -zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS -O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D -34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP -K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv -Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj -QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS -IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 -HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa -O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv -033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u -dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE -kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 -3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD -u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq -4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 3" -# Serial: 1 -# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef -# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 -# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN -8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ -RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 -hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 -ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM -EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 -A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy -WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ -1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 -6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT -91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p -TpPDpFQUWw== ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 2009" -# Serial: 623603 -# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f -# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 -# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha -ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM -HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 -UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 -tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R -ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM -lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp -/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G -A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G -A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj -dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy -MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl -cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js -L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL -BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni -acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K -zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 -PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y -Johw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 EV 2009" -# Serial: 623604 -# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 -# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 -# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw -NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV -BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn -ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 -3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z -qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR -p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 -HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw -ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea -HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw -Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh -c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E -RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt -dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku -Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp -3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF -CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na -xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX -KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R2 O=Disig a.s. -# Subject: CN=CA Disig Root R2 O=Disig a.s. -# Label: "CA Disig Root R2" -# Serial: 10572350602393338211 -# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 -# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 -# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy -MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe -NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH -PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I -x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe -QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR -yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO -QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 -H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ -QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD -i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs -nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 -rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI -hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf -GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb -lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka -+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal -TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i -nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 -gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr -G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os -zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x -L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- - -# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Label: "ACCVRAIZ1" -# Serial: 6828503384748696800 -# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 -# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 -# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE -AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw -CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ -BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND -VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb -qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY -HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo -G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA -lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr -IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ -0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH -k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 -4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO -m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa -cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl -uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI -KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls -ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG -AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT -VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG -CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA -cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA -QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA -7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA -cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA -QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA -czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu -aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt -aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud -DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF -BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp -D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU -JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m -AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD -vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms -tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH -7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA -h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF -d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H -pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- - -# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Label: "TWCA Global Root CA" -# Serial: 3262 -# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 -# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 -# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx -EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT -VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 -NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT -B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF -10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz -0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh -MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH -zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc -46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 -yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi -laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP -oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA -BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE -qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm -4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL -1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF -H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo -RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ -nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh -15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW -6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW -nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j -wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz -aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy -KwbQBM0= ------END CERTIFICATE----- - -# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Label: "TeliaSonera Root CA v1" -# Serial: 199041966741090107964904287217786801558 -# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c -# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 -# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 ------BEGIN CERTIFICATE----- -MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw -NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv -b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD -VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F -VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 -7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X -Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ -/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs -81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm -dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe -Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu -sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 -pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs -slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ -arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD -VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG -9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl -dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx -0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj -TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed -Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 -Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI -OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 -vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW -t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn -HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx -SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 2" -# Serial: 1 -# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a -# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 -# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd -AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC -FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi -1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq -jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ -wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ -WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy -NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC -uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw -IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 -g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP -BSeOE6Fuwg== ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot 2011 O=Atos -# Subject: CN=Atos TrustedRoot 2011 O=Atos -# Label: "Atos TrustedRoot 2011" -# Serial: 6643877497813316402 -# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 -# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 -# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE -AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG -EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM -FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC -REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp -Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM -VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ -SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ -4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L -cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi -eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG -A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 -DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j -vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP -DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc -maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D -lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv -KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 1 G3" -# Serial: 687049649626669250736271037606554624078720034195 -# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab -# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 -# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 -MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV -wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe -rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 -68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh -4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp -UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o -abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc -3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G -KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt -hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO -Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt -zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD -ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC -MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 -cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN -qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 -YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv -b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 -8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k -NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj -ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp -q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt -nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2 G3" -# Serial: 390156079458959257446133169266079962026824725800 -# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 -# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 -# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 -MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf -qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW -n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym -c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ -O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 -o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j -IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq -IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz -8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh -vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l -7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG -cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD -ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 -AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC -roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga -W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n -lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE -+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV -csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd -dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg -KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM -HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 -WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3 G3" -# Serial: 268090761170461462463995952157327242137089239581 -# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 -# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d -# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 -MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR -/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu -FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR -U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c -ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR -FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k -A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw -eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl -sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp -VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q -A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ -ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD -ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px -KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI -FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv -oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg -u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP -0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf -3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl -8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ -DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN -PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ -ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G2" -# Serial: 15385348160840213938643033620894905419 -# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d -# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f -# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 ------BEGIN CERTIFICATE----- -MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA -n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc -biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp -EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA -bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu -YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW -BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI -QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I -0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni -lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 -B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv -ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo -IhNzbM8m9Yop5w== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G3" -# Serial: 15459312981008553731928384953135426796 -# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb -# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 -# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 ------BEGIN CERTIFICATE----- -MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg -RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf -Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q -RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD -AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY -JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv -6pZjamVFkpUBtA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G2" -# Serial: 4293743540046975378534879503202253541 -# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 -# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 -# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI -2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx -1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ -q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz -tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ -vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV -5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY -1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 -NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG -Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 -8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe -pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G3" -# Serial: 7089244469030293291760083333884364146 -# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca -# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e -# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 ------BEGIN CERTIFICATE----- -MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe -Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw -EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x -IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG -fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO -Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd -BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx -AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ -oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 -sycX ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Trusted Root G4" -# Serial: 7451500558977370777930084869016614236 -# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 -# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 -# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg -RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y -ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If -xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV -ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO -DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ -jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ -CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi -EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM -fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY -uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK -chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t -9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 -SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd -+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc -fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa -sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N -cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N -0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie -4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI -r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 -/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm -gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ ------END CERTIFICATE----- - -# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Label: "COMODO RSA Certification Authority" -# Serial: 101909084537582093308941363524873193117 -# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 -# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 -# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 ------BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB -hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV -BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT -EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR -6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X -pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC -9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV -/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf -Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z -+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w -qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah -SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC -u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf -Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq -crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E -FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl -wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM -4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV -2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna -FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ -CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK -boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke -jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL -S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb -QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl -0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB -NVOFBkpdn627G190 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Label: "USERTrust RSA Certification Authority" -# Serial: 2645093764781058787591871645665788717 -# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 -# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e -# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 ------BEGIN CERTIFICATE----- -MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB -iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl -cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV -BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw -MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV -BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B -3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY -tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ -Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 -VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT -79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 -c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT -Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l -c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee -UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE -Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd -BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF -Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO -VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 -ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs -8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR -iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze -Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ -XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ -qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB -VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB -L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG -jjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Label: "USERTrust ECC Certification Authority" -# Serial: 123013823720199481456569720443997572134 -# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 -# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 -# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a ------BEGIN CERTIFICATE----- -MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL -MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl -eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT -JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT -Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg -VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo -I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng -o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G -A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB -zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW -RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Label: "GlobalSign ECC Root CA - R5" -# Serial: 32785792099990507226680698011560947931244 -# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 -# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa -# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 ------BEGIN CERTIFICATE----- -MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc -8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke -hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI -KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg -515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO -xwy8p2Fp8fc74SrL+SvzZpA3 ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Label: "IdenTrust Commercial Root CA 1" -# Serial: 13298821034946342390520003877796839426 -# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 -# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 -# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu -VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw -MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw -JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT -3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU -+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp -S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 -bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi -T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL -vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK -Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK -dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT -c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv -l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N -iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD -ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH -6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt -LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 -nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 -+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK -W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT -AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq -l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG -4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ -mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A -7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Label: "IdenTrust Public Sector Root CA 1" -# Serial: 13298821034946342390521976156843933698 -# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba -# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd -# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu -VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN -MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 -MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 -ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy -RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS -bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF -/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R -3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw -EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy -9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V -GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ -2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV -WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD -W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN -AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj -t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV -DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 -TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G -lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW -mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df -WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 -+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ -tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA -GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv -8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c ------END CERTIFICATE----- - -# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority -# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority -# Label: "CFCA EV ROOT" -# Serial: 407555286 -# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 -# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 -# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD -TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx -MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j -aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP -T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 -sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL -TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 -/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp -7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz -EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt -hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP -a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot -aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg -TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV -PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv -cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL -tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd -BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB -ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT -ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL -jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS -ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy -P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 -xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d -Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN -5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe -/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z -AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ -5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GB CA" -# Serial: 157768595616588414422159278966750757568 -# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d -# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed -# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt -MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg -Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i -YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x -CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG -b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh -bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 -HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx -WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX -1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk -u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P -99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r -M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB -BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh -cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 -gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO -ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf -aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic -Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= ------END CERTIFICATE----- - -# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Label: "SZAFIR ROOT CA2" -# Serial: 357043034767186914217277344587386743377558296292 -# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 -# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de -# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe ------BEGIN CERTIFICATE----- -MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 -ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw -NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L -cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg -Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN -QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT -3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw -3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 -3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 -BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN -XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF -AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw -8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG -nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP -oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy -d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg -LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA 2" -# Serial: 44979900017204383099463764357512596969 -# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 -# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 -# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 ------BEGIN CERTIFICATE----- -MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB -gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu -QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG -A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz -OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ -VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 -b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA -DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn -0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB -OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE -fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E -Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m -o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i -sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW -OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez -Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS -adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n -3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ -F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf -CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 -XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm -djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ -WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb -AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq -P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko -b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj -XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P -5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi -DrW5viSP ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce -# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 -# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 ------BEGIN CERTIFICATE----- -MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix -DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k -IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT -N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v -dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG -A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh -ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx -QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA -4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 -AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 -4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C -ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV -9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD -gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 -Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq -NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko -LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc -Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd -ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I -XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI -M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot -9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V -Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea -j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh -X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ -l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf -bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 -pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK -e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 -vm9qp/UsQu0yrbYhnr68 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef -# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 -# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 ------BEGIN CERTIFICATE----- -MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN -BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl -bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv -b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ -BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj -YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 -MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 -dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg -QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa -jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi -C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep -lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof -TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR ------END CERTIFICATE----- - -# Issuer: CN=ISRG Root X1 O=Internet Security Research Group -# Subject: CN=ISRG Root X1 O=Internet Security Research Group -# Label: "ISRG Root X1" -# Serial: 172886928669790476064670243504169061120 -# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e -# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 -# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- - -# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Label: "AC RAIZ FNMT-RCM" -# Serial: 485876308206448804701554682760554759 -# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d -# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 -# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx -CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ -WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ -BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG -Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ -yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf -BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz -WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF -tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z -374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC -IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL -mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 -wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS -MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 -ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet -UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H -YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 -LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD -nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 -RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM -LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf -77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N -JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm -fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp -6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp -1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B -9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok -RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv -uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 1 O=Amazon -# Subject: CN=Amazon Root CA 1 O=Amazon -# Label: "Amazon Root CA 1" -# Serial: 143266978916655856878034712317230054538369994 -# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 -# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 -# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e ------BEGIN CERTIFICATE----- -MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj -ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM -9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw -IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 -VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L -93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm -jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA -A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI -U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs -N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv -o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU -5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy -rqXRfboQnoZsG4q5WTP468SQvvG5 ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 2 O=Amazon -# Subject: CN=Amazon Root CA 2 O=Amazon -# Label: "Amazon Root CA 2" -# Serial: 143266982885963551818349160658925006970653239 -# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 -# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a -# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK -gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ -W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg -1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K -8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r -2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me -z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR -8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj -mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz -7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 -+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI -0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm -UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 -LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY -+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS -k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl -7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm -btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl -urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ -fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 -n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE -76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H -9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT -4PsJYGw= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 3 O=Amazon -# Subject: CN=Amazon Root CA 3 O=Amazon -# Label: "Amazon Root CA 3" -# Serial: 143266986699090766294700635381230934788665930 -# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 -# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e -# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 ------BEGIN CERTIFICATE----- -MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl -ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr -ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr -BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM -YyRIHN8wfdVoOw== ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 4 O=Amazon -# Subject: CN=Amazon Root CA 4 O=Amazon -# Label: "Amazon Root CA 4" -# Serial: 143266989758080763974105200630763877849284878 -# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd -# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be -# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 ------BEGIN CERTIFICATE----- -MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi -9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk -M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB -MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw -CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW -1KyLa2tJElMzrdfkviT8tQp21KW8EA== ------END CERTIFICATE----- - -# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" -# Serial: 1 -# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 -# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca -# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 ------BEGIN CERTIFICATE----- -MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx -GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp -bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w -KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 -BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy -dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG -EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll -IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU -QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT -TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg -LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 -a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr -LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr -N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X -YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ -iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f -AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH -V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh -AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf -IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 -lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c -8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf -lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= ------END CERTIFICATE----- - -# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Label: "GDCA TrustAUTH R5 ROOT" -# Serial: 9009899650740120186 -# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 -# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 -# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 ------BEGIN CERTIFICATE----- -MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE -BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ -IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 -MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV -BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w -HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj -Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj -TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u -KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj -qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm -MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 -ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP -zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk -L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC -jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA -HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC -AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg -p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm -DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 -COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry -L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf -JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg -IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io -2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV -09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ -XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq -T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe -MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Label: "SSL.com Root Certification Authority RSA" -# Serial: 8875640296558310041 -# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 -# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb -# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 ------BEGIN CERTIFICATE----- -MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE -BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK -DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz -OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv -bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R -xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX -qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC -C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 -6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh -/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF -YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E -JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc -US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 -ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm -+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi -M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G -A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV -cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc -Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs -PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ -q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 -cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr -a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I -H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y -K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu -nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf -oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY -Ic2wBlX7Jz9TkHCpBB5XJ7k= ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com Root Certification Authority ECC" -# Serial: 8495723813297216424 -# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e -# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a -# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 ------BEGIN CERTIFICATE----- -MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz -WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 -b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS -b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB -BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI -7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg -CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud -EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD -VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T -kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ -gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority RSA R2" -# Serial: 6248227494352943350 -# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 -# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a -# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c ------BEGIN CERTIFICATE----- -MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV -BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE -CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy -MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G -A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD -DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq -M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf -OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa -4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 -HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR -aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA -b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ -Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV -PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO -pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu -UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY -MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV -HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 -9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW -s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 -Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg -cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM -79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz -/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt -ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm -Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK -QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ -w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi -S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 -mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority ECC" -# Serial: 3182246526754555285 -# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 -# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d -# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 ------BEGIN CERTIFICATE----- -MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx -NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv -bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 -AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA -VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku -WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX -5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ -ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg -h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Label: "GlobalSign Root CA - R6" -# Serial: 1417766617973444989252670301619537 -# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae -# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 -# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg -MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh -bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx -MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET -MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI -xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k -ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD -aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw -LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw -1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX -k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 -SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h -bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n -WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY -rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce -MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu -bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN -nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt -Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 -55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj -vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf -cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz -oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp -nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs -pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v -JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R -8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 -5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GC CA" -# Serial: 44084345621038548146064804565436152554 -# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 -# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 -# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d ------BEGIN CERTIFICATE----- -MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw -CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 -bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg -Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ -BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu -ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS -b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni -eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W -p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T -rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV -57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg -Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 ------END CERTIFICATE----- - -# Issuer: CN=UCA Global G2 Root O=UniTrust -# Subject: CN=UCA Global G2 Root O=UniTrust -# Label: "UCA Global G2 Root" -# Serial: 124779693093741543919145257850076631279 -# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 -# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a -# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 -MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH -bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x -CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds -b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr -b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 -kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm -VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R -VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc -C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj -tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY -D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv -j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl -NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 -iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP -O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV -ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj -L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 -1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl -1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU -b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV -PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj -y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb -EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg -DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI -+Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy -YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX -UB+K+wb1whnw0A== ------END CERTIFICATE----- - -# Issuer: CN=UCA Extended Validation Root O=UniTrust -# Subject: CN=UCA Extended Validation Root O=UniTrust -# Label: "UCA Extended Validation Root" -# Serial: 106100277556486529736699587978573607008 -# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 -# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a -# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH -MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF -eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx -MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV -BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog -D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS -sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop -O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk -sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi -c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj -VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz -KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ -TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G -sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs -1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD -fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN -l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR -ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ -VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 -c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp -4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s -t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj -2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO -vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C -xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx -cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM -fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax ------END CERTIFICATE----- - -# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 -# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 -# Label: "Certigna Root CA" -# Serial: 269714418870597844693661054334862075617 -# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 -# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 -# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 ------BEGIN CERTIFICATE----- -MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw -WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw -MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x -MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD -VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX -BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO -ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M -CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu -I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm -TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh -C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf -ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz -IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT -Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k -JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 -hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB -GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of -1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov -L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo -dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr -aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq -hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L -6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG -HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 -0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB -lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi -o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 -gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v -faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 -Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh -jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw -3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= ------END CERTIFICATE----- - -# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI -# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI -# Label: "emSign Root CA - G1" -# Serial: 235931866688319308814040 -# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac -# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c -# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 ------BEGIN CERTIFICATE----- -MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD -VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU -ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH -MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO -MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv -Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz -f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO -8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq -d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM -tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt -Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB -o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x -PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM -wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d -GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH -6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby -RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx -iN66zB+Afko= ------END CERTIFICATE----- - -# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI -# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI -# Label: "emSign ECC Root CA - G3" -# Serial: 287880440101571086945156 -# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 -# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 -# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b ------BEGIN CERTIFICATE----- -MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG -EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo -bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g -RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ -TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s -b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw -djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 -WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS -fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB -zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq -hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB -CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD -+JbNR6iC8hZVdyR+EhCVBCyj ------END CERTIFICATE----- - -# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI -# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI -# Label: "emSign Root CA - C1" -# Serial: 825510296613316004955058 -# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 -# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 -# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f ------BEGIN CERTIFICATE----- -MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG -A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg -SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw -MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln -biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v -dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ -BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ -HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH -3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH -GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c -xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 -aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq -TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 -/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 -kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG -YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT -+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo -WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= ------END CERTIFICATE----- - -# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI -# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI -# Label: "emSign ECC Root CA - C3" -# Serial: 582948710642506000014504 -# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 -# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 -# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 ------BEGIN CERTIFICATE----- -MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG -EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx -IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw -MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln -biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND -IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci -MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti -sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O -BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB -Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c -3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J -0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== ------END CERTIFICATE----- - -# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post -# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post -# Label: "Hongkong Post Root CA 3" -# Serial: 46170865288971385588281144162979347873371282084 -# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 -# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 -# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 ------BEGIN CERTIFICATE----- -MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQEL -BQAwbzELMAkGA1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJ -SG9uZyBLb25nMRYwFAYDVQQKEw1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25n -a29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2MDMwMjI5NDZaFw00MjA2MDMwMjI5 -NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtvbmcxEjAQBgNVBAcT -CUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMXSG9u -Z2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCziNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFO -dem1p+/l6TWZ5Mwc50tfjTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mI -VoBc+L0sPOFMV4i707mV78vH9toxdCim5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV -9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOesL4jpNrcyCse2m5FHomY -2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj0mRiikKY -vLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+Tt -bNe/JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZb -x39ri1UbSsUgYT2uy1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+ -l2oBlKN8W4UdKjk60FSh0Tlxnf0h+bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YK -TE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsGxVd7GYYKecsAyVKvQv83j+Gj -Hno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwIDAQABo2MwYTAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e -i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEw -DQYJKoZIhvcNAQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG -7BJ8dNVI0lkUmcDrudHr9EgwW62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCk -MpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWldy8joRTnU+kLBEUx3XZL7av9YROXr -gZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov+BS5gLNdTaqX4fnk -GMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDceqFS -3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJm -Ozj/2ZQw9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+ -l6mc1X5VTMbeRRAc6uk7nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6c -JfTzPV4e0hz5sy229zdcxsshTrD3mUcYhcErulWuBurQB7Lcq9CClnXO0lD+mefP -L5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB60PZ2Pierc+xYw5F9KBa -LJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fqdBb9HxEG -mpv0 ------END CERTIFICATE----- - -# Issuer: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation -# Subject: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation -# Label: "Microsoft ECC Root Certificate Authority 2017" -# Serial: 136839042543790627607696632466672567020 -# MD5 Fingerprint: dd:a1:03:e6:4a:93:10:d1:bf:f0:19:42:cb:fe:ed:67 -# SHA1 Fingerprint: 99:9a:64:c3:7f:f4:7d:9f:ab:95:f1:47:69:89:14:60:ee:c4:c3:c5 -# SHA256 Fingerprint: 35:8d:f3:9d:76:4a:f9:e1:b7:66:e9:c9:72:df:35:2e:e1:5c:fa:c2:27:af:6a:d1:d7:0e:8e:4a:6e:dc:ba:02 ------BEGIN CERTIFICATE----- -MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYD -VQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw -MTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4MjMxNjA0WjBlMQswCQYDVQQGEwJV -UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNy -b3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZR -ogPZnZH6thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYb -hGBKia/teQ87zvH2RPUBeMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBTIy5lycFIM+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3 -FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlfXu5gKcs68tvWMoQZP3zV -L8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaReNtUjGUB -iudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= ------END CERTIFICATE----- - -# Issuer: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation -# Subject: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation -# Label: "Microsoft RSA Root Certificate Authority 2017" -# Serial: 40975477897264996090493496164228220339 -# MD5 Fingerprint: 10:ff:00:ff:cf:c9:f8:c7:7a:c0:ee:35:8e:c9:0f:47 -# SHA1 Fingerprint: 73:a5:e6:4a:3b:ff:83:16:ff:0e:dc:cc:61:8a:90:6e:4e:ae:4d:74 -# SHA256 Fingerprint: c7:41:f7:0f:4b:2a:8d:88:bf:2e:71:c1:41:22:ef:53:ef:10:eb:a0:cf:a5:e6:4c:fa:20:f4:18:85:30:73:e0 ------BEGIN CERTIFICATE----- -MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBl -MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw -NAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIwNzE4MjMwMDIzWjBlMQswCQYDVQQG -EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1N -aWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZ -Nt9GkMml7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0 -ZdDMbRnMlfl7rEqUrQ7eS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1 -HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw71VdyvD/IybLeS2v4I2wDwAW9lcfNcztm -gGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+dkC0zVJhUXAoP8XFWvLJ -jEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49FyGcohJUc -aDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaG -YaRSMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6 -W6IYZVcSn2i51BVrlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4K -UGsTuqwPN1q3ErWQgR5WrlcihtnJ0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH -+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJClTUFLkqqNfs+avNJVgyeY+Q -W5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZC -LgLNFgVZJ8og6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OC -gMNPOsduET/m4xaRhPtthH80dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6 -tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk+ONVFT24bcMKpBLBaYVu32TxU5nh -SnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex/2kskZGT4d9Mozd2 -TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDyAmH3 -pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGR -xpl/j8nWZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiApp -GWSZI1b7rCoucL5mxAyE7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9 -dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKTc0QWbej09+CVgI+WXTik9KveCjCHk9hN -AHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D5KbvtwEwXlGjefVwaaZB -RA+GsCyRxj3qrg+E ------END CERTIFICATE----- - -# Issuer: CN=e-Szigno Root CA 2017 O=Microsec Ltd. -# Subject: CN=e-Szigno Root CA 2017 O=Microsec Ltd. -# Label: "e-Szigno Root CA 2017" -# Serial: 411379200276854331539784714 -# MD5 Fingerprint: de:1f:f6:9e:84:ae:a7:b4:21:ce:1e:58:7d:d1:84:98 -# SHA1 Fingerprint: 89:d4:83:03:4f:9e:9a:48:80:5f:72:37:d4:a9:a6:ef:cb:7c:1f:d1 -# SHA256 Fingerprint: be:b0:0b:30:83:9b:9b:c3:2c:32:e4:44:79:05:95:06:41:f2:64:21:b1:5e:d0:89:19:8b:51:8a:e2:ea:1b:99 ------BEGIN CERTIFICATE----- -MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNV -BAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRk -LjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJv -b3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZaFw00MjA4MjIxMjA3MDZaMHExCzAJ -BgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMg -THRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25v -IFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtv -xie+RJCxs1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+H -Wyx7xf58etqjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBSHERUI0arBeAyxr87GyZDvvzAEwDAfBgNVHSMEGDAWgBSHERUI0arB -eAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEAtVfd14pVCzbhhkT61Nlo -jbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxOsvxyqltZ -+efcMQ== ------END CERTIFICATE----- - -# Issuer: O=CERTSIGN SA OU=certSIGN ROOT CA G2 -# Subject: O=CERTSIGN SA OU=certSIGN ROOT CA G2 -# Label: "certSIGN Root CA G2" -# Serial: 313609486401300475190 -# MD5 Fingerprint: 8c:f1:75:8a:c6:19:cf:94:b7:f7:65:20:87:c3:97:c7 -# SHA1 Fingerprint: 26:f9:93:b4:ed:3d:28:27:b0:b9:4b:a7:e9:15:1d:a3:8d:92:e5:32 -# SHA256 Fingerprint: 65:7c:fe:2f:a7:3f:aa:38:46:25:71:f3:32:a2:36:3a:46:fc:e7:02:09:51:71:07:02:cd:fb:b6:ee:da:33:05 ------BEGIN CERTIFICATE----- -MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV -BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g -Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ -BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ -R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF -dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw -vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ -uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp -n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs -cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW -xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P -rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF -DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx -DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy -LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C -eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ -d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq -kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC -b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl -qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0 -OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c -NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk -ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO -pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj -03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk -PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE -1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX -QRBdJ3NghVdJIgc= ------END CERTIFICATE----- - -# Issuer: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. -# Subject: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. -# Label: "Trustwave Global Certification Authority" -# Serial: 1846098327275375458322922162 -# MD5 Fingerprint: f8:1c:18:2d:2f:ba:5f:6d:a1:6c:bc:c7:ab:91:c7:0e -# SHA1 Fingerprint: 2f:8f:36:4f:e1:58:97:44:21:59:87:a5:2a:9a:d0:69:95:26:7f:b5 -# SHA256 Fingerprint: 97:55:20:15:f5:dd:fc:3c:87:88:c0:06:94:45:55:40:88:94:45:00:84:f1:00:86:70:86:bc:1a:2b:b5:8d:c8 ------BEGIN CERTIFICATE----- -MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQsw -CQYDVQQGEwJVUzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28x -ITAfBgNVBAoMGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1 -c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMx -OTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJVUzERMA8GA1UECAwI -SWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2ZSBI -b2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -ALldUShLPDeS0YLOvR29zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0Xzn -swuvCAAJWX/NKSqIk4cXGIDtiLK0thAfLdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu -7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4BqstTnoApTAbqOl5F2brz8 -1Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9oWN0EACyW -80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotP -JqX+OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1l -RtzuzWniTY+HKE40Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfw -hI0Vcnyh78zyiGG69Gm7DIwLdVcEuE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10 -coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm+9jaJXLE9gCxInm943xZYkqc -BW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqjifLJS3tBEW1n -twiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1Ud -DwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W -0OhUKDtkLSGm+J1WE2pIPU/HPinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfe -uyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0HZJDmHvUqoai7PF35owgLEQzxPy0Q -lG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla4gt5kNdXElE1GYhB -aCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5RvbbE -sLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPT -MaCm/zjdzyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qe -qu5AvzSxnI9O4fKSTx+O856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxh -VicGaeVyQYHTtgGJoC86cnn+OjC/QezHYj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8 -h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu3R3y4G5OBVixwJAWKqQ9 -EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP29FpHOTK -yeC2nOnOcXHebD8WpHk= ------END CERTIFICATE----- - -# Issuer: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. -# Subject: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. -# Label: "Trustwave Global ECC P256 Certification Authority" -# Serial: 4151900041497450638097112925 -# MD5 Fingerprint: 5b:44:e3:8d:5d:36:86:26:e8:0d:05:d2:59:a7:83:54 -# SHA1 Fingerprint: b4:90:82:dd:45:0c:be:8b:5b:b1:66:d3:e2:a4:08:26:cd:ed:42:cf -# SHA256 Fingerprint: 94:5b:bc:82:5e:a5:54:f4:89:d1:fd:51:a7:3d:df:2e:a6:24:ac:70:19:a0:52:05:22:5c:22:a7:8c:cf:a8:b4 ------BEGIN CERTIFICATE----- -MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYD -VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf -BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 -YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x -NzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYDVQQGEwJVUzERMA8G -A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 -d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF -Q0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqG -SM49AwEHA0IABH77bOYj43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoN -FWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqmP62jQzBBMA8GA1UdEwEB/wQFMAMBAf8w -DwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt0UrrdaVKEJmzsaGLSvcw -CgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjzRM4q3wgh -DDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 ------END CERTIFICATE----- - -# Issuer: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. -# Subject: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. -# Label: "Trustwave Global ECC P384 Certification Authority" -# Serial: 2704997926503831671788816187 -# MD5 Fingerprint: ea:cf:60:c4:3b:b9:15:29:40:a1:97:ed:78:27:93:d6 -# SHA1 Fingerprint: e7:f3:a3:c8:cf:6f:c3:04:2e:6d:0e:67:32:c5:9e:68:95:0d:5e:d2 -# SHA256 Fingerprint: 55:90:38:59:c8:c0:c3:eb:b8:75:9e:ce:4e:25:57:22:5f:f5:75:8b:bd:38:eb:d4:82:76:60:1e:1b:d5:80:97 ------BEGIN CERTIFICATE----- -MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYD -VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf -BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 -YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x -NzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYDVQQGEwJVUzERMA8G -A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 -d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF -Q0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuB -BAAiA2IABGvaDXU1CDFHBa5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJ -j9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr/TklZvFe/oyujUF5nQlgziip04pt89ZF -1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNVHQ8BAf8EBQMDBwYAMB0G -A1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNnADBkAjA3 -AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsC -MGclCrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVu -Sw== ------END CERTIFICATE----- - -# Issuer: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. -# Subject: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. -# Label: "NAVER Global Root Certification Authority" -# Serial: 9013692873798656336226253319739695165984492813 -# MD5 Fingerprint: c8:7e:41:f6:25:3b:f5:09:b3:17:e8:46:3d:bf:d0:9b -# SHA1 Fingerprint: 8f:6b:f2:a9:27:4a:da:14:a0:c4:f4:8e:61:27:f9:c0:1e:78:5d:d1 -# SHA256 Fingerprint: 88:f4:38:dc:f8:ff:d1:fa:8f:42:91:15:ff:e5:f8:2a:e1:e0:6e:0c:70:c3:75:fa:ad:71:7b:34:a4:9e:72:65 ------BEGIN CERTIFICATE----- -MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEM -BQAwaTELMAkGA1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRG -T1JNIENvcnAuMTIwMAYDVQQDDClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4NDJaFw0zNzA4MTgyMzU5NTlaMGkx -CzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVTUyBQTEFURk9STSBD -b3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVA -iQqrDZBbUGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH -38dq6SZeWYp34+hInDEW+j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lE -HoSTGEq0n+USZGnQJoViAbbJAh2+g1G7XNr4rRVqmfeSVPc0W+m/6imBEtRTkZaz -kVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2aacp+yPOiNgSnABIqKYP -szuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4Yb8Obtoq -vC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHf -nZ3zVHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaG -YQ5fG8Ir4ozVu53BA0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo -0es+nPxdGoMuK8u180SdOqcXYZaicdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3a -CJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejyYhbLgGvtPe31HzClrkvJE+2K -AQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNVHQ4EFgQU0p+I -36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB -Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoN -qo0hV4/GPnrK21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatj -cu3cvuzHV+YwIHHW1xDBE1UBjCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm -+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bxhYTeodoS76TiEJd6eN4MUZeoIUCL -hr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTgE34h5prCy8VCZLQe -lHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTHD8z7 -p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8 -piKCk5XQA76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLR -LBT/DShycpWbXgnbiUSYqqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX -5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oGI/hGoiLtk/bdmuYqh7GYVPEi92tF4+KO -dh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmgkpzNNIaRkPpkUZ3+/uul -9XXeifdy ------END CERTIFICATE----- - -# Issuer: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres -# Subject: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres -# Label: "AC RAIZ FNMT-RCM SERVIDORES SEGUROS" -# Serial: 131542671362353147877283741781055151509 -# MD5 Fingerprint: 19:36:9c:52:03:2f:d2:d1:bb:23:cc:dd:1e:12:55:bb -# SHA1 Fingerprint: 62:ff:d9:9e:c0:65:0d:03:ce:75:93:d2:ed:3f:2d:32:c9:e3:e5:4a -# SHA256 Fingerprint: 55:41:53:b1:3d:2c:f9:dd:b7:53:bf:be:1a:4e:0a:e0:8d:0a:a4:18:70:58:fe:60:a2:b8:62:b2:e4:b8:7b:cb ------BEGIN CERTIFICATE----- -MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQsw -CQYDVQQGEwJFUzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgw -FgYDVQRhDA9WQVRFUy1RMjgyNjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1S -Q00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4MTIyMDA5MzczM1oXDTQzMTIyMDA5 -MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQtUkNNMQ4wDAYDVQQL -DAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNBQyBS -QUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuB -BAAiA2IABPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LH -sbI6GA60XYyzZl2hNPk2LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oK -Um8BA06Oi6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqGSM49BAMDA2kAMGYCMQCu -SuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoDzBOQn5IC -MQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJy -v+c= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign Root R46 O=GlobalSign nv-sa -# Subject: CN=GlobalSign Root R46 O=GlobalSign nv-sa -# Label: "GlobalSign Root R46" -# Serial: 1552617688466950547958867513931858518042577 -# MD5 Fingerprint: c4:14:30:e4:fa:66:43:94:2a:6a:1b:24:5f:19:d0:ef -# SHA1 Fingerprint: 53:a2:b0:4b:ca:6b:d6:45:e6:39:8a:8e:c4:0d:d2:bf:77:c3:a2:90 -# SHA256 Fingerprint: 4f:a3:12:6d:8d:3a:11:d1:c4:85:5a:4f:80:7c:ba:d6:cf:91:9d:3a:5a:88:b0:3b:ea:2c:63:72:d9:3c:40:c9 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUA -MEYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYD -VQQDExNHbG9iYWxTaWduIFJvb3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMy -MDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt -c2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08EsCVeJ -OaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQG -vGIFAha/r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud -316HCkD7rRlr+/fKYIje2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo -0q3v84RLHIf8E6M6cqJaESvWJ3En7YEtbWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSE -y132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvjK8Cd+RTyG/FWaha/LIWF -zXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD412lPFzYE -+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCN -I/onccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzs -x2sZy/N78CsHpdlseVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqa -ByFrgY/bxFn63iLABJzjqls2k+g9vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC -4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEMBQADggIBAHx4 -7PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg -JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti -2kM3S+LGteWygxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIk -pnnpHs6i58FZFZ8d4kuaPp92CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRF -FRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZmOUdkLG5NrmJ7v2B0GbhWrJKsFjLt -rWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qqJZ4d16GLuc1CLgSk -ZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwyeqiv5 -u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP -4vkYxboznxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6 -N3ec592kD3ZDZopD8p/7DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3 -vouXsXgxT7PntgMTzlSdriVZzH81Xwj3QEUxeCp6 ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign Root E46 O=GlobalSign nv-sa -# Subject: CN=GlobalSign Root E46 O=GlobalSign nv-sa -# Label: "GlobalSign Root E46" -# Serial: 1552617690338932563915843282459653771421763 -# MD5 Fingerprint: b5:b8:66:ed:de:08:83:e3:c9:e2:01:34:06:ac:51:6f -# SHA1 Fingerprint: 39:b4:6c:d5:fe:80:06:eb:e2:2f:4a:bb:08:33:a0:af:db:b9:dd:84 -# SHA256 Fingerprint: cb:b9:c4:4d:84:b8:04:3e:10:50:ea:31:a6:9f:51:49:55:d7:bf:d2:e2:c6:b4:93:01:01:9a:d6:1d:9f:50:58 ------BEGIN CERTIFICATE----- -MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYx -CzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQD -ExNHbG9iYWxTaWduIFJvb3QgRTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAw -MDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex -HDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkBjtjq -R+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGdd -yXqBPCCjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBQxCpCPtsad0kRLgLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ -7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZkvLtoURMMA/cVi4RguYv/Uo7njLwcAjA8 -+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+CAezNIm8BZ/3Hobui3A= ------END CERTIFICATE----- - -# Issuer: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz -# Subject: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz -# Label: "ANF Secure Server Root CA" -# Serial: 996390341000653745 -# MD5 Fingerprint: 26:a6:44:5a:d9:af:4e:2f:b2:1d:b6:65:b0:4e:e8:96 -# SHA1 Fingerprint: 5b:6e:68:d0:cc:15:b6:a0:5f:1e:c1:5f:ae:02:fc:6b:2f:5d:6f:74 -# SHA256 Fingerprint: fb:8f:ec:75:91:69:b9:10:6b:1e:51:16:44:c6:18:c5:13:04:37:3f:6c:06:43:08:8d:8b:ef:fd:1b:99:75:99 ------BEGIN CERTIFICATE----- -MIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNV -BAUTCUc2MzI4NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlk -YWQgZGUgQ2VydGlmaWNhY2lvbjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNV -BAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3QgQ0EwHhcNMTkwOTA0MTAwMDM4WhcN -MzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEwMQswCQYDVQQGEwJF -UzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQwEgYD -VQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9v -dCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCj -cqQZAZ2cC4Ffc0m6p6zzBE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9q -yGFOtibBTI3/TO80sh9l2Ll49a2pcbnvT1gdpd50IJeh7WhM3pIXS7yr/2WanvtH -2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcvB2VSAKduyK9o7PQUlrZX -H1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXsezx76W0OL -zc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyR -p1RMVwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQz -W7i1o0TJrH93PB0j7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/ -SiOL9V8BY9KHcyi1Swr1+KuCLH5zJTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJn -LNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe8TZBAQIvfXOn3kLMTOmJDVb3 -n5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVOHj1tyRRM4y5B -u8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj -o1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC -AgEATh65isagmD9uw2nAalxJUqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L -9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzxj6ptBZNscsdW699QIyjlRRA96Gej -rw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDtdD+4E5UGUcjohybK -pFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM5gf0 -vPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjq -OknkJjCb5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ -/zo1PqVUSlJZS2Db7v54EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ9 -2zg/LFis6ELhDtjTO0wugumDLmsx2d1Hhk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI -+PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGyg77FGr8H6lnco4g175x2 -MjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3r5+qPeoo -tt7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw= ------END CERTIFICATE----- - -# Issuer: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority -# Subject: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority -# Label: "Certum EC-384 CA" -# Serial: 160250656287871593594747141429395092468 -# MD5 Fingerprint: b6:65:b3:96:60:97:12:a1:ec:4e:e1:3d:a3:c6:c9:f1 -# SHA1 Fingerprint: f3:3e:78:3c:ac:df:f4:a2:cc:ac:67:55:69:56:d7:e5:16:3c:e1:ed -# SHA256 Fingerprint: 6b:32:80:85:62:53:18:aa:50:d1:73:c9:8d:8b:da:09:d5:7e:27:41:3d:11:4c:f7:87:a0:f5:d0:6c:03:0c:f6 ------BEGIN CERTIFICATE----- -MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQsw -CQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScw -JQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMT -EENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2MDcyNDU0WhcNNDMwMzI2MDcyNDU0 -WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBT -LkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAX -BgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATE -KI6rGFtqvm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7Tm -Fy8as10CW4kjPMIRBSqniBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68Kj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI0GZnQkdjrzife81r1HfS+8 -EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjADVS2m5hjEfO/J -UG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0QoSZ/6vn -nvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Root CA" -# Serial: 40870380103424195783807378461123655149 -# MD5 Fingerprint: 51:e1:c2:e7:fe:4c:84:af:59:0e:2f:f4:54:6f:ea:29 -# SHA1 Fingerprint: c8:83:44:c0:18:ae:9f:cc:f1:87:b7:8f:22:d1:c5:d7:45:84:ba:e5 -# SHA256 Fingerprint: fe:76:96:57:38:55:77:3e:37:a9:5e:7a:d4:d9:cc:96:c3:01:57:c1:5d:31:76:5b:a9:b1:57:04:e1:ae:78:fd ------BEGIN CERTIFICATE----- -MIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6 -MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEu -MScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNV -BAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwHhcNMTgwMzE2MTIxMDEzWhcNNDMw -MzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEg -U3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZ -n0EGze2jusDbCSzBfN8pfktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/q -p1x4EaTByIVcJdPTsuclzxFUl6s1wB52HO8AU5853BSlLCIls3Jy/I2z5T4IHhQq -NwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2fJmItdUDmj0VDT06qKhF -8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGtg/BKEiJ3 -HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGa -mqi4NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi -7VdNIuJGmj8PkTQkfVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSF -ytKAQd8FqKPVhJBPC/PgP5sZ0jeJP/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0P -qafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSYnjYJdmZm/Bo/6khUHL4wvYBQ -v3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHKHRzQ+8S1h9E6 -Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1 -vALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQAD -ggIBAEii1QALLtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4 -WxmB82M+w85bj/UvXgF2Ez8sALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvo -zMrnadyHncI013nR03e4qllY/p0m+jiGPp2Kh2RX5Rc64vmNueMzeMGQ2Ljdt4NR -5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8CYyqOhNf6DR5UMEQ -GfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA4kZf -5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq -0Uc9NneoWWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7D -P78v3DSk+yshzWePS/Tj6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTM -qJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmTOPQD8rv7gmsHINFSH5pkAnuYZttcTVoP -0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZckbxJF0WddCajJFdr60qZf -E2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb ------END CERTIFICATE----- - -# Issuer: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique -# Subject: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique -# Label: "TunTrust Root CA" -# Serial: 108534058042236574382096126452369648152337120275 -# MD5 Fingerprint: 85:13:b9:90:5b:36:5c:b6:5e:b8:5a:f8:e0:31:57:b4 -# SHA1 Fingerprint: cf:e9:70:84:0f:e0:73:0f:9d:f6:0c:7f:2c:4b:ee:20:46:34:9c:bb -# SHA256 Fingerprint: 2e:44:10:2a:b5:8c:b8:54:19:45:1c:8e:19:d9:ac:f3:66:2c:af:bc:61:4b:6a:53:96:0a:30:f7:d0:e2:eb:41 ------BEGIN CERTIFICATE----- -MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQEL -BQAwYTELMAkGA1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUg -Q2VydGlmaWNhdGlvbiBFbGVjdHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJv -b3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQwNDI2MDg1NzU2WjBhMQswCQYDVQQG -EwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBDZXJ0aWZpY2F0aW9u -IEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZ -n56eY+hz2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd -2JQDoOw05TDENX37Jk0bbjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgF -VwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZ -GoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAdgjH8KcwAWJeRTIAAHDOF -li/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViWVSHbhlnU -r8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2 -eY8fTpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIb -MlEsPvLfe/ZdeikZjuXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISg -jwBUFfyRbVinljvrS5YnzWuioYasDXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB -7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwSVXAkPcvCFDVDXSdOvsC9qnyW -5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI04Y+oXNZtPdE -ITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 -90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+z -xiD2BkewhpMl0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYu -QEkHDVneixCwSQXi/5E/S7fdAo74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4 -FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRYYdZ2vyJ/0Adqp2RT8JeNnYA/u8EH -22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJpadbGNjHh/PqAulxP -xOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65xxBzn -dFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5 -Xc0yGYuPjCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7b -nV2UqL1g52KAdoGDDIzMMEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQ -CvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9zZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZH -u/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3rAZ3r2OvEhJn7wAzMMujj -d9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= ------END CERTIFICATE----- - -# Issuer: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA -# Subject: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA -# Label: "HARICA TLS RSA Root CA 2021" -# Serial: 76817823531813593706434026085292783742 -# MD5 Fingerprint: 65:47:9b:58:86:dd:2c:f0:fc:a2:84:1f:1e:96:c4:91 -# SHA1 Fingerprint: 02:2d:05:82:fa:88:ce:14:0c:06:79:de:7f:14:10:e9:45:d7:a5:6d -# SHA256 Fingerprint: d9:5d:0e:8e:da:79:52:5b:f9:be:b1:1b:14:d2:10:0d:32:94:98:5f:0c:62:d9:fa:bd:9c:d9:99:ec:cb:7b:1d ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBs -MQswCQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0Eg -Um9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUzOFoXDTQ1MDIxMzEwNTUzN1owbDEL -MAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl -YXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNBIFJv -b3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569l -mwVnlskNJLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE -4VGC/6zStGndLuwRo0Xua2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uv -a9of08WRiFukiZLRgeaMOVig1mlDqa2YUlhu2wr7a89o+uOkXjpFc5gH6l8Cct4M -pbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K5FrZx40d/JiZ+yykgmvw -Kh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEvdmn8kN3b -LW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcY -AuUR0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqB -AGMUuTNe3QvboEUHGjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYq -E613TBoYm5EPWNgGVMWX+Ko/IIqmhaZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHr -W2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQCPxrvrNQKlr9qEgYRtaQQJKQ -CoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAU -X15QvWiWkKQUEapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3 -f5Z2EMVGpdAgS1D0NTsY9FVqQRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxaja -H6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxDQpSbIPDRzbLrLFPCU3hKTwSUQZqP -JzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcRj88YxeMn/ibvBZ3P -zzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5vZSt -jBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0 -/L5H9MG0qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pT -BGIBnfHAT+7hOtSLIBD6Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79 -aPib8qXPMThcFarmlwDB31qlpzmq6YR/PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YW -xw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnnkf3/W9b3raYvAwtt41dU -63ZTGI0RmLo= ------END CERTIFICATE----- - -# Issuer: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA -# Subject: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA -# Label: "HARICA TLS ECC Root CA 2021" -# Serial: 137515985548005187474074462014555733966 -# MD5 Fingerprint: ae:f7:4c:e5:66:35:d1:b7:9b:8c:22:93:74:d3:4b:b0 -# SHA1 Fingerprint: bc:b0:c1:9d:e9:98:92:70:19:38:57:e9:8d:a7:b4:5d:6e:ee:01:48 -# SHA256 Fingerprint: 3f:99:cc:47:4a:cf:ce:4d:fe:d5:87:94:66:5e:47:8d:15:47:73:9f:2e:78:0f:1b:b4:ca:9b:13:30:97:d4:01 ------BEGIN CERTIFICATE----- -MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQsw -CQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2Vh -cmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9v -dCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoXDTQ1MDIxMzExMDEwOVowbDELMAkG -A1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj -aCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJvb3Qg -Q0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7 -KKrxcm1lAEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9Y -STHMmE5gEYd103KUkE+bECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQD -AgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAircJRQO9gcS3ujwLEXQNw -SaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/QwCZ61IygN -nxS2PFOiTAZpffpskcYqSUXm7LcT4Tps ------END CERTIFICATE----- - -# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" -# Serial: 1977337328857672817 -# MD5 Fingerprint: 4e:6e:9b:54:4c:ca:b7:fa:48:e4:90:b1:15:4b:1c:a3 -# SHA1 Fingerprint: 0b:be:c2:27:22:49:cb:39:aa:db:35:5c:53:e3:8c:ae:78:ff:b6:fe -# SHA256 Fingerprint: 57:de:05:83:ef:d2:b2:6e:03:61:da:99:da:9d:f4:64:8d:ef:7e:e8:44:1c:3b:72:8a:fa:9b:cd:e0:f9:b2:6a ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1 -MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 -thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM -cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG -L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i -NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h -X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b -m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy -Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja -EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T -KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF -6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh -OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1UdDgQWBBRlzeurNR4APn7VdMAc -tHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4wgZswgZgGBFUd -IAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j -b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABC -AG8AbgBhAG4AbwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAw -ADEANzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9m -iWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL4QjbEwj4KKE1soCzC1HA01aajTNF -Sa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDbLIpgD7dvlAceHabJ -hfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1ilI45P -Vf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZE -EAEeiGaPcjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV -1aUsIC+nmCjuRfzxuIgALI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2t -CsvMo2ebKHTEm9caPARYpoKdrcd7b/+Alun4jWq9GJAd/0kakFI3ky88Al2CdgtR -5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH9IBk9W6VULgRfhVwOEqw -f9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpfNIbnYrX9 -ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNK -GbqEZycPvEJdvSRUDewdcAZfpLz6IHxV ------END CERTIFICATE----- - -# Issuer: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd. -# Subject: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd. -# Label: "vTrus ECC Root CA" -# Serial: 630369271402956006249506845124680065938238527194 -# MD5 Fingerprint: de:4b:c1:f5:52:8c:9b:43:e1:3e:8f:55:54:17:8d:85 -# SHA1 Fingerprint: f6:9c:db:b0:fc:f6:02:13:b6:52:32:a6:a3:91:3f:16:70:da:c3:e1 -# SHA256 Fingerprint: 30:fb:ba:2c:32:23:8e:2a:98:54:7a:f9:79:31:e5:50:42:8b:9b:3f:1c:8e:eb:66:33:dc:fa:86:c5:b2:7d:d3 ------BEGIN CERTIFICATE----- -MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMw -RzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAY -BgNVBAMTEXZUcnVzIEVDQyBSb290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDcz -MTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28u -LEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+cToL0 -v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUd -e4BdS49nTPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIw -V53dVvHH4+m4SVBrm2nDb+zDfSXkV5UTQJtS0zvzQBm8JsctBp61ezaf9SXUY2sA -AjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQLYgmRWAD5Tfs0aNoJrSEG -GJTO ------END CERTIFICATE----- - -# Issuer: CN=vTrus Root CA O=iTrusChina Co.,Ltd. -# Subject: CN=vTrus Root CA O=iTrusChina Co.,Ltd. -# Label: "vTrus Root CA" -# Serial: 387574501246983434957692974888460947164905180485 -# MD5 Fingerprint: b8:c9:37:df:fa:6b:31:84:64:c5:ea:11:6a:1b:75:fc -# SHA1 Fingerprint: 84:1a:69:fb:f5:cd:1a:25:34:13:3d:e3:f8:fc:b8:99:d0:c9:14:b7 -# SHA256 Fingerprint: 8a:71:de:65:59:33:6f:42:6c:26:e5:38:80:d0:0d:88:a1:8d:a4:c6:a9:1f:0d:cb:61:94:e2:06:c5:c9:63:87 ------BEGIN CERTIFICATE----- -MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQEL -BQAwQzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4x -FjAUBgNVBAMTDXZUcnVzIFJvb3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMx -MDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoGA1UEChMTaVRydXNDaGluYSBDby4s -THRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZotsSKYc -IrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykU -AyyNJJrIZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+ -GrPSbcKvdmaVayqwlHeFXgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z9 -8Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KAYPxMvDVTAWqXcoKv8R1w6Jz1717CbMdH -flqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70kLJrxLT5ZOrpGgrIDajt -J8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2AXPKBlim -0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZN -pGvu/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQ -UqqzApVg+QxMaPnu1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHW -OXSuTEGC2/KmSNGzm/MzqvOmwMVO9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMB -AAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYgscasGrz2iTAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAKbqSSaet -8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd -nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1j -bhd47F18iMjrjld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvM -Kar5CKXiNxTKsbhm7xqC5PD48acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIiv -TDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJnxDHO2zTlJQNgJXtxmOTAGytfdELS -S8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554WgicEFOwE30z9J4nfr -I8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4sEb9 -b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNB -UvupLnKWnyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1P -Ti07NEPhmg4NpGaXutIcSkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929ven -sBxXVsFy6K2ir40zSbofitzmdHxghm+Hl3s= ------END CERTIFICATE----- - -# Issuer: CN=ISRG Root X2 O=Internet Security Research Group -# Subject: CN=ISRG Root X2 O=Internet Security Research Group -# Label: "ISRG Root X2" -# Serial: 87493402998870891108772069816698636114 -# MD5 Fingerprint: d3:9e:c4:1e:23:3c:a6:df:cf:a3:7e:6d:e0:14:e6:e5 -# SHA1 Fingerprint: bd:b1:b9:3c:d5:97:8d:45:c6:26:14:55:f8:db:95:c7:5a:d1:53:af -# SHA256 Fingerprint: 69:72:9b:8e:15:a8:6e:fc:17:7a:57:af:b7:17:1d:fc:64:ad:d2:8c:2f:ca:8c:f1:50:7e:34:45:3c:cb:14:70 ------BEGIN CERTIFICATE----- -MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw -CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg -R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00 -MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT -ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW -+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9 -ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI -zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW -tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1 -/q4AaOeMSQ+2b1tbFfLn ------END CERTIFICATE----- - -# Issuer: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd. -# Subject: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd. -# Label: "HiPKI Root CA - G1" -# Serial: 60966262342023497858655262305426234976 -# MD5 Fingerprint: 69:45:df:16:65:4b:e8:68:9a:8f:76:5f:ff:80:9e:d3 -# SHA1 Fingerprint: 6a:92:e4:a8:ee:1b:ec:96:45:37:e3:29:57:49:cd:96:e3:e5:d2:60 -# SHA256 Fingerprint: f0:15:ce:3c:c2:39:bf:ef:06:4b:e9:f1:d2:c4:17:e1:a0:26:4a:0a:94:be:1f:0c:8d:12:18:64:eb:69:49:cc ------BEGIN CERTIFICATE----- -MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBP -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xGzAZBgNVBAMMEkhpUEtJIFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRa -Fw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3 -YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kgUm9vdCBDQSAtIEcx -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0o9Qw -qNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twv -Vcg3Px+kwJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6 -lZgRZq2XNdZ1AYDgr/SEYYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnz -Qs7ZngyzsHeXZJzA9KMuH5UHsBffMNsAGJZMoYFL3QRtU6M9/Aes1MU3guvklQgZ -KILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfdhSi8MEyr48KxRURHH+CK -FgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj1jOXTyFj -HluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDr -y+K49a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ -/W3c1pzAtH2lsN0/Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgM -a/aOEmem8rJY5AIJEzypuxC00jBF8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6 -fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQDAgGGMA0GCSqG -SIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi -7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqc -SE5XCV0vrPSltJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6Fza -ZsT0pPBWGTMpWmWSBUdGSquEwx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9Tc -XzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07QJNBAsNB1CI69aO4I1258EHBGG3zg -iLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv5wiZqAxeJoBF1Pho -L5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+GpzjLrF -Ne85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wr -kkVbbiVghUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+ -vhV4nYWBSipX3tUZQ9rbyltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQU -YDksswBVLuT1sw5XxJFBAJw/6KXf6vb/yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Label: "GlobalSign ECC Root CA - R4" -# Serial: 159662223612894884239637590694 -# MD5 Fingerprint: 26:29:f8:6d:e1:88:bf:a2:65:7f:aa:c4:cd:0f:7f:fc -# SHA1 Fingerprint: 6b:a0:b0:98:e1:71:ef:5a:ad:fe:48:15:80:77:10:f4:bd:6f:0b:28 -# SHA256 Fingerprint: b0:85:d7:0b:96:4f:19:1a:73:e4:af:0d:54:ae:7a:0e:07:aa:fd:af:9b:71:dd:08:62:13:8a:b7:32:5a:24:a2 ------BEGIN CERTIFICATE----- -MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYD -VQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2Jh -bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgw -MTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0g -UjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wWTAT -BgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkWymOx -uYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNV -HQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/ -+wpu+74zyTyjhNUwCgYIKoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147 -bmF0774BxL4YSFlhgjICICadVGNA3jdgUM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R1 O=Google Trust Services LLC -# Subject: CN=GTS Root R1 O=Google Trust Services LLC -# Label: "GTS Root R1" -# Serial: 159662320309726417404178440727 -# MD5 Fingerprint: 05:fe:d0:bf:71:a8:a3:76:63:da:01:e0:d8:52:dc:40 -# SHA1 Fingerprint: e5:8c:1c:c4:91:3b:38:63:4b:e9:10:6e:e3:ad:8e:6b:9d:d9:81:4a -# SHA256 Fingerprint: d9:47:43:2a:bd:e7:b7:fa:90:fc:2e:6b:59:10:1b:12:80:e0:e1:c7:e4:e4:0f:a3:c6:88:7f:ff:57:a7:f4:cf ------BEGIN CERTIFICATE----- -MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo -27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w -Cl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw -TcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl -qAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH -szVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8 -Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk -MiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 -wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p -aDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN -VjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID -AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb -C5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe -QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy -h6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4 -7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J -ZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef -MgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/ -Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT -6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ -0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm -2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb -bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R2 O=Google Trust Services LLC -# Subject: CN=GTS Root R2 O=Google Trust Services LLC -# Label: "GTS Root R2" -# Serial: 159662449406622349769042896298 -# MD5 Fingerprint: 1e:39:c0:53:e6:1e:29:82:0b:ca:52:55:36:5d:57:dc -# SHA1 Fingerprint: 9a:44:49:76:32:db:de:fa:d0:bc:fb:5a:7b:17:bd:9e:56:09:24:94 -# SHA256 Fingerprint: 8d:25:cd:97:22:9d:bf:70:35:6b:da:4e:b3:cc:73:40:31:e2:4c:f0:0f:af:cf:d3:2d:c7:6e:b5:84:1c:7e:a8 ------BEGIN CERTIFICATE----- -MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3LvCvpt -nfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY -6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAu -MC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7k -RXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWg -f9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1mKPV -+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K8Yzo -dDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW -Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKa -G73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCq -gc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwID -AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBAB/Kzt3H -vqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 -0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyC -B19m3H0Q/gxhswWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2u -NmSRXbBoGOqKYcl3qJfEycel/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMg -yALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVnjWQye+mew4K6Ki3pHrTgSAai/Gev -HyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y59PYjJbigapordwj6 -xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M7YNR -TOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924Sg -JPFI/2R80L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV -7LXTWtiBmelDGDfrs7vRWGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl -6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjWHYbL ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R3 O=Google Trust Services LLC -# Subject: CN=GTS Root R3 O=Google Trust Services LLC -# Label: "GTS Root R3" -# Serial: 159662495401136852707857743206 -# MD5 Fingerprint: 3e:e7:9d:58:02:94:46:51:94:e5:e0:22:4a:8b:e7:73 -# SHA1 Fingerprint: ed:e5:71:80:2b:c8:92:b9:5b:83:3c:d2:32:68:3f:09:cd:a0:1e:46 -# SHA256 Fingerprint: 34:d8:a7:3e:e2:08:d9:bc:db:0d:95:65:20:93:4b:4e:40:e6:94:82:59:6e:8b:6f:73:c8:42:6b:01:0a:6f:48 ------BEGIN CERTIFICATE----- -MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYD -VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG -A1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw -WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz -IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNi -AAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout736G -jOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL2 -4CejQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7 -VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azTL818+FsuVbu/3ZL3pAzcMeGiAjEA/Jdm -ZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV11RZt+cRLInUue4X ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R4 O=Google Trust Services LLC -# Subject: CN=GTS Root R4 O=Google Trust Services LLC -# Label: "GTS Root R4" -# Serial: 159662532700760215368942768210 -# MD5 Fingerprint: 43:96:83:77:19:4d:76:b3:9d:65:52:e4:1d:22:a5:e8 -# SHA1 Fingerprint: 77:d3:03:67:b5:e0:0c:15:f6:0c:38:61:df:7c:e1:3b:92:46:4d:47 -# SHA256 Fingerprint: 34:9d:fa:40:58:c5:e2:63:12:3b:39:8a:e7:95:57:3c:4e:13:13:c8:3f:e6:8f:93:55:6c:d5:e8:03:1b:3c:7d ------BEGIN CERTIFICATE----- -MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYD -VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG -A1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw -WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz -IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi -AATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzuhXyi -QHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvR -HYqjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D -9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/Cr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8 -p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD ------END CERTIFICATE----- - -# Issuer: CN=Telia Root CA v2 O=Telia Finland Oyj -# Subject: CN=Telia Root CA v2 O=Telia Finland Oyj -# Label: "Telia Root CA v2" -# Serial: 7288924052977061235122729490515358 -# MD5 Fingerprint: 0e:8f:ac:aa:82:df:85:b1:f4:dc:10:1c:fc:99:d9:48 -# SHA1 Fingerprint: b9:99:cd:d1:73:50:8a:c4:47:05:08:9c:8c:88:fb:be:a0:2b:40:cd -# SHA256 Fingerprint: 24:2b:69:74:2f:cb:1e:5b:2a:bf:98:89:8b:94:57:21:87:54:4e:5b:4d:99:11:78:65:73:62:1f:6a:74:b8:2c ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQx -CzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UE -AwwQVGVsaWEgUm9vdCBDQSB2MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1 -NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZ -MBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ76zBq -AMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9 -vVYiQJ3q9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9 -lRdU2HhE8Qx3FZLgmEKnpNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTOD -n3WhUidhOPFZPY5Q4L15POdslv5e2QJltI5c0BE0312/UqeBAMN/mUWZFdUXyApT -7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW5olWK8jjfN7j/4nlNW4o -6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNrRBH0pUPC -TEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6 -WT0EBXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63R -DolUK5X6wK0dmBR4M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZI -pEYslOqodmJHixBTB0hXbOKSTbauBcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGj -YzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7Wxy+G2CQ5MB0GA1UdDgQWBBRy -rOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ -8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi -0f6X+J8wfBj5tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMM -A8iZGok1GTzTyVR8qPAs5m4HeW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBS -SRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+Cy748fdHif64W1lZYudogsYMVoe+K -TTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygCQMez2P2ccGrGKMOF -6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15h2Er -3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMt -Ty3EHD70sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pT -VmBds9hCG1xLEooc6+t9xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAW -ysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQraVplI/owd8k+BsHMYeB2F326CjYSlKA -rBPuUBQemMc= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH -# Subject: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH -# Label: "D-TRUST BR Root CA 1 2020" -# Serial: 165870826978392376648679885835942448534 -# MD5 Fingerprint: b5:aa:4b:d5:ed:f7:e3:55:2e:8f:72:0a:f3:75:b8:ed -# SHA1 Fingerprint: 1f:5b:98:f0:e3:b5:f7:74:3c:ed:e6:b0:36:7d:32:cd:f4:09:41:67 -# SHA256 Fingerprint: e5:9a:aa:81:60:09:c2:2b:ff:5b:25:ba:d3:7d:f3:06:f0:49:79:7c:1f:81:d8:5a:b0:89:e6:57:bd:8f:00:44 ------BEGIN CERTIFICATE----- -MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQsw -CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS -VVNUIEJSIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5 -NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG -A1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB -BAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7dPYS -zuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0 -QVK5buXuQqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/ -VbNafAkl1bK6CKBrqx9tMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g -PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2JyX3Jvb3Rf -Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l -dC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 -c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO -PQQDAwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFW -wKrY7RjEsK70PvomAjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHV -dWNbFJWcHwHP2NVypw87 ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH -# Subject: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH -# Label: "D-TRUST EV Root CA 1 2020" -# Serial: 126288379621884218666039612629459926992 -# MD5 Fingerprint: 8c:2d:9d:70:9f:48:99:11:06:11:fb:e9:cb:30:c0:6e -# SHA1 Fingerprint: 61:db:8c:21:59:69:03:90:d8:7c:9c:12:86:54:cf:9d:3d:f4:dd:07 -# SHA256 Fingerprint: 08:17:0d:1a:a3:64:53:90:1a:2f:95:92:45:e3:47:db:0c:8d:37:ab:aa:bc:56:b8:1a:a1:00:dc:95:89:70:db ------BEGIN CERTIFICATE----- -MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQsw -CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS -VVNUIEVWIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5 -NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG -A1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB -BAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8ZRCC -/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rD -wpdhQntJraOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3 -OqQo5FD4pPfsazK2/umLMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g -PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2V2X3Jvb3Rf -Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l -dC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 -c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO -PQQDAwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CA -y/m0sRtW9XLS/BnRAjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJb -gfM0agPnIjhQW+0ZT0MW ------END CERTIFICATE----- - -# Issuer: CN=DigiCert TLS ECC P384 Root G5 O=DigiCert, Inc. -# Subject: CN=DigiCert TLS ECC P384 Root G5 O=DigiCert, Inc. -# Label: "DigiCert TLS ECC P384 Root G5" -# Serial: 13129116028163249804115411775095713523 -# MD5 Fingerprint: d3:71:04:6a:43:1c:db:a6:59:e1:a8:a3:aa:c5:71:ed -# SHA1 Fingerprint: 17:f3:de:5e:9f:0f:19:e9:8e:f6:1f:32:26:6e:20:c4:07:ae:30:ee -# SHA256 Fingerprint: 01:8e:13:f0:77:25:32:cf:80:9b:d1:b1:72:81:86:72:83:fc:48:c6:e1:3b:e9:c6:98:12:85:4a:49:0c:1b:05 ------BEGIN CERTIFICATE----- -MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURp -Z2lDZXJ0IFRMUyBFQ0MgUDM4NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2 -MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJ -bmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQgUm9vdCBHNTB2MBAG -ByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1TzvdlHJS -7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp -0zVozptjn4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICIS -B4CIfBFqMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49 -BAMDA2gAMGUCMQCJao1H5+z8blUD2WdsJk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQ -LgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIxAJSdYsiJvRmEFOml+wG4 -DXZDjC5Ty3zfDBeWUA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert TLS RSA4096 Root G5 O=DigiCert, Inc. -# Subject: CN=DigiCert TLS RSA4096 Root G5 O=DigiCert, Inc. -# Label: "DigiCert TLS RSA4096 Root G5" -# Serial: 11930366277458970227240571539258396554 -# MD5 Fingerprint: ac:fe:f7:34:96:a9:f2:b3:b4:12:4b:e4:27:41:6f:e1 -# SHA1 Fingerprint: a7:88:49:dc:5d:7c:75:8c:8c:de:39:98:56:b3:aa:d0:b2:a5:71:35 -# SHA256 Fingerprint: 37:1a:00:dc:05:33:b3:72:1a:7e:eb:40:e8:41:9e:70:79:9d:2b:0a:0f:2c:1d:80:69:31:65:f7:ce:c4:ad:75 ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBN -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMT -HERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcN -NDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQs -IEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS87IE+ -ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG0 -2C+JFvuUAT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgp -wgscONyfMXdcvyej/Cestyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZM -pG2T6T867jp8nVid9E6P/DsjyG244gXazOvswzH016cpVIDPRFtMbzCe88zdH5RD -nU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnVDdXifBBiqmvwPXbzP6Po -sMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9qTXeXAaDx -Zre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cd -Lvvyz6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvX -KyY//SovcfXWJL5/MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNe -XoVPzthwiHvOAbWWl9fNff2C+MIkwcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPL -tgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4EFgQUUTMc7TZArxfTJc1paPKv -TiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN -AQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw -GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7H -PNtQOa27PShNlnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLF -O4uJ+DQtpBflF+aZfTCIITfNMBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQ -REtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/u4cnYiWB39yhL/btp/96j1EuMPik -AdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9GOUrYU9DzLjtxpdRv -/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh47a+ -p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilw -MUc/dNAUFvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WF -qUITVuwhd4GTWgzqltlJyqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCK -ovfepEWFJqgejF0pW8hL2JpqA15w8oVPbEtoL8pU9ozaMv7Da4M/OMZ+ ------END CERTIFICATE----- - -# Issuer: CN=Certainly Root R1 O=Certainly -# Subject: CN=Certainly Root R1 O=Certainly -# Label: "Certainly Root R1" -# Serial: 188833316161142517227353805653483829216 -# MD5 Fingerprint: 07:70:d4:3e:82:87:a0:fa:33:36:13:f4:fa:33:e7:12 -# SHA1 Fingerprint: a0:50:ee:0f:28:71:f4:27:b2:12:6d:6f:50:96:25:ba:cc:86:42:af -# SHA256 Fingerprint: 77:b8:2c:d8:64:4c:43:05:f7:ac:c5:cb:15:6b:45:67:50:04:03:3d:51:c6:0c:62:02:a8:e0:c3:34:67:d3:a0 ------BEGIN CERTIFICATE----- -MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAw -PTELMAkGA1UEBhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2Vy -dGFpbmx5IFJvb3QgUjEwHhcNMjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9 -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0 -YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANA2 -1B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O5MQT -vqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbed -aFySpvXl8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b0 -1C7jcvk2xusVtyWMOvwlDbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5 -r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGIXsXwClTNSaa/ApzSRKft43jvRl5tcdF5 -cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkNKPl6I7ENPT2a/Z2B7yyQ -wHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQAjeZjOVJ -6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA -2CnbrlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyH -Wyf5QBGenDPBt+U1VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMR -eiFPCyEQtkA6qyI6BJyLm4SGcprSp6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB -/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTgqj8ljZ9EXME66C6u -d0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAszHQNTVfSVcOQr -PbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d -8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi -1wrykXprOQ4vMMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrd -rRT90+7iIgXr0PK3aBLXWopBGsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9di -taY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+gjwN/KUD+nsa2UUeYNrEjvn8K8l7 -lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgHJBu6haEaBQmAupVj -yTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7fpYn -Kx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLy -yCwzk5Iwx06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5n -wXARPbv0+Em34yaXOp/SX3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6 -OV+KmalBWQewLK8= ------END CERTIFICATE----- - -# Issuer: CN=Certainly Root E1 O=Certainly -# Subject: CN=Certainly Root E1 O=Certainly -# Label: "Certainly Root E1" -# Serial: 8168531406727139161245376702891150584 -# MD5 Fingerprint: 0a:9e:ca:cd:3e:52:50:c6:36:f3:4b:a3:ed:a7:53:e9 -# SHA1 Fingerprint: f9:e1:6d:dc:01:89:cf:d5:82:45:63:3e:c5:37:7d:c2:eb:93:6f:2b -# SHA256 Fingerprint: b4:58:5f:22:e4:ac:75:6a:4e:86:12:a1:36:1c:5d:9d:03:1a:93:fd:84:fe:bb:77:8f:a3:06:8b:0f:c4:2d:c2 ------BEGIN CERTIFICATE----- -MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQsw -CQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlu -bHkgUm9vdCBFMTAeFw0yMTA0MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJ -BgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlubHkxGjAYBgNVBAMTEUNlcnRhaW5s -eSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4fxzf7flHh4axpMCK -+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9YBk2 -QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4 -hevIIgcwCgYIKoZIzj0EAwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozm -ut6Dacpps6kFtZaSF4fC0urQe87YQVt8rgIwRt7qy12a7DLCZRawTDBcMPPaTnOG -BtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR ------END CERTIFICATE----- - -# Issuer: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD. -# Subject: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD. -# Label: "Security Communication ECC RootCA1" -# Serial: 15446673492073852651 -# MD5 Fingerprint: 7e:43:b0:92:68:ec:05:43:4c:98:ab:5d:35:2e:7e:86 -# SHA1 Fingerprint: b8:0e:26:a9:bf:d2:b2:3b:c0:ef:46:c9:ba:c7:bb:f6:1d:0d:41:41 -# SHA256 Fingerprint: e7:4f:bd:a5:5b:d5:64:c4:73:a3:6b:44:1a:a7:99:c8:a6:8e:07:74:40:e8:28:8b:9f:a1:e5:0e:4b:ba:ca:11 ------BEGIN CERTIFICATE----- -MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYT -AkpQMSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYD -VQQDEyJTZWN1cml0eSBDb21tdW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYx -NjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTELMAkGA1UEBhMCSlAxJTAjBgNVBAoT -HFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNVBAMTIlNlY3VyaXR5 -IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQAIgNi -AASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+Cnnfdl -dB9sELLo5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpK -ULGjQjBAMB0GA1UdDgQWBBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu -9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3LsnNdo4gIxwwCMQDAqy0O -be0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70eN9k= ------END CERTIFICATE----- - -# Issuer: CN=BJCA Global Root CA1 O=BEIJING CERTIFICATE AUTHORITY -# Subject: CN=BJCA Global Root CA1 O=BEIJING CERTIFICATE AUTHORITY -# Label: "BJCA Global Root CA1" -# Serial: 113562791157148395269083148143378328608 -# MD5 Fingerprint: 42:32:99:76:43:33:36:24:35:07:82:9b:28:f9:d0:90 -# SHA1 Fingerprint: d5:ec:8d:7b:4c:ba:79:f4:e7:e8:cb:9d:6b:ae:77:83:10:03:21:6a -# SHA256 Fingerprint: f3:89:6f:88:fe:7c:0a:88:27:66:a7:fa:6a:d2:74:9f:b5:7a:7f:3e:98:fb:76:9c:1f:a7:b0:9c:2c:44:d5:ae ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBU -MQswCQYDVQQGEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRI -T1JJVFkxHTAbBgNVBAMMFEJKQ0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAz -MTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkGA1UEBhMCQ04xJjAkBgNVBAoMHUJF -SUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRCSkNBIEdsb2Jh -bCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFmCL3Z -xRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZ -spDyRhySsTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O5 -58dnJCNPYwpj9mZ9S1WnP3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgR -at7GGPZHOiJBhyL8xIkoVNiMpTAK+BcWyqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll -5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRjeulumijWML3mG90Vr4Tq -nMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNnMoH1V6XK -V0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/ -pj+bOT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZO -z2nxbkRs1CTqjSShGL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXn -jSXWgXSHRtQpdaJCbPdzied9v3pKH9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+ -WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMBAAGjQjBAMB0GA1UdDgQWBBTF -7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4 -YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3Kli -awLwQ8hOnThJdMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u -+2D2/VnGKhs/I0qUJDAnyIm860Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88 -X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuhTaRjAv04l5U/BXCga99igUOLtFkN -SoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW4AB+dAb/OMRyHdOo -P2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmpGQrI -+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRz -znfSxqxx4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9 -eVzYH6Eze9mCUAyTF6ps3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2 -YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4SSPfSKcOYKMryMguTjClPPGAyzQWWYezy -r/6zcCwupvI= ------END CERTIFICATE----- - -# Issuer: CN=BJCA Global Root CA2 O=BEIJING CERTIFICATE AUTHORITY -# Subject: CN=BJCA Global Root CA2 O=BEIJING CERTIFICATE AUTHORITY -# Label: "BJCA Global Root CA2" -# Serial: 58605626836079930195615843123109055211 -# MD5 Fingerprint: 5e:0a:f6:47:5f:a6:14:e8:11:01:95:3f:4d:01:eb:3c -# SHA1 Fingerprint: f4:27:86:eb:6e:b8:6d:88:31:67:02:fb:ba:66:a4:53:00:aa:7a:a6 -# SHA256 Fingerprint: 57:4d:f6:93:1e:27:80:39:66:7b:72:0a:fd:c1:60:0f:c2:7e:b6:6d:d3:09:29:79:fb:73:85:64:87:21:28:82 ------BEGIN CERTIFICATE----- -MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQsw -CQYDVQQGEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJ -VFkxHTAbBgNVBAMMFEJKQ0EgR2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgy -MVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJ -TkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRCSkNBIEdsb2JhbCBS -b290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jlSR9B -IgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK+ -+kpRuDCK/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJK -sVF/BvDRgh9Obl+rg/xI1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA -94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8gUXOQwKhbYdDFUDn9hf7B -43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== ------END CERTIFICATE----- - -# Issuer: CN=Sectigo Public Server Authentication Root E46 O=Sectigo Limited -# Subject: CN=Sectigo Public Server Authentication Root E46 O=Sectigo Limited -# Label: "Sectigo Public Server Authentication Root E46" -# Serial: 88989738453351742415770396670917916916 -# MD5 Fingerprint: 28:23:f8:b2:98:5c:37:16:3b:3e:46:13:4e:b0:b3:01 -# SHA1 Fingerprint: ec:8a:39:6c:40:f0:2e:bc:42:75:d4:9f:ab:1c:1a:5b:67:be:d2:9a -# SHA256 Fingerprint: c9:0f:26:f0:fb:1b:40:18:b2:22:27:51:9b:5c:a2:b5:3e:2c:a5:b3:be:5c:f1:8e:fe:1b:ef:47:38:0c:53:83 ------BEGIN CERTIFICATE----- -MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQsw -CQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T -ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcN -MjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYG -A1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT -ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccC -WvkEN/U0NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+ -6xnOQ6OjQjBAMB0GA1UdDgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8B -Af8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNnADBkAjAn7qRa -qCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RHlAFWovgzJQxC36oCMB3q -4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21USAGKcw== ------END CERTIFICATE----- - -# Issuer: CN=Sectigo Public Server Authentication Root R46 O=Sectigo Limited -# Subject: CN=Sectigo Public Server Authentication Root R46 O=Sectigo Limited -# Label: "Sectigo Public Server Authentication Root R46" -# Serial: 156256931880233212765902055439220583700 -# MD5 Fingerprint: 32:10:09:52:00:d5:7e:6c:43:df:15:c0:b1:16:93:e5 -# SHA1 Fingerprint: ad:98:f9:f3:e4:7d:75:3b:65:d4:82:b3:a4:52:17:bb:6e:f5:e4:38 -# SHA256 Fingerprint: 7b:b6:47:a6:2a:ee:ac:88:bf:25:7a:a5:22:d0:1f:fe:a3:95:e0:ab:45:c7:3f:93:f6:56:54:ec:38:f2:5a:06 ------BEGIN CERTIFICATE----- -MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBf -MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQD -Ey1TZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYw -HhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEY -MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1Ymxp -YyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDa -ef0rty2k1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnz -SDBh+oF8HqcIStw+KxwfGExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xf -iOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMPFF1bFOdLvt30yNoDN9HWOaEhUTCDsG3X -ME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vuZDCQOc2TZYEhMbUjUDM3 -IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5QazYw6A3OAS -VYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgE -SJ/AwSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu -+Zd4KKTIRJLpfSYFplhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt -8uaZFURww3y8nDnAtOFr94MlI1fZEoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+L -HaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW6aWWrL3DkJiy4Pmi1KZHQ3xt -zwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWIIUkwDgYDVR0P -AQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c -mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQ -YKlJfp/imTYpE0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52 -gDY9hAaLMyZlbcp+nv4fjFg4exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZA -Fv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M0ejf5lG5Nkc/kLnHvALcWxxPDkjB -JYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI84HxZmduTILA7rpX -DhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9mpFui -TdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5 -dHn5HrwdVw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65 -LvKRRFHQV80MNNVIIb/bE/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp -0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmmJ1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAY -QqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL ------END CERTIFICATE----- - -# Issuer: CN=SSL.com TLS RSA Root CA 2022 O=SSL Corporation -# Subject: CN=SSL.com TLS RSA Root CA 2022 O=SSL Corporation -# Label: "SSL.com TLS RSA Root CA 2022" -# Serial: 148535279242832292258835760425842727825 -# MD5 Fingerprint: d8:4e:c6:59:30:d8:fe:a0:d6:7a:5a:2c:2c:69:78:da -# SHA1 Fingerprint: ec:2c:83:40:72:af:26:95:10:ff:0e:f2:03:ee:31:70:f6:78:9d:ca -# SHA256 Fingerprint: 8f:af:7d:2e:2c:b4:70:9b:b8:e0:b3:36:66:bf:75:a5:dd:45:b5:de:48:0f:8e:a8:d4:bf:e6:be:bc:17:f2:ed ------BEGIN CERTIFICATE----- -MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBO -MQswCQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQD -DBxTU0wuY29tIFRMUyBSU0EgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloX -DTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jw -b3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJvb3QgQ0EgMjAyMjCC -AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u9nTP -L3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OY -t6/wNr/y7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0ins -S657Lb85/bRi3pZ7QcacoOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3 -PnxEX4MN8/HdIGkWCVDi1FW24IBydm5MR7d1VVm0U3TZlMZBrViKMWYPHqIbKUBO -L9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDGD6C1vBdOSHtRwvzpXGk3 -R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEWTO6Af77w -dr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS -+YCk8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYS -d66UNHsef8JmAOSqg+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoG -AtUjHBPW6dvbxrB6y3snm/vg1UYk7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2f -gTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j -BBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsuN+7jhHonLs0Z -NbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt -hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsM -QtfhWsSWTVTNj8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvf -R4iyrT7gJ4eLSYwfqUdYe5byiB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJ -DPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjUo3KUQyxi4U5cMj29TH0ZR6LDSeeW -P4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqoENjwuSfr98t67wVy -lrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7EgkaibMOlq -bLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2w -AgDHbICivRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3q -r5nsLFR+jM4uElZI7xc7P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sji -Mho6/4UIyYOf8kpIEFR3N+2ivEC+5BB09+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU -98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA= ------END CERTIFICATE----- - -# Issuer: CN=SSL.com TLS ECC Root CA 2022 O=SSL Corporation -# Subject: CN=SSL.com TLS ECC Root CA 2022 O=SSL Corporation -# Label: "SSL.com TLS ECC Root CA 2022" -# Serial: 26605119622390491762507526719404364228 -# MD5 Fingerprint: 99:d7:5c:f1:51:36:cc:e9:ce:d9:19:2e:77:71:56:c5 -# SHA1 Fingerprint: 9f:5f:d9:1a:54:6d:f5:0c:71:f0:ee:7a:bd:17:49:98:84:73:e2:39 -# SHA256 Fingerprint: c3:2f:fd:9f:46:f9:36:d1:6c:36:73:99:09:59:43:4b:9a:d6:0a:af:bb:9e:7c:f3:36:54:f1:44:cc:1b:a1:43 ------BEGIN CERTIFICATE----- -MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQsw -CQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxT -U0wuY29tIFRMUyBFQ0MgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2 -MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3Jh -dGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3QgQ0EgMjAyMjB2MBAG -ByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWyJGYm -acCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFN -SeR7T5v15wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME -GDAWgBSJjy+j6CugFFR781a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NW -uCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp -15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w7deedWo1dlJF4AIxAMeN -b0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5Zn6g6g== ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot Root CA ECC TLS 2021 O=Atos -# Subject: CN=Atos TrustedRoot Root CA ECC TLS 2021 O=Atos -# Label: "Atos TrustedRoot Root CA ECC TLS 2021" -# Serial: 81873346711060652204712539181482831616 -# MD5 Fingerprint: 16:9f:ad:f1:70:ad:79:d6:ed:29:b4:d1:c5:79:70:a8 -# SHA1 Fingerprint: 9e:bc:75:10:42:b3:02:f3:81:f4:f7:30:62:d4:8f:c3:a7:51:b2:dd -# SHA256 Fingerprint: b2:fa:e5:3e:14:cc:d7:ab:92:12:06:47:01:ae:27:9c:1d:89:88:fa:cb:77:5f:a8:a0:08:91:4e:66:39:88:a8 ------BEGIN CERTIFICATE----- -MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4w -LAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0w -CwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0 -MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBF -Q0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMHYwEAYHKoZI -zj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6KDP/X -tXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4 -AjJn8ZQSb+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2 -KCXWfeBmmnoJsmo7jjPXNtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMD -aAAwZQIwW5kp85wxtolrbNa9d+F851F+uDrNozZffPc8dz7kUK2o59JZDCaOMDtu -CCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGYa3cpetskz2VAv9LcjBHo -9H1/IISpQuQo ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot Root CA RSA TLS 2021 O=Atos -# Subject: CN=Atos TrustedRoot Root CA RSA TLS 2021 O=Atos -# Label: "Atos TrustedRoot Root CA RSA TLS 2021" -# Serial: 111436099570196163832749341232207667876 -# MD5 Fingerprint: d4:d3:46:b8:9a:c0:9c:76:5d:9e:3a:c3:b9:99:31:d2 -# SHA1 Fingerprint: 18:52:3b:0d:06:37:e4:d6:3a:df:23:e4:98:fb:5b:16:fb:86:74:48 -# SHA256 Fingerprint: 81:a9:08:8e:a5:9f:b3:64:c5:48:a6:f8:55:59:09:9b:6f:04:05:ef:bf:18:e5:32:4e:c9:f4:57:ba:00:11:2f ------BEGIN CERTIFICATE----- -MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBM -MS4wLAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIx -MQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00 -MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBD -QSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMIICIjAN -BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BBl01Z -4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYv -Ye+W/CBGvevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZ -kmGbzSoXfduP9LVq6hdKZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDs -GY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt0xU6kGpn8bRrZtkh68rZYnxGEFzedUln -nkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVKPNe0OwANwI8f4UDErmwh -3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMYsluMWuPD -0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzy -geBYBr3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8 -ANSbhqRAvNncTFd+rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezB -c6eUWsuSZIKmAMFwoW4sKeFYV+xafJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lI -pw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU -dEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB -DAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS -4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPs -o0UvFJ/1TCplQ3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJ -qM7F78PRreBrAwA0JrRUITWXAdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuyw -xfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9GslA9hGCZcbUztVdF5kJHdWoOsAgM -rr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2VktafcxBPTy+av5EzH4 -AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9qTFsR -0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuY -o7Ey7Nmj1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5 -dDTedk+SKlOxJTnbPP/lPqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcE -oji2jbDwN/zIIX8/syQbPYtuzE2wFg2WHYMfRsCbvUOZ58SWLs5fyQ== ------END CERTIFICATE----- - -# Issuer: CN=TrustAsia Global Root CA G3 O=TrustAsia Technologies, Inc. -# Subject: CN=TrustAsia Global Root CA G3 O=TrustAsia Technologies, Inc. -# Label: "TrustAsia Global Root CA G3" -# Serial: 576386314500428537169965010905813481816650257167 -# MD5 Fingerprint: 30:42:1b:b7:bb:81:75:35:e4:16:4f:53:d2:94:de:04 -# SHA1 Fingerprint: 63:cf:b6:c1:27:2b:56:e4:88:8e:1c:23:9a:b6:2e:81:47:24:c3:c7 -# SHA256 Fingerprint: e0:d3:22:6a:eb:11:63:c2:e4:8f:f9:be:3b:50:b4:c6:43:1b:e7:bb:1e:ac:c5:c3:6b:5d:5e:c5:09:03:9a:08 ------BEGIN CERTIFICATE----- -MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEM -BQAwWjELMAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dp -ZXMsIEluYy4xJDAiBgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAe -Fw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEwMTlaMFoxCzAJBgNVBAYTAkNOMSUw -IwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQwIgYDVQQDDBtU -cnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNS -T1QY4SxzlZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqK -AtCWHwDNBSHvBm3dIZwZQ0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1 -nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/VP68czH5GX6zfZBCK70bwkPAPLfSIC7Ep -qq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1AgdB4SQXMeJNnKziyhWTXA -yB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm9WAPzJMs -hH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gX -zhqcD0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAv -kV34PmVACxmZySYgWmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msT -f9FkPz2ccEblooV7WIQn3MSAPmeamseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jA -uPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCFTIcQcf+eQxuulXUtgQIDAQAB -o2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj7zjKsK5Xf/Ih -MBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E -BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4 -wM8zAQLpw6o1D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2 -XFNFV1pF1AWZLy4jVe5jaN/TG3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1 -JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNjduMNhXJEIlU/HHzp/LgV6FL6qj6j -ITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstlcHboCoWASzY9M/eV -VHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys+TIx -xHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1on -AX1daBli2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d -7XB4tmBZrOFdRWOPyN9yaFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2Ntjj -gKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsASZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV -+Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFRJQJ6+N1rZdVtTTDIZbpo -FGWsJwt0ivKH ------END CERTIFICATE----- - -# Issuer: CN=TrustAsia Global Root CA G4 O=TrustAsia Technologies, Inc. -# Subject: CN=TrustAsia Global Root CA G4 O=TrustAsia Technologies, Inc. -# Label: "TrustAsia Global Root CA G4" -# Serial: 451799571007117016466790293371524403291602933463 -# MD5 Fingerprint: 54:dd:b2:d7:5f:d8:3e:ed:7c:e0:0b:2e:cc:ed:eb:eb -# SHA1 Fingerprint: 57:73:a5:61:5d:80:b2:e6:ac:38:82:fc:68:07:31:ac:9f:b5:92:5a -# SHA256 Fingerprint: be:4b:56:cb:50:56:c0:13:6a:52:6d:f4:44:50:8d:aa:36:a0:b5:4f:42:e4:ac:38:f7:2a:f4:70:e4:79:65:4c ------BEGIN CERTIFICATE----- -MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMw -WjELMAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs -IEluYy4xJDAiBgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0y -MTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJaMFoxCzAJBgNVBAYTAkNOMSUwIwYD -VQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQwIgYDVQQDDBtUcnVz -dEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATx -s8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbw -LxYI+hW8m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJij -YzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mD -pm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/pDHel4NZg6ZvccveMA4GA1UdDwEB/wQE -AwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AAbbd+NvBNEU/zy4k6LHiR -UKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xkdUfFVZDj -/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA== ------END CERTIFICATE----- - -# Issuer: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH -# Subject: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH -# Label: "Telekom Security TLS ECC Root 2020" -# Serial: 72082518505882327255703894282316633856 -# MD5 Fingerprint: c1:ab:fe:6a:10:2c:03:8d:bc:1c:22:32:c0:85:a7:fd -# SHA1 Fingerprint: c0:f8:96:c5:a9:3b:01:06:21:07:da:18:42:48:bc:e9:9d:88:d5:ec -# SHA256 Fingerprint: 57:8a:f4:de:d0:85:3f:4e:59:98:db:4a:ea:f9:cb:ea:8d:94:5f:60:b6:20:a3:8d:1a:3c:13:b2:bc:7b:a8:e1 ------BEGIN CERTIFICATE----- -MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQsw -CQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBH -bWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIw -MB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIzNTk1OVowYzELMAkGA1UEBhMCREUx -JzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkGA1UE -AwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqGSM49 -AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/O -tdKPD/M12kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDP -f8iAC8GXs7s1J8nCG6NCMEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6f -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cA -MGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZMo7k+5Dck2TOrbRBR2Di -z6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdUga/sf+Rn -27iQ7t0l ------END CERTIFICATE----- - -# Issuer: CN=Telekom Security TLS RSA Root 2023 O=Deutsche Telekom Security GmbH -# Subject: CN=Telekom Security TLS RSA Root 2023 O=Deutsche Telekom Security GmbH -# Label: "Telekom Security TLS RSA Root 2023" -# Serial: 44676229530606711399881795178081572759 -# MD5 Fingerprint: bf:5b:eb:54:40:cd:48:71:c4:20:8d:7d:de:0a:42:f2 -# SHA1 Fingerprint: 54:d3:ac:b3:bd:57:56:f6:85:9d:ce:e5:c3:21:e2:d4:ad:83:d0:93 -# SHA256 Fingerprint: ef:c6:5c:ad:bb:59:ad:b6:ef:e8:4d:a2:23:11:b3:56:24:b7:1b:3b:1e:a0:da:8b:66:55:17:4e:c8:97:86:46 ------BEGIN CERTIFICATE----- -MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBj -MQswCQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0 -eSBHbWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAy -MDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMyNzIzNTk1OVowYzELMAkGA1UEBhMC -REUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkG -A1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9 -cUD/h3VCKSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHV -cp6R+SPWcHu79ZvB7JPPGeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMA -U6DksquDOFczJZSfvkgdmOGjup5czQRxUX11eKvzWarE4GC+j4NSuHUaQTXtvPM6 -Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWol8hHD/BeEIvnHRz+sTug -BTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9FIS3R/qy -8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73J -co4vzLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg -8qKrBC7m8kwOFjQgrIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8 -rFEz0ciD0cmfHdRHNCk+y7AO+oMLKFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12 -mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7SWWO/gLCMk3PLNaaZlSJhZQNg -+y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtqeX -gj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2 -p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQ -pGv7qHBFfLp+sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm -9S3ul0A8Yute1hTWjOKWi0FpkzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErw -M807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy/SKE8YXJN3nptT+/XOR0so8RYgDd -GGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4mZqTuXNnQkYRIer+ -CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtzaL1t -xKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+ -w6jv/naaoqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aK -L4x35bcF7DvB7L6Gs4a8wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+lj -X273CXE2whJdV/LItM3z7gLfEdxquVeEHVlNjM7IDiPCtyaaEBRx/pOyiriA8A4Q -ntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0o82bNSQ3+pCTE4FCxpgm -dTdmQRCsu/WU48IxK63nI1bMNSWSs1A= ------END CERTIFICATE----- - -# Issuer: CN=FIRMAPROFESIONAL CA ROOT-A WEB O=Firmaprofesional SA -# Subject: CN=FIRMAPROFESIONAL CA ROOT-A WEB O=Firmaprofesional SA -# Label: "FIRMAPROFESIONAL CA ROOT-A WEB" -# Serial: 65916896770016886708751106294915943533 -# MD5 Fingerprint: 82:b2:ad:45:00:82:b0:66:63:f8:5f:c3:67:4e:ce:a3 -# SHA1 Fingerprint: a8:31:11:74:a6:14:15:0d:ca:77:dd:0e:e4:0c:5d:58:fc:a0:72:a5 -# SHA256 Fingerprint: be:f2:56:da:f2:6e:9c:69:bd:ec:16:02:35:97:98:f3:ca:f7:18:21:a0:3e:01:82:57:c5:3c:65:61:7f:3d:4a ------BEGIN CERTIFICATE----- -MIICejCCAgCgAwIBAgIQMZch7a+JQn81QYehZ1ZMbTAKBggqhkjOPQQDAzBuMQsw -CQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UE -YQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENB -IFJPT1QtQSBXRUIwHhcNMjIwNDA2MDkwMTM2WhcNNDcwMzMxMDkwMTM2WjBuMQsw -CQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UE -YQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENB -IFJPT1QtQSBXRUIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARHU+osEaR3xyrq89Zf -e9MEkVz6iMYiuYMQYneEMy3pA4jU4DP37XcsSmDq5G+tbbT4TIqk5B/K6k84Si6C -cyvHZpsKjECcfIr28jlgst7L7Ljkb+qbXbdTkBgyVcUgt5SjYzBhMA8GA1UdEwEB -/wQFMAMBAf8wHwYDVR0jBBgwFoAUk+FDY1w8ndYn81LsF7Kpryz3dvgwHQYDVR0O -BBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjO -PQQDAwNoADBlAjAdfKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgLcFBTApFw -hVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dG -XSaQpYXFuXqUPoeovQA= ------END CERTIFICATE----- - -# Issuer: CN=TWCA CYBER Root CA O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA CYBER Root CA O=TAIWAN-CA OU=Root CA -# Label: "TWCA CYBER Root CA" -# Serial: 85076849864375384482682434040119489222 -# MD5 Fingerprint: 0b:33:a0:97:52:95:d4:a9:fd:bb:db:6e:a3:55:5b:51 -# SHA1 Fingerprint: f6:b1:1c:1a:83:38:e9:7b:db:b3:a8:c8:33:24:e0:2d:9c:7f:26:66 -# SHA256 Fingerprint: 3f:63:bb:28:14:be:17:4e:c8:b6:43:9c:f0:8d:6d:56:f0:b7:c4:05:88:3a:56:48:a3:34:42:4d:6b:3e:c5:58 ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQ -MQswCQYDVQQGEwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290 -IENBMRswGQYDVQQDExJUV0NBIENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5 -WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQGEwJUVzESMBAGA1UEChMJVEFJV0FO -LUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NBIENZQkVSIFJvb3Qg -Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1sTs6P -40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxF -avcokPFhV8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/ -34bKS1PE2Y2yHer43CdTo0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684i -JkXXYJndzk834H/nY62wuFm40AZoNWDTNq5xQwTxaWV4fPMf88oon1oglWa0zbfu -j3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK/c/WMw+f+5eesRycnupf -Xtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkHIuNZW0CP -2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDA -S9TMfAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDA -oS/xUgXJP+92ZuJF2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzC -kHDXShi8fgGwsOsVHkQGzaRP6AzRwyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW -5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83QOGt4A1WNzAd -BgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB -AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0t -tGlTITVX1olNc79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn -68xDiBaiA9a5F/gZbG0jAn/xX9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNn -TKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDRIG4kqIQnoVesqlVYL9zZyvpoBJ7t -RCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq/p1hvIbZv97Tujqx -f36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0RFxbI -Qh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz -8ppy6rBePm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4 -NxKfKjLji7gh7MMrZQzvIt6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzX -xeSDwWrruoBa3lwtcHb4yOWHh8qgnaHlIhInD0Q9HWzq1MKLL295q39QpsQZp6F6 -t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X ------END CERTIFICATE----- - -# Issuer: CN=SecureSign Root CA12 O=Cybertrust Japan Co., Ltd. -# Subject: CN=SecureSign Root CA12 O=Cybertrust Japan Co., Ltd. -# Label: "SecureSign Root CA12" -# Serial: 587887345431707215246142177076162061960426065942 -# MD5 Fingerprint: c6:89:ca:64:42:9b:62:08:49:0b:1e:7f:e9:07:3d:e8 -# SHA1 Fingerprint: 7a:22:1e:3d:de:1b:06:ac:9e:c8:47:70:16:8e:3c:e5:f7:6b:06:f4 -# SHA256 Fingerprint: 3f:03:4b:b5:70:4d:44:b2:d0:85:45:a0:20:57:de:93:eb:f3:90:5f:ce:72:1a:cb:c7:30:c0:6d:da:ee:90:4e ------BEGIN CERTIFICATE----- -MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28u -LCBMdGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgw -NTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpD -eWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBS -b290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3emhF -KxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mt -p7JIKwccJ/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zd -J1M3s6oYwlkm7Fsf0uZlfO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gur -FzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBFEaCeVESE99g2zvVQR9wsMJvuwPWW0v4J -hscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1UefNzFJM3IFTQy2VYzxV4+K -h9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsF -AAOCAQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6Ld -mmQOmFxv3Y67ilQiLUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJ -mBClnW8Zt7vPemVV2zfrPIpyMpcemik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA -8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPSvWKErI4cqc1avTc7bgoitPQV -55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhgaaaI5gdka9at/ -yOPiZwud9AzqVN/Ssq+xIvEg37xEHA== ------END CERTIFICATE----- - -# Issuer: CN=SecureSign Root CA14 O=Cybertrust Japan Co., Ltd. -# Subject: CN=SecureSign Root CA14 O=Cybertrust Japan Co., Ltd. -# Label: "SecureSign Root CA14" -# Serial: 575790784512929437950770173562378038616896959179 -# MD5 Fingerprint: 71:0d:72:fa:92:19:65:5e:89:04:ac:16:33:f0:bc:d5 -# SHA1 Fingerprint: dd:50:c0:f7:79:b3:64:2e:74:a2:b8:9d:9f:d3:40:dd:bb:f0:f2:4f -# SHA256 Fingerprint: 4b:00:9c:10:34:49:4f:9a:b5:6b:ba:3b:a1:d6:27:31:fc:4d:20:d8:95:5a:dc:ec:10:a9:25:60:72:61:e3:38 ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEM -BQAwUTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28u -LCBMdGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgw -NzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpD -eWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBS -b290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh1oq/ -FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOg -vlIfX8xnbacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy -6pJxaeQp8E+BgQQ8sqVb1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo -/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9J -kdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOEkJTRX45zGRBdAuVwpcAQ -0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSxjVIHvXib -y8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac -18izju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs -0Wq2XSqypWa9a4X0dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIAB -SMbHdPTGrMNASRZhdCyvjG817XsYAFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVL -ApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeqYR3r6/wtbyPk -86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E -rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ib -ed87hwriZLoAymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopT -zfFP7ELyk+OZpDc8h7hi2/DsHzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHS -DCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPGFrojutzdfhrGe0K22VoF3Jpf1d+4 -2kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6qnsb58Nn4DSEC5MUo -FlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/OfVy -K4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6 -dB7h7sxaOgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtl -Lor6CZpO2oYofaphNdgOpygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB -365jJ6UeTo3cKXhZ+PmhIIynJkBugnLNeLLIjzwec+fBH7/PzqUqm9tEZDKgu39c -JRNItX+S ------END CERTIFICATE----- - -# Issuer: CN=SecureSign Root CA15 O=Cybertrust Japan Co., Ltd. -# Subject: CN=SecureSign Root CA15 O=Cybertrust Japan Co., Ltd. -# Label: "SecureSign Root CA15" -# Serial: 126083514594751269499665114766174399806381178503 -# MD5 Fingerprint: 13:30:fc:c4:62:a6:a9:de:b5:c1:68:af:b5:d2:31:47 -# SHA1 Fingerprint: cb:ba:83:c8:c1:5a:5d:f1:f9:73:6f:ca:d7:ef:28:13:06:4a:07:7d -# SHA256 Fingerprint: e7:78:f0:f0:95:fe:84:37:29:cd:1a:00:82:17:9e:53:14:a9:c2:91:44:28:05:e1:fb:1d:8f:b6:b8:88:6c:3a ------BEGIN CERTIFICATE----- -MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMw -UTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBM -dGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMy -NTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpDeWJl -cnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBSb290 -IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5GdCx4 -wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSR -ZHX+AezB2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT -9DAKBggqhkjOPQQDAwNoADBlAjEA2S6Jfl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp -4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJSwdLZrWeqrqgHkHZAXQ6 -bkU6iYAZezKYVWOr62Nuk22rGwlgMU4= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST BR Root CA 2 2023 O=D-Trust GmbH -# Subject: CN=D-TRUST BR Root CA 2 2023 O=D-Trust GmbH -# Label: "D-TRUST BR Root CA 2 2023" -# Serial: 153168538924886464690566649552453098598 -# MD5 Fingerprint: e1:09:ed:d3:60:d4:56:1b:47:1f:b7:0c:5f:1b:5f:85 -# SHA1 Fingerprint: 2d:b0:70:ee:71:94:af:69:68:17:db:79:ce:58:9f:a0:6b:96:f7:87 -# SHA256 Fingerprint: 05:52:e6:f8:3f:df:65:e8:fa:96:70:e6:66:df:28:a4:e2:13:40:b5:10:cb:e5:25:66:f9:7c:4f:b9:4b:2b:d1 ------BEGIN CERTIFICATE----- -MIIFqTCCA5GgAwIBAgIQczswBEhb2U14LnNLyaHcZjANBgkqhkiG9w0BAQ0FADBI -MQswCQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlE -LVRSVVNUIEJSIFJvb3QgQ0EgMiAyMDIzMB4XDTIzMDUwOTA4NTYzMVoXDTM4MDUw -OTA4NTYzMFowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEi -MCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDIgMjAyMzCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBAK7/CVmRgApKaOYkP7in5Mg6CjoWzckjYaCTcfKr -i3OPoGdlYNJUa2NRb0kz4HIHE304zQaSBylSa053bATTlfrdTIzZXcFhfUvnKLNE -gXtRr90zsWh81k5M/itoucpmacTsXld/9w3HnDY25QdgrMBM6ghs7wZ8T1soegj8 -k12b9py0i4a6Ibn08OhZWiihNIQaJZG2tY/vsvmA+vk9PBFy2OMvhnbFeSzBqZCT -Rphny4NqoFAjpzv2gTng7fC5v2Xx2Mt6++9zA84A9H3X4F07ZrjcjrqDy4d2A/wl -2ecjbwb9Z/Pg/4S8R7+1FhhGaRTMBffb00msa8yr5LULQyReS2tNZ9/WtT5PeB+U -cSTq3nD88ZP+npNa5JRal1QMNXtfbO4AHyTsA7oC9Xb0n9Sa7YUsOCIvx9gvdhFP -/Wxc6PWOJ4d/GUohR5AdeY0cW/jPSoXk7bNbjb7EZChdQcRurDhaTyN0dKkSw/bS -uREVMweR2Ds3OmMwBtHFIjYoYiMQ4EbMl6zWK11kJNXuHA7e+whadSr2Y23OC0K+ -0bpwHJwh5Q8xaRfX/Aq03u2AnMuStIv13lmiWAmlY0cL4UEyNEHZmrHZqLAbWt4N -DfTisl01gLmB1IRpkQLLddCNxbU9CZEJjxShFHR5PtbJFR2kWVki3PaKRT08EtY+ -XTIvAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUZ5Dw1t61 -GNVGKX5cq/ieCLxklRAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRCMEAwPqA8oDqG -OGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfYnJfcm9vdF9jYV8y -XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQA097N3U9swFrktpSHxQCF16+tI -FoE9c+CeJyrrd6kTpGoKWloUMz1oH4Guaf2Mn2VsNELZLdB/eBaxOqwjMa1ef67n -riv6uvw8l5VAk1/DLQOj7aRvU9f6QA4w9QAgLABMjDu0ox+2v5Eyq6+SmNMW5tTR -VFxDWy6u71cqqLRvpO8NVhTaIasgdp4D/Ca4nj8+AybmTNudX0KEPUUDAxxZiMrc -LmEkWqTqJwtzEr5SswrPMhfiHocaFpVIbVrg0M8JkiZmkdijYQ6qgYF/6FKC0ULn -4B0Y+qSFNueG4A3rvNTJ1jxD8V1Jbn6Bm2m1iWKPiFLY1/4nwSPFyysCu7Ff/vtD -hQNGvl3GyiEm/9cCnnRK3PgTFbGBVzbLZVzRHTF36SXDw7IyN9XxmAnkbWOACKsG -koHU6XCPpz+y7YaMgmo1yEJagtFSGkUPFaUA8JR7ZSdXOUPPfH/mvTWze/EZTN46 -ls/pdu4D58JDUjxqgejBWoC9EV2Ta/vH5mQ/u2kc6d0li690yVRAysuTEwrt+2aS -Ecr1wPrYg1UDfNPFIkZ1cGt5SAYqgpq/5usWDiJFAbzdNpQ0qTUmiteXue4Icr80 -knCDgKs4qllo3UCkGJCy89UDyibK79XH4I9TjvAA46jtn/mtd+ArY0+ew+43u3gJ -hJ65bvspmZDogNOfJA== ------END CERTIFICATE----- - -# Issuer: CN=TrustAsia TLS ECC Root CA O=TrustAsia Technologies, Inc. -# Subject: CN=TrustAsia TLS ECC Root CA O=TrustAsia Technologies, Inc. -# Label: "TrustAsia TLS ECC Root CA" -# Serial: 310892014698942880364840003424242768478804666567 -# MD5 Fingerprint: 09:48:04:77:d2:fc:65:93:71:66:b1:11:95:4f:06:8c -# SHA1 Fingerprint: b5:ec:39:f3:a1:66:37:ae:c3:05:94:57:e2:be:11:be:b7:a1:7f:36 -# SHA256 Fingerprint: c0:07:6b:9e:f0:53:1f:b1:a6:56:d6:7c:4e:be:97:cd:5d:ba:a4:1e:f4:45:98:ac:c2:48:98:78:c9:2d:87:11 ------BEGIN CERTIFICATE----- -MIICMTCCAbegAwIBAgIUNnThTXxlE8msg1UloD5Sfi9QaMcwCgYIKoZIzj0EAwMw -WDELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs -IEluYy4xIjAgBgNVBAMTGVRydXN0QXNpYSBUTFMgRUNDIFJvb3QgQ0EwHhcNMjQw -NTE1MDU0MTU2WhcNNDQwNTE1MDU0MTU1WjBYMQswCQYDVQQGEwJDTjElMCMGA1UE -ChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjEiMCAGA1UEAxMZVHJ1c3RB -c2lhIFRMUyBFQ0MgUm9vdCBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABLh/pVs/ -AT598IhtrimY4ZtcU5nb9wj/1WrgjstEpvDBjL1P1M7UiFPoXlfXTr4sP/MSpwDp -guMqWzJ8S5sUKZ74LYO1644xST0mYekdcouJtgq7nDM1D9rs3qlKH8kzsaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQULIVTu7FDzTLqnqOH/qKYqKaT6RAw -DgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMFRH18MtYYZI9HlaVQ01 -L18N9mdsd0AaRuf4aFtOJx24mH1/k78ITcTaRTChD15KeAIxAKORh/IRM4PDwYqR -OkwrULG9IpRdNYlzg8WbGf60oenUoWa2AaU2+dhoYSi3dOGiMQ== ------END CERTIFICATE----- - -# Issuer: CN=TrustAsia TLS RSA Root CA O=TrustAsia Technologies, Inc. -# Subject: CN=TrustAsia TLS RSA Root CA O=TrustAsia Technologies, Inc. -# Label: "TrustAsia TLS RSA Root CA" -# Serial: 160405846464868906657516898462547310235378010780 -# MD5 Fingerprint: 3b:9e:c3:86:0f:34:3c:6b:c5:46:c4:8e:1d:e7:19:12 -# SHA1 Fingerprint: a5:46:50:c5:62:ea:95:9a:1a:a7:04:6f:17:58:c7:29:53:3d:03:fa -# SHA256 Fingerprint: 06:c0:8d:7d:af:d8:76:97:1e:b1:12:4f:e6:7f:84:7e:c0:c7:a1:58:d3:ea:53:cb:e9:40:e2:ea:97:91:f4:c3 ------BEGIN CERTIFICATE----- -MIIFgDCCA2igAwIBAgIUHBjYz+VTPyI1RlNUJDxsR9FcSpwwDQYJKoZIhvcNAQEM -BQAwWDELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dp -ZXMsIEluYy4xIjAgBgNVBAMTGVRydXN0QXNpYSBUTFMgUlNBIFJvb3QgQ0EwHhcN -MjQwNTE1MDU0MTU3WhcNNDQwNTE1MDU0MTU2WjBYMQswCQYDVQQGEwJDTjElMCMG -A1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjEiMCAGA1UEAxMZVHJ1 -c3RBc2lhIFRMUyBSU0EgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC -AgoCggIBAMMWuBtqpERz5dZO9LnPWwvB0ZqB9WOwj0PBuwhaGnrhB3YmH49pVr7+ -NmDQDIPNlOrnxS1cLwUWAp4KqC/lYCZUlviYQB2srp10Zy9U+5RjmOMmSoPGlbYJ -Q1DNDX3eRA5gEk9bNb2/mThtfWza4mhzH/kxpRkQcwUqwzIZheo0qt1CHjCNP561 -HmHVb70AcnKtEj+qpklz8oYVlQwQX1Fkzv93uMltrOXVmPGZLmzjyUT5tUMnCE32 -ft5EebuyjBza00tsLtbDeLdM1aTk2tyKjg7/D8OmYCYozza/+lcK7Fs/6TAWe8Tb -xNRkoDD75f0dcZLdKY9BWN4ArTr9PXwaqLEX8E40eFgl1oUh63kd0Nyrz2I8sMeX -i9bQn9P+PN7F4/w6g3CEIR0JwqH8uyghZVNgepBtljhb//HXeltt08lwSUq6HTrQ -UNoyIBnkiz/r1RYmNzz7dZ6wB3C4FGB33PYPXFIKvF1tjVEK2sUYyJtt3LCDs3+j -TnhMmCWr8n4uIF6CFabW2I+s5c0yhsj55NqJ4js+k8UTav/H9xj8Z7XvGCxUq0DT -bE3txci3OE9kxJRMT6DNrqXGJyV1J23G2pyOsAWZ1SgRxSHUuPzHlqtKZFlhaxP8 -S8ySpg+kUb8OWJDZgoM5pl+z+m6Ss80zDoWo8SnTq1mt1tve1CuBAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFLgHkXlcBvRG/XtZylomkadFK/hT -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQwFAAOCAgEAIZtqBSBdGBanEqT3 -Rz/NyjuujsCCztxIJXgXbODgcMTWltnZ9r96nBO7U5WS/8+S4PPFJzVXqDuiGev4 -iqME3mmL5Dw8veWv0BIb5Ylrc5tvJQJLkIKvQMKtuppgJFqBTQUYo+IzeXoLH5Pt -7DlK9RME7I10nYEKqG/odv6LTytpEoYKNDbdgptvT+Bz3Ul/KD7JO6NXBNiT2Twp -2xIQaOHEibgGIOcberyxk2GaGUARtWqFVwHxtlotJnMnlvm5P1vQiJ3koP26TpUJ -g3933FEFlJ0gcXax7PqJtZwuhfG5WyRasQmr2soaB82G39tp27RIGAAtvKLEiUUj -pQ7hRGU+isFqMB3iYPg6qocJQrmBktwliJiJ8Xw18WLK7nn4GS/+X/jbh87qqA8M -pugLoDzga5SYnH+tBuYc6kIQX+ImFTw3OffXvO645e8D7r0i+yiGNFjEWn9hongP -XvPKnbwbPKfILfanIhHKA9jnZwqKDss1jjQ52MjqjZ9k4DewbNfFj8GQYSbbJIwe -SsCI3zWQzj8C9GRh3sfIB5XeMhg6j6JCQCTl1jNdfK7vsU1P1FeQNWrcrgSXSYk0 -ly4wBOeY99sLAZDBHwo/+ML+TvrbmnNzFrwFuHnYWa8G5z9nODmxfKuU4CkUpijy -323imttUQ/hHWKNddBWcwauwxzQ= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST EV Root CA 2 2023 O=D-Trust GmbH -# Subject: CN=D-TRUST EV Root CA 2 2023 O=D-Trust GmbH -# Label: "D-TRUST EV Root CA 2 2023" -# Serial: 139766439402180512324132425437959641711 -# MD5 Fingerprint: 96:b4:78:09:f0:09:cb:77:eb:bb:1b:4d:6f:36:bc:b6 -# SHA1 Fingerprint: a5:5b:d8:47:6c:8f:19:f7:4c:f4:6d:6b:b6:c2:79:82:22:df:54:8b -# SHA256 Fingerprint: 8e:82:21:b2:e7:d4:00:78:36:a1:67:2f:0d:cc:29:9c:33:bc:07:d3:16:f1:32:fa:1a:20:6d:58:71:50:f1:ce ------BEGIN CERTIFICATE----- -MIIFqTCCA5GgAwIBAgIQaSYJfoBLTKCnjHhiU19abzANBgkqhkiG9w0BAQ0FADBI -MQswCQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlE -LVRSVVNUIEVWIFJvb3QgQ0EgMiAyMDIzMB4XDTIzMDUwOTA5MTAzM1oXDTM4MDUw -OTA5MTAzMlowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEi -MCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDIgMjAyMzCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBANiOo4mAC7JXUtypU0w3uX9jFxPvp1sjW2l1sJkK -F8GLxNuo4MwxusLyzV3pt/gdr2rElYfXR8mV2IIEUD2BCP/kPbOx1sWy/YgJ25yE -7CUXFId/MHibaljJtnMoPDT3mfd/06b4HEV8rSyMlD/YZxBTfiLNTiVR8CUkNRFe -EMbsh2aJgWi6zCudR3Mfvc2RpHJqnKIbGKBv7FD0fUDCqDDPvXPIEysQEx6Lmqg6 -lHPTGGkKSv/BAQP/eX+1SH977ugpbzZMlWGG2Pmic4ruri+W7mjNPU0oQvlFKzIb -RlUWaqZLKfm7lVa/Rh3sHZMdwGWyH6FDrlaeoLGPaxK3YG14C8qKXO0elg6DpkiV -jTujIcSuWMYAsoS0I6SWhjW42J7YrDRJmGOVxcttSEfi8i4YHtAxq9107PncjLgc -jmgjutDzUNzPZY9zOjLHfP7KgiJPvo5iR2blzYfi6NUPGJ/lBHJLRjwQ8kTCZFZx -TnXonMkmdMV9WdEKWw9t/p51HBjGGjp82A0EzM23RWV6sY+4roRIPrN6TagD4uJ+ -ARZZaBhDM7DS3LAaQzXupdqpRlyuhoFBAUp0JuyfBr/CBTdkdXgpaP3F9ev+R/nk -hbDhezGdpn9yo7nELC7MmVcOIQxFAZRl62UJxmMiCzNJkkg8/M3OsD6Onov4/knF -NXJHAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqvyREBuH -kV8Wub9PS5FeAByxMoAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRCMEAwPqA8oDqG -OGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfZXZfcm9vdF9jYV8y -XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQCTy6UfmRHsmg1fLBWTxj++EI14 -QvBukEdHjqOSMo1wj/Zbjb6JzkcBahsgIIlbyIIQbODnmaprxiqgYzWRaoUlrRc4 -pZt+UPJ26oUFKidBK7GB0aL2QHWpDsvxVUjY7NHss+jOFKE17MJeNRqrphYBBo7q -3C+jisosketSjl8MmxfPy3MHGcRqwnNU73xDUmPBEcrCRbH0O1P1aa4846XerOhU -t7KR/aypH/KH5BfGSah82ApB9PI+53c0BFLd6IHyTS9URZ0V4U/M5d40VxDJI3IX -cI1QcB9WbMy5/zpaT2N6w25lBx2Eof+pDGOJbbJAiDnXH3dotfyc1dZnaVuodNv8 -ifYbMvekJKZ2t0dT741Jj6m2g1qllpBFYfXeA08mD6iL8AOWsKwV0HFaanuU5nCT -2vFp4LJiTZ6P/4mdm13NRemUAiKN4DV/6PEEeXFsVIP4M7kFMhtYVRFP0OUnR3Hs -7dpn1mKmS00PaaLJvOwiS5THaJQXfuKOKD62xur1NGyfN4gHONuGcfrNlUhDbqNP -gofXNJhuS5N5YHVpD/Aa1VP6IQzCP+k/HxiMkl14p3ZnGbuy6n/pcAlWVqOwDAst -Nl7F6cTVg8uGF5csbBNvh1qvSaYd2804BC5f4ko1Di1L+KIkBI3Y4WNeApI02phh -XBxvWHZks/wCuPWdCg== ------END CERTIFICATE----- - -# Issuer: CN=SwissSign RSA TLS Root CA 2022 - 1 O=SwissSign AG -# Subject: CN=SwissSign RSA TLS Root CA 2022 - 1 O=SwissSign AG -# Label: "SwissSign RSA TLS Root CA 2022 - 1" -# Serial: 388078645722908516278762308316089881486363258315 -# MD5 Fingerprint: 16:2e:e4:19:76:81:85:ba:8e:91:58:f1:15:ef:72:39 -# SHA1 Fingerprint: 81:34:0a:be:4c:cd:ce:cc:e7:7d:cc:8a:d4:57:e2:45:a0:77:5d:ce -# SHA256 Fingerprint: 19:31:44:f4:31:e0:fd:db:74:07:17:d4:de:92:6a:57:11:33:88:4b:43:60:d3:0e:27:29:13:cb:e6:60:ce:41 ------BEGIN CERTIFICATE----- -MIIFkzCCA3ugAwIBAgIUQ/oMX04bgBhE79G0TzUfRPSA7cswDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzErMCkGA1UE -AxMiU3dpc3NTaWduIFJTQSBUTFMgUm9vdCBDQSAyMDIyIC0gMTAeFw0yMjA2MDgx -MTA4MjJaFw00NzA2MDgxMTA4MjJaMFExCzAJBgNVBAYTAkNIMRUwEwYDVQQKEwxT -d2lzc1NpZ24gQUcxKzApBgNVBAMTIlN3aXNzU2lnbiBSU0EgVExTIFJvb3QgQ0Eg -MjAyMiAtIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDLKmjiC8NX -vDVjvHClO/OMPE5Xlm7DTjak9gLKHqquuN6orx122ro10JFwB9+zBvKK8i5VUXu7 -LCTLf5ImgKO0lPaCoaTo+nUdWfMHamFk4saMla+ju45vVs9xzF6BYQ1t8qsCLqSX -5XH8irCRIFucdFJtrhUnWXjyCcplDn/L9Ovn3KlMd/YrFgSVrpxxpT8q2kFC5zyE -EPThPYxr4iuRR1VPuFa+Rd4iUU1OKNlfGUEGjw5NBuBwQCMBauTLE5tzrE0USJIt -/m2n+IdreXXhvhCxqohAWVTXz8TQm0SzOGlkjIHRI36qOTw7D59Ke4LKa2/KIj4x -0LDQKhySio/YGZxH5D4MucLNvkEM+KRHBdvBFzA4OmnczcNpI/2aDwLOEGrOyvi5 -KaM2iYauC8BPY7kGWUleDsFpswrzd34unYyzJ5jSmY0lpx+Gs6ZUcDj8fV3oT4MM -0ZPlEuRU2j7yrTrePjxF8CgPBrnh25d7mUWe3f6VWQQvdT/TromZhqwUtKiE+shd -OxtYk8EXlFXIC+OCeYSf8wCENO7cMdWP8vpPlkwGqnj73mSiI80fPsWMvDdUDrta -clXvyFu1cvh43zcgTFeRc5JzrBh3Q4IgaezprClG5QtO+DdziZaKHG29777YtvTK -wP1H8K4LWCDFyB02rpeNUIMmJCn3nTsPBQIDAQABo2MwYTAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBRvjmKLk0Ow4UD2p8P98Q+4 -DxU4pTAdBgNVHQ4EFgQUb45ii5NDsOFA9qfD/fEPuA8VOKUwDQYJKoZIhvcNAQEL -BQADggIBAKwsKUF9+lz1GpUYvyypiqkkVHX1uECry6gkUSsYP2OprphWKwVDIqO3 -10aewCoSPY6WlkDfDDOLazeROpW7OSltwAJsipQLBwJNGD77+3v1dj2b9l4wBlgz -Hqp41eZUBDqyggmNzhYzWUUo8aWjlw5DI/0LIICQ/+Mmz7hkkeUFjxOgdg3XNwwQ -iJb0Pr6VvfHDffCjw3lHC1ySFWPtUnWK50Zpy1FVCypM9fJkT6lc/2cyjlUtMoIc -gC9qkfjLvH4YoiaoLqNTKIftV+Vlek4ASltOU8liNr3CjlvrzG4ngRhZi0Rjn9UM -ZfQpZX+RLOV/fuiJz48gy20HQhFRJjKKLjpHE7iNvUcNCfAWpO2Whi4Z2L6MOuhF -LhG6rlrnub+xzI/goP+4s9GFe3lmozm1O2bYQL7Pt2eLSMkZJVX8vY3PXtpOpvJp -zv1/THfQwUY1mFwjmwJFQ5Ra3bxHrSL+ul4vkSkphnsh3m5kt8sNjzdbowhq6/Td -Ao9QAwKxuDdollDruF/UKIqlIgyKhPBZLtU30WHlQnNYKoH3dtvi4k0NX/a3vgW0 -rk4N3hY9A4GzJl5LuEsAz/+MF7psYC0nhzck5npgL7XTgwSqT0N1osGDsieYK7EO -gLrAhV5Cud+xYJHT6xh+cHiudoO+cVrQkOPKwRYlZ0rwtnu64ZzZ ------END CERTIFICATE----- - -# Issuer: CN=OISTE Server Root ECC G1 O=OISTE Foundation -# Subject: CN=OISTE Server Root ECC G1 O=OISTE Foundation -# Label: "OISTE Server Root ECC G1" -# Serial: 47819833811561661340092227008453318557 -# MD5 Fingerprint: 42:a7:d2:35:ae:02:92:db:19:76:08:de:2f:05:b4:d4 -# SHA1 Fingerprint: 3b:f6:8b:09:ae:2a:92:7b:ba:e3:8d:3f:11:95:d9:e6:44:0c:45:e2 -# SHA256 Fingerprint: ee:c9:97:c0:c3:0f:21:6f:7e:3b:8b:30:7d:2b:ae:42:41:2d:75:3f:c8:21:9d:af:d1:52:0b:25:72:85:0f:49 ------BEGIN CERTIFICATE----- -MIICNTCCAbqgAwIBAgIQI/nD1jWvjyhLH/BU6n6XnTAKBggqhkjOPQQDAzBLMQsw -CQYDVQQGEwJDSDEZMBcGA1UECgwQT0lTVEUgRm91bmRhdGlvbjEhMB8GA1UEAwwY -T0lTVEUgU2VydmVyIFJvb3QgRUNDIEcxMB4XDTIzMDUzMTE0NDIyOFoXDTQ4MDUy -NDE0NDIyN1owSzELMAkGA1UEBhMCQ0gxGTAXBgNVBAoMEE9JU1RFIEZvdW5kYXRp -b24xITAfBgNVBAMMGE9JU1RFIFNlcnZlciBSb290IEVDQyBHMTB2MBAGByqGSM49 -AgEGBSuBBAAiA2IABBcv+hK8rBjzCvRE1nZCnrPoH7d5qVi2+GXROiFPqOujvqQy -cvO2Ackr/XeFblPdreqqLiWStukhEaivtUwL85Zgmjvn6hp4LrQ95SjeHIC6XG4N -2xml4z+cKrhAS93mT6NjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBQ3 -TYhlz/w9itWj8UnATgwQb0K0nDAdBgNVHQ4EFgQUN02IZc/8PYrVo/FJwE4MEG9C -tJwwDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2kAMGYCMQCpKjAd0MKfkFFR -QD6VVCHNFmb3U2wIFjnQEnx/Yxvf4zgAOdktUyBFCxxgZzFDJe0CMQCSia7pXGKD -YmH5LVerVrkR3SW+ak5KGoJr3M/TvEqzPNcum9v4KGm8ay3sMaE641c= ------END CERTIFICATE----- - -# Issuer: CN=OISTE Server Root RSA G1 O=OISTE Foundation -# Subject: CN=OISTE Server Root RSA G1 O=OISTE Foundation -# Label: "OISTE Server Root RSA G1" -# Serial: 113845518112613905024960613408179309848 -# MD5 Fingerprint: 23:a7:9e:d4:70:b8:b9:14:57:41:8a:7e:44:59:e2:68 -# SHA1 Fingerprint: f7:00:34:25:94:88:68:31:e4:34:87:3f:70:fe:86:b3:86:9f:f0:6e -# SHA256 Fingerprint: 9a:e3:62:32:a5:18:9f:fd:db:35:3d:fd:26:52:0c:01:53:95:d2:27:77:da:c5:9d:b5:7b:98:c0:89:a6:51:e6 ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIQVaXZZ5Qoxu0M+ifdWwFNGDANBgkqhkiG9w0BAQwFADBL -MQswCQYDVQQGEwJDSDEZMBcGA1UECgwQT0lTVEUgRm91bmRhdGlvbjEhMB8GA1UE -AwwYT0lTVEUgU2VydmVyIFJvb3QgUlNBIEcxMB4XDTIzMDUzMTE0MzcxNloXDTQ4 -MDUyNDE0MzcxNVowSzELMAkGA1UEBhMCQ0gxGTAXBgNVBAoMEE9JU1RFIEZvdW5k -YXRpb24xITAfBgNVBAMMGE9JU1RFIFNlcnZlciBSb290IFJTQSBHMTCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAKqu9KuCz/vlNwvn1ZatkOhLKdxVYOPM -vLO8LZK55KN68YG0nnJyQ98/qwsmtO57Gmn7KNByXEptaZnwYx4M0rH/1ow00O7b -rEi56rAUjtgHqSSY3ekJvqgiG1k50SeH3BzN+Puz6+mTeO0Pzjd8JnduodgsIUzk -ik/HEzxux9UTl7Ko2yRpg1bTacuCErudG/L4NPKYKyqOBGf244ehHa1uzjZ0Dl4z -O8vbUZeUapU8zhhabkvG/AePLhq5SvdkNCncpo1Q4Y2LS+VIG24ugBA/5J8bZT8R -tOpXaZ+0AOuFJJkk9SGdl6r7NH8CaxWQrbueWhl/pIzY+m0o/DjH40ytas7ZTpOS -jswMZ78LS5bOZmdTaMsXEY5Z96ycG7mOaES3GK/m5Q9l3JUJsJMStR8+lKXHiHUh -sd4JJCpM4rzsTGdHwimIuQq6+cF0zowYJmXa92/GjHtoXAvuY8BeS/FOzJ8vD+Ho -mnqT8eDI278n5mUpezbgMxVz8p1rhAhoKzYHKyfMeNhqhw5HdPSqoBNdZH702xSu -+zrkL8Fl47l6QGzwBrd7KJvX4V84c5Ss2XCTLdyEr0YconosP4EmQufU2MVshGYR -i3drVByjtdgQ8K4p92cIiBdcuJd5z+orKu5YM+Vt6SmqZQENghPsJQtdLEByFSnT -kCz3GkPVavBpAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU -8snBDw1jALvsRQ5KH7WxszbNDo0wHQYDVR0OBBYEFPLJwQ8NYwC77EUOSh+1sbM2 -zQ6NMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQwFAAOCAgEANGd5sjrG5T33 -I3K5Ce+SrScfoE4KsvXaFwyihdJ+klH9FWXXXGtkFu6KRcoMQzZENdl//nk6HOjG -5D1rd9QhEOP28yBOqb6J8xycqd+8MDoX0TJD0KqKchxRKEzdNsjkLWd9kYccnbz8 -qyiWXmFcuCIzGEgWUOrKL+mlSdx/PKQZvDatkuK59EvV6wit53j+F8Bdh3foZ3dP -AGav9LEDOr4SfEE15fSmG0eLy3n31r8Xbk5l8PjaV8GUgeV6Vg27Rn9vkf195hfk -gSe7BYhW3SCl95gtkRlpMV+bMPKZrXJAlszYd2abtNUOshD+FKrDgHGdPY3ofRRs -YWSGRqbXVMW215AWRqWFyp464+YTFrYVI8ypKVL9AMb2kI5Wj4kI3Zaq5tNqqYY1 -9tVFeEJKRvwDyF7YZvZFZSS0vod7VSCd9521Kvy5YhnLbDuv0204bKt7ph6N/Ome -/msVuduCmsuY33OhkKCgxeDoAaijFJzIwZqsFVAzje18KotzlUBDJvyBpCpfOZC3 -J8tRd/iWkx7P8nd9H0aTolkelUTFLXVksNb54Dxp6gS1HAviRkRNQzuXSXERvSS2 -wq1yVAb+axj5d9spLFKebXd7Yv0PTY6YMjAwcRLWJTXjn/hvnLXrahut6hDTlhZy -BiElxky8j3C7DOReIoMt0r7+hVu05L0= ------END CERTIFICATE----- - -# Issuer: CN=e-Szigno TLS Root CA 2023 O=Microsec Ltd. -# Subject: CN=e-Szigno TLS Root CA 2023 O=Microsec Ltd. -# Label: "e-Szigno TLS Root CA 2023" -# Serial: 71934828665710877219916191754 -# MD5 Fingerprint: 6a:e9:99:74:a5:da:5e:f1:d9:2e:f2:c8:d1:86:8b:71 -# SHA1 Fingerprint: 6f:9a:d5:d5:df:e8:2c:eb:be:37:07:ee:4f:4f:52:58:29:41:d1:fe -# SHA256 Fingerprint: b4:91:41:50:2d:00:66:3d:74:0f:2e:7e:c3:40:c5:28:00:96:26:66:12:1a:36:d0:9c:f7:dd:2b:90:38:4f:b4 ------BEGIN CERTIFICATE----- -MIICzzCCAjGgAwIBAgINAOhvGHvWOWuYSkmYCjAKBggqhkjOPQQDBDB1MQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xFzAVBgNVBGEMDlZBVEhVLTIzNTg0NDk3MSIwIAYDVQQDDBllLVN6aWdubyBU -TFMgUm9vdCBDQSAyMDIzMB4XDTIzMDcxNzE0MDAwMFoXDTM4MDcxNzE0MDAwMFow -dTELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRYwFAYDVQQKDA1NaWNy -b3NlYyBMdGQuMRcwFQYDVQRhDA5WQVRIVS0yMzU4NDQ5NzEiMCAGA1UEAwwZZS1T -emlnbm8gVExTIFJvb3QgQ0EgMjAyMzCBmzAQBgcqhkjOPQIBBgUrgQQAIwOBhgAE -AGgP36J8PKp0iGEKjcJMpQEiFNT3YHdCnAo4YKGMZz6zY+n6kbCLS+Y53wLCMAFS -AL/fjO1ZrTJlqwlZULUZwmgcAOAFX9pQJhzDrAQixTpN7+lXWDajwRlTEArRzT/v -SzUaQ49CE0y5LBqcvjC2xN7cS53kpDzLLtmt3999Cd8ukv+ho2MwYTAPBgNVHRMB -Af8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUWYQCYlpGePVd3I8K -ECgj3NXW+0UwHwYDVR0jBBgwFoAUWYQCYlpGePVd3I8KECgj3NXW+0UwCgYIKoZI -zj0EAwQDgYsAMIGHAkIBLdqu9S54tma4n7Zwf2Z0z+yOfP7AAXmazlIC58PRDHpt -y7Ve7hekm9sEdu4pKeiv+62sUvTXK9Z3hBC9xdIoaDQCQTV2WnXzkoYI9bIeCvZl -C9p2x1L/Cx6AcCIwwzPbGO2E14vs7dOoY4G1VnxHx1YwlGhza9IuqbnZLBwpvQy6 -uWWL ------END CERTIFICATE----- diff --git a/venv/lib/python3.12/site-packages/certifi/core.py b/venv/lib/python3.12/site-packages/certifi/core.py deleted file mode 100644 index 1c9661c..0000000 --- a/venv/lib/python3.12/site-packages/certifi/core.py +++ /dev/null @@ -1,83 +0,0 @@ -""" -certifi.py -~~~~~~~~~~ - -This module returns the installation location of cacert.pem or its contents. -""" -import sys -import atexit - -def exit_cacert_ctx() -> None: - _CACERT_CTX.__exit__(None, None, None) # type: ignore[union-attr] - - -if sys.version_info >= (3, 11): - - from importlib.resources import as_file, files - - _CACERT_CTX = None - _CACERT_PATH = None - - def where() -> str: - # This is slightly terrible, but we want to delay extracting the file - # in cases where we're inside of a zipimport situation until someone - # actually calls where(), but we don't want to re-extract the file - # on every call of where(), so we'll do it once then store it in a - # global variable. - global _CACERT_CTX - global _CACERT_PATH - if _CACERT_PATH is None: - # This is slightly janky, the importlib.resources API wants you to - # manage the cleanup of this file, so it doesn't actually return a - # path, it returns a context manager that will give you the path - # when you enter it and will do any cleanup when you leave it. In - # the common case of not needing a temporary file, it will just - # return the file system location and the __exit__() is a no-op. - # - # We also have to hold onto the actual context manager, because - # it will do the cleanup whenever it gets garbage collected, so - # we will also store that at the global level as well. - _CACERT_CTX = as_file(files("certifi").joinpath("cacert.pem")) - _CACERT_PATH = str(_CACERT_CTX.__enter__()) - atexit.register(exit_cacert_ctx) - - return _CACERT_PATH - - def contents() -> str: - return files("certifi").joinpath("cacert.pem").read_text(encoding="ascii") - -else: - - from importlib.resources import path as get_path, read_text - - _CACERT_CTX = None - _CACERT_PATH = None - - def where() -> str: - # This is slightly terrible, but we want to delay extracting the - # file in cases where we're inside of a zipimport situation until - # someone actually calls where(), but we don't want to re-extract - # the file on every call of where(), so we'll do it once then store - # it in a global variable. - global _CACERT_CTX - global _CACERT_PATH - if _CACERT_PATH is None: - # This is slightly janky, the importlib.resources API wants you - # to manage the cleanup of this file, so it doesn't actually - # return a path, it returns a context manager that will give - # you the path when you enter it and will do any cleanup when - # you leave it. In the common case of not needing a temporary - # file, it will just return the file system location and the - # __exit__() is a no-op. - # - # We also have to hold onto the actual context manager, because - # it will do the cleanup whenever it gets garbage collected, so - # we will also store that at the global level as well. - _CACERT_CTX = get_path("certifi", "cacert.pem") - _CACERT_PATH = str(_CACERT_CTX.__enter__()) - atexit.register(exit_cacert_ctx) - - return _CACERT_PATH - - def contents() -> str: - return read_text("certifi", "cacert.pem", encoding="ascii") diff --git a/venv/lib/python3.12/site-packages/certifi/py.typed b/venv/lib/python3.12/site-packages/certifi/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.7.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/charset_normalizer-3.4.7.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.7.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.7.dist-info/METADATA b/venv/lib/python3.12/site-packages/charset_normalizer-3.4.7.dist-info/METADATA deleted file mode 100644 index 6b5a360..0000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.7.dist-info/METADATA +++ /dev/null @@ -1,808 +0,0 @@ -Metadata-Version: 2.4 -Name: charset-normalizer -Version: 3.4.7 -Summary: The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. -Author-email: "Ahmed R. TAHRI" -Maintainer-email: "Ahmed R. TAHRI" -License: MIT -Project-URL: Changelog, https://github.com/jawah/charset_normalizer/blob/master/CHANGELOG.md -Project-URL: Documentation, https://charset-normalizer.readthedocs.io/ -Project-URL: Code, https://github.com/jawah/charset_normalizer -Project-URL: Issue tracker, https://github.com/jawah/charset_normalizer/issues -Keywords: encoding,charset,charset-detector,detector,normalization,unicode,chardet,detect -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: 3.14 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Programming Language :: Python :: Free Threading :: 4 - Resilient -Classifier: Topic :: Text Processing :: Linguistic -Classifier: Topic :: Utilities -Classifier: Typing :: Typed -Requires-Python: >=3.7 -Description-Content-Type: text/markdown -License-File: LICENSE -Provides-Extra: unicode-backport -Dynamic: license-file - -

Charset Detection, for Everyone 👋

- -

- The Real First Universal Charset Detector
- - - - - Download Count Total - - - - -

-

- Featured Packages
- - Static Badge - - - Static Badge - -

-

- In other language (unofficial port - by the community)
- - Static Badge - -

- -> A library that helps you read text from an unknown charset encoding.
Motivated by `chardet`, -> I'm trying to resolve the issue by taking a new approach. -> All IANA character set names for which the Python core library provides codecs are supported. -> You can also register your own set of codecs, and yes, it would work as-is. - -

- >>>>> 👉 Try Me Online Now, Then Adopt Me 👈 <<<<< -

- -This project offers you an alternative to **Universal Charset Encoding Detector**, also known as **Chardet**. - -| Feature | [Chardet](https://github.com/chardet/chardet) | Charset Normalizer | [cChardet](https://github.com/PyYoshi/cChardet) | -|--------------------------------------------------|:---------------------------------------------:|:-----------------------------------------------------------------------------------------------:|:-----------------------------------------------:| -| `Fast` | ✅ | ✅ | ✅ | -| `Universal`[^1] | ❌ | ✅ | ❌ | -| `Reliable` **without** distinguishable standards | ✅ | ✅ | ✅ | -| `Reliable` **with** distinguishable standards | ✅ | ✅ | ✅ | -| `License` | _Disputed_[^2]
_restrictive_ | MIT | MPL-1.1
_restrictive_ | -| `Native Python` | ✅ | ✅ | ❌ | -| `Detect spoken language` | ✅ | ✅ | N/A | -| `UnicodeDecodeError Safety` | ✅ | ✅ | ❌ | -| `Whl Size (min)` | 500 kB | 150 kB | ~200 kB | -| `Supported Encoding` | 99 | [99](https://charset-normalizer.readthedocs.io/en/latest/user/support.html#supported-encodings) | 40 | -| `Can register custom encoding` | ❌ | ✅ | ❌ | - -

-Reading Normalized TextCat Reading Text -

- -[^1]: They are clearly using specific code for a specific encoding even if covering most of used one. -[^2]: Chardet 7.0+ was relicensed from LGPL-2.1 to MIT following an AI-assisted rewrite. This relicensing is disputed on two independent grounds: **(a)** the original author [contests](https://github.com/chardet/chardet/issues/327) that the maintainer had the right to relicense, arguing the rewrite is a derivative work of the LGPL-licensed codebase since it was not a clean room implementation; **(b)** the copyright claim itself is [questionable](https://github.com/chardet/chardet/issues/334) given the code was primarily generated by an LLM, and AI-generated output may not be copyrightable under most jurisdictions. Either issue alone could undermine the MIT license. Beyond licensing, the rewrite raises questions about responsible use of AI in open source: key architectural ideas pioneered by charset-normalizer - notably decode-first validity filtering (our foundational approach since v1) and encoding pairwise similarity with the same algorithm and threshold — surfaced in chardet 7 without acknowledgment. The project also imported test files from charset-normalizer to train and benchmark against it, then claimed superior accuracy on those very files. Charset-normalizer has always been MIT-licensed, encoding-agnostic by design, and built on a verifiable human-authored history. - -## ⚡ Performance - -This package offer better performances (99th, and 95th) against Chardet. Here are some numbers. - -| Package | Accuracy | Mean per file (ms) | File per sec (est) | -|---------------------------------------------------|:--------:|:------------------:|:------------------:| -| [chardet 7.1](https://github.com/chardet/chardet) | 89 % | 3 ms | 333 file/sec | -| charset-normalizer | **97 %** | 3 ms | 333 file/sec | - -| Package | 99th percentile | 95th percentile | 50th percentile | -|---------------------------------------------------|:---------------:|:---------------:|:---------------:| -| [chardet 7.1](https://github.com/chardet/chardet) | 32 ms | 17 ms | < 1 ms | -| charset-normalizer | 16 ms | 10 ms | 1 ms | - -_updated as of March 2026 using CPython 3.12, Charset-Normalizer 3.4.6, and Chardet 7.1.0_ - -~Chardet's performance on larger file (1MB+) are very poor. Expect huge difference on large payload.~ No longer the case since Chardet 7.0+ - -> Stats are generated using 400+ files using default parameters. More details on used files, see GHA workflows. -> And yes, these results might change at any time. The dataset can be updated to include more files. -> The actual delays heavily depends on your CPU capabilities. The factors should remain the same. -> Chardet claims on his documentation to have a greater accuracy than us based on the dataset they trained Chardet on(...) -> Well, it's normal, the opposite would have been worrying. Whereas charset-normalizer don't train on anything, our solution -> is based on a completely different algorithm, still heuristic through, it does not need weights across every encoding tables. - -## ✨ Installation - -Using pip: - -```sh -pip install charset-normalizer -U -``` - -## 🚀 Basic Usage - -### CLI -This package comes with a CLI. - -``` -usage: normalizer [-h] [-v] [-a] [-n] [-m] [-r] [-f] [-t THRESHOLD] - file [file ...] - -The Real First Universal Charset Detector. Discover originating encoding used -on text file. Normalize text to unicode. - -positional arguments: - files File(s) to be analysed - -optional arguments: - -h, --help show this help message and exit - -v, --verbose Display complementary information about file if any. - Stdout will contain logs about the detection process. - -a, --with-alternative - Output complementary possibilities if any. Top-level - JSON WILL be a list. - -n, --normalize Permit to normalize input file. If not set, program - does not write anything. - -m, --minimal Only output the charset detected to STDOUT. Disabling - JSON output. - -r, --replace Replace file when trying to normalize it instead of - creating a new one. - -f, --force Replace file without asking if you are sure, use this - flag with caution. - -t THRESHOLD, --threshold THRESHOLD - Define a custom maximum amount of chaos allowed in - decoded content. 0. <= chaos <= 1. - --version Show version information and exit. -``` - -```bash -normalizer ./data/sample.1.fr.srt -``` - -or - -```bash -python -m charset_normalizer ./data/sample.1.fr.srt -``` - -🎉 Since version 1.4.0 the CLI produce easily usable stdout result in JSON format. - -```json -{ - "path": "/home/default/projects/charset_normalizer/data/sample.1.fr.srt", - "encoding": "cp1252", - "encoding_aliases": [ - "1252", - "windows_1252" - ], - "alternative_encodings": [ - "cp1254", - "cp1256", - "cp1258", - "iso8859_14", - "iso8859_15", - "iso8859_16", - "iso8859_3", - "iso8859_9", - "latin_1", - "mbcs" - ], - "language": "French", - "alphabets": [ - "Basic Latin", - "Latin-1 Supplement" - ], - "has_sig_or_bom": false, - "chaos": 0.149, - "coherence": 97.152, - "unicode_path": null, - "is_preferred": true -} -``` - -### Python -*Just print out normalized text* -```python -from charset_normalizer import from_path - -results = from_path('./my_subtitle.srt') - -print(str(results.best())) -``` - -*Upgrade your code without effort* -```python -from charset_normalizer import detect -``` - -The above code will behave the same as **chardet**. We ensure that we offer the best (reasonable) BC result possible. - -See the docs for advanced usage : [readthedocs.io](https://charset-normalizer.readthedocs.io/en/latest/) - -## 😇 Why - -When I started using Chardet, I noticed that it was not suited to my expectations, and I wanted to propose a -reliable alternative using a completely different method. Also! I never back down on a good challenge! - -I **don't care** about the **originating charset** encoding, because **two different tables** can -produce **two identical rendered string.** -What I want is to get readable text, the best I can. - -In a way, **I'm brute forcing text decoding.** How cool is that ? 😎 - -Don't confuse package **ftfy** with charset-normalizer or chardet. ftfy goal is to repair Unicode string whereas charset-normalizer to convert raw file in unknown encoding to unicode. - -## 🍰 How - - - Discard all charset encoding table that could not fit the binary content. - - Measure noise, or the mess once opened (by chunks) with a corresponding charset encoding. - - Extract matches with the lowest mess detected. - - Additionally, we measure coherence / probe for a language. - -**Wait a minute**, what is noise/mess and coherence according to **YOU ?** - -*Noise :* I opened hundred of text files, **written by humans**, with the wrong encoding table. **I observed**, then -**I established** some ground rules about **what is obvious** when **it seems like** a mess (aka. defining noise in rendered text). - I know that my interpretation of what is noise is probably incomplete, feel free to contribute in order to - improve or rewrite it. - -*Coherence :* For each language there is on earth, we have computed ranked letter appearance occurrences (the best we can). So I thought -that intel is worth something here. So I use those records against decoded text to check if I can detect intelligent design. - -## ⚡ Known limitations - - - Language detection is unreliable when text contains two or more languages sharing identical letters. (eg. HTML (english tags) + Turkish content (Sharing Latin characters)) - - Every charset detector heavily depends on sufficient content. In common cases, do not bother run detection on very tiny content. - -## ⚠️ About Python EOLs - -**If you are running:** - -- Python >=2.7,<3.5: Unsupported -- Python 3.5: charset-normalizer < 2.1 -- Python 3.6: charset-normalizer < 3.1 - -Upgrade your Python interpreter as soon as possible. - -## 👤 Contributing - -Contributions, issues and feature requests are very much welcome.
-Feel free to check [issues page](https://github.com/ousret/charset_normalizer/issues) if you want to contribute. - -## 📝 License - -Copyright © [Ahmed TAHRI @Ousret](https://github.com/Ousret).
-This project is [MIT](https://github.com/Ousret/charset_normalizer/blob/master/LICENSE) licensed. - -Characters frequencies used in this project © 2012 [Denny Vrandečić](http://simia.net/letters/) - -## 💼 For Enterprise - -Professional support for charset-normalizer is available as part of the [Tidelift -Subscription][1]. Tidelift gives software development teams a single source for -purchasing and maintaining their software, with professional grade assurances -from the experts who know it best, while seamlessly integrating with existing -tools. - -[1]: https://tidelift.com/subscription/pkg/pypi-charset-normalizer?utm_source=pypi-charset-normalizer&utm_medium=readme - -[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/7297/badge)](https://www.bestpractices.dev/projects/7297) - -# Changelog -All notable changes to charset-normalizer will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - -## [3.4.7](https://github.com/Ousret/charset_normalizer/compare/3.4.6...3.4.7) (2026-04-02) - -### Changed -- Pre-built optimized version using mypy[c] v1.20. -- Relax `setuptools` constraint to `setuptools>=68,<82.1`. - -### Fixed -- Correctly remove SIG remnant in utf-7 decoded string. (#718) (#716) - -## [3.4.6](https://github.com/Ousret/charset_normalizer/compare/3.4.5...3.4.6) (2026-03-15) - -### Changed -- Flattened the logic in `charset_normalizer.md` for higher performance. Removed `eligible(..)` and `feed(...)` - in favor of `feed_info(...)`. -- Raised upper bound for mypy[c] to 1.20, for our optimized version. -- Updated `UNICODE_RANGES_COMBINED` using Unicode blocks v17. - -### Fixed -- Edge case where noise difference between two candidates can be almost insignificant. (#672) -- CLI `--normalize` writing to wrong path when passing multiple files in. (#702) - -### Misc -- Freethreaded pre-built wheels now shipped in PyPI starting with 3.14t. (#616) - -## [3.4.5](https://github.com/Ousret/charset_normalizer/compare/3.4.4...3.4.5) (2026-03-06) - -### Changed -- Update `setuptools` constraint to `setuptools>=68,<=82`. -- Raised upper bound of mypyc for the optional pre-built extension to v1.19.1 - -### Fixed -- Add explicit link to lib math in our optimized build. (#692) -- Logger level not restored correctly for empty byte sequences. (#701) -- TypeError when passing bytearray to from_bytes. (#703) - -### Misc -- Applied safe micro-optimizations in both our noise detector and language detector. -- Rewrote the `query_yes_no` function (inside CLI) to avoid using ambiguous licensed code. -- Added `cd.py` submodule into mypyc optional compilation to reduce further the performance impact. - -## [3.4.4](https://github.com/Ousret/charset_normalizer/compare/3.4.2...3.4.4) (2025-10-13) - -### Changed -- Bound `setuptools` to a specific constraint `setuptools>=68,<=81`. -- Raised upper bound of mypyc for the optional pre-built extension to v1.18.2 - -### Removed -- `setuptools-scm` as a build dependency. - -### Misc -- Enforced hashes in `dev-requirements.txt` and created `ci-requirements.txt` for security purposes. -- Additional pre-built wheels for riscv64, s390x, and armv7l architectures. -- Restore ` multiple.intoto.jsonl` in GitHub releases in addition to individual attestation file per wheel. - -## [3.4.3](https://github.com/Ousret/charset_normalizer/compare/3.4.2...3.4.3) (2025-08-09) - -### Changed -- mypy(c) is no longer a required dependency at build time if `CHARSET_NORMALIZER_USE_MYPYC` isn't set to `1`. (#595) (#583) -- automatically lower confidence on small bytes samples that are not Unicode in `detect` output legacy function. (#391) - -### Added -- Custom build backend to overcome inability to mark mypy as an optional dependency in the build phase. -- Support for Python 3.14 - -### Fixed -- sdist archive contained useless directories. -- automatically fallback on valid UTF-16 or UTF-32 even if the md says it's noisy. (#633) - -### Misc -- SBOM are automatically published to the relevant GitHub release to comply with regulatory changes. - Each published wheel comes with its SBOM. We choose CycloneDX as the format. -- Prebuilt optimized wheel are no longer distributed by default for CPython 3.7 due to a change in cibuildwheel. - -## [3.4.2](https://github.com/Ousret/charset_normalizer/compare/3.4.1...3.4.2) (2025-05-02) - -### Fixed -- Addressed the DeprecationWarning in our CLI regarding `argparse.FileType` by backporting the target class into the package. (#591) -- Improved the overall reliability of the detector with CJK Ideographs. (#605) (#587) - -### Changed -- Optional mypyc compilation upgraded to version 1.15 for Python >= 3.8 - -## [3.4.1](https://github.com/Ousret/charset_normalizer/compare/3.4.0...3.4.1) (2024-12-24) - -### Changed -- Project metadata are now stored using `pyproject.toml` instead of `setup.cfg` using setuptools as the build backend. -- Enforce annotation delayed loading for a simpler and consistent types in the project. -- Optional mypyc compilation upgraded to version 1.14 for Python >= 3.8 - -### Added -- pre-commit configuration. -- noxfile. - -### Removed -- `build-requirements.txt` as per using `pyproject.toml` native build configuration. -- `bin/integration.py` and `bin/serve.py` in favor of downstream integration test (see noxfile). -- `setup.cfg` in favor of `pyproject.toml` metadata configuration. -- Unused `utils.range_scan` function. - -### Fixed -- Converting content to Unicode bytes may insert `utf_8` instead of preferred `utf-8`. (#572) -- Deprecation warning "'count' is passed as positional argument" when converting to Unicode bytes on Python 3.13+ - -## [3.4.0](https://github.com/Ousret/charset_normalizer/compare/3.3.2...3.4.0) (2024-10-08) - -### Added -- Argument `--no-preemptive` in the CLI to prevent the detector to search for hints. -- Support for Python 3.13 (#512) - -### Fixed -- Relax the TypeError exception thrown when trying to compare a CharsetMatch with anything else than a CharsetMatch. -- Improved the general reliability of the detector based on user feedbacks. (#520) (#509) (#498) (#407) (#537) -- Declared charset in content (preemptive detection) not changed when converting to utf-8 bytes. (#381) - -## [3.3.2](https://github.com/Ousret/charset_normalizer/compare/3.3.1...3.3.2) (2023-10-31) - -### Fixed -- Unintentional memory usage regression when using large payload that match several encoding (#376) -- Regression on some detection case showcased in the documentation (#371) - -### Added -- Noise (md) probe that identify malformed arabic representation due to the presence of letters in isolated form (credit to my wife) - -## [3.3.1](https://github.com/Ousret/charset_normalizer/compare/3.3.0...3.3.1) (2023-10-22) - -### Changed -- Optional mypyc compilation upgraded to version 1.6.1 for Python >= 3.8 -- Improved the general detection reliability based on reports from the community - -## [3.3.0](https://github.com/Ousret/charset_normalizer/compare/3.2.0...3.3.0) (2023-09-30) - -### Added -- Allow to execute the CLI (e.g. normalizer) through `python -m charset_normalizer.cli` or `python -m charset_normalizer` -- Support for 9 forgotten encoding that are supported by Python but unlisted in `encoding.aliases` as they have no alias (#323) - -### Removed -- (internal) Redundant utils.is_ascii function and unused function is_private_use_only -- (internal) charset_normalizer.assets is moved inside charset_normalizer.constant - -### Changed -- (internal) Unicode code blocks in constants are updated using the latest v15.0.0 definition to improve detection -- Optional mypyc compilation upgraded to version 1.5.1 for Python >= 3.8 - -### Fixed -- Unable to properly sort CharsetMatch when both chaos/noise and coherence were close due to an unreachable condition in \_\_lt\_\_ (#350) - -## [3.2.0](https://github.com/Ousret/charset_normalizer/compare/3.1.0...3.2.0) (2023-06-07) - -### Changed -- Typehint for function `from_path` no longer enforce `PathLike` as its first argument -- Minor improvement over the global detection reliability - -### Added -- Introduce function `is_binary` that relies on main capabilities, and optimized to detect binaries -- Propagate `enable_fallback` argument throughout `from_bytes`, `from_path`, and `from_fp` that allow a deeper control over the detection (default True) -- Explicit support for Python 3.12 - -### Fixed -- Edge case detection failure where a file would contain 'very-long' camel cased word (Issue #289) - -## [3.1.0](https://github.com/Ousret/charset_normalizer/compare/3.0.1...3.1.0) (2023-03-06) - -### Added -- Argument `should_rename_legacy` for legacy function `detect` and disregard any new arguments without errors (PR #262) - -### Removed -- Support for Python 3.6 (PR #260) - -### Changed -- Optional speedup provided by mypy/c 1.0.1 - -## [3.0.1](https://github.com/Ousret/charset_normalizer/compare/3.0.0...3.0.1) (2022-11-18) - -### Fixed -- Multi-bytes cutter/chunk generator did not always cut correctly (PR #233) - -### Changed -- Speedup provided by mypy/c 0.990 on Python >= 3.7 - -## [3.0.0](https://github.com/Ousret/charset_normalizer/compare/2.1.1...3.0.0) (2022-10-20) - -### Added -- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results -- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES -- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio -- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl) - -### Changed -- Build with static metadata using 'build' frontend -- Make the language detection stricter -- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1 - -### Fixed -- CLI with opt --normalize fail when using full path for files -- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it -- Sphinx warnings when generating the documentation - -### Removed -- Coherence detector no longer return 'Simple English' instead return 'English' -- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese' -- Breaking: Method `first()` and `best()` from CharsetMatch -- UTF-7 will no longer appear as "detected" without a recognized SIG/mark (is unreliable/conflict with ASCII) -- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches -- Breaking: Top-level function `normalize` -- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch -- Support for the backport `unicodedata2` - -## [3.0.0rc1](https://github.com/Ousret/charset_normalizer/compare/3.0.0b2...3.0.0rc1) (2022-10-18) - -### Added -- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results -- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES -- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio - -### Changed -- Build with static metadata using 'build' frontend -- Make the language detection stricter - -### Fixed -- CLI with opt --normalize fail when using full path for files -- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it - -### Removed -- Coherence detector no longer return 'Simple English' instead return 'English' -- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese' - -## [3.0.0b2](https://github.com/Ousret/charset_normalizer/compare/3.0.0b1...3.0.0b2) (2022-08-21) - -### Added -- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl) - -### Removed -- Breaking: Method `first()` and `best()` from CharsetMatch -- UTF-7 will no longer appear as "detected" without a recognized SIG/mark (is unreliable/conflict with ASCII) - -### Fixed -- Sphinx warnings when generating the documentation - -## [3.0.0b1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...3.0.0b1) (2022-08-15) - -### Changed -- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1 - -### Removed -- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches -- Breaking: Top-level function `normalize` -- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch -- Support for the backport `unicodedata2` - -## [2.1.1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...2.1.1) (2022-08-19) - -### Deprecated -- Function `normalize` scheduled for removal in 3.0 - -### Changed -- Removed useless call to decode in fn is_unprintable (#206) - -### Fixed -- Third-party library (i18n xgettext) crashing not recognizing utf_8 (PEP 263) with underscore from [@aleksandernovikov](https://github.com/aleksandernovikov) (#204) - -## [2.1.0](https://github.com/Ousret/charset_normalizer/compare/2.0.12...2.1.0) (2022-06-19) - -### Added -- Output the Unicode table version when running the CLI with `--version` (PR #194) - -### Changed -- Re-use decoded buffer for single byte character sets from [@nijel](https://github.com/nijel) (PR #175) -- Fixing some performance bottlenecks from [@deedy5](https://github.com/deedy5) (PR #183) - -### Fixed -- Workaround potential bug in cpython with Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space (PR #175) -- CLI default threshold aligned with the API threshold from [@oleksandr-kuzmenko](https://github.com/oleksandr-kuzmenko) (PR #181) - -### Removed -- Support for Python 3.5 (PR #192) - -### Deprecated -- Use of backport unicodedata from `unicodedata2` as Python is quickly catching up, scheduled for removal in 3.0 (PR #194) - -## [2.0.12](https://github.com/Ousret/charset_normalizer/compare/2.0.11...2.0.12) (2022-02-12) - -### Fixed -- ASCII miss-detection on rare cases (PR #170) - -## [2.0.11](https://github.com/Ousret/charset_normalizer/compare/2.0.10...2.0.11) (2022-01-30) - -### Added -- Explicit support for Python 3.11 (PR #164) - -### Changed -- The logging behavior have been completely reviewed, now using only TRACE and DEBUG levels (PR #163 #165) - -## [2.0.10](https://github.com/Ousret/charset_normalizer/compare/2.0.9...2.0.10) (2022-01-04) - -### Fixed -- Fallback match entries might lead to UnicodeDecodeError for large bytes sequence (PR #154) - -### Changed -- Skipping the language-detection (CD) on ASCII (PR #155) - -## [2.0.9](https://github.com/Ousret/charset_normalizer/compare/2.0.8...2.0.9) (2021-12-03) - -### Changed -- Moderating the logging impact (since 2.0.8) for specific environments (PR #147) - -### Fixed -- Wrong logging level applied when setting kwarg `explain` to True (PR #146) - -## [2.0.8](https://github.com/Ousret/charset_normalizer/compare/2.0.7...2.0.8) (2021-11-24) -### Changed -- Improvement over Vietnamese detection (PR #126) -- MD improvement on trailing data and long foreign (non-pure latin) data (PR #124) -- Efficiency improvements in cd/alphabet_languages from [@adbar](https://github.com/adbar) (PR #122) -- call sum() without an intermediary list following PEP 289 recommendations from [@adbar](https://github.com/adbar) (PR #129) -- Code style as refactored by Sourcery-AI (PR #131) -- Minor adjustment on the MD around european words (PR #133) -- Remove and replace SRTs from assets / tests (PR #139) -- Initialize the library logger with a `NullHandler` by default from [@nmaynes](https://github.com/nmaynes) (PR #135) -- Setting kwarg `explain` to True will add provisionally (bounded to function lifespan) a specific stream handler (PR #135) - -### Fixed -- Fix large (misleading) sequence giving UnicodeDecodeError (PR #137) -- Avoid using too insignificant chunk (PR #137) - -### Added -- Add and expose function `set_logging_handler` to configure a specific StreamHandler from [@nmaynes](https://github.com/nmaynes) (PR #135) -- Add `CHANGELOG.md` entries, format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) (PR #141) - -## [2.0.7](https://github.com/Ousret/charset_normalizer/compare/2.0.6...2.0.7) (2021-10-11) -### Added -- Add support for Kazakh (Cyrillic) language detection (PR #109) - -### Changed -- Further, improve inferring the language from a given single-byte code page (PR #112) -- Vainly trying to leverage PEP263 when PEP3120 is not supported (PR #116) -- Refactoring for potential performance improvements in loops from [@adbar](https://github.com/adbar) (PR #113) -- Various detection improvement (MD+CD) (PR #117) - -### Removed -- Remove redundant logging entry about detected language(s) (PR #115) - -### Fixed -- Fix a minor inconsistency between Python 3.5 and other versions regarding language detection (PR #117 #102) - -## [2.0.6](https://github.com/Ousret/charset_normalizer/compare/2.0.5...2.0.6) (2021-09-18) -### Fixed -- Unforeseen regression with the loss of the backward-compatibility with some older minor of Python 3.5.x (PR #100) -- Fix CLI crash when using --minimal output in certain cases (PR #103) - -### Changed -- Minor improvement to the detection efficiency (less than 1%) (PR #106 #101) - -## [2.0.5](https://github.com/Ousret/charset_normalizer/compare/2.0.4...2.0.5) (2021-09-14) -### Changed -- The project now comply with: flake8, mypy, isort and black to ensure a better overall quality (PR #81) -- The BC-support with v1.x was improved, the old staticmethods are restored (PR #82) -- The Unicode detection is slightly improved (PR #93) -- Add syntax sugar \_\_bool\_\_ for results CharsetMatches list-container (PR #91) - -### Removed -- The project no longer raise warning on tiny content given for detection, will be simply logged as warning instead (PR #92) - -### Fixed -- In some rare case, the chunks extractor could cut in the middle of a multi-byte character and could mislead the mess detection (PR #95) -- Some rare 'space' characters could trip up the UnprintablePlugin/Mess detection (PR #96) -- The MANIFEST.in was not exhaustive (PR #78) - -## [2.0.4](https://github.com/Ousret/charset_normalizer/compare/2.0.3...2.0.4) (2021-07-30) -### Fixed -- The CLI no longer raise an unexpected exception when no encoding has been found (PR #70) -- Fix accessing the 'alphabets' property when the payload contains surrogate characters (PR #68) -- The logger could mislead (explain=True) on detected languages and the impact of one MBCS match (PR #72) -- Submatch factoring could be wrong in rare edge cases (PR #72) -- Multiple files given to the CLI were ignored when publishing results to STDOUT. (After the first path) (PR #72) -- Fix line endings from CRLF to LF for certain project files (PR #67) - -### Changed -- Adjust the MD to lower the sensitivity, thus improving the global detection reliability (PR #69 #76) -- Allow fallback on specified encoding if any (PR #71) - -## [2.0.3](https://github.com/Ousret/charset_normalizer/compare/2.0.2...2.0.3) (2021-07-16) -### Changed -- Part of the detection mechanism has been improved to be less sensitive, resulting in more accurate detection results. Especially ASCII. (PR #63) -- According to the community wishes, the detection will fall back on ASCII or UTF-8 in a last-resort case. (PR #64) - -## [2.0.2](https://github.com/Ousret/charset_normalizer/compare/2.0.1...2.0.2) (2021-07-15) -### Fixed -- Empty/Too small JSON payload miss-detection fixed. Report from [@tseaver](https://github.com/tseaver) (PR #59) - -### Changed -- Don't inject unicodedata2 into sys.modules from [@akx](https://github.com/akx) (PR #57) - -## [2.0.1](https://github.com/Ousret/charset_normalizer/compare/2.0.0...2.0.1) (2021-07-13) -### Fixed -- Make it work where there isn't a filesystem available, dropping assets frequencies.json. Report from [@sethmlarson](https://github.com/sethmlarson). (PR #55) -- Using explain=False permanently disable the verbose output in the current runtime (PR #47) -- One log entry (language target preemptive) was not show in logs when using explain=True (PR #47) -- Fix undesired exception (ValueError) on getitem of instance CharsetMatches (PR #52) - -### Changed -- Public function normalize default args values were not aligned with from_bytes (PR #53) - -### Added -- You may now use charset aliases in cp_isolation and cp_exclusion arguments (PR #47) - -## [2.0.0](https://github.com/Ousret/charset_normalizer/compare/1.4.1...2.0.0) (2021-07-02) -### Changed -- 4x to 5 times faster than the previous 1.4.0 release. At least 2x faster than Chardet. -- Accent has been made on UTF-8 detection, should perform rather instantaneous. -- The backward compatibility with Chardet has been greatly improved. The legacy detect function returns an identical charset name whenever possible. -- The detection mechanism has been slightly improved, now Turkish content is detected correctly (most of the time) -- The program has been rewritten to ease the readability and maintainability. (+Using static typing)+ -- utf_7 detection has been reinstated. - -### Removed -- This package no longer require anything when used with Python 3.5 (Dropped cached_property) -- Removed support for these languages: Catalan, Esperanto, Kazakh, Baque, Volapük, Azeri, Galician, Nynorsk, Macedonian, and Serbocroatian. -- The exception hook on UnicodeDecodeError has been removed. - -### Deprecated -- Methods coherence_non_latin, w_counter, chaos_secondary_pass of the class CharsetMatch are now deprecated and scheduled for removal in v3.0 - -### Fixed -- The CLI output used the relative path of the file(s). Should be absolute. - -## [1.4.1](https://github.com/Ousret/charset_normalizer/compare/1.4.0...1.4.1) (2021-05-28) -### Fixed -- Logger configuration/usage no longer conflict with others (PR #44) - -## [1.4.0](https://github.com/Ousret/charset_normalizer/compare/1.3.9...1.4.0) (2021-05-21) -### Removed -- Using standard logging instead of using the package loguru. -- Dropping nose test framework in favor of the maintained pytest. -- Choose to not use dragonmapper package to help with gibberish Chinese/CJK text. -- Require cached_property only for Python 3.5 due to constraint. Dropping for every other interpreter version. -- Stop support for UTF-7 that does not contain a SIG. -- Dropping PrettyTable, replaced with pure JSON output in CLI. - -### Fixed -- BOM marker in a CharsetNormalizerMatch instance could be False in rare cases even if obviously present. Due to the sub-match factoring process. -- Not searching properly for the BOM when trying utf32/16 parent codec. - -### Changed -- Improving the package final size by compressing frequencies.json. -- Huge improvement over the larges payload. - -### Added -- CLI now produces JSON consumable output. -- Return ASCII if given sequences fit. Given reasonable confidence. - -## [1.3.9](https://github.com/Ousret/charset_normalizer/compare/1.3.8...1.3.9) (2021-05-13) - -### Fixed -- In some very rare cases, you may end up getting encode/decode errors due to a bad bytes payload (PR #40) - -## [1.3.8](https://github.com/Ousret/charset_normalizer/compare/1.3.7...1.3.8) (2021-05-12) - -### Fixed -- Empty given payload for detection may cause an exception if trying to access the `alphabets` property. (PR #39) - -## [1.3.7](https://github.com/Ousret/charset_normalizer/compare/1.3.6...1.3.7) (2021-05-12) - -### Fixed -- The legacy detect function should return UTF-8-SIG if sig is present in the payload. (PR #38) - -## [1.3.6](https://github.com/Ousret/charset_normalizer/compare/1.3.5...1.3.6) (2021-02-09) - -### Changed -- Amend the previous release to allow prettytable 2.0 (PR #35) - -## [1.3.5](https://github.com/Ousret/charset_normalizer/compare/1.3.4...1.3.5) (2021-02-08) - -### Fixed -- Fix error while using the package with a python pre-release interpreter (PR #33) - -### Changed -- Dependencies refactoring, constraints revised. - -### Added -- Add python 3.9 and 3.10 to the supported interpreters - -MIT License - -Copyright (c) 2025 TAHRI Ahmed R. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.7.dist-info/RECORD b/venv/lib/python3.12/site-packages/charset_normalizer-3.4.7.dist-info/RECORD deleted file mode 100644 index 5662cad..0000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.7.dist-info/RECORD +++ /dev/null @@ -1,36 +0,0 @@ -../../../bin/normalizer,sha256=Umpq-rec9Wx5kYCZ6LgwHlx4GH5Fe3fLbWVaKKW6HRg,266 -81d243bd2c585b0f4821__mypyc.cpython-312-x86_64-linux-gnu.so,sha256=xPTGB-9iuOqJ5RfI3qaB1WzuFAm1oYWbgN1Jz9U1wn0,433312 -charset_normalizer-3.4.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -charset_normalizer-3.4.7.dist-info/METADATA,sha256=K8lK8L8LaZ1YmKvWLt3zEkpIxiCOC58xNhzFQrfQJxQ,40931 -charset_normalizer-3.4.7.dist-info/RECORD,, -charset_normalizer-3.4.7.dist-info/WHEEL,sha256=Tc3fF66yn9Kh-hkUUsdKQyuB9Lw0CDoeANnEbSVc3f4,190 -charset_normalizer-3.4.7.dist-info/entry_points.txt,sha256=ADSTKrkXZ3hhdOVFi6DcUEHQRS0xfxDIE_pEz4wLIXA,65 -charset_normalizer-3.4.7.dist-info/licenses/LICENSE,sha256=bQ1Bv-FwrGx9wkjJpj4lTQ-0WmDVCoJX0K-SxuJJuIc,1071 -charset_normalizer-3.4.7.dist-info/top_level.txt,sha256=c_vZbitqecT2GfK3zdxSTLCn8C-6pGnHQY5o_5Y32M0,47 -charset_normalizer/__init__.py,sha256=OKRxRv2Zhnqk00tqkN0c1BtJjm165fWXLydE52IKuHc,1590 -charset_normalizer/__main__.py,sha256=yzYxMR-IhKRHYwcSlavEv8oGdwxsR89mr2X09qXGdps,109 -charset_normalizer/__pycache__/__init__.cpython-312.pyc,, -charset_normalizer/__pycache__/__main__.cpython-312.pyc,, -charset_normalizer/__pycache__/api.cpython-312.pyc,, -charset_normalizer/__pycache__/cd.cpython-312.pyc,, -charset_normalizer/__pycache__/constant.cpython-312.pyc,, -charset_normalizer/__pycache__/legacy.cpython-312.pyc,, -charset_normalizer/__pycache__/md.cpython-312.pyc,, -charset_normalizer/__pycache__/models.cpython-312.pyc,, -charset_normalizer/__pycache__/utils.cpython-312.pyc,, -charset_normalizer/__pycache__/version.cpython-312.pyc,, -charset_normalizer/api.py,sha256=387F3n23MlMu-xfSbFULW2DLGsBmVrZVGhnkiGXeKBo,38844 -charset_normalizer/cd.cpython-312-x86_64-linux-gnu.so,sha256=gOe65H__3O8_4a-aSVMB8gxHsRxVyQDUqqaIurPmIhE,15912 -charset_normalizer/cd.py,sha256=v0iPJweGsRegXywrM1LzUgqW9bJ1KFvIblQHP1jm5FQ,15174 -charset_normalizer/cli/__init__.py,sha256=D8I86lFk2-py45JvqxniTirSj_sFyE6sjaY_0-G1shc,136 -charset_normalizer/cli/__main__.py,sha256=E9FFSV1E2iOE_B2B1tJHQT9ExJqc60Ks_c-08sNawh8,11940 -charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc,, -charset_normalizer/cli/__pycache__/__main__.cpython-312.pyc,, -charset_normalizer/constant.py,sha256=yvLAWDrdSC743Cu4amhwHLIO-FGuRTOTZouCzZKGikc,44431 -charset_normalizer/legacy.py,sha256=yBIFMNABNPE5JkdKOWyVo36fZtV9nm8bf37LrDWulz8,2661 -charset_normalizer/md.cpython-312-x86_64-linux-gnu.so,sha256=iYaQbya7NVRR7xg5FtK1yAKS5shmTFwmtkqqQbbvEWs,15912 -charset_normalizer/md.py,sha256=AYCdfDX79FrgoId3zXqmbCuDcbGr1NRuGqgJN94Rx9Q,30441 -charset_normalizer/models.py,sha256=FbaQnI6ECmVmyHRSvVM5fHNeMAQ3KSGdwLjGcQqWDws,12821 -charset_normalizer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -charset_normalizer/utils.py,sha256=9cpi-_0-vC9pGDfuoarhC6VlF_Jxwx5Jsa_8I4w2D8k,12282 -charset_normalizer/version.py,sha256=2LxFuGp3BBuIwt95cp64y7v8bCNHcMAi08IfXt_47Co,115 diff --git a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.7.dist-info/WHEEL b/venv/lib/python3.12/site-packages/charset_normalizer-3.4.7.dist-info/WHEEL deleted file mode 100644 index 0493eaf..0000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.7.dist-info/WHEEL +++ /dev/null @@ -1,7 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (82.0.1) -Root-Is-Purelib: false -Tag: cp312-cp312-manylinux_2_17_x86_64 -Tag: cp312-cp312-manylinux2014_x86_64 -Tag: cp312-cp312-manylinux_2_28_x86_64 - diff --git a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.7.dist-info/entry_points.txt b/venv/lib/python3.12/site-packages/charset_normalizer-3.4.7.dist-info/entry_points.txt deleted file mode 100644 index 65619e7..0000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.7.dist-info/entry_points.txt +++ /dev/null @@ -1,2 +0,0 @@ -[console_scripts] -normalizer = charset_normalizer.cli:cli_detect diff --git a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.7.dist-info/licenses/LICENSE b/venv/lib/python3.12/site-packages/charset_normalizer-3.4.7.dist-info/licenses/LICENSE deleted file mode 100644 index 9725772..0000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.7.dist-info/licenses/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2025 TAHRI Ahmed R. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.7.dist-info/top_level.txt b/venv/lib/python3.12/site-packages/charset_normalizer-3.4.7.dist-info/top_level.txt deleted file mode 100644 index 89847be..0000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer-3.4.7.dist-info/top_level.txt +++ /dev/null @@ -1,2 +0,0 @@ -81d243bd2c585b0f4821__mypyc -charset_normalizer diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/__init__.py b/venv/lib/python3.12/site-packages/charset_normalizer/__init__.py deleted file mode 100644 index 0d3a379..0000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer/__init__.py +++ /dev/null @@ -1,48 +0,0 @@ -""" -Charset-Normalizer -~~~~~~~~~~~~~~ -The Real First Universal Charset Detector. -A library that helps you read text from an unknown charset encoding. -Motivated by chardet, This package is trying to resolve the issue by taking a new approach. -All IANA character set names for which the Python core library provides codecs are supported. - -Basic usage: - >>> from charset_normalizer import from_bytes - >>> results = from_bytes('Bсеки човек има право на образование. Oбразованието!'.encode('utf_8')) - >>> best_guess = results.best() - >>> str(best_guess) - 'Bсеки човек има право на образование. Oбразованието!' - -Others methods and usages are available - see the full documentation -at . -:copyright: (c) 2021 by Ahmed TAHRI -:license: MIT, see LICENSE for more details. -""" - -from __future__ import annotations - -import logging - -from .api import from_bytes, from_fp, from_path, is_binary -from .legacy import detect -from .models import CharsetMatch, CharsetMatches -from .utils import set_logging_handler -from .version import VERSION, __version__ - -__all__ = ( - "from_fp", - "from_path", - "from_bytes", - "is_binary", - "detect", - "CharsetMatch", - "CharsetMatches", - "__version__", - "VERSION", - "set_logging_handler", -) - -# Attach a NullHandler to the top level logger by default -# https://docs.python.org/3.3/howto/logging.html#configuring-logging-for-a-library - -logging.getLogger("charset_normalizer").addHandler(logging.NullHandler()) diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/__main__.py b/venv/lib/python3.12/site-packages/charset_normalizer/__main__.py deleted file mode 100644 index e0e76f7..0000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer/__main__.py +++ /dev/null @@ -1,6 +0,0 @@ -from __future__ import annotations - -from .cli import cli_detect - -if __name__ == "__main__": - cli_detect() diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 14be171..0000000 Binary files a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__main__.cpython-312.pyc b/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__main__.cpython-312.pyc deleted file mode 100644 index c860c13..0000000 Binary files a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__main__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/api.cpython-312.pyc b/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/api.cpython-312.pyc deleted file mode 100644 index 410c888..0000000 Binary files a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/api.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/cd.cpython-312.pyc b/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/cd.cpython-312.pyc deleted file mode 100644 index e0dc4ed..0000000 Binary files a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/cd.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/constant.cpython-312.pyc b/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/constant.cpython-312.pyc deleted file mode 100644 index 08fd281..0000000 Binary files a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/constant.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/legacy.cpython-312.pyc b/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/legacy.cpython-312.pyc deleted file mode 100644 index 669169e..0000000 Binary files a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/legacy.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/md.cpython-312.pyc b/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/md.cpython-312.pyc deleted file mode 100644 index 3efdc1c..0000000 Binary files a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/md.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/models.cpython-312.pyc b/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/models.cpython-312.pyc deleted file mode 100644 index ca1d994..0000000 Binary files a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/models.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index 2210b10..0000000 Binary files a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/utils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/version.cpython-312.pyc b/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/version.cpython-312.pyc deleted file mode 100644 index 8dfc16e..0000000 Binary files a/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/version.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/api.py b/venv/lib/python3.12/site-packages/charset_normalizer/api.py deleted file mode 100644 index 50cb955..0000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer/api.py +++ /dev/null @@ -1,988 +0,0 @@ -from __future__ import annotations - -import logging -from os import PathLike -from typing import BinaryIO - -from .cd import ( - coherence_ratio, - encoding_languages, - mb_encoding_languages, - merge_coherence_ratios, -) -from .constant import ( - IANA_SUPPORTED, - IANA_SUPPORTED_SIMILAR, - TOO_BIG_SEQUENCE, - TOO_SMALL_SEQUENCE, - TRACE, -) -from .md import mess_ratio -from .models import CharsetMatch, CharsetMatches -from .utils import ( - any_specified_encoding, - cut_sequence_chunks, - iana_name, - identify_sig_or_bom, - is_multi_byte_encoding, - should_strip_sig_or_bom, -) - -logger = logging.getLogger("charset_normalizer") -explain_handler = logging.StreamHandler() -explain_handler.setFormatter( - logging.Formatter("%(asctime)s | %(levelname)s | %(message)s") -) - -# Pre-compute a reordered encoding list: multibyte first, then single-byte. -# This allows the mb_definitive_match optimization to fire earlier, skipping -# all single-byte encodings for genuine CJK content. Multibyte codecs -# hard-fail (UnicodeDecodeError) on single-byte data almost instantly, so -# testing them first costs negligible time for non-CJK files. -_mb_supported: list[str] = [] -_sb_supported: list[str] = [] - -for _supported_enc in IANA_SUPPORTED: - try: - if is_multi_byte_encoding(_supported_enc): - _mb_supported.append(_supported_enc) - else: - _sb_supported.append(_supported_enc) - except ImportError: - _sb_supported.append(_supported_enc) - -IANA_SUPPORTED_MB_FIRST: list[str] = _mb_supported + _sb_supported - - -def from_bytes( - sequences: bytes | bytearray, - steps: int = 5, - chunk_size: int = 512, - threshold: float = 0.2, - cp_isolation: list[str] | None = None, - cp_exclusion: list[str] | None = None, - preemptive_behaviour: bool = True, - explain: bool = False, - language_threshold: float = 0.1, - enable_fallback: bool = True, -) -> CharsetMatches: - """ - Given a raw bytes sequence, return the best possibles charset usable to render str objects. - If there is no results, it is a strong indicator that the source is binary/not text. - By default, the process will extract 5 blocks of 512o each to assess the mess and coherence of a given sequence. - And will give up a particular code page after 20% of measured mess. Those criteria are customizable at will. - - The preemptive behavior DOES NOT replace the traditional detection workflow, it prioritize a particular code page - but never take it for granted. Can improve the performance. - - You may want to focus your attention to some code page or/and not others, use cp_isolation and cp_exclusion for that - purpose. - - This function will strip the SIG in the payload/sequence every time except on UTF-16, UTF-32. - By default the library does not setup any handler other than the NullHandler, if you choose to set the 'explain' - toggle to True it will alter the logger configuration to add a StreamHandler that is suitable for debugging. - Custom logging format and handler can be set manually. - """ - - if not isinstance(sequences, (bytearray, bytes)): - raise TypeError( - "Expected object of type bytes or bytearray, got: {}".format( - type(sequences) - ) - ) - - if explain: - previous_logger_level: int = logger.level - logger.addHandler(explain_handler) - logger.setLevel(TRACE) - - length: int = len(sequences) - - if length == 0: - logger.debug("Encoding detection on empty bytes, assuming utf_8 intention.") - if explain: # Defensive: ensure exit path clean handler - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level) - return CharsetMatches([CharsetMatch(sequences, "utf_8", 0.0, False, [], "")]) - - if cp_isolation is not None: - logger.log( - TRACE, - "cp_isolation is set. use this flag for debugging purpose. " - "limited list of encoding allowed : %s.", - ", ".join(cp_isolation), - ) - cp_isolation = [iana_name(cp, False) for cp in cp_isolation] - else: - cp_isolation = [] - - if cp_exclusion is not None: - logger.log( - TRACE, - "cp_exclusion is set. use this flag for debugging purpose. " - "limited list of encoding excluded : %s.", - ", ".join(cp_exclusion), - ) - cp_exclusion = [iana_name(cp, False) for cp in cp_exclusion] - else: - cp_exclusion = [] - - if length <= (chunk_size * steps): - logger.log( - TRACE, - "override steps (%i) and chunk_size (%i) as content does not fit (%i byte(s) given) parameters.", - steps, - chunk_size, - length, - ) - steps = 1 - chunk_size = length - - if steps > 1 and length / steps < chunk_size: - chunk_size = int(length / steps) - - is_too_small_sequence: bool = len(sequences) < TOO_SMALL_SEQUENCE - is_too_large_sequence: bool = len(sequences) >= TOO_BIG_SEQUENCE - - if is_too_small_sequence: - logger.log( - TRACE, - "Trying to detect encoding from a tiny portion of ({}) byte(s).".format( - length - ), - ) - elif is_too_large_sequence: - logger.log( - TRACE, - "Using lazy str decoding because the payload is quite large, ({}) byte(s).".format( - length - ), - ) - - prioritized_encodings: list[str] = [] - - specified_encoding: str | None = ( - any_specified_encoding(sequences) if preemptive_behaviour else None - ) - - if specified_encoding is not None: - prioritized_encodings.append(specified_encoding) - logger.log( - TRACE, - "Detected declarative mark in sequence. Priority +1 given for %s.", - specified_encoding, - ) - - tested: set[str] = set() - tested_but_hard_failure: list[str] = [] - tested_but_soft_failure: list[str] = [] - soft_failure_skip: set[str] = set() - success_fast_tracked: set[str] = set() - - # Cache for decoded payload deduplication: hash(decoded_payload) -> (mean_mess_ratio, cd_ratios_merged, passed) - # When multiple encodings decode to the exact same string, we can skip the expensive - # mess_ratio and coherence_ratio analysis and reuse the results from the first encoding. - payload_result_cache: dict[int, tuple[float, list[tuple[str, float]], bool]] = {} - - # When a definitive result (chaos=0.0 and good coherence) is found after testing - # the prioritized encodings (ascii, utf_8), we can significantly reduce the remaining - # work. Encodings that target completely different language families (e.g., Cyrillic - # when the definitive match is Latin) are skipped entirely. - # Additionally, for same-family encodings that pass chaos probing, we reuse the - # definitive match's coherence ratios instead of recomputing them — a major savings - # since coherence_ratio accounts for ~30% of total time on slow Latin files. - definitive_match_found: bool = False - definitive_target_languages: set[str] = set() - # After the definitive match fires, we cap the number of additional same-family - # single-byte encodings that pass chaos probing. Once we've accumulated enough - # good candidates (N), further same-family SB encodings are unlikely to produce - # a better best() result and just waste mess_ratio + coherence_ratio time. - # The first encoding to trigger the definitive match is NOT counted (it's already in). - post_definitive_sb_success_count: int = 0 - POST_DEFINITIVE_SB_CAP: int = 7 - - # When a non-UTF multibyte encoding passes chaos probing with significant multibyte - # content (decoded length < 98% of raw length), skip all remaining single-byte encodings. - # Rationale: multi-byte decoders (CJK) have strict byte-sequence validation — if they - # decode without error AND pass chaos probing with substantial multibyte content, the - # data is genuinely multibyte encoded. Single-byte encodings will always decode (every - # byte maps to something) but waste time on mess_ratio before failing. - # The 98% threshold prevents false triggers on files that happen to have a few valid - # multibyte pairs (e.g., cp424/_ude_1.txt where big5 decodes with 99% ratio). - mb_definitive_match_found: bool = False - - fallback_ascii: CharsetMatch | None = None - fallback_u8: CharsetMatch | None = None - fallback_specified: CharsetMatch | None = None - - results: CharsetMatches = CharsetMatches() - - early_stop_results: CharsetMatches = CharsetMatches() - - sig_encoding, sig_payload = identify_sig_or_bom(sequences) - - if sig_encoding is not None: - prioritized_encodings.append(sig_encoding) - logger.log( - TRACE, - "Detected a SIG or BOM mark on first %i byte(s). Priority +1 given for %s.", - len(sig_payload), - sig_encoding, - ) - - prioritized_encodings.append("ascii") - - if "utf_8" not in prioritized_encodings: - prioritized_encodings.append("utf_8") - - for encoding_iana in prioritized_encodings + IANA_SUPPORTED_MB_FIRST: - if cp_isolation and encoding_iana not in cp_isolation: - continue - - if cp_exclusion and encoding_iana in cp_exclusion: - continue - - if encoding_iana in tested: - continue - - tested.add(encoding_iana) - - decoded_payload: str | None = None - bom_or_sig_available: bool = sig_encoding == encoding_iana - strip_sig_or_bom: bool = bom_or_sig_available and should_strip_sig_or_bom( - encoding_iana - ) - - if encoding_iana in {"utf_16", "utf_32"} and not bom_or_sig_available: - logger.log( - TRACE, - "Encoding %s won't be tested as-is because it require a BOM. Will try some sub-encoder LE/BE.", - encoding_iana, - ) - continue - if encoding_iana in {"utf_7"} and not bom_or_sig_available: - logger.log( - TRACE, - "Encoding %s won't be tested as-is because detection is unreliable without BOM/SIG.", - encoding_iana, - ) - continue - - # Skip encodings similar to ones that already soft-failed (high mess ratio). - # Checked BEFORE the expensive decode attempt. - if encoding_iana in soft_failure_skip: - logger.log( - TRACE, - "%s is deemed too similar to a code page that was already considered unsuited. Continuing!", - encoding_iana, - ) - continue - - # Skip encodings that were already fast-tracked from a similar successful encoding. - if encoding_iana in success_fast_tracked: - logger.log( - TRACE, - "Skipping %s: already fast-tracked from a similar successful encoding.", - encoding_iana, - ) - continue - - try: - is_multi_byte_decoder: bool = is_multi_byte_encoding(encoding_iana) - except (ModuleNotFoundError, ImportError): # Defensive: - logger.log( - TRACE, - "Encoding %s does not provide an IncrementalDecoder", - encoding_iana, - ) - continue - - # When we've already found a definitive match (chaos=0.0 with good coherence) - # after testing the prioritized encodings, skip encodings that target - # completely different language families. This avoids running expensive - # mess_ratio + coherence_ratio on clearly unrelated candidates (e.g., Cyrillic - # when the definitive match is Latin-based). - if definitive_match_found: - if not is_multi_byte_decoder: - enc_languages = set(encoding_languages(encoding_iana)) - else: - enc_languages = set(mb_encoding_languages(encoding_iana)) - if not enc_languages.intersection(definitive_target_languages): - logger.log( - TRACE, - "Skipping %s: definitive match already found, this encoding targets different languages (%s vs %s).", - encoding_iana, - enc_languages, - definitive_target_languages, - ) - continue - - # After the definitive match, cap the number of additional same-family - # single-byte encodings that pass chaos probing. This avoids testing the - # tail of rare, low-value same-family encodings (mac_iceland, cp860, etc.) - # that almost never change best() but each cost ~1-2ms of mess_ratio + coherence. - if ( - definitive_match_found - and not is_multi_byte_decoder - and post_definitive_sb_success_count >= POST_DEFINITIVE_SB_CAP - ): - logger.log( - TRACE, - "Skipping %s: already accumulated %d same-family results after definitive match (cap=%d).", - encoding_iana, - post_definitive_sb_success_count, - POST_DEFINITIVE_SB_CAP, - ) - continue - - # When a multibyte encoding with significant multibyte content has already - # passed chaos probing, skip all single-byte encodings. They will either fail - # chaos probing (wasting mess_ratio time) or produce inferior results. - if mb_definitive_match_found and not is_multi_byte_decoder: - logger.log( - TRACE, - "Skipping single-byte %s: multi-byte definitive match already found.", - encoding_iana, - ) - continue - - try: - if is_too_large_sequence and is_multi_byte_decoder is False: - str( - ( - sequences[: int(50e4)] - if strip_sig_or_bom is False - else sequences[len(sig_payload) : int(50e4)] - ), - encoding=encoding_iana, - ) - else: - # UTF-7 BOM is encoded in modified Base64 whose byte boundary - # can overlap with the next character. Stripping raw SIG bytes - # before decoding may leave stray bytes that decode as garbage. - # Decode the full sequence and remove the leading BOM char instead. - # see https://github.com/jawah/charset_normalizer/issues/718 - # and https://github.com/jawah/charset_normalizer/issues/716 - if encoding_iana == "utf_7" and bom_or_sig_available: - decoded_payload = str( - sequences, - encoding=encoding_iana, - ) - if decoded_payload and decoded_payload[0] == "\ufeff": - decoded_payload = decoded_payload[1:] - else: - decoded_payload = str( - ( - sequences - if strip_sig_or_bom is False - else sequences[len(sig_payload) :] - ), - encoding=encoding_iana, - ) - except (UnicodeDecodeError, LookupError) as e: - if not isinstance(e, LookupError): - logger.log( - TRACE, - "Code page %s does not fit given bytes sequence at ALL. %s", - encoding_iana, - str(e), - ) - tested_but_hard_failure.append(encoding_iana) - continue - - r_ = range( - 0 if not bom_or_sig_available else len(sig_payload), - length, - int(length / steps), - ) - - multi_byte_bonus: bool = ( - is_multi_byte_decoder - and decoded_payload is not None - and len(decoded_payload) < length - ) - - if multi_byte_bonus: - logger.log( - TRACE, - "Code page %s is a multi byte encoding table and it appear that at least one character " - "was encoded using n-bytes.", - encoding_iana, - ) - - # Payload-hash deduplication: if another encoding already decoded to the - # exact same string, reuse its mess_ratio and coherence results entirely. - # This is strictly more general than the old IANA_SUPPORTED_SIMILAR approach - # because it catches ALL identical decoding, not just pre-mapped ones. - if decoded_payload is not None and not is_multi_byte_decoder: - payload_hash: int = hash(decoded_payload) - cached = payload_result_cache.get(payload_hash) - if cached is not None: - cached_mess, cached_cd, cached_passed = cached - if cached_passed: - # The previous encoding with identical output passed chaos probing. - fast_match = CharsetMatch( - sequences, - encoding_iana, - cached_mess, - bom_or_sig_available, - cached_cd, - ( - decoded_payload - if ( - is_too_large_sequence is False - or encoding_iana - in [specified_encoding, "ascii", "utf_8"] - ) - else None - ), - preemptive_declaration=specified_encoding, - ) - results.append(fast_match) - success_fast_tracked.add(encoding_iana) - logger.log( - TRACE, - "%s fast-tracked (identical decoded payload to a prior encoding, chaos=%f %%).", - encoding_iana, - round(cached_mess * 100, ndigits=3), - ) - - if ( - encoding_iana in [specified_encoding, "ascii", "utf_8"] - and cached_mess < 0.1 - ): - if cached_mess == 0.0: - logger.debug( - "Encoding detection: %s is most likely the one.", - fast_match.encoding, - ) - if explain: - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level) - return CharsetMatches([fast_match]) - early_stop_results.append(fast_match) - - if ( - len(early_stop_results) - and (specified_encoding is None or specified_encoding in tested) - and "ascii" in tested - and "utf_8" in tested - ): - probable_result: CharsetMatch = early_stop_results.best() # type: ignore[assignment] - logger.debug( - "Encoding detection: %s is most likely the one.", - probable_result.encoding, - ) - if explain: - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level) - return CharsetMatches([probable_result]) - - continue - else: - # The previous encoding with identical output failed chaos probing. - tested_but_soft_failure.append(encoding_iana) - logger.log( - TRACE, - "%s fast-skipped (identical decoded payload to a prior encoding that failed chaos probing).", - encoding_iana, - ) - # Prepare fallbacks for special encodings even when skipped. - if enable_fallback and encoding_iana in [ - "ascii", - "utf_8", - specified_encoding, - "utf_16", - "utf_32", - ]: - fallback_entry = CharsetMatch( - sequences, - encoding_iana, - threshold, - bom_or_sig_available, - [], - decoded_payload, - preemptive_declaration=specified_encoding, - ) - if encoding_iana == specified_encoding: - fallback_specified = fallback_entry - elif encoding_iana == "ascii": - fallback_ascii = fallback_entry - else: - fallback_u8 = fallback_entry - continue - - max_chunk_gave_up: int = int(len(r_) / 4) - - max_chunk_gave_up = max(max_chunk_gave_up, 2) - early_stop_count: int = 0 - lazy_str_hard_failure = False - - md_chunks: list[str] = [] - md_ratios = [] - - try: - for chunk in cut_sequence_chunks( - sequences, - encoding_iana, - r_, - chunk_size, - bom_or_sig_available, - strip_sig_or_bom, - sig_payload, - is_multi_byte_decoder, - decoded_payload, - ): - md_chunks.append(chunk) - - md_ratios.append( - mess_ratio( - chunk, - threshold, - explain is True and 1 <= len(cp_isolation) <= 2, - ) - ) - - if md_ratios[-1] >= threshold: - early_stop_count += 1 - - if (early_stop_count >= max_chunk_gave_up) or ( - bom_or_sig_available and strip_sig_or_bom is False - ): - break - except ( - UnicodeDecodeError - ) as e: # Lazy str loading may have missed something there - logger.log( - TRACE, - "LazyStr Loading: After MD chunk decode, code page %s does not fit given bytes sequence at ALL. %s", - encoding_iana, - str(e), - ) - early_stop_count = max_chunk_gave_up - lazy_str_hard_failure = True - - # We might want to check the sequence again with the whole content - # Only if initial MD tests passes - if ( - not lazy_str_hard_failure - and is_too_large_sequence - and not is_multi_byte_decoder - ): - try: - sequences[int(50e3) :].decode(encoding_iana, errors="strict") - except UnicodeDecodeError as e: - logger.log( - TRACE, - "LazyStr Loading: After final lookup, code page %s does not fit given bytes sequence at ALL. %s", - encoding_iana, - str(e), - ) - tested_but_hard_failure.append(encoding_iana) - continue - - mean_mess_ratio: float = sum(md_ratios) / len(md_ratios) if md_ratios else 0.0 - if mean_mess_ratio >= threshold or early_stop_count >= max_chunk_gave_up: - tested_but_soft_failure.append(encoding_iana) - if encoding_iana in IANA_SUPPORTED_SIMILAR: - soft_failure_skip.update(IANA_SUPPORTED_SIMILAR[encoding_iana]) - # Cache this soft-failure so identical decoding from other encodings - # can be skipped immediately. - if decoded_payload is not None and not is_multi_byte_decoder: - payload_result_cache.setdefault( - hash(decoded_payload), (mean_mess_ratio, [], False) - ) - logger.log( - TRACE, - "%s was excluded because of initial chaos probing. Gave up %i time(s). " - "Computed mean chaos is %f %%.", - encoding_iana, - early_stop_count, - round(mean_mess_ratio * 100, ndigits=3), - ) - # Preparing those fallbacks in case we got nothing. - if ( - enable_fallback - and encoding_iana - in ["ascii", "utf_8", specified_encoding, "utf_16", "utf_32"] - and not lazy_str_hard_failure - ): - fallback_entry = CharsetMatch( - sequences, - encoding_iana, - threshold, - bom_or_sig_available, - [], - decoded_payload, - preemptive_declaration=specified_encoding, - ) - if encoding_iana == specified_encoding: - fallback_specified = fallback_entry - elif encoding_iana == "ascii": - fallback_ascii = fallback_entry - else: - fallback_u8 = fallback_entry - continue - - logger.log( - TRACE, - "%s passed initial chaos probing. Mean measured chaos is %f %%", - encoding_iana, - round(mean_mess_ratio * 100, ndigits=3), - ) - - if not is_multi_byte_decoder: - target_languages: list[str] = encoding_languages(encoding_iana) - else: - target_languages = mb_encoding_languages(encoding_iana) - - if target_languages: - logger.log( - TRACE, - "{} should target any language(s) of {}".format( - encoding_iana, str(target_languages) - ), - ) - - cd_ratios = [] - - # Run coherence detection on all chunks. We previously tried limiting to - # 1-2 chunks for post-definitive encodings to save time, but this caused - # coverage regressions by producing unrepresentative coherence scores. - # The SB cap and language-family skip optimizations provide sufficient - # speedup without sacrificing coherence accuracy. - if encoding_iana != "ascii": - # We shall skip the CD when its about ASCII - # Most of the time its not relevant to run "language-detection" on it. - for chunk in md_chunks: - chunk_languages = coherence_ratio( - chunk, - language_threshold, - ",".join(target_languages) if target_languages else None, - ) - - cd_ratios.append(chunk_languages) - cd_ratios_merged = merge_coherence_ratios(cd_ratios) - else: - cd_ratios_merged = merge_coherence_ratios(cd_ratios) - - if cd_ratios_merged: - logger.log( - TRACE, - "We detected language {} using {}".format( - cd_ratios_merged, encoding_iana - ), - ) - - current_match = CharsetMatch( - sequences, - encoding_iana, - mean_mess_ratio, - bom_or_sig_available, - cd_ratios_merged, - ( - decoded_payload - if ( - is_too_large_sequence is False - or encoding_iana in [specified_encoding, "ascii", "utf_8"] - ) - else None - ), - preemptive_declaration=specified_encoding, - ) - - results.append(current_match) - - # Cache the successful result for payload-hash deduplication. - if decoded_payload is not None and not is_multi_byte_decoder: - payload_result_cache.setdefault( - hash(decoded_payload), - (mean_mess_ratio, cd_ratios_merged, True), - ) - - # Count post-definitive same-family SB successes for the early termination cap. - # Only count low-mess encodings (< 2%) toward the cap. High-mess encodings are - # marginal results that shouldn't prevent better-quality candidates from being - # tested. For example, iso8859_4 (mess=0%) should not be skipped just because - # 7 high-mess Latin encodings (cp1252 at 8%, etc.) were tried first. - if ( - definitive_match_found - and not is_multi_byte_decoder - and mean_mess_ratio < 0.02 - ): - post_definitive_sb_success_count += 1 - - if ( - encoding_iana in [specified_encoding, "ascii", "utf_8"] - and mean_mess_ratio < 0.1 - ): - # If md says nothing to worry about, then... stop immediately! - if mean_mess_ratio == 0.0: - logger.debug( - "Encoding detection: %s is most likely the one.", - current_match.encoding, - ) - if explain: # Defensive: ensure exit path clean handler - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level) - return CharsetMatches([current_match]) - - early_stop_results.append(current_match) - - if ( - len(early_stop_results) - and (specified_encoding is None or specified_encoding in tested) - and "ascii" in tested - and "utf_8" in tested - ): - probable_result = early_stop_results.best() # type: ignore[assignment] - logger.debug( - "Encoding detection: %s is most likely the one.", - probable_result.encoding, # type: ignore[union-attr] - ) - if explain: # Defensive: ensure exit path clean handler - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level) - - return CharsetMatches([probable_result]) - - # Once we find a result with good coherence (>= 0.5) after testing the - # prioritized encodings (ascii, utf_8), activate "definitive mode": skip - # encodings that target completely different language families. This avoids - # running expensive mess_ratio + coherence_ratio on clearly unrelated - # candidates (e.g., Cyrillic encodings when the match is Latin-based). - # We require coherence >= 0.5 to avoid false positives (e.g., cp1251 decoding - # Hebrew text with 0.0 chaos but wrong language detection at coherence 0.33). - if not definitive_match_found and not is_multi_byte_decoder: - best_coherence = ( - max((v for _, v in cd_ratios_merged), default=0.0) - if cd_ratios_merged - else 0.0 - ) - if best_coherence >= 0.5 and "ascii" in tested and "utf_8" in tested: - definitive_match_found = True - definitive_target_languages.update(target_languages) - logger.log( - TRACE, - "Definitive match found: %s (chaos=%.3f, coherence=%.2f). Encodings targeting different language families will be skipped.", - encoding_iana, - mean_mess_ratio, - best_coherence, - ) - - # When a non-UTF multibyte encoding passes chaos probing with significant - # multibyte content (decoded < 98% of raw), activate mb_definitive_match. - # This skips all remaining single-byte encodings which would either soft-fail - # (running expensive mess_ratio for nothing) or produce inferior results. - if ( - not mb_definitive_match_found - and is_multi_byte_decoder - and multi_byte_bonus - and decoded_payload is not None - and len(decoded_payload) < length * 0.98 - and encoding_iana - not in { - "utf_8", - "utf_8_sig", - "utf_16", - "utf_16_be", - "utf_16_le", - "utf_32", - "utf_32_be", - "utf_32_le", - "utf_7", - } - and "ascii" in tested - and "utf_8" in tested - ): - mb_definitive_match_found = True - logger.log( - TRACE, - "Multi-byte definitive match: %s (chaos=%.3f, decoded=%d/%d=%.1f%%). Single-byte encodings will be skipped.", - encoding_iana, - mean_mess_ratio, - len(decoded_payload), - length, - len(decoded_payload) / length * 100, - ) - - if encoding_iana == sig_encoding: - logger.debug( - "Encoding detection: %s is most likely the one as we detected a BOM or SIG within " - "the beginning of the sequence.", - encoding_iana, - ) - if explain: # Defensive: ensure exit path clean handler - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level) - return CharsetMatches([results[encoding_iana]]) - - if len(results) == 0: - if fallback_u8 or fallback_ascii or fallback_specified: - logger.log( - TRACE, - "Nothing got out of the detection process. Using ASCII/UTF-8/Specified fallback.", - ) - - if fallback_specified: - logger.debug( - "Encoding detection: %s will be used as a fallback match", - fallback_specified.encoding, - ) - results.append(fallback_specified) - elif ( - (fallback_u8 and fallback_ascii is None) - or ( - fallback_u8 - and fallback_ascii - and fallback_u8.fingerprint != fallback_ascii.fingerprint - ) - or (fallback_u8 is not None) - ): - logger.debug("Encoding detection: utf_8 will be used as a fallback match") - results.append(fallback_u8) - elif fallback_ascii: - logger.debug("Encoding detection: ascii will be used as a fallback match") - results.append(fallback_ascii) - - if results: - logger.debug( - "Encoding detection: Found %s as plausible (best-candidate) for content. With %i alternatives.", - results.best().encoding, # type: ignore - len(results) - 1, - ) - else: - logger.debug("Encoding detection: Unable to determine any suitable charset.") - - if explain: - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level) - - return results - - -def from_fp( - fp: BinaryIO, - steps: int = 5, - chunk_size: int = 512, - threshold: float = 0.20, - cp_isolation: list[str] | None = None, - cp_exclusion: list[str] | None = None, - preemptive_behaviour: bool = True, - explain: bool = False, - language_threshold: float = 0.1, - enable_fallback: bool = True, -) -> CharsetMatches: - """ - Same thing than the function from_bytes but using a file pointer that is already ready. - Will not close the file pointer. - """ - return from_bytes( - fp.read(), - steps, - chunk_size, - threshold, - cp_isolation, - cp_exclusion, - preemptive_behaviour, - explain, - language_threshold, - enable_fallback, - ) - - -def from_path( - path: str | bytes | PathLike, # type: ignore[type-arg] - steps: int = 5, - chunk_size: int = 512, - threshold: float = 0.20, - cp_isolation: list[str] | None = None, - cp_exclusion: list[str] | None = None, - preemptive_behaviour: bool = True, - explain: bool = False, - language_threshold: float = 0.1, - enable_fallback: bool = True, -) -> CharsetMatches: - """ - Same thing than the function from_bytes but with one extra step. Opening and reading given file path in binary mode. - Can raise IOError. - """ - with open(path, "rb") as fp: - return from_fp( - fp, - steps, - chunk_size, - threshold, - cp_isolation, - cp_exclusion, - preemptive_behaviour, - explain, - language_threshold, - enable_fallback, - ) - - -def is_binary( - fp_or_path_or_payload: PathLike | str | BinaryIO | bytes, # type: ignore[type-arg] - steps: int = 5, - chunk_size: int = 512, - threshold: float = 0.20, - cp_isolation: list[str] | None = None, - cp_exclusion: list[str] | None = None, - preemptive_behaviour: bool = True, - explain: bool = False, - language_threshold: float = 0.1, - enable_fallback: bool = False, -) -> bool: - """ - Detect if the given input (file, bytes, or path) points to a binary file. aka. not a string. - Based on the same main heuristic algorithms and default kwargs at the sole exception that fallbacks match - are disabled to be stricter around ASCII-compatible but unlikely to be a string. - """ - if isinstance(fp_or_path_or_payload, (str, PathLike)): - guesses = from_path( - fp_or_path_or_payload, - steps=steps, - chunk_size=chunk_size, - threshold=threshold, - cp_isolation=cp_isolation, - cp_exclusion=cp_exclusion, - preemptive_behaviour=preemptive_behaviour, - explain=explain, - language_threshold=language_threshold, - enable_fallback=enable_fallback, - ) - elif isinstance( - fp_or_path_or_payload, - ( - bytes, - bytearray, - ), - ): - guesses = from_bytes( - fp_or_path_or_payload, - steps=steps, - chunk_size=chunk_size, - threshold=threshold, - cp_isolation=cp_isolation, - cp_exclusion=cp_exclusion, - preemptive_behaviour=preemptive_behaviour, - explain=explain, - language_threshold=language_threshold, - enable_fallback=enable_fallback, - ) - else: - guesses = from_fp( - fp_or_path_or_payload, - steps=steps, - chunk_size=chunk_size, - threshold=threshold, - cp_isolation=cp_isolation, - cp_exclusion=cp_exclusion, - preemptive_behaviour=preemptive_behaviour, - explain=explain, - language_threshold=language_threshold, - enable_fallback=enable_fallback, - ) - - return not guesses diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/cd.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/charset_normalizer/cd.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index dffe3e4..0000000 Binary files a/venv/lib/python3.12/site-packages/charset_normalizer/cd.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/cd.py b/venv/lib/python3.12/site-packages/charset_normalizer/cd.py deleted file mode 100644 index 9545d35..0000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer/cd.py +++ /dev/null @@ -1,454 +0,0 @@ -from __future__ import annotations - -import importlib -from codecs import IncrementalDecoder -from collections import Counter -from functools import lru_cache -from typing import Counter as TypeCounter - -from .constant import ( - FREQUENCIES, - KO_NAMES, - LANGUAGE_SUPPORTED_COUNT, - TOO_SMALL_SEQUENCE, - ZH_NAMES, - _FREQUENCIES_SET, - _FREQUENCIES_RANK, -) -from .md import is_suspiciously_successive_range -from .models import CoherenceMatches -from .utils import ( - is_accentuated, - is_latin, - is_multi_byte_encoding, - is_unicode_range_secondary, - unicode_range, -) - - -def encoding_unicode_range(iana_name: str) -> list[str]: - """ - Return associated unicode ranges in a single byte code page. - """ - if is_multi_byte_encoding(iana_name): - raise OSError( # Defensive: - "Function not supported on multi-byte code page" - ) - - decoder = importlib.import_module(f"encodings.{iana_name}").IncrementalDecoder - - p: IncrementalDecoder = decoder(errors="ignore") - seen_ranges: dict[str, int] = {} - character_count: int = 0 - - for i in range(0x40, 0xFF): - chunk: str = p.decode(bytes([i])) - - if chunk: - character_range: str | None = unicode_range(chunk) - - if character_range is None: - continue - - if is_unicode_range_secondary(character_range) is False: - if character_range not in seen_ranges: - seen_ranges[character_range] = 0 - seen_ranges[character_range] += 1 - character_count += 1 - - return sorted( - [ - character_range - for character_range in seen_ranges - if seen_ranges[character_range] / character_count >= 0.15 - ] - ) - - -def unicode_range_languages(primary_range: str) -> list[str]: - """ - Return inferred languages used with a unicode range. - """ - languages: list[str] = [] - - for language, characters in FREQUENCIES.items(): - for character in characters: - if unicode_range(character) == primary_range: - languages.append(language) - break - - return languages - - -@lru_cache() -def encoding_languages(iana_name: str) -> list[str]: - """ - Single-byte encoding language association. Some code page are heavily linked to particular language(s). - This function does the correspondence. - """ - unicode_ranges: list[str] = encoding_unicode_range(iana_name) - primary_range: str | None = None - - for specified_range in unicode_ranges: - if "Latin" not in specified_range: - primary_range = specified_range - break - - if primary_range is None: - return ["Latin Based"] - - return unicode_range_languages(primary_range) - - -@lru_cache() -def mb_encoding_languages(iana_name: str) -> list[str]: - """ - Multi-byte encoding language association. Some code page are heavily linked to particular language(s). - This function does the correspondence. - """ - if ( - iana_name.startswith("shift_") - or iana_name.startswith("iso2022_jp") - or iana_name.startswith("euc_j") - or iana_name == "cp932" - ): - return ["Japanese"] - if iana_name.startswith("gb") or iana_name in ZH_NAMES: - return ["Chinese"] - if iana_name.startswith("iso2022_kr") or iana_name in KO_NAMES: - return ["Korean"] - - return [] - - -@lru_cache(maxsize=LANGUAGE_SUPPORTED_COUNT) -def get_target_features(language: str) -> tuple[bool, bool]: - """ - Determine main aspects from a supported language if it contains accents and if is pure Latin. - """ - target_have_accents: bool = False - target_pure_latin: bool = True - - for character in FREQUENCIES[language]: - if not target_have_accents and is_accentuated(character): - target_have_accents = True - if target_pure_latin and is_latin(character) is False: - target_pure_latin = False - - return target_have_accents, target_pure_latin - - -def alphabet_languages( - characters: list[str], ignore_non_latin: bool = False -) -> list[str]: - """ - Return associated languages associated to given characters. - """ - languages: list[tuple[str, float]] = [] - - characters_set: frozenset[str] = frozenset(characters) - source_have_accents = any(is_accentuated(character) for character in characters) - - for language, language_characters in FREQUENCIES.items(): - target_have_accents, target_pure_latin = get_target_features(language) - - if ignore_non_latin and target_pure_latin is False: - continue - - if target_have_accents is False and source_have_accents: - continue - - character_count: int = len(language_characters) - - character_match_count: int = len(_FREQUENCIES_SET[language] & characters_set) - - ratio: float = character_match_count / character_count - - if ratio >= 0.2: - languages.append((language, ratio)) - - languages = sorted(languages, key=lambda x: x[1], reverse=True) - - return [compatible_language[0] for compatible_language in languages] - - -def characters_popularity_compare( - language: str, ordered_characters: list[str] -) -> float: - """ - Determine if a ordered characters list (by occurrence from most appearance to rarest) match a particular language. - The result is a ratio between 0. (absolutely no correspondence) and 1. (near perfect fit). - Beware that is function is not strict on the match in order to ease the detection. (Meaning close match is 1.) - """ - if language not in FREQUENCIES: - raise ValueError(f"{language} not available") # Defensive: - - character_approved_count: int = 0 - frequencies_language_set: frozenset[str] = _FREQUENCIES_SET[language] - lang_rank: dict[str, int] = _FREQUENCIES_RANK[language] - - ordered_characters_count: int = len(ordered_characters) - target_language_characters_count: int = len(FREQUENCIES[language]) - - large_alphabet: bool = target_language_characters_count > 26 - - expected_projection_ratio: float = ( - target_language_characters_count / ordered_characters_count - ) - - # Pre-built rank dict for ordered_characters (avoids repeated list slicing). - ordered_rank: dict[str, int] = { - char: rank for rank, char in enumerate(ordered_characters) - } - - # Pre-compute characters common to both orderings. - # Avoids repeated `c in ordered_rank` dict lookups in the inner counts. - common_chars: list[tuple[int, int]] = [ - (lr, ordered_rank[c]) for c, lr in lang_rank.items() if c in ordered_rank - ] - - # Pre-extract lr and orr arrays for faster iteration in the inner loop. - # Plain integer loops with local arrays are much faster under mypyc than - # generator expression sums over a list of tuples. - common_count: int = len(common_chars) - common_lr: list[int] = [p[0] for p in common_chars] - common_orr: list[int] = [p[1] for p in common_chars] - - for character, character_rank in zip( - ordered_characters, range(0, ordered_characters_count) - ): - if character not in frequencies_language_set: - continue - - character_rank_in_language: int = lang_rank[character] - character_rank_projection: int = int(character_rank * expected_projection_ratio) - - if ( - large_alphabet is False - and abs(character_rank_projection - character_rank_in_language) > 4 - ): - continue - - if ( - large_alphabet is True - and abs(character_rank_projection - character_rank_in_language) - < target_language_characters_count / 3 - ): - character_approved_count += 1 - continue - - # Count how many characters appear "before" in both orderings, - # and how many appear "at or after" in both orderings. - # Single pass over pre-extracted arrays — much faster under mypyc - # than two generator expression sums. - before_match_count: int = 0 - after_match_count: int = 0 - for i in range(common_count): - lr_i: int = common_lr[i] - orr_i: int = common_orr[i] - if lr_i < character_rank_in_language: - if orr_i < character_rank: - before_match_count += 1 - else: - if orr_i >= character_rank: - after_match_count += 1 - - after_len: int = target_language_characters_count - character_rank_in_language - - if character_rank_in_language == 0 and before_match_count <= 4: - character_approved_count += 1 - continue - - if after_len == 0 and after_match_count <= 4: - character_approved_count += 1 - continue - - if ( - character_rank_in_language > 0 - and before_match_count / character_rank_in_language >= 0.4 - ) or (after_len > 0 and after_match_count / after_len >= 0.4): - character_approved_count += 1 - continue - - return character_approved_count / len(ordered_characters) - - -def alpha_unicode_split(decoded_sequence: str) -> list[str]: - """ - Given a decoded text sequence, return a list of str. Unicode range / alphabet separation. - Ex. a text containing English/Latin with a bit a Hebrew will return two items in the resulting list; - One containing the latin letters and the other hebrew. - """ - layers: dict[str, list[str]] = {} - - # Fast path: track single-layer key to skip dict iteration for single-script text. - single_layer_key: str | None = None - multi_layer: bool = False - - # Cache the last character_range and its resolved layer to avoid repeated - # is_suspiciously_successive_range calls for consecutive same-range chars. - prev_character_range: str | None = None - prev_layer_target: str | None = None - - for character in decoded_sequence: - if character.isalpha() is False: - continue - - # ASCII fast-path: a-z and A-Z are always "Basic Latin". - # Avoids unicode_range() function call overhead for the most common case. - character_ord: int = ord(character) - if character_ord < 128: - character_range: str | None = "Basic Latin" - else: - character_range = unicode_range(character) - - if character_range is None: - continue - - # Fast path: same range as previous character → reuse cached layer target. - if character_range == prev_character_range: - if prev_layer_target is not None: - layers[prev_layer_target].append(character) - continue - - layer_target_range: str | None = None - - if multi_layer: - for discovered_range in layers: - if ( - is_suspiciously_successive_range(discovered_range, character_range) - is False - ): - layer_target_range = discovered_range - break - elif single_layer_key is not None: - if ( - is_suspiciously_successive_range(single_layer_key, character_range) - is False - ): - layer_target_range = single_layer_key - - if layer_target_range is None: - layer_target_range = character_range - - if layer_target_range not in layers: - layers[layer_target_range] = [] - if single_layer_key is None: - single_layer_key = layer_target_range - else: - multi_layer = True - - layers[layer_target_range].append(character) - - # Cache for next iteration - prev_character_range = character_range - prev_layer_target = layer_target_range - - return ["".join(chars).lower() for chars in layers.values()] - - -def merge_coherence_ratios(results: list[CoherenceMatches]) -> CoherenceMatches: - """ - This function merge results previously given by the function coherence_ratio. - The return type is the same as coherence_ratio. - """ - per_language_ratios: dict[str, list[float]] = {} - for result in results: - for sub_result in result: - language, ratio = sub_result - if language not in per_language_ratios: - per_language_ratios[language] = [ratio] - continue - per_language_ratios[language].append(ratio) - - merge = [ - ( - language, - round( - sum(per_language_ratios[language]) / len(per_language_ratios[language]), - 4, - ), - ) - for language in per_language_ratios - ] - - return sorted(merge, key=lambda x: x[1], reverse=True) - - -def filter_alt_coherence_matches(results: CoherenceMatches) -> CoherenceMatches: - """ - We shall NOT return "English—" in CoherenceMatches because it is an alternative - of "English". This function only keeps the best match and remove the em-dash in it. - """ - index_results: dict[str, list[float]] = dict() - - for result in results: - language, ratio = result - no_em_name: str = language.replace("—", "") - - if no_em_name not in index_results: - index_results[no_em_name] = [] - - index_results[no_em_name].append(ratio) - - if any(len(index_results[e]) > 1 for e in index_results): - filtered_results: CoherenceMatches = [] - - for language in index_results: - filtered_results.append((language, max(index_results[language]))) - - return filtered_results - - return results - - -@lru_cache(maxsize=2048) -def coherence_ratio( - decoded_sequence: str, threshold: float = 0.1, lg_inclusion: str | None = None -) -> CoherenceMatches: - """ - Detect ANY language that can be identified in given sequence. The sequence will be analysed by layers. - A layer = Character extraction by alphabets/ranges. - """ - - results: list[tuple[str, float]] = [] - ignore_non_latin: bool = False - - sufficient_match_count: int = 0 - - lg_inclusion_list = lg_inclusion.split(",") if lg_inclusion is not None else [] - if "Latin Based" in lg_inclusion_list: - ignore_non_latin = True - lg_inclusion_list.remove("Latin Based") - - for layer in alpha_unicode_split(decoded_sequence): - sequence_frequencies: TypeCounter[str] = Counter(layer) - most_common = sequence_frequencies.most_common() - - character_count: int = len(layer) - - if character_count <= TOO_SMALL_SEQUENCE: - continue - - popular_character_ordered: list[str] = [c for c, o in most_common] - - for language in lg_inclusion_list or alphabet_languages( - popular_character_ordered, ignore_non_latin - ): - ratio: float = characters_popularity_compare( - language, popular_character_ordered - ) - - if ratio < threshold: - continue - elif ratio >= 0.8: - sufficient_match_count += 1 - - results.append((language, round(ratio, 4))) - - if sufficient_match_count >= 3: - break - - return sorted( - filter_alt_coherence_matches(results), key=lambda x: x[1], reverse=True - ) diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/cli/__init__.py b/venv/lib/python3.12/site-packages/charset_normalizer/cli/__init__.py deleted file mode 100644 index 543a5a4..0000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer/cli/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -from __future__ import annotations - -from .__main__ import cli_detect, query_yes_no - -__all__ = ( - "cli_detect", - "query_yes_no", -) diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/cli/__main__.py b/venv/lib/python3.12/site-packages/charset_normalizer/cli/__main__.py deleted file mode 100644 index ad843c1..0000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer/cli/__main__.py +++ /dev/null @@ -1,362 +0,0 @@ -from __future__ import annotations - -import argparse -import sys -import typing -from json import dumps -from os.path import abspath, basename, dirname, join, realpath -from platform import python_version -from unicodedata import unidata_version - -import charset_normalizer.md as md_module -from charset_normalizer import from_fp -from charset_normalizer.models import CliDetectionResult -from charset_normalizer.version import __version__ - - -def query_yes_no(question: str, default: str = "yes") -> bool: # Defensive: - """Ask a yes/no question via input() and return the answer as a bool.""" - prompt = " [Y/n] " if default == "yes" else " [y/N] " - - while True: - choice = input(question + prompt).strip().lower() - if not choice: - return default == "yes" - if choice in ("y", "yes"): - return True - if choice in ("n", "no"): - return False - print("Please respond with 'y' or 'n'.") - - -class FileType: - """Factory for creating file object types - - Instances of FileType are typically passed as type= arguments to the - ArgumentParser add_argument() method. - - Keyword Arguments: - - mode -- A string indicating how the file is to be opened. Accepts the - same values as the builtin open() function. - - bufsize -- The file's desired buffer size. Accepts the same values as - the builtin open() function. - - encoding -- The file's encoding. Accepts the same values as the - builtin open() function. - - errors -- A string indicating how encoding and decoding errors are to - be handled. Accepts the same value as the builtin open() function. - - Backported from CPython 3.12 - """ - - def __init__( - self, - mode: str = "r", - bufsize: int = -1, - encoding: str | None = None, - errors: str | None = None, - ): - self._mode = mode - self._bufsize = bufsize - self._encoding = encoding - self._errors = errors - - def __call__(self, string: str) -> typing.IO: # type: ignore[type-arg] - # the special argument "-" means sys.std{in,out} - if string == "-": - if "r" in self._mode: - return sys.stdin.buffer if "b" in self._mode else sys.stdin - elif any(c in self._mode for c in "wax"): - return sys.stdout.buffer if "b" in self._mode else sys.stdout - else: - msg = f'argument "-" with mode {self._mode}' - raise ValueError(msg) - - # all other arguments are used as file names - try: - return open(string, self._mode, self._bufsize, self._encoding, self._errors) - except OSError as e: - message = f"can't open '{string}': {e}" - raise argparse.ArgumentTypeError(message) - - def __repr__(self) -> str: - args = self._mode, self._bufsize - kwargs = [("encoding", self._encoding), ("errors", self._errors)] - args_str = ", ".join( - [repr(arg) for arg in args if arg != -1] - + [f"{kw}={arg!r}" for kw, arg in kwargs if arg is not None] - ) - return f"{type(self).__name__}({args_str})" - - -def cli_detect(argv: list[str] | None = None) -> int: - """ - CLI assistant using ARGV and ArgumentParser - :param argv: - :return: 0 if everything is fine, anything else equal trouble - """ - parser = argparse.ArgumentParser( - description="The Real First Universal Charset Detector. " - "Discover originating encoding used on text file. " - "Normalize text to unicode." - ) - - parser.add_argument( - "files", type=FileType("rb"), nargs="+", help="File(s) to be analysed" - ) - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - dest="verbose", - help="Display complementary information about file if any. " - "Stdout will contain logs about the detection process.", - ) - parser.add_argument( - "-a", - "--with-alternative", - action="store_true", - default=False, - dest="alternatives", - help="Output complementary possibilities if any. Top-level JSON WILL be a list.", - ) - parser.add_argument( - "-n", - "--normalize", - action="store_true", - default=False, - dest="normalize", - help="Permit to normalize input file. If not set, program does not write anything.", - ) - parser.add_argument( - "-m", - "--minimal", - action="store_true", - default=False, - dest="minimal", - help="Only output the charset detected to STDOUT. Disabling JSON output.", - ) - parser.add_argument( - "-r", - "--replace", - action="store_true", - default=False, - dest="replace", - help="Replace file when trying to normalize it instead of creating a new one.", - ) - parser.add_argument( - "-f", - "--force", - action="store_true", - default=False, - dest="force", - help="Replace file without asking if you are sure, use this flag with caution.", - ) - parser.add_argument( - "-i", - "--no-preemptive", - action="store_true", - default=False, - dest="no_preemptive", - help="Disable looking at a charset declaration to hint the detector.", - ) - parser.add_argument( - "-t", - "--threshold", - action="store", - default=0.2, - type=float, - dest="threshold", - help="Define a custom maximum amount of noise allowed in decoded content. 0. <= noise <= 1.", - ) - parser.add_argument( - "--version", - action="version", - version="Charset-Normalizer {} - Python {} - Unicode {} - SpeedUp {}".format( - __version__, - python_version(), - unidata_version, - "OFF" if md_module.__file__.lower().endswith(".py") else "ON", - ), - help="Show version information and exit.", - ) - - args = parser.parse_args(argv) - - if args.replace is True and args.normalize is False: - if args.files: - for my_file in args.files: - my_file.close() - print("Use --replace in addition of --normalize only.", file=sys.stderr) - return 1 - - if args.force is True and args.replace is False: - if args.files: - for my_file in args.files: - my_file.close() - print("Use --force in addition of --replace only.", file=sys.stderr) - return 1 - - if args.threshold < 0.0 or args.threshold > 1.0: - if args.files: - for my_file in args.files: - my_file.close() - print("--threshold VALUE should be between 0. AND 1.", file=sys.stderr) - return 1 - - x_ = [] - - for my_file in args.files: - matches = from_fp( - my_file, - threshold=args.threshold, - explain=args.verbose, - preemptive_behaviour=args.no_preemptive is False, - ) - - best_guess = matches.best() - - if best_guess is None: - print( - 'Unable to identify originating encoding for "{}". {}'.format( - my_file.name, - ( - "Maybe try increasing maximum amount of chaos." - if args.threshold < 1.0 - else "" - ), - ), - file=sys.stderr, - ) - x_.append( - CliDetectionResult( - abspath(my_file.name), - None, - [], - [], - "Unknown", - [], - False, - 1.0, - 0.0, - None, - True, - ) - ) - else: - cli_result = CliDetectionResult( - abspath(my_file.name), - best_guess.encoding, - best_guess.encoding_aliases, - [ - cp - for cp in best_guess.could_be_from_charset - if cp != best_guess.encoding - ], - best_guess.language, - best_guess.alphabets, - best_guess.bom, - best_guess.percent_chaos, - best_guess.percent_coherence, - None, - True, - ) - x_.append(cli_result) - - if len(matches) > 1 and args.alternatives: - for el in matches: - if el != best_guess: - x_.append( - CliDetectionResult( - abspath(my_file.name), - el.encoding, - el.encoding_aliases, - [ - cp - for cp in el.could_be_from_charset - if cp != el.encoding - ], - el.language, - el.alphabets, - el.bom, - el.percent_chaos, - el.percent_coherence, - None, - False, - ) - ) - - if args.normalize is True: - if best_guess.encoding.startswith("utf") is True: - print( - '"{}" file does not need to be normalized, as it already came from unicode.'.format( - my_file.name - ), - file=sys.stderr, - ) - if my_file.closed is False: - my_file.close() - continue - - dir_path = dirname(realpath(my_file.name)) - file_name = basename(realpath(my_file.name)) - - o_: list[str] = file_name.split(".") - - if args.replace is False: - o_.insert(-1, best_guess.encoding) - if my_file.closed is False: - my_file.close() - elif ( - args.force is False - and query_yes_no( - 'Are you sure to normalize "{}" by replacing it ?'.format( - my_file.name - ), - "no", - ) - is False - ): - if my_file.closed is False: - my_file.close() - continue - - try: - cli_result.unicode_path = join(dir_path, ".".join(o_)) - - with open(cli_result.unicode_path, "wb") as fp: - fp.write(best_guess.output()) - except OSError as e: # Defensive: - print(str(e), file=sys.stderr) - if my_file.closed is False: - my_file.close() - return 2 - - if my_file.closed is False: - my_file.close() - - if args.minimal is False: - print( - dumps( - [el.__dict__ for el in x_] if len(x_) > 1 else x_[0].__dict__, - ensure_ascii=True, - indent=4, - ) - ) - else: - for my_file in args.files: - print( - ", ".join( - [ - el.encoding or "undefined" - for el in x_ - if el.path == abspath(my_file.name) - ] - ) - ) - - return 0 - - -if __name__ == "__main__": # Defensive: - cli_detect() diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 891b617..0000000 Binary files a/venv/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__main__.cpython-312.pyc b/venv/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__main__.cpython-312.pyc deleted file mode 100644 index 98254f3..0000000 Binary files a/venv/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__main__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/constant.py b/venv/lib/python3.12/site-packages/charset_normalizer/constant.py deleted file mode 100644 index e1297d2..0000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer/constant.py +++ /dev/null @@ -1,2050 +0,0 @@ -from __future__ import annotations - -from codecs import BOM_UTF8, BOM_UTF16_BE, BOM_UTF16_LE, BOM_UTF32_BE, BOM_UTF32_LE -from encodings.aliases import aliases -from re import IGNORECASE -from re import compile as re_compile - -# Contain for each eligible encoding a list of/item bytes SIG/BOM -ENCODING_MARKS: dict[str, bytes | list[bytes]] = { - "utf_8": BOM_UTF8, - "utf_7": [ - b"\x2b\x2f\x76\x38\x2d", - b"\x2b\x2f\x76\x38", - b"\x2b\x2f\x76\x39", - b"\x2b\x2f\x76\x2b", - b"\x2b\x2f\x76\x2f", - ], - "gb18030": b"\x84\x31\x95\x33", - "utf_32": [BOM_UTF32_BE, BOM_UTF32_LE], - "utf_16": [BOM_UTF16_BE, BOM_UTF16_LE], -} - -TOO_SMALL_SEQUENCE: int = 32 -TOO_BIG_SEQUENCE: int = int(10e6) - -UTF8_MAXIMAL_ALLOCATION: int = 1_112_064 - -# Up-to-date Unicode ucd/17.0.0 -UNICODE_RANGES_COMBINED: dict[str, range] = { - "Control character": range(32), - "Basic Latin": range(32, 128), - "Latin-1 Supplement": range(128, 256), - "Latin Extended-A": range(256, 384), - "Latin Extended-B": range(384, 592), - "IPA Extensions": range(592, 688), - "Spacing Modifier Letters": range(688, 768), - "Combining Diacritical Marks": range(768, 880), - "Greek and Coptic": range(880, 1024), - "Cyrillic": range(1024, 1280), - "Cyrillic Supplement": range(1280, 1328), - "Armenian": range(1328, 1424), - "Hebrew": range(1424, 1536), - "Arabic": range(1536, 1792), - "Syriac": range(1792, 1872), - "Arabic Supplement": range(1872, 1920), - "Thaana": range(1920, 1984), - "NKo": range(1984, 2048), - "Samaritan": range(2048, 2112), - "Mandaic": range(2112, 2144), - "Syriac Supplement": range(2144, 2160), - "Arabic Extended-B": range(2160, 2208), - "Arabic Extended-A": range(2208, 2304), - "Devanagari": range(2304, 2432), - "Bengali": range(2432, 2560), - "Gurmukhi": range(2560, 2688), - "Gujarati": range(2688, 2816), - "Oriya": range(2816, 2944), - "Tamil": range(2944, 3072), - "Telugu": range(3072, 3200), - "Kannada": range(3200, 3328), - "Malayalam": range(3328, 3456), - "Sinhala": range(3456, 3584), - "Thai": range(3584, 3712), - "Lao": range(3712, 3840), - "Tibetan": range(3840, 4096), - "Myanmar": range(4096, 4256), - "Georgian": range(4256, 4352), - "Hangul Jamo": range(4352, 4608), - "Ethiopic": range(4608, 4992), - "Ethiopic Supplement": range(4992, 5024), - "Cherokee": range(5024, 5120), - "Unified Canadian Aboriginal Syllabics": range(5120, 5760), - "Ogham": range(5760, 5792), - "Runic": range(5792, 5888), - "Tagalog": range(5888, 5920), - "Hanunoo": range(5920, 5952), - "Buhid": range(5952, 5984), - "Tagbanwa": range(5984, 6016), - "Khmer": range(6016, 6144), - "Mongolian": range(6144, 6320), - "Unified Canadian Aboriginal Syllabics Extended": range(6320, 6400), - "Limbu": range(6400, 6480), - "Tai Le": range(6480, 6528), - "New Tai Lue": range(6528, 6624), - "Khmer Symbols": range(6624, 6656), - "Buginese": range(6656, 6688), - "Tai Tham": range(6688, 6832), - "Combining Diacritical Marks Extended": range(6832, 6912), - "Balinese": range(6912, 7040), - "Sundanese": range(7040, 7104), - "Batak": range(7104, 7168), - "Lepcha": range(7168, 7248), - "Ol Chiki": range(7248, 7296), - "Cyrillic Extended-C": range(7296, 7312), - "Georgian Extended": range(7312, 7360), - "Sundanese Supplement": range(7360, 7376), - "Vedic Extensions": range(7376, 7424), - "Phonetic Extensions": range(7424, 7552), - "Phonetic Extensions Supplement": range(7552, 7616), - "Combining Diacritical Marks Supplement": range(7616, 7680), - "Latin Extended Additional": range(7680, 7936), - "Greek Extended": range(7936, 8192), - "General Punctuation": range(8192, 8304), - "Superscripts and Subscripts": range(8304, 8352), - "Currency Symbols": range(8352, 8400), - "Combining Diacritical Marks for Symbols": range(8400, 8448), - "Letterlike Symbols": range(8448, 8528), - "Number Forms": range(8528, 8592), - "Arrows": range(8592, 8704), - "Mathematical Operators": range(8704, 8960), - "Miscellaneous Technical": range(8960, 9216), - "Control Pictures": range(9216, 9280), - "Optical Character Recognition": range(9280, 9312), - "Enclosed Alphanumerics": range(9312, 9472), - "Box Drawing": range(9472, 9600), - "Block Elements": range(9600, 9632), - "Geometric Shapes": range(9632, 9728), - "Miscellaneous Symbols": range(9728, 9984), - "Dingbats": range(9984, 10176), - "Miscellaneous Mathematical Symbols-A": range(10176, 10224), - "Supplemental Arrows-A": range(10224, 10240), - "Braille Patterns": range(10240, 10496), - "Supplemental Arrows-B": range(10496, 10624), - "Miscellaneous Mathematical Symbols-B": range(10624, 10752), - "Supplemental Mathematical Operators": range(10752, 11008), - "Miscellaneous Symbols and Arrows": range(11008, 11264), - "Glagolitic": range(11264, 11360), - "Latin Extended-C": range(11360, 11392), - "Coptic": range(11392, 11520), - "Georgian Supplement": range(11520, 11568), - "Tifinagh": range(11568, 11648), - "Ethiopic Extended": range(11648, 11744), - "Cyrillic Extended-A": range(11744, 11776), - "Supplemental Punctuation": range(11776, 11904), - "CJK Radicals Supplement": range(11904, 12032), - "Kangxi Radicals": range(12032, 12256), - "Ideographic Description Characters": range(12272, 12288), - "CJK Symbols and Punctuation": range(12288, 12352), - "Hiragana": range(12352, 12448), - "Katakana": range(12448, 12544), - "Bopomofo": range(12544, 12592), - "Hangul Compatibility Jamo": range(12592, 12688), - "Kanbun": range(12688, 12704), - "Bopomofo Extended": range(12704, 12736), - "CJK Strokes": range(12736, 12784), - "Katakana Phonetic Extensions": range(12784, 12800), - "Enclosed CJK Letters and Months": range(12800, 13056), - "CJK Compatibility": range(13056, 13312), - "CJK Unified Ideographs Extension A": range(13312, 19904), - "Yijing Hexagram Symbols": range(19904, 19968), - "CJK Unified Ideographs": range(19968, 40960), - "Yi Syllables": range(40960, 42128), - "Yi Radicals": range(42128, 42192), - "Lisu": range(42192, 42240), - "Vai": range(42240, 42560), - "Cyrillic Extended-B": range(42560, 42656), - "Bamum": range(42656, 42752), - "Modifier Tone Letters": range(42752, 42784), - "Latin Extended-D": range(42784, 43008), - "Syloti Nagri": range(43008, 43056), - "Common Indic Number Forms": range(43056, 43072), - "Phags-pa": range(43072, 43136), - "Saurashtra": range(43136, 43232), - "Devanagari Extended": range(43232, 43264), - "Kayah Li": range(43264, 43312), - "Rejang": range(43312, 43360), - "Hangul Jamo Extended-A": range(43360, 43392), - "Javanese": range(43392, 43488), - "Myanmar Extended-B": range(43488, 43520), - "Cham": range(43520, 43616), - "Myanmar Extended-A": range(43616, 43648), - "Tai Viet": range(43648, 43744), - "Meetei Mayek Extensions": range(43744, 43776), - "Ethiopic Extended-A": range(43776, 43824), - "Latin Extended-E": range(43824, 43888), - "Cherokee Supplement": range(43888, 43968), - "Meetei Mayek": range(43968, 44032), - "Hangul Syllables": range(44032, 55216), - "Hangul Jamo Extended-B": range(55216, 55296), - "High Surrogates": range(55296, 56192), - "High Private Use Surrogates": range(56192, 56320), - "Low Surrogates": range(56320, 57344), - "Private Use Area": range(57344, 63744), - "CJK Compatibility Ideographs": range(63744, 64256), - "Alphabetic Presentation Forms": range(64256, 64336), - "Arabic Presentation Forms-A": range(64336, 65024), - "Variation Selectors": range(65024, 65040), - "Vertical Forms": range(65040, 65056), - "Combining Half Marks": range(65056, 65072), - "CJK Compatibility Forms": range(65072, 65104), - "Small Form Variants": range(65104, 65136), - "Arabic Presentation Forms-B": range(65136, 65280), - "Halfwidth and Fullwidth Forms": range(65280, 65520), - "Specials": range(65520, 65536), - "Linear B Syllabary": range(65536, 65664), - "Linear B Ideograms": range(65664, 65792), - "Aegean Numbers": range(65792, 65856), - "Ancient Greek Numbers": range(65856, 65936), - "Ancient Symbols": range(65936, 66000), - "Phaistos Disc": range(66000, 66048), - "Lycian": range(66176, 66208), - "Carian": range(66208, 66272), - "Coptic Epact Numbers": range(66272, 66304), - "Old Italic": range(66304, 66352), - "Gothic": range(66352, 66384), - "Old Permic": range(66384, 66432), - "Ugaritic": range(66432, 66464), - "Old Persian": range(66464, 66528), - "Deseret": range(66560, 66640), - "Shavian": range(66640, 66688), - "Osmanya": range(66688, 66736), - "Osage": range(66736, 66816), - "Elbasan": range(66816, 66864), - "Caucasian Albanian": range(66864, 66928), - "Vithkuqi": range(66928, 67008), - "Todhri": range(67008, 67072), - "Linear A": range(67072, 67456), - "Latin Extended-F": range(67456, 67520), - "Cypriot Syllabary": range(67584, 67648), - "Imperial Aramaic": range(67648, 67680), - "Palmyrene": range(67680, 67712), - "Nabataean": range(67712, 67760), - "Hatran": range(67808, 67840), - "Phoenician": range(67840, 67872), - "Lydian": range(67872, 67904), - "Sidetic": range(67904, 67936), - "Meroitic Hieroglyphs": range(67968, 68000), - "Meroitic Cursive": range(68000, 68096), - "Kharoshthi": range(68096, 68192), - "Old South Arabian": range(68192, 68224), - "Old North Arabian": range(68224, 68256), - "Manichaean": range(68288, 68352), - "Avestan": range(68352, 68416), - "Inscriptional Parthian": range(68416, 68448), - "Inscriptional Pahlavi": range(68448, 68480), - "Psalter Pahlavi": range(68480, 68528), - "Old Turkic": range(68608, 68688), - "Old Hungarian": range(68736, 68864), - "Hanifi Rohingya": range(68864, 68928), - "Garay": range(68928, 69008), - "Rumi Numeral Symbols": range(69216, 69248), - "Yezidi": range(69248, 69312), - "Arabic Extended-C": range(69312, 69376), - "Old Sogdian": range(69376, 69424), - "Sogdian": range(69424, 69488), - "Old Uyghur": range(69488, 69552), - "Chorasmian": range(69552, 69600), - "Elymaic": range(69600, 69632), - "Brahmi": range(69632, 69760), - "Kaithi": range(69760, 69840), - "Sora Sompeng": range(69840, 69888), - "Chakma": range(69888, 69968), - "Mahajani": range(69968, 70016), - "Sharada": range(70016, 70112), - "Sinhala Archaic Numbers": range(70112, 70144), - "Khojki": range(70144, 70224), - "Multani": range(70272, 70320), - "Khudawadi": range(70320, 70400), - "Grantha": range(70400, 70528), - "Tulu-Tigalari": range(70528, 70656), - "Newa": range(70656, 70784), - "Tirhuta": range(70784, 70880), - "Siddham": range(71040, 71168), - "Modi": range(71168, 71264), - "Mongolian Supplement": range(71264, 71296), - "Takri": range(71296, 71376), - "Myanmar Extended-C": range(71376, 71424), - "Ahom": range(71424, 71504), - "Dogra": range(71680, 71760), - "Warang Citi": range(71840, 71936), - "Dives Akuru": range(71936, 72032), - "Nandinagari": range(72096, 72192), - "Zanabazar Square": range(72192, 72272), - "Soyombo": range(72272, 72368), - "Unified Canadian Aboriginal Syllabics Extended-A": range(72368, 72384), - "Pau Cin Hau": range(72384, 72448), - "Devanagari Extended-A": range(72448, 72544), - "Sharada Supplement": range(72544, 72576), - "Sunuwar": range(72640, 72704), - "Bhaiksuki": range(72704, 72816), - "Marchen": range(72816, 72896), - "Masaram Gondi": range(72960, 73056), - "Gunjala Gondi": range(73056, 73136), - "Tolong Siki": range(73136, 73200), - "Makasar": range(73440, 73472), - "Kawi": range(73472, 73568), - "Lisu Supplement": range(73648, 73664), - "Tamil Supplement": range(73664, 73728), - "Cuneiform": range(73728, 74752), - "Cuneiform Numbers and Punctuation": range(74752, 74880), - "Early Dynastic Cuneiform": range(74880, 75088), - "Cypro-Minoan": range(77712, 77824), - "Egyptian Hieroglyphs": range(77824, 78896), - "Egyptian Hieroglyph Format Controls": range(78896, 78944), - "Egyptian Hieroglyphs Extended-A": range(78944, 82944), - "Anatolian Hieroglyphs": range(82944, 83584), - "Gurung Khema": range(90368, 90432), - "Bamum Supplement": range(92160, 92736), - "Mro": range(92736, 92784), - "Tangsa": range(92784, 92880), - "Bassa Vah": range(92880, 92928), - "Pahawh Hmong": range(92928, 93072), - "Kirat Rai": range(93504, 93568), - "Medefaidrin": range(93760, 93856), - "Beria Erfe": range(93856, 93920), - "Miao": range(93952, 94112), - "Ideographic Symbols and Punctuation": range(94176, 94208), - "Tangut": range(94208, 100352), - "Tangut Components": range(100352, 101120), - "Khitan Small Script": range(101120, 101632), - "Tangut Supplement": range(101632, 101760), - "Tangut Components Supplement": range(101760, 101888), - "Kana Extended-B": range(110576, 110592), - "Kana Supplement": range(110592, 110848), - "Kana Extended-A": range(110848, 110896), - "Small Kana Extension": range(110896, 110960), - "Nushu": range(110960, 111360), - "Duployan": range(113664, 113824), - "Shorthand Format Controls": range(113824, 113840), - "Symbols for Legacy Computing Supplement": range(117760, 118464), - "Miscellaneous Symbols Supplement": range(118464, 118528), - "Znamenny Musical Notation": range(118528, 118736), - "Byzantine Musical Symbols": range(118784, 119040), - "Musical Symbols": range(119040, 119296), - "Ancient Greek Musical Notation": range(119296, 119376), - "Kaktovik Numerals": range(119488, 119520), - "Mayan Numerals": range(119520, 119552), - "Tai Xuan Jing Symbols": range(119552, 119648), - "Counting Rod Numerals": range(119648, 119680), - "Mathematical Alphanumeric Symbols": range(119808, 120832), - "Sutton SignWriting": range(120832, 121520), - "Latin Extended-G": range(122624, 122880), - "Glagolitic Supplement": range(122880, 122928), - "Cyrillic Extended-D": range(122928, 123024), - "Nyiakeng Puachue Hmong": range(123136, 123216), - "Toto": range(123536, 123584), - "Wancho": range(123584, 123648), - "Nag Mundari": range(124112, 124160), - "Ol Onal": range(124368, 124416), - "Tai Yo": range(124608, 124672), - "Ethiopic Extended-B": range(124896, 124928), - "Mende Kikakui": range(124928, 125152), - "Adlam": range(125184, 125280), - "Indic Siyaq Numbers": range(126064, 126144), - "Ottoman Siyaq Numbers": range(126208, 126288), - "Arabic Mathematical Alphabetic Symbols": range(126464, 126720), - "Mahjong Tiles": range(126976, 127024), - "Domino Tiles": range(127024, 127136), - "Playing Cards": range(127136, 127232), - "Enclosed Alphanumeric Supplement": range(127232, 127488), - "Enclosed Ideographic Supplement": range(127488, 127744), - "Miscellaneous Symbols and Pictographs": range(127744, 128512), - "Emoticons": range(128512, 128592), - "Ornamental Dingbats": range(128592, 128640), - "Transport and Map Symbols": range(128640, 128768), - "Alchemical Symbols": range(128768, 128896), - "Geometric Shapes Extended": range(128896, 129024), - "Supplemental Arrows-C": range(129024, 129280), - "Supplemental Symbols and Pictographs": range(129280, 129536), - "Chess Symbols": range(129536, 129648), - "Symbols and Pictographs Extended-A": range(129648, 129792), - "Symbols for Legacy Computing": range(129792, 130048), - "CJK Unified Ideographs Extension B": range(131072, 173792), - "CJK Unified Ideographs Extension C": range(173824, 177984), - "CJK Unified Ideographs Extension D": range(177984, 178208), - "CJK Unified Ideographs Extension E": range(178208, 183984), - "CJK Unified Ideographs Extension F": range(183984, 191472), - "CJK Unified Ideographs Extension I": range(191472, 192096), - "CJK Compatibility Ideographs Supplement": range(194560, 195104), - "CJK Unified Ideographs Extension G": range(196608, 201552), - "CJK Unified Ideographs Extension H": range(201552, 205744), - "CJK Unified Ideographs Extension J": range(205744, 210048), - "Tags": range(917504, 917632), - "Variation Selectors Supplement": range(917760, 918000), - "Supplementary Private Use Area-A": range(983040, 1048576), - "Supplementary Private Use Area-B": range(1048576, 1114112), -} - - -UNICODE_SECONDARY_RANGE_KEYWORD: list[str] = [ - "Supplement", - "Extended", - "Extensions", - "Modifier", - "Marks", - "Punctuation", - "Symbols", - "Forms", - "Operators", - "Miscellaneous", - "Drawing", - "Block", - "Shapes", - "Supplemental", - "Tags", -] - -RE_POSSIBLE_ENCODING_INDICATION = re_compile( - r"(?:(?:encoding)|(?:charset)|(?:coding))(?:[\:= ]{1,10})(?:[\"\']?)([a-zA-Z0-9\-_]+)(?:[\"\']?)", - IGNORECASE, -) - -IANA_NO_ALIASES = [ - "cp720", - "cp737", - "cp856", - "cp874", - "cp875", - "cp1006", - "koi8_r", - "koi8_t", - "koi8_u", -] - -IANA_SUPPORTED: list[str] = sorted( - filter( - lambda x: x.endswith("_codec") is False - and x not in {"rot_13", "tactis", "mbcs"}, - list(set(aliases.values())) + IANA_NO_ALIASES, - ) -) - -IANA_SUPPORTED_COUNT: int = len(IANA_SUPPORTED) - -# pre-computed code page that are similar using the function cp_similarity. -IANA_SUPPORTED_SIMILAR: dict[str, list[str]] = { - "cp037": ["cp1026", "cp1140", "cp273", "cp500"], - "cp1026": ["cp037", "cp1140", "cp273", "cp500"], - "cp1125": ["cp866"], - "cp1140": ["cp037", "cp1026", "cp273", "cp500"], - "cp1250": ["iso8859_2"], - "cp1251": ["kz1048", "ptcp154"], - "cp1252": ["iso8859_15", "iso8859_9", "latin_1"], - "cp1253": ["iso8859_7"], - "cp1254": ["iso8859_15", "iso8859_9", "latin_1"], - "cp1257": ["iso8859_13"], - "cp273": ["cp037", "cp1026", "cp1140", "cp500"], - "cp437": ["cp850", "cp858", "cp860", "cp861", "cp862", "cp863", "cp865"], - "cp500": ["cp037", "cp1026", "cp1140", "cp273"], - "cp850": ["cp437", "cp857", "cp858", "cp865"], - "cp857": ["cp850", "cp858", "cp865"], - "cp858": ["cp437", "cp850", "cp857", "cp865"], - "cp860": ["cp437", "cp861", "cp862", "cp863", "cp865"], - "cp861": ["cp437", "cp860", "cp862", "cp863", "cp865"], - "cp862": ["cp437", "cp860", "cp861", "cp863", "cp865"], - "cp863": ["cp437", "cp860", "cp861", "cp862", "cp865"], - "cp865": ["cp437", "cp850", "cp857", "cp858", "cp860", "cp861", "cp862", "cp863"], - "cp866": ["cp1125"], - "iso8859_10": ["iso8859_14", "iso8859_15", "iso8859_4", "iso8859_9", "latin_1"], - "iso8859_11": ["tis_620"], - "iso8859_13": ["cp1257"], - "iso8859_14": [ - "iso8859_10", - "iso8859_15", - "iso8859_16", - "iso8859_3", - "iso8859_9", - "latin_1", - ], - "iso8859_15": [ - "cp1252", - "cp1254", - "iso8859_10", - "iso8859_14", - "iso8859_16", - "iso8859_3", - "iso8859_9", - "latin_1", - ], - "iso8859_16": [ - "iso8859_14", - "iso8859_15", - "iso8859_2", - "iso8859_3", - "iso8859_9", - "latin_1", - ], - "iso8859_2": ["cp1250", "iso8859_16", "iso8859_4"], - "iso8859_3": ["iso8859_14", "iso8859_15", "iso8859_16", "iso8859_9", "latin_1"], - "iso8859_4": ["iso8859_10", "iso8859_2", "iso8859_9", "latin_1"], - "iso8859_7": ["cp1253"], - "iso8859_9": [ - "cp1252", - "cp1254", - "cp1258", - "iso8859_10", - "iso8859_14", - "iso8859_15", - "iso8859_16", - "iso8859_3", - "iso8859_4", - "latin_1", - ], - "kz1048": ["cp1251", "ptcp154"], - "latin_1": [ - "cp1252", - "cp1254", - "cp1258", - "iso8859_10", - "iso8859_14", - "iso8859_15", - "iso8859_16", - "iso8859_3", - "iso8859_4", - "iso8859_9", - ], - "mac_iceland": ["mac_roman", "mac_turkish"], - "mac_roman": ["mac_iceland", "mac_turkish"], - "mac_turkish": ["mac_iceland", "mac_roman"], - "ptcp154": ["cp1251", "kz1048"], - "tis_620": ["iso8859_11"], -} - - -CHARDET_CORRESPONDENCE: dict[str, str] = { - "iso2022_kr": "ISO-2022-KR", - "iso2022_jp": "ISO-2022-JP", - "euc_kr": "EUC-KR", - "tis_620": "TIS-620", - "utf_32": "UTF-32", - "euc_jp": "EUC-JP", - "koi8_r": "KOI8-R", - "iso8859_1": "ISO-8859-1", - "iso8859_2": "ISO-8859-2", - "iso8859_5": "ISO-8859-5", - "iso8859_6": "ISO-8859-6", - "iso8859_7": "ISO-8859-7", - "iso8859_8": "ISO-8859-8", - "utf_16": "UTF-16", - "cp855": "IBM855", - "mac_cyrillic": "MacCyrillic", - "gb2312": "GB2312", - "gb18030": "GB18030", - "cp932": "CP932", - "cp866": "IBM866", - "utf_8": "utf-8", - "utf_8_sig": "UTF-8-SIG", - "shift_jis": "SHIFT_JIS", - "big5": "Big5", - "cp1250": "windows-1250", - "cp1251": "windows-1251", - "cp1252": "Windows-1252", - "cp1253": "windows-1253", - "cp1255": "windows-1255", - "cp1256": "windows-1256", - "cp1254": "Windows-1254", - "cp949": "CP949", -} - - -COMMON_SAFE_ASCII_CHARACTERS: frozenset[str] = frozenset( - { - "<", - ">", - "=", - ":", - "/", - "&", - ";", - "{", - "}", - "[", - "]", - ",", - "|", - '"', - "-", - "(", - ")", - } -) - -# Sample character sets — replace with full lists if needed -COMMON_CHINESE_CHARACTERS = "的一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除消构府太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该铁价严龙飞" - -COMMON_JAPANESE_CHARACTERS = "日一国年大十二本中長出三時行見月分後前生五間上東四今金九入学高円子外八六下来気小七山話女北午百書先名川千水半男西電校語土木聞食車何南万毎白天母火右読友左休父雨" - -COMMON_KOREAN_CHARACTERS = "一二三四五六七八九十百千萬上下左右中人女子大小山川日月火水木金土父母天地國名年時文校學生" - -# Combine all into a frozenset -COMMON_CJK_CHARACTERS = frozenset( - "".join( - [ - COMMON_CHINESE_CHARACTERS, - COMMON_JAPANESE_CHARACTERS, - COMMON_KOREAN_CHARACTERS, - ] - ) -) - -KO_NAMES: frozenset[str] = frozenset({"johab", "cp949", "euc_kr"}) -ZH_NAMES: frozenset[str] = frozenset({"big5", "cp950", "big5hkscs", "hz"}) - -# Logging LEVEL below DEBUG -TRACE: int = 5 - - -# Language label that contain the em dash "—" -# character are to be considered alternative seq to origin -FREQUENCIES: dict[str, list[str]] = { - "English": [ - "e", - "a", - "t", - "i", - "o", - "n", - "s", - "r", - "h", - "l", - "d", - "c", - "u", - "m", - "f", - "p", - "g", - "w", - "y", - "b", - "v", - "k", - "x", - "j", - "z", - "q", - ], - "English—": [ - "e", - "a", - "t", - "i", - "o", - "n", - "s", - "r", - "h", - "l", - "d", - "c", - "m", - "u", - "f", - "p", - "g", - "w", - "b", - "y", - "v", - "k", - "j", - "x", - "z", - "q", - ], - "German": [ - "e", - "n", - "i", - "r", - "s", - "t", - "a", - "d", - "h", - "u", - "l", - "g", - "o", - "c", - "m", - "b", - "f", - "k", - "w", - "z", - "p", - "v", - "ü", - "ä", - "ö", - "j", - ], - "French": [ - "e", - "a", - "s", - "n", - "i", - "t", - "r", - "l", - "u", - "o", - "d", - "c", - "p", - "m", - "é", - "v", - "g", - "f", - "b", - "h", - "q", - "à", - "x", - "è", - "y", - "j", - ], - "Dutch": [ - "e", - "n", - "a", - "i", - "r", - "t", - "o", - "d", - "s", - "l", - "g", - "h", - "v", - "m", - "u", - "k", - "c", - "p", - "b", - "w", - "j", - "z", - "f", - "y", - "x", - "ë", - ], - "Italian": [ - "e", - "i", - "a", - "o", - "n", - "l", - "t", - "r", - "s", - "c", - "d", - "u", - "p", - "m", - "g", - "v", - "f", - "b", - "z", - "h", - "q", - "è", - "à", - "k", - "y", - "ò", - ], - "Polish": [ - "a", - "i", - "o", - "e", - "n", - "r", - "z", - "w", - "s", - "c", - "t", - "k", - "y", - "d", - "p", - "m", - "u", - "l", - "j", - "ł", - "g", - "b", - "h", - "ą", - "ę", - "ó", - ], - "Spanish": [ - "e", - "a", - "o", - "n", - "s", - "r", - "i", - "l", - "d", - "t", - "c", - "u", - "m", - "p", - "b", - "g", - "v", - "f", - "y", - "ó", - "h", - "q", - "í", - "j", - "z", - "á", - ], - "Russian": [ - "о", - "е", - "а", - "и", - "н", - "т", - "с", - "р", - "в", - "л", - "к", - "м", - "д", - "п", - "у", - "г", - "я", - "ы", - "з", - "б", - "й", - "ь", - "ч", - "х", - "ж", - "ц", - ], - # Jap-Kanji - "Japanese": [ - "日", - "一", - "人", - "年", - "大", - "十", - "二", - "本", - "中", - "長", - "出", - "三", - "時", - "行", - "見", - "月", - "分", - "後", - "前", - "生", - "五", - "間", - "上", - "東", - "四", - "今", - "金", - "九", - "入", - "学", - "高", - "円", - "子", - "外", - "八", - "六", - "下", - "来", - "気", - "小", - "七", - "山", - "話", - "女", - "北", - "午", - "百", - "書", - "先", - "名", - "川", - "千", - "水", - "半", - "男", - "西", - "電", - "校", - "語", - "土", - "木", - "聞", - "食", - "車", - "何", - "南", - "万", - "毎", - "白", - "天", - "母", - "火", - "右", - "読", - "友", - "左", - "休", - "父", - "雨", - ], - # Jap-Katakana - "Japanese—": [ - "ー", - "ン", - "ス", - "・", - "ル", - "ト", - "リ", - "イ", - "ア", - "ラ", - "ッ", - "ク", - "ド", - "シ", - "レ", - "ジ", - "タ", - "フ", - "ロ", - "カ", - "テ", - "マ", - "ィ", - "グ", - "バ", - "ム", - "プ", - "オ", - "コ", - "デ", - "ニ", - "ウ", - "メ", - "サ", - "ビ", - "ナ", - "ブ", - "ャ", - "エ", - "ュ", - "チ", - "キ", - "ズ", - "ダ", - "パ", - "ミ", - "ェ", - "ョ", - "ハ", - "セ", - "ベ", - "ガ", - "モ", - "ツ", - "ネ", - "ボ", - "ソ", - "ノ", - "ァ", - "ヴ", - "ワ", - "ポ", - "ペ", - "ピ", - "ケ", - "ゴ", - "ギ", - "ザ", - "ホ", - "ゲ", - "ォ", - "ヤ", - "ヒ", - "ユ", - "ヨ", - "ヘ", - "ゼ", - "ヌ", - "ゥ", - "ゾ", - "ヶ", - "ヂ", - "ヲ", - "ヅ", - "ヵ", - "ヱ", - "ヰ", - "ヮ", - "ヽ", - "゠", - "ヾ", - "ヷ", - "ヿ", - "ヸ", - "ヹ", - "ヺ", - ], - # Jap-Hiragana - "Japanese——": [ - "の", - "に", - "る", - "た", - "と", - "は", - "し", - "い", - "を", - "で", - "て", - "が", - "な", - "れ", - "か", - "ら", - "さ", - "っ", - "り", - "す", - "あ", - "も", - "こ", - "ま", - "う", - "く", - "よ", - "き", - "ん", - "め", - "お", - "け", - "そ", - "つ", - "だ", - "や", - "え", - "ど", - "わ", - "ち", - "み", - "せ", - "じ", - "ば", - "へ", - "び", - "ず", - "ろ", - "ほ", - "げ", - "む", - "べ", - "ひ", - "ょ", - "ゆ", - "ぶ", - "ご", - "ゃ", - "ね", - "ふ", - "ぐ", - "ぎ", - "ぼ", - "ゅ", - "づ", - "ざ", - "ぞ", - "ぬ", - "ぜ", - "ぱ", - "ぽ", - "ぷ", - "ぴ", - "ぃ", - "ぁ", - "ぇ", - "ぺ", - "ゞ", - "ぢ", - "ぉ", - "ぅ", - "ゐ", - "ゝ", - "ゑ", - "゛", - "゜", - "ゎ", - "ゔ", - "゚", - "ゟ", - "゙", - "ゕ", - "ゖ", - ], - "Portuguese": [ - "a", - "e", - "o", - "s", - "i", - "r", - "d", - "n", - "t", - "m", - "u", - "c", - "l", - "p", - "g", - "v", - "b", - "f", - "h", - "ã", - "q", - "é", - "ç", - "á", - "z", - "í", - ], - "Swedish": [ - "e", - "a", - "n", - "r", - "t", - "s", - "i", - "l", - "d", - "o", - "m", - "k", - "g", - "v", - "h", - "f", - "u", - "p", - "ä", - "c", - "b", - "ö", - "å", - "y", - "j", - "x", - ], - "Chinese": [ - "的", - "一", - "是", - "不", - "了", - "在", - "人", - "有", - "我", - "他", - "这", - "个", - "们", - "中", - "来", - "上", - "大", - "为", - "和", - "国", - "地", - "到", - "以", - "说", - "时", - "要", - "就", - "出", - "会", - "可", - "也", - "你", - "对", - "生", - "能", - "而", - "子", - "那", - "得", - "于", - "着", - "下", - "自", - "之", - "年", - "过", - "发", - "后", - "作", - "里", - "用", - "道", - "行", - "所", - "然", - "家", - "种", - "事", - "成", - "方", - "多", - "经", - "么", - "去", - "法", - "学", - "如", - "都", - "同", - "现", - "当", - "没", - "动", - "面", - "起", - "看", - "定", - "天", - "分", - "还", - "进", - "好", - "小", - "部", - "其", - "些", - "主", - "样", - "理", - "心", - "她", - "本", - "前", - "开", - "但", - "因", - "只", - "从", - "想", - "实", - ], - "Ukrainian": [ - "о", - "а", - "н", - "і", - "и", - "р", - "в", - "т", - "е", - "с", - "к", - "л", - "у", - "д", - "м", - "п", - "з", - "я", - "ь", - "б", - "г", - "й", - "ч", - "х", - "ц", - "ї", - ], - "Norwegian": [ - "e", - "r", - "n", - "t", - "a", - "s", - "i", - "o", - "l", - "d", - "g", - "k", - "m", - "v", - "f", - "p", - "u", - "b", - "h", - "å", - "y", - "j", - "ø", - "c", - "æ", - "w", - ], - "Finnish": [ - "a", - "i", - "n", - "t", - "e", - "s", - "l", - "o", - "u", - "k", - "ä", - "m", - "r", - "v", - "j", - "h", - "p", - "y", - "d", - "ö", - "g", - "c", - "b", - "f", - "w", - "z", - ], - "Vietnamese": [ - "n", - "h", - "t", - "i", - "c", - "g", - "a", - "o", - "u", - "m", - "l", - "r", - "à", - "đ", - "s", - "e", - "v", - "p", - "b", - "y", - "ư", - "d", - "á", - "k", - "ộ", - "ế", - ], - "Czech": [ - "o", - "e", - "a", - "n", - "t", - "s", - "i", - "l", - "v", - "r", - "k", - "d", - "u", - "m", - "p", - "í", - "c", - "h", - "z", - "á", - "y", - "j", - "b", - "ě", - "é", - "ř", - ], - "Hungarian": [ - "e", - "a", - "t", - "l", - "s", - "n", - "k", - "r", - "i", - "o", - "z", - "á", - "é", - "g", - "m", - "b", - "y", - "v", - "d", - "h", - "u", - "p", - "j", - "ö", - "f", - "c", - ], - "Korean": [ - "이", - "다", - "에", - "의", - "는", - "로", - "하", - "을", - "가", - "고", - "지", - "서", - "한", - "은", - "기", - "으", - "년", - "대", - "사", - "시", - "를", - "리", - "도", - "인", - "스", - "일", - ], - "Indonesian": [ - "a", - "n", - "e", - "i", - "r", - "t", - "u", - "s", - "d", - "k", - "m", - "l", - "g", - "p", - "b", - "o", - "h", - "y", - "j", - "c", - "w", - "f", - "v", - "z", - "x", - "q", - ], - "Turkish": [ - "a", - "e", - "i", - "n", - "r", - "l", - "ı", - "k", - "d", - "t", - "s", - "m", - "y", - "u", - "o", - "b", - "ü", - "ş", - "v", - "g", - "z", - "h", - "c", - "p", - "ç", - "ğ", - ], - "Romanian": [ - "e", - "i", - "a", - "r", - "n", - "t", - "u", - "l", - "o", - "c", - "s", - "d", - "p", - "m", - "ă", - "f", - "v", - "î", - "g", - "b", - "ș", - "ț", - "z", - "h", - "â", - "j", - ], - "Farsi": [ - "ا", - "ی", - "ر", - "د", - "ن", - "ه", - "و", - "م", - "ت", - "ب", - "س", - "ل", - "ک", - "ش", - "ز", - "ف", - "گ", - "ع", - "خ", - "ق", - "ج", - "آ", - "پ", - "ح", - "ط", - "ص", - ], - "Arabic": [ - "ا", - "ل", - "ي", - "م", - "و", - "ن", - "ر", - "ت", - "ب", - "ة", - "ع", - "د", - "س", - "ف", - "ه", - "ك", - "ق", - "أ", - "ح", - "ج", - "ش", - "ط", - "ص", - "ى", - "خ", - "إ", - ], - "Danish": [ - "e", - "r", - "n", - "t", - "a", - "i", - "s", - "d", - "l", - "o", - "g", - "m", - "k", - "f", - "v", - "u", - "b", - "h", - "p", - "å", - "y", - "ø", - "æ", - "c", - "j", - "w", - ], - "Serbian": [ - "а", - "и", - "о", - "е", - "н", - "р", - "с", - "у", - "т", - "к", - "ј", - "в", - "д", - "м", - "п", - "л", - "г", - "з", - "б", - "a", - "i", - "e", - "o", - "n", - "ц", - "ш", - ], - "Lithuanian": [ - "i", - "a", - "s", - "o", - "r", - "e", - "t", - "n", - "u", - "k", - "m", - "l", - "p", - "v", - "d", - "j", - "g", - "ė", - "b", - "y", - "ų", - "š", - "ž", - "c", - "ą", - "į", - ], - "Slovene": [ - "e", - "a", - "i", - "o", - "n", - "r", - "s", - "l", - "t", - "j", - "v", - "k", - "d", - "p", - "m", - "u", - "z", - "b", - "g", - "h", - "č", - "c", - "š", - "ž", - "f", - "y", - ], - "Slovak": [ - "o", - "a", - "e", - "n", - "i", - "r", - "v", - "t", - "s", - "l", - "k", - "d", - "m", - "p", - "u", - "c", - "h", - "j", - "b", - "z", - "á", - "y", - "ý", - "í", - "č", - "é", - ], - "Hebrew": [ - "י", - "ו", - "ה", - "ל", - "ר", - "ב", - "ת", - "מ", - "א", - "ש", - "נ", - "ע", - "ם", - "ד", - "ק", - "ח", - "פ", - "ס", - "כ", - "ג", - "ט", - "צ", - "ן", - "ז", - "ך", - ], - "Bulgarian": [ - "а", - "и", - "о", - "е", - "н", - "т", - "р", - "с", - "в", - "л", - "к", - "д", - "п", - "м", - "з", - "г", - "я", - "ъ", - "у", - "б", - "ч", - "ц", - "й", - "ж", - "щ", - "х", - ], - "Croatian": [ - "a", - "i", - "o", - "e", - "n", - "r", - "j", - "s", - "t", - "u", - "k", - "l", - "v", - "d", - "m", - "p", - "g", - "z", - "b", - "c", - "č", - "h", - "š", - "ž", - "ć", - "f", - ], - "Hindi": [ - "क", - "र", - "स", - "न", - "त", - "म", - "ह", - "प", - "य", - "ल", - "व", - "ज", - "द", - "ग", - "ब", - "श", - "ट", - "अ", - "ए", - "थ", - "भ", - "ड", - "च", - "ध", - "ष", - "इ", - ], - "Estonian": [ - "a", - "i", - "e", - "s", - "t", - "l", - "u", - "n", - "o", - "k", - "r", - "d", - "m", - "v", - "g", - "p", - "j", - "h", - "ä", - "b", - "õ", - "ü", - "f", - "c", - "ö", - "y", - ], - "Thai": [ - "า", - "น", - "ร", - "อ", - "ก", - "เ", - "ง", - "ม", - "ย", - "ล", - "ว", - "ด", - "ท", - "ส", - "ต", - "ะ", - "ป", - "บ", - "ค", - "ห", - "แ", - "จ", - "พ", - "ช", - "ข", - "ใ", - ], - "Greek": [ - "α", - "τ", - "ο", - "ι", - "ε", - "ν", - "ρ", - "σ", - "κ", - "η", - "π", - "ς", - "υ", - "μ", - "λ", - "ί", - "ό", - "ά", - "γ", - "έ", - "δ", - "ή", - "ω", - "χ", - "θ", - "ύ", - ], - "Tamil": [ - "க", - "த", - "ப", - "ட", - "ர", - "ம", - "ல", - "ன", - "வ", - "ற", - "ய", - "ள", - "ச", - "ந", - "இ", - "ண", - "அ", - "ஆ", - "ழ", - "ங", - "எ", - "உ", - "ஒ", - "ஸ", - ], - "Kazakh": [ - "а", - "ы", - "е", - "н", - "т", - "р", - "л", - "і", - "д", - "с", - "м", - "қ", - "к", - "о", - "б", - "и", - "у", - "ғ", - "ж", - "ң", - "з", - "ш", - "й", - "п", - "г", - "ө", - ], -} - -LANGUAGE_SUPPORTED_COUNT: int = len(FREQUENCIES) - -# Bit flags for unified character classification. -# A single unicodedata.name() call sets all relevant flags at once. -_LATIN: int = 1 -_ACCENTUATED: int = 1 << 1 -_CJK: int = 1 << 2 -_HANGUL: int = 1 << 3 -_KATAKANA: int = 1 << 4 -_HIRAGANA: int = 1 << 5 -_THAI: int = 1 << 6 -_ARABIC: int = 1 << 7 -_ARABIC_ISOLATED_FORM: int = 1 << 8 - -_ACCENT_KEYWORDS: tuple[str, ...] = ( - "WITH GRAVE", - "WITH ACUTE", - "WITH CEDILLA", - "WITH DIAERESIS", - "WITH CIRCUMFLEX", - "WITH TILDE", - "WITH MACRON", - "WITH RING ABOVE", -) - -# Pre-built lookup structures for FREQUENCIES (computed once at import time). -# character -> rank mapping per language (replaces list .index() calls). -_FREQUENCIES_RANK: dict[str, dict[str, int]] = { - lang: {char: rank for rank, char in enumerate(chars)} - for lang, chars in FREQUENCIES.items() -} - -# frozenset per language (avoids rebuilding set() per call). -_FREQUENCIES_SET: dict[str, frozenset[str]] = { - lang: frozenset(chars) for lang, chars in FREQUENCIES.items() -} diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/legacy.py b/venv/lib/python3.12/site-packages/charset_normalizer/legacy.py deleted file mode 100644 index 293c1ef..0000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer/legacy.py +++ /dev/null @@ -1,79 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any -from warnings import warn - -from .api import from_bytes -from .constant import CHARDET_CORRESPONDENCE, TOO_SMALL_SEQUENCE - -if TYPE_CHECKING: - from typing import TypedDict - - class ResultDict(TypedDict): - encoding: str | None - language: str - confidence: float | None - - -def detect( - byte_str: bytes, should_rename_legacy: bool = False, **kwargs: Any -) -> ResultDict: - """ - chardet legacy method - Detect the encoding of the given byte string. It should be mostly backward-compatible. - Encoding name will match Chardet own writing whenever possible. (Not on encoding name unsupported by it) - This function is deprecated and should be used to migrate your project easily, consult the documentation for - further information. Not planned for removal. - - :param byte_str: The byte sequence to examine. - :param should_rename_legacy: Should we rename legacy encodings - to their more modern equivalents? - """ - if len(kwargs): - warn( - f"charset-normalizer disregard arguments '{','.join(list(kwargs.keys()))}' in legacy function detect()" - ) - - if not isinstance(byte_str, (bytearray, bytes)): - raise TypeError( # pragma: nocover - f"Expected object of type bytes or bytearray, got: {type(byte_str)}" - ) - - if isinstance(byte_str, bytearray): - byte_str = bytes(byte_str) - - r = from_bytes(byte_str).best() - - encoding = r.encoding if r is not None else None - language = r.language if r is not None and r.language != "Unknown" else "" - confidence = 1.0 - r.chaos if r is not None else None - - # automatically lower confidence - # on small bytes samples. - # https://github.com/jawah/charset_normalizer/issues/391 - if ( - confidence is not None - and confidence >= 0.9 - and encoding - not in { - "utf_8", - "ascii", - } - and r.bom is False # type: ignore[union-attr] - and len(byte_str) < TOO_SMALL_SEQUENCE - ): - confidence -= 0.2 - - # Note: CharsetNormalizer does not return 'UTF-8-SIG' as the sig get stripped in the detection/normalization process - # but chardet does return 'utf-8-sig' and it is a valid codec name. - if r is not None and encoding == "utf_8" and r.bom: - encoding += "_sig" - - if should_rename_legacy is False and encoding in CHARDET_CORRESPONDENCE: - encoding = CHARDET_CORRESPONDENCE[encoding] - - return { - "encoding": encoding, - "language": language, - "confidence": confidence, - } diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 87d31c7..0000000 Binary files a/venv/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-x86_64-linux-gnu.so and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/md.py b/venv/lib/python3.12/site-packages/charset_normalizer/md.py deleted file mode 100644 index b41d9cf..0000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer/md.py +++ /dev/null @@ -1,936 +0,0 @@ -from __future__ import annotations - -import sys -from functools import lru_cache -from logging import getLogger - -if sys.version_info >= (3, 8): - from typing import final -else: - try: - from typing_extensions import final - except ImportError: - - def final(cls): # type: ignore[misc,no-untyped-def] - return cls - - -from .constant import ( - COMMON_CJK_CHARACTERS, - COMMON_SAFE_ASCII_CHARACTERS, - TRACE, - UNICODE_SECONDARY_RANGE_KEYWORD, - _ACCENTUATED, - _ARABIC, - _ARABIC_ISOLATED_FORM, - _CJK, - _HANGUL, - _HIRAGANA, - _KATAKANA, - _LATIN, - _THAI, -) -from .utils import ( - _character_flags, - is_emoticon, - is_punctuation, - is_separator, - is_symbol, - remove_accent, - unicode_range, -) - -# Combined bitmask for CJK/Hangul/Katakana/Hiragana/Thai glyph detection. -_GLYPH_MASK: int = _CJK | _HANGUL | _KATAKANA | _HIRAGANA | _THAI - - -@final -class CharInfo: - """Pre-computed character properties shared across all detectors. - - Instantiated once and reused via :meth:`update` on every character - in the hot loop so that redundant calls to str methods - (``isalpha``, ``isupper``, …) and cached utility functions - (``_character_flags``, ``is_punctuation``, …) are avoided when - several plugins need the same information. - """ - - __slots__ = ( - "character", - "printable", - "alpha", - "upper", - "lower", - "space", - "digit", - "is_ascii", - "case_variable", - "flags", - "accentuated", - "latin", - "is_cjk", - "is_arabic", - "is_glyph", - "punct", - "sym", - ) - - def __init__(self) -> None: - self.character: str = "" - self.printable: bool = False - self.alpha: bool = False - self.upper: bool = False - self.lower: bool = False - self.space: bool = False - self.digit: bool = False - self.is_ascii: bool = False - self.case_variable: bool = False - self.flags: int = 0 - self.accentuated: bool = False - self.latin: bool = False - self.is_cjk: bool = False - self.is_arabic: bool = False - self.is_glyph: bool = False - self.punct: bool = False - self.sym: bool = False - - def update(self, character: str) -> None: - """Update all properties for *character* (called once per character).""" - self.character = character - - # ASCII fast-path: for characters with ord < 128, we can skip - # _character_flags() entirely and derive most properties from ord. - o: int = ord(character) - if o < 128: - self.is_ascii = True - self.accentuated = False - self.is_cjk = False - self.is_arabic = False - self.is_glyph = False - # ASCII alpha: a-z (97-122) or A-Z (65-90) - if 65 <= o <= 90: - # Uppercase ASCII letter - self.alpha = True - self.upper = True - self.lower = False - self.space = False - self.digit = False - self.printable = True - self.case_variable = True - self.flags = _LATIN - self.latin = True - self.punct = False - self.sym = False - elif 97 <= o <= 122: - # Lowercase ASCII letter - self.alpha = True - self.upper = False - self.lower = True - self.space = False - self.digit = False - self.printable = True - self.case_variable = True - self.flags = _LATIN - self.latin = True - self.punct = False - self.sym = False - elif 48 <= o <= 57: - # ASCII digit 0-9 - self.alpha = False - self.upper = False - self.lower = False - self.space = False - self.digit = True - self.printable = True - self.case_variable = False - self.flags = 0 - self.latin = False - self.punct = False - self.sym = False - elif o == 32 or (9 <= o <= 13): - # Space, tab, newline, etc. - self.alpha = False - self.upper = False - self.lower = False - self.space = True - self.digit = False - self.printable = o == 32 - self.case_variable = False - self.flags = 0 - self.latin = False - self.punct = False - self.sym = False - else: - # Other ASCII (punctuation, symbols, control chars) - self.printable = character.isprintable() - self.alpha = False - self.upper = False - self.lower = False - self.space = False - self.digit = False - self.case_variable = False - self.flags = 0 - self.latin = False - self.punct = is_punctuation(character) if self.printable else False - self.sym = is_symbol(character) if self.printable else False - else: - # Non-ASCII path - self.is_ascii = False - self.printable = character.isprintable() - self.alpha = character.isalpha() - self.upper = character.isupper() - self.lower = character.islower() - self.space = character.isspace() - self.digit = character.isdigit() - self.case_variable = self.lower != self.upper - - # Flag-based classification (single unicodedata.name() call, lru-cached) - flags: int - if self.alpha: - flags = _character_flags(character) - else: - flags = 0 - self.flags = flags - self.accentuated = bool(flags & _ACCENTUATED) - self.latin = bool(flags & _LATIN) - self.is_cjk = bool(flags & _CJK) - self.is_arabic = bool(flags & _ARABIC) - self.is_glyph = bool(flags & _GLYPH_MASK) - - # Eagerly compute punct and sym (avoids property dispatch overhead - # on 300K+ accesses in the hot loop). - self.punct = is_punctuation(character) if self.printable else False - self.sym = is_symbol(character) if self.printable else False - - -class MessDetectorPlugin: - """ - Base abstract class used for mess detection plugins. - All detectors MUST extend and implement given methods. - """ - - __slots__ = () - - def feed_info(self, character: str, info: CharInfo) -> None: - """ - The main routine to be executed upon character. - Insert the logic in witch the text would be considered chaotic. - """ - raise NotImplementedError # Defensive: - - def reset(self) -> None: # Defensive: - """ - Permit to reset the plugin to the initial state. - """ - raise NotImplementedError - - @property - def ratio(self) -> float: - """ - Compute the chaos ratio based on what your feed() has seen. - Must NOT be lower than 0.; No restriction gt 0. - """ - raise NotImplementedError # Defensive: - - -@final -class TooManySymbolOrPunctuationPlugin(MessDetectorPlugin): - __slots__ = ( - "_punctuation_count", - "_symbol_count", - "_character_count", - "_last_printable_char", - "_frenzy_symbol_in_word", - ) - - def __init__(self) -> None: - self._punctuation_count: int = 0 - self._symbol_count: int = 0 - self._character_count: int = 0 - - self._last_printable_char: str | None = None - self._frenzy_symbol_in_word: bool = False - - def feed_info(self, character: str, info: CharInfo) -> None: - """Optimized feed using pre-computed character info.""" - self._character_count += 1 - - if ( - character != self._last_printable_char - and character not in COMMON_SAFE_ASCII_CHARACTERS - ): - if info.punct: - self._punctuation_count += 1 - elif not info.digit and info.sym and not is_emoticon(character): - self._symbol_count += 2 - - self._last_printable_char = character - - def reset(self) -> None: # Abstract - self._punctuation_count = 0 - self._character_count = 0 - self._symbol_count = 0 - - @property - def ratio(self) -> float: - if self._character_count == 0: - return 0.0 - - ratio_of_punctuation: float = ( - self._punctuation_count + self._symbol_count - ) / self._character_count - - return ratio_of_punctuation if ratio_of_punctuation >= 0.3 else 0.0 - - -@final -class TooManyAccentuatedPlugin(MessDetectorPlugin): - __slots__ = ("_character_count", "_accentuated_count") - - def __init__(self) -> None: - self._character_count: int = 0 - self._accentuated_count: int = 0 - - def feed_info(self, character: str, info: CharInfo) -> None: - """Optimized feed using pre-computed character info.""" - self._character_count += 1 - - if info.accentuated: - self._accentuated_count += 1 - - def reset(self) -> None: # Abstract - self._character_count = 0 - self._accentuated_count = 0 - - @property - def ratio(self) -> float: - if self._character_count < 8: - return 0.0 - - ratio_of_accentuation: float = self._accentuated_count / self._character_count - return ratio_of_accentuation if ratio_of_accentuation >= 0.35 else 0.0 - - -@final -class UnprintablePlugin(MessDetectorPlugin): - __slots__ = ("_unprintable_count", "_character_count") - - def __init__(self) -> None: - self._unprintable_count: int = 0 - self._character_count: int = 0 - - def feed_info(self, character: str, info: CharInfo) -> None: - """Optimized feed using pre-computed character info.""" - if ( - not info.space - and not info.printable - and character != "\x1a" - and character != "\ufeff" - ): - self._unprintable_count += 1 - self._character_count += 1 - - def reset(self) -> None: # Abstract - self._unprintable_count = 0 - - @property - def ratio(self) -> float: - if self._character_count == 0: # Defensive: - return 0.0 - - return (self._unprintable_count * 8) / self._character_count - - -@final -class SuspiciousDuplicateAccentPlugin(MessDetectorPlugin): - __slots__ = ( - "_successive_count", - "_character_count", - "_last_latin_character", - "_last_was_accentuated", - ) - - def __init__(self) -> None: - self._successive_count: int = 0 - self._character_count: int = 0 - - self._last_latin_character: str | None = None - self._last_was_accentuated: bool = False - - def feed_info(self, character: str, info: CharInfo) -> None: - """Optimized feed using pre-computed character info.""" - self._character_count += 1 - if ( - self._last_latin_character is not None - and info.accentuated - and self._last_was_accentuated - ): - if info.upper and self._last_latin_character.isupper(): - self._successive_count += 1 - if remove_accent(character) == remove_accent(self._last_latin_character): - self._successive_count += 1 - self._last_latin_character = character - self._last_was_accentuated = info.accentuated - - def reset(self) -> None: # Abstract - self._successive_count = 0 - self._character_count = 0 - self._last_latin_character = None - self._last_was_accentuated = False - - @property - def ratio(self) -> float: - if self._character_count == 0: - return 0.0 - - return (self._successive_count * 2) / self._character_count - - -@final -class SuspiciousRange(MessDetectorPlugin): - __slots__ = ( - "_suspicious_successive_range_count", - "_character_count", - "_last_printable_seen", - "_last_printable_range", - ) - - def __init__(self) -> None: - self._suspicious_successive_range_count: int = 0 - self._character_count: int = 0 - self._last_printable_seen: str | None = None - self._last_printable_range: str | None = None - - def feed_info(self, character: str, info: CharInfo) -> None: - """Optimized feed using pre-computed character info.""" - self._character_count += 1 - - if info.space or info.punct or character in COMMON_SAFE_ASCII_CHARACTERS: - self._last_printable_seen = None - self._last_printable_range = None - return - - if self._last_printable_seen is None: - self._last_printable_seen = character - self._last_printable_range = unicode_range(character) - return - - unicode_range_a: str | None = self._last_printable_range - unicode_range_b: str | None = unicode_range(character) - - if is_suspiciously_successive_range(unicode_range_a, unicode_range_b): - self._suspicious_successive_range_count += 1 - - self._last_printable_seen = character - self._last_printable_range = unicode_range_b - - def reset(self) -> None: # Abstract - self._character_count = 0 - self._suspicious_successive_range_count = 0 - self._last_printable_seen = None - self._last_printable_range = None - - @property - def ratio(self) -> float: - if self._character_count <= 13: - return 0.0 - - ratio_of_suspicious_range_usage: float = ( - self._suspicious_successive_range_count * 2 - ) / self._character_count - - return ratio_of_suspicious_range_usage - - -@final -class SuperWeirdWordPlugin(MessDetectorPlugin): - __slots__ = ( - "_word_count", - "_bad_word_count", - "_foreign_long_count", - "_is_current_word_bad", - "_foreign_long_watch", - "_character_count", - "_bad_character_count", - "_buffer_length", - "_buffer_last_char", - "_buffer_last_char_accentuated", - "_buffer_accent_count", - "_buffer_glyph_count", - "_buffer_upper_count", - ) - - def __init__(self) -> None: - self._word_count: int = 0 - self._bad_word_count: int = 0 - self._foreign_long_count: int = 0 - - self._is_current_word_bad: bool = False - self._foreign_long_watch: bool = False - - self._character_count: int = 0 - self._bad_character_count: int = 0 - - self._buffer_length: int = 0 - self._buffer_last_char: str | None = None - self._buffer_last_char_accentuated: bool = False - self._buffer_accent_count: int = 0 - self._buffer_glyph_count: int = 0 - self._buffer_upper_count: int = 0 - - def feed_info(self, character: str, info: CharInfo) -> None: - """Optimized feed using pre-computed character info.""" - if info.alpha: - self._buffer_length += 1 - self._buffer_last_char = character - - if info.upper: - self._buffer_upper_count += 1 - - self._buffer_last_char_accentuated = info.accentuated - - if info.accentuated: - self._buffer_accent_count += 1 - if ( - not self._foreign_long_watch - and (not info.latin or info.accentuated) - and not info.is_glyph - ): - self._foreign_long_watch = True - if info.is_glyph: - self._buffer_glyph_count += 1 - return - if not self._buffer_length: - return - if info.space or info.punct or is_separator(character): - self._word_count += 1 - buffer_length: int = self._buffer_length - - self._character_count += buffer_length - - if buffer_length >= 4: - if self._buffer_accent_count / buffer_length >= 0.5: - self._is_current_word_bad = True - elif ( - self._buffer_last_char_accentuated - and self._buffer_last_char.isupper() # type: ignore[union-attr] - and self._buffer_upper_count != buffer_length - ): - self._foreign_long_count += 1 - self._is_current_word_bad = True - elif self._buffer_glyph_count == 1: - self._is_current_word_bad = True - self._foreign_long_count += 1 - if buffer_length >= 24 and self._foreign_long_watch: - probable_camel_cased: bool = ( - self._buffer_upper_count > 0 - and self._buffer_upper_count / buffer_length <= 0.3 - ) - - if not probable_camel_cased: - self._foreign_long_count += 1 - self._is_current_word_bad = True - - if self._is_current_word_bad: - self._bad_word_count += 1 - self._bad_character_count += buffer_length - self._is_current_word_bad = False - - self._foreign_long_watch = False - self._buffer_length = 0 - self._buffer_last_char = None - self._buffer_last_char_accentuated = False - self._buffer_accent_count = 0 - self._buffer_glyph_count = 0 - self._buffer_upper_count = 0 - elif ( - character not in {"<", ">", "-", "=", "~", "|", "_"} - and not info.digit - and info.sym - ): - self._is_current_word_bad = True - self._buffer_length += 1 - self._buffer_last_char = character - self._buffer_last_char_accentuated = False - - def reset(self) -> None: # Abstract - self._buffer_length = 0 - self._buffer_last_char = None - self._buffer_last_char_accentuated = False - self._is_current_word_bad = False - self._foreign_long_watch = False - self._bad_word_count = 0 - self._word_count = 0 - self._character_count = 0 - self._bad_character_count = 0 - self._foreign_long_count = 0 - self._buffer_accent_count = 0 - self._buffer_glyph_count = 0 - self._buffer_upper_count = 0 - - @property - def ratio(self) -> float: - if self._word_count <= 10 and self._foreign_long_count == 0: - return 0.0 - - return self._bad_character_count / self._character_count - - -@final -class CjkUncommonPlugin(MessDetectorPlugin): - """ - Detect messy CJK text that probably means nothing. - """ - - __slots__ = ("_character_count", "_uncommon_count") - - def __init__(self) -> None: - self._character_count: int = 0 - self._uncommon_count: int = 0 - - def feed_info(self, character: str, info: CharInfo) -> None: - """Optimized feed using pre-computed character info.""" - self._character_count += 1 - - if character not in COMMON_CJK_CHARACTERS: - self._uncommon_count += 1 - - def reset(self) -> None: # Abstract - self._character_count = 0 - self._uncommon_count = 0 - - @property - def ratio(self) -> float: - if self._character_count < 8: - return 0.0 - - uncommon_form_usage: float = self._uncommon_count / self._character_count - - # we can be pretty sure it's garbage when uncommon characters are widely - # used. otherwise it could just be traditional chinese for example. - return uncommon_form_usage / 10 if uncommon_form_usage > 0.5 else 0.0 - - -@final -class ArchaicUpperLowerPlugin(MessDetectorPlugin): - __slots__ = ( - "_buf", - "_character_count_since_last_sep", - "_successive_upper_lower_count", - "_successive_upper_lower_count_final", - "_character_count", - "_last_alpha_seen", - "_last_alpha_seen_upper", - "_last_alpha_seen_lower", - "_current_ascii_only", - ) - - def __init__(self) -> None: - self._buf: bool = False - - self._character_count_since_last_sep: int = 0 - - self._successive_upper_lower_count: int = 0 - self._successive_upper_lower_count_final: int = 0 - - self._character_count: int = 0 - - self._last_alpha_seen: str | None = None - self._last_alpha_seen_upper: bool = False - self._last_alpha_seen_lower: bool = False - self._current_ascii_only: bool = True - - def feed_info(self, character: str, info: CharInfo) -> None: - """Optimized feed using pre-computed character info.""" - is_concerned: bool = info.alpha and info.case_variable - chunk_sep: bool = not is_concerned - - if chunk_sep and self._character_count_since_last_sep > 0: - if ( - self._character_count_since_last_sep <= 64 - and not info.digit - and not self._current_ascii_only - ): - self._successive_upper_lower_count_final += ( - self._successive_upper_lower_count - ) - - self._successive_upper_lower_count = 0 - self._character_count_since_last_sep = 0 - self._last_alpha_seen = None - self._buf = False - self._character_count += 1 - self._current_ascii_only = True - - return - - if self._current_ascii_only and not info.is_ascii: - self._current_ascii_only = False - - if self._last_alpha_seen is not None: - if (info.upper and self._last_alpha_seen_lower) or ( - info.lower and self._last_alpha_seen_upper - ): - if self._buf: - self._successive_upper_lower_count += 2 - self._buf = False - else: - self._buf = True - else: - self._buf = False - - self._character_count += 1 - self._character_count_since_last_sep += 1 - self._last_alpha_seen = character - self._last_alpha_seen_upper = info.upper - self._last_alpha_seen_lower = info.lower - - def reset(self) -> None: # Abstract - self._character_count = 0 - self._character_count_since_last_sep = 0 - self._successive_upper_lower_count = 0 - self._successive_upper_lower_count_final = 0 - self._last_alpha_seen = None - self._last_alpha_seen_upper = False - self._last_alpha_seen_lower = False - self._buf = False - self._current_ascii_only = True - - @property - def ratio(self) -> float: - if self._character_count == 0: # Defensive: - return 0.0 - - return self._successive_upper_lower_count_final / self._character_count - - -@final -class ArabicIsolatedFormPlugin(MessDetectorPlugin): - __slots__ = ("_character_count", "_isolated_form_count") - - def __init__(self) -> None: - self._character_count: int = 0 - self._isolated_form_count: int = 0 - - def reset(self) -> None: # Abstract - self._character_count = 0 - self._isolated_form_count = 0 - - def feed_info(self, character: str, info: CharInfo) -> None: - """Optimized feed using pre-computed character info.""" - self._character_count += 1 - - if info.flags & _ARABIC_ISOLATED_FORM: - self._isolated_form_count += 1 - - @property - def ratio(self) -> float: - if self._character_count < 8: - return 0.0 - - isolated_form_usage: float = self._isolated_form_count / self._character_count - - return isolated_form_usage - - -@lru_cache(maxsize=1024) -def is_suspiciously_successive_range( - unicode_range_a: str | None, unicode_range_b: str | None -) -> bool: - """ - Determine if two Unicode range seen next to each other can be considered as suspicious. - """ - if unicode_range_a is None or unicode_range_b is None: - return True - - if unicode_range_a == unicode_range_b: - return False - - if "Latin" in unicode_range_a and "Latin" in unicode_range_b: - return False - - if "Emoticons" in unicode_range_a or "Emoticons" in unicode_range_b: - return False - - # Latin characters can be accompanied with a combining diacritical mark - # eg. Vietnamese. - if ("Latin" in unicode_range_a or "Latin" in unicode_range_b) and ( - "Combining" in unicode_range_a or "Combining" in unicode_range_b - ): - return False - - keywords_range_a, keywords_range_b = ( - unicode_range_a.split(" "), - unicode_range_b.split(" "), - ) - - for el in keywords_range_a: - if el in UNICODE_SECONDARY_RANGE_KEYWORD: - continue - if el in keywords_range_b: - return False - - # Japanese Exception - range_a_jp_chars, range_b_jp_chars = ( - unicode_range_a - in ( - "Hiragana", - "Katakana", - ), - unicode_range_b in ("Hiragana", "Katakana"), - ) - if (range_a_jp_chars or range_b_jp_chars) and ( - "CJK" in unicode_range_a or "CJK" in unicode_range_b - ): - return False - if range_a_jp_chars and range_b_jp_chars: - return False - - if "Hangul" in unicode_range_a or "Hangul" in unicode_range_b: - if "CJK" in unicode_range_a or "CJK" in unicode_range_b: - return False - if unicode_range_a == "Basic Latin" or unicode_range_b == "Basic Latin": - return False - - # Chinese/Japanese use dedicated range for punctuation and/or separators. - if ("CJK" in unicode_range_a or "CJK" in unicode_range_b) or ( - unicode_range_a in ["Katakana", "Hiragana"] - and unicode_range_b in ["Katakana", "Hiragana"] - ): - if "Punctuation" in unicode_range_a or "Punctuation" in unicode_range_b: - return False - if "Forms" in unicode_range_a or "Forms" in unicode_range_b: - return False - if unicode_range_a == "Basic Latin" or unicode_range_b == "Basic Latin": - return False - - return True - - -@lru_cache(maxsize=2048) -def mess_ratio( - decoded_sequence: str, maximum_threshold: float = 0.2, debug: bool = False -) -> float: - """ - Compute a mess ratio given a decoded bytes sequence. The maximum threshold does stop the computation earlier. - """ - - seq_len: int = len(decoded_sequence) - - if seq_len < 511: - step: int = 32 - elif seq_len < 1024: - step = 64 - else: - step = 128 - - # Create each detector as a named local variable (unrolled from the generic loop). - # This eliminates per-character iteration over the detector list and - # per-character eligible() virtual dispatch, while keeping every plugin class - # intact and fully readable. - d_sp: TooManySymbolOrPunctuationPlugin = TooManySymbolOrPunctuationPlugin() - d_ta: TooManyAccentuatedPlugin = TooManyAccentuatedPlugin() - d_up: UnprintablePlugin = UnprintablePlugin() - d_sda: SuspiciousDuplicateAccentPlugin = SuspiciousDuplicateAccentPlugin() - d_sr: SuspiciousRange = SuspiciousRange() - d_sw: SuperWeirdWordPlugin = SuperWeirdWordPlugin() - d_cu: CjkUncommonPlugin = CjkUncommonPlugin() - d_au: ArchaicUpperLowerPlugin = ArchaicUpperLowerPlugin() - d_ai: ArabicIsolatedFormPlugin = ArabicIsolatedFormPlugin() - - # Local references for feed_info methods called in the hot loop. - d_sp_feed = d_sp.feed_info - d_ta_feed = d_ta.feed_info - d_up_feed = d_up.feed_info - d_sda_feed = d_sda.feed_info - d_sr_feed = d_sr.feed_info - d_sw_feed = d_sw.feed_info - d_cu_feed = d_cu.feed_info - d_au_feed = d_au.feed_info - d_ai_feed = d_ai.feed_info - - # Single reusable CharInfo object (avoids per-character allocation). - info: CharInfo = CharInfo() - info_update = info.update - - mean_mess_ratio: float - - for block_start in range(0, seq_len, step): - for character in decoded_sequence[block_start : block_start + step]: - # Pre-compute all character properties once (shared across all plugins). - info_update(character) - - # Detectors with eligible() == always True - d_up_feed(character, info) - d_sw_feed(character, info) - d_au_feed(character, info) - - # Detectors with eligible() == isprintable - if info.printable: - d_sp_feed(character, info) - d_sr_feed(character, info) - - # Detectors with eligible() == isalpha - if info.alpha: - d_ta_feed(character, info) - # SuspiciousDuplicateAccent: isalpha() and is_latin() - if info.latin: - d_sda_feed(character, info) - # CjkUncommon: is_cjk() - if info.is_cjk: - d_cu_feed(character, info) - # ArabicIsolatedForm: is_arabic() - if info.is_arabic: - d_ai_feed(character, info) - - mean_mess_ratio = ( - d_sp.ratio - + d_ta.ratio - + d_up.ratio - + d_sda.ratio - + d_sr.ratio - + d_sw.ratio - + d_cu.ratio - + d_au.ratio - + d_ai.ratio - ) - - if mean_mess_ratio >= maximum_threshold: - break - else: - # Flush last word buffer in SuperWeirdWordPlugin via trailing newline. - info_update("\n") - d_sw_feed("\n", info) - d_au_feed("\n", info) - d_up_feed("\n", info) - - mean_mess_ratio = ( - d_sp.ratio - + d_ta.ratio - + d_up.ratio - + d_sda.ratio - + d_sr.ratio - + d_sw.ratio - + d_cu.ratio - + d_au.ratio - + d_ai.ratio - ) - - if debug: # Defensive: - logger = getLogger("charset_normalizer") - - logger.log( - TRACE, - "Mess-detector extended-analysis start. " - f"intermediary_mean_mess_ratio_calc={step} mean_mess_ratio={mean_mess_ratio} " - f"maximum_threshold={maximum_threshold}", - ) - - if seq_len > 16: - logger.log(TRACE, f"Starting with: {decoded_sequence[:16]}") - logger.log(TRACE, f"Ending with: {decoded_sequence[-16::]}") - - for dt in [d_sp, d_ta, d_up, d_sda, d_sr, d_sw, d_cu, d_au, d_ai]: - logger.log(TRACE, f"{dt.__class__}: {dt.ratio}") - - return round(mean_mess_ratio, 3) diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/models.py b/venv/lib/python3.12/site-packages/charset_normalizer/models.py deleted file mode 100644 index 382de15..0000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer/models.py +++ /dev/null @@ -1,369 +0,0 @@ -from __future__ import annotations - -from encodings.aliases import aliases -from json import dumps -from re import sub -from typing import Any, Iterator, List, Tuple - -from .constant import RE_POSSIBLE_ENCODING_INDICATION, TOO_BIG_SEQUENCE -from .utils import iana_name, is_multi_byte_encoding, unicode_range - - -class CharsetMatch: - def __init__( - self, - payload: bytes | bytearray, - guessed_encoding: str, - mean_mess_ratio: float, - has_sig_or_bom: bool, - languages: CoherenceMatches, - decoded_payload: str | None = None, - preemptive_declaration: str | None = None, - ): - self._payload: bytes | bytearray = payload - - self._encoding: str = guessed_encoding - self._mean_mess_ratio: float = mean_mess_ratio - self._languages: CoherenceMatches = languages - self._has_sig_or_bom: bool = has_sig_or_bom - self._unicode_ranges: list[str] | None = None - - self._leaves: list[CharsetMatch] = [] - self._mean_coherence_ratio: float = 0.0 - - self._output_payload: bytes | None = None - self._output_encoding: str | None = None - - self._string: str | None = decoded_payload - - self._preemptive_declaration: str | None = preemptive_declaration - - def __eq__(self, other: object) -> bool: - if not isinstance(other, CharsetMatch): - if isinstance(other, str): - return iana_name(other) == self.encoding - return False - return self.encoding == other.encoding and self.fingerprint == other.fingerprint - - def __lt__(self, other: object) -> bool: - """ - Implemented to make sorted available upon CharsetMatches items. - """ - if not isinstance(other, CharsetMatch): - raise ValueError - - chaos_difference: float = abs(self.chaos - other.chaos) - coherence_difference: float = abs(self.coherence - other.coherence) - - # Below 0.5% difference --> Use Coherence - if chaos_difference < 0.005 and coherence_difference > 0.02: - return self.coherence > other.coherence - elif chaos_difference < 0.005 and coherence_difference <= 0.02: - # When having a difficult decision, use the result that decoded as many multi-byte as possible. - # preserve RAM usage! - if len(self._payload) >= TOO_BIG_SEQUENCE: - return self.chaos < other.chaos - return self.multi_byte_usage > other.multi_byte_usage - - return self.chaos < other.chaos - - @property - def multi_byte_usage(self) -> float: - return 1.0 - (len(str(self)) / len(self.raw)) - - def __str__(self) -> str: - # Lazy Str Loading - if self._string is None: - self._string = str(self._payload, self._encoding, "strict") - # UTF-7 BOM is encoded in modified Base64 whose byte boundary - # can overlap with the next character, so raw-byte stripping - # is unreliable. Strip the decoded BOM character instead. - if ( - self._has_sig_or_bom - and self._encoding == "utf_7" - and self._string - and self._string[0] == "\ufeff" - ): - self._string = self._string[1:] - return self._string - - def __repr__(self) -> str: - return f"" - - def add_submatch(self, other: CharsetMatch) -> None: - if not isinstance(other, CharsetMatch) or other == self: - raise ValueError( - "Unable to add instance <{}> as a submatch of a CharsetMatch".format( - other.__class__ - ) - ) - - other._string = None # Unload RAM usage; dirty trick. - self._leaves.append(other) - - @property - def encoding(self) -> str: - return self._encoding - - @property - def encoding_aliases(self) -> list[str]: - """ - Encoding name are known by many name, using this could help when searching for IBM855 when it's listed as CP855. - """ - also_known_as: list[str] = [] - for u, p in aliases.items(): - if self.encoding == u: - also_known_as.append(p) - elif self.encoding == p: - also_known_as.append(u) - return also_known_as - - @property - def bom(self) -> bool: - return self._has_sig_or_bom - - @property - def byte_order_mark(self) -> bool: - return self._has_sig_or_bom - - @property - def languages(self) -> list[str]: - """ - Return the complete list of possible languages found in decoded sequence. - Usually not really useful. Returned list may be empty even if 'language' property return something != 'Unknown'. - """ - return [e[0] for e in self._languages] - - @property - def language(self) -> str: - """ - Most probable language found in decoded sequence. If none were detected or inferred, the property will return - "Unknown". - """ - if not self._languages: - # Trying to infer the language based on the given encoding - # Its either English or we should not pronounce ourselves in certain cases. - if "ascii" in self.could_be_from_charset: - return "English" - - # doing it there to avoid circular import - from charset_normalizer.cd import encoding_languages, mb_encoding_languages - - languages = ( - mb_encoding_languages(self.encoding) - if is_multi_byte_encoding(self.encoding) - else encoding_languages(self.encoding) - ) - - if len(languages) == 0 or "Latin Based" in languages: - return "Unknown" - - return languages[0] - - return self._languages[0][0] - - @property - def chaos(self) -> float: - return self._mean_mess_ratio - - @property - def coherence(self) -> float: - if not self._languages: - return 0.0 - return self._languages[0][1] - - @property - def percent_chaos(self) -> float: - return round(self.chaos * 100, ndigits=3) - - @property - def percent_coherence(self) -> float: - return round(self.coherence * 100, ndigits=3) - - @property - def raw(self) -> bytes | bytearray: - """ - Original untouched bytes. - """ - return self._payload - - @property - def submatch(self) -> list[CharsetMatch]: - return self._leaves - - @property - def has_submatch(self) -> bool: - return len(self._leaves) > 0 - - @property - def alphabets(self) -> list[str]: - if self._unicode_ranges is not None: - return self._unicode_ranges - # list detected ranges - detected_ranges: list[str | None] = [unicode_range(char) for char in str(self)] - # filter and sort - self._unicode_ranges = sorted(list({r for r in detected_ranges if r})) - return self._unicode_ranges - - @property - def could_be_from_charset(self) -> list[str]: - """ - The complete list of encoding that output the exact SAME str result and therefore could be the originating - encoding. - This list does include the encoding available in property 'encoding'. - """ - return [self._encoding] + [m.encoding for m in self._leaves] - - def output(self, encoding: str = "utf_8") -> bytes: - """ - Method to get re-encoded bytes payload using given target encoding. Default to UTF-8. - Any errors will be simply ignored by the encoder NOT replaced. - """ - if self._output_encoding is None or self._output_encoding != encoding: - self._output_encoding = encoding - decoded_string = str(self) - if ( - self._preemptive_declaration is not None - and self._preemptive_declaration.lower() - not in ["utf-8", "utf8", "utf_8"] - ): - patched_header = sub( - RE_POSSIBLE_ENCODING_INDICATION, - lambda m: m.string[m.span()[0] : m.span()[1]].replace( - m.groups()[0], - iana_name(self._output_encoding).replace("_", "-"), # type: ignore[arg-type] - ), - decoded_string[:8192], - count=1, - ) - - decoded_string = patched_header + decoded_string[8192:] - - self._output_payload = decoded_string.encode(encoding, "replace") - - return self._output_payload # type: ignore - - @property - def fingerprint(self) -> int: - """ - Retrieve a hash fingerprint of the decoded payload, used for deduplication. - """ - return hash(str(self)) - - -class CharsetMatches: - """ - Container with every CharsetMatch items ordered by default from most probable to the less one. - Act like a list(iterable) but does not implements all related methods. - """ - - def __init__(self, results: list[CharsetMatch] | None = None): - self._results: list[CharsetMatch] = sorted(results) if results else [] - - def __iter__(self) -> Iterator[CharsetMatch]: - yield from self._results - - def __getitem__(self, item: int | str) -> CharsetMatch: - """ - Retrieve a single item either by its position or encoding name (alias may be used here). - Raise KeyError upon invalid index or encoding not present in results. - """ - if isinstance(item, int): - return self._results[item] - if isinstance(item, str): - item = iana_name(item, False) - for result in self._results: - if item in result.could_be_from_charset: - return result - raise KeyError - - def __len__(self) -> int: - return len(self._results) - - def __bool__(self) -> bool: - return len(self._results) > 0 - - def append(self, item: CharsetMatch) -> None: - """ - Insert a single match. Will be inserted accordingly to preserve sort. - Can be inserted as a submatch. - """ - if not isinstance(item, CharsetMatch): - raise ValueError( - "Cannot append instance '{}' to CharsetMatches".format( - str(item.__class__) - ) - ) - # We should disable the submatch factoring when the input file is too heavy (conserve RAM usage) - if len(item.raw) < TOO_BIG_SEQUENCE: - for match in self._results: - if match.fingerprint == item.fingerprint and match.chaos == item.chaos: - match.add_submatch(item) - return - self._results.append(item) - self._results = sorted(self._results) - - def best(self) -> CharsetMatch | None: - """ - Simply return the first match. Strict equivalent to matches[0]. - """ - if not self._results: - return None - return self._results[0] - - def first(self) -> CharsetMatch | None: - """ - Redundant method, call the method best(). Kept for BC reasons. - """ - return self.best() - - -CoherenceMatch = Tuple[str, float] -CoherenceMatches = List[CoherenceMatch] - - -class CliDetectionResult: - def __init__( - self, - path: str, - encoding: str | None, - encoding_aliases: list[str], - alternative_encodings: list[str], - language: str, - alphabets: list[str], - has_sig_or_bom: bool, - chaos: float, - coherence: float, - unicode_path: str | None, - is_preferred: bool, - ): - self.path: str = path - self.unicode_path: str | None = unicode_path - self.encoding: str | None = encoding - self.encoding_aliases: list[str] = encoding_aliases - self.alternative_encodings: list[str] = alternative_encodings - self.language: str = language - self.alphabets: list[str] = alphabets - self.has_sig_or_bom: bool = has_sig_or_bom - self.chaos: float = chaos - self.coherence: float = coherence - self.is_preferred: bool = is_preferred - - @property - def __dict__(self) -> dict[str, Any]: # type: ignore - return { - "path": self.path, - "encoding": self.encoding, - "encoding_aliases": self.encoding_aliases, - "alternative_encodings": self.alternative_encodings, - "language": self.language, - "alphabets": self.alphabets, - "has_sig_or_bom": self.has_sig_or_bom, - "chaos": self.chaos, - "coherence": self.coherence, - "unicode_path": self.unicode_path, - "is_preferred": self.is_preferred, - } - - def to_json(self) -> str: - return dumps(self.__dict__, ensure_ascii=True, indent=4) diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/py.typed b/venv/lib/python3.12/site-packages/charset_normalizer/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/utils.py b/venv/lib/python3.12/site-packages/charset_normalizer/utils.py deleted file mode 100644 index 0f529b5..0000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer/utils.py +++ /dev/null @@ -1,422 +0,0 @@ -from __future__ import annotations - -import importlib -import logging -import unicodedata -from bisect import bisect_right -from codecs import IncrementalDecoder -from encodings.aliases import aliases -from functools import lru_cache -from re import findall -from typing import Generator - -from _multibytecodec import ( # type: ignore[import-not-found,import] - MultibyteIncrementalDecoder, -) - -from .constant import ( - ENCODING_MARKS, - IANA_SUPPORTED_SIMILAR, - RE_POSSIBLE_ENCODING_INDICATION, - UNICODE_RANGES_COMBINED, - UNICODE_SECONDARY_RANGE_KEYWORD, - UTF8_MAXIMAL_ALLOCATION, - COMMON_CJK_CHARACTERS, - _LATIN, - _CJK, - _HANGUL, - _KATAKANA, - _HIRAGANA, - _THAI, - _ARABIC, - _ARABIC_ISOLATED_FORM, - _ACCENT_KEYWORDS, - _ACCENTUATED, -) - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def _character_flags(character: str) -> int: - """Compute all name-based classification flags with a single unicodedata.name() call.""" - try: - desc: str = unicodedata.name(character) - except ValueError: - return 0 - - flags: int = 0 - - if "LATIN" in desc: - flags |= _LATIN - if "CJK" in desc: - flags |= _CJK - if "HANGUL" in desc: - flags |= _HANGUL - if "KATAKANA" in desc: - flags |= _KATAKANA - if "HIRAGANA" in desc: - flags |= _HIRAGANA - if "THAI" in desc: - flags |= _THAI - if "ARABIC" in desc: - flags |= _ARABIC - if "ISOLATED FORM" in desc: - flags |= _ARABIC_ISOLATED_FORM - - for kw in _ACCENT_KEYWORDS: - if kw in desc: - flags |= _ACCENTUATED - break - - return flags - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_accentuated(character: str) -> bool: - return bool(_character_flags(character) & _ACCENTUATED) - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def remove_accent(character: str) -> str: - decomposed: str = unicodedata.decomposition(character) - if not decomposed: - return character - - codes: list[str] = decomposed.split(" ") - - return chr(int(codes[0], 16)) - - -# Pre-built sorted lookup table for O(log n) binary search in unicode_range(). -# Each entry is (range_start, range_end_exclusive, range_name). -_UNICODE_RANGES_SORTED: list[tuple[int, int, str]] = sorted( - (ord_range.start, ord_range.stop, name) - for name, ord_range in UNICODE_RANGES_COMBINED.items() -) -_UNICODE_RANGE_STARTS: list[int] = [e[0] for e in _UNICODE_RANGES_SORTED] - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def unicode_range(character: str) -> str | None: - """ - Retrieve the Unicode range official name from a single character. - """ - character_ord: int = ord(character) - - # Binary search: find the rightmost range whose start <= character_ord - idx = bisect_right(_UNICODE_RANGE_STARTS, character_ord) - 1 - if idx >= 0: - start, stop, name = _UNICODE_RANGES_SORTED[idx] - if character_ord < stop: - return name - - return None - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_latin(character: str) -> bool: - return bool(_character_flags(character) & _LATIN) - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_punctuation(character: str) -> bool: - character_category: str = unicodedata.category(character) - - if "P" in character_category: - return True - - character_range: str | None = unicode_range(character) - - if character_range is None: - return False - - return "Punctuation" in character_range - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_symbol(character: str) -> bool: - character_category: str = unicodedata.category(character) - - if "S" in character_category or "N" in character_category: - return True - - character_range: str | None = unicode_range(character) - - if character_range is None: - return False - - return "Forms" in character_range and character_category != "Lo" - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_emoticon(character: str) -> bool: - character_range: str | None = unicode_range(character) - - if character_range is None: - return False - - return "Emoticons" in character_range or "Pictographs" in character_range - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_separator(character: str) -> bool: - if character.isspace() or character in {"|", "+", "<", ">"}: - return True - - character_category: str = unicodedata.category(character) - - return "Z" in character_category or character_category in {"Po", "Pd", "Pc"} - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_case_variable(character: str) -> bool: - return character.islower() != character.isupper() - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_cjk(character: str) -> bool: - return bool(_character_flags(character) & _CJK) - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_hiragana(character: str) -> bool: - return bool(_character_flags(character) & _HIRAGANA) - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_katakana(character: str) -> bool: - return bool(_character_flags(character) & _KATAKANA) - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_hangul(character: str) -> bool: - return bool(_character_flags(character) & _HANGUL) - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_thai(character: str) -> bool: - return bool(_character_flags(character) & _THAI) - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_arabic(character: str) -> bool: - return bool(_character_flags(character) & _ARABIC) - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_arabic_isolated_form(character: str) -> bool: - return bool(_character_flags(character) & _ARABIC_ISOLATED_FORM) - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_cjk_uncommon(character: str) -> bool: - return character not in COMMON_CJK_CHARACTERS - - -@lru_cache(maxsize=len(UNICODE_RANGES_COMBINED)) -def is_unicode_range_secondary(range_name: str) -> bool: - return any(keyword in range_name for keyword in UNICODE_SECONDARY_RANGE_KEYWORD) - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_unprintable(character: str) -> bool: - return ( - character.isspace() is False # includes \n \t \r \v - and character.isprintable() is False - and character != "\x1a" # Why? Its the ASCII substitute character. - and character != "\ufeff" # bug discovered in Python, - # Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space. - ) - - -def any_specified_encoding( - sequence: bytes | bytearray, search_zone: int = 8192 -) -> str | None: - """ - Extract using ASCII-only decoder any specified encoding in the first n-bytes. - """ - if not isinstance(sequence, (bytes, bytearray)): - raise TypeError - - seq_len: int = len(sequence) - - results: list[str] = findall( - RE_POSSIBLE_ENCODING_INDICATION, - sequence[: min(seq_len, search_zone)].decode("ascii", errors="ignore"), - ) - - if len(results) == 0: - return None - - for specified_encoding in results: - specified_encoding = specified_encoding.lower().replace("-", "_") - - encoding_alias: str - encoding_iana: str - - for encoding_alias, encoding_iana in aliases.items(): - if encoding_alias == specified_encoding: - return encoding_iana - if encoding_iana == specified_encoding: - return encoding_iana - - return None - - -@lru_cache(maxsize=128) -def is_multi_byte_encoding(name: str) -> bool: - """ - Verify is a specific encoding is a multi byte one based on it IANA name - """ - return name in { - "utf_8", - "utf_8_sig", - "utf_16", - "utf_16_be", - "utf_16_le", - "utf_32", - "utf_32_le", - "utf_32_be", - "utf_7", - } or issubclass( - importlib.import_module(f"encodings.{name}").IncrementalDecoder, - MultibyteIncrementalDecoder, - ) - - -def identify_sig_or_bom(sequence: bytes | bytearray) -> tuple[str | None, bytes]: - """ - Identify and extract SIG/BOM in given sequence. - """ - - for iana_encoding in ENCODING_MARKS: - marks: bytes | list[bytes] = ENCODING_MARKS[iana_encoding] - - if isinstance(marks, bytes): - marks = [marks] - - for mark in marks: - if sequence.startswith(mark): - return iana_encoding, mark - - return None, b"" - - -def should_strip_sig_or_bom(iana_encoding: str) -> bool: - return iana_encoding not in {"utf_16", "utf_32"} - - -def iana_name(cp_name: str, strict: bool = True) -> str: - """Returns the Python normalized encoding name (Not the IANA official name).""" - cp_name = cp_name.lower().replace("-", "_") - - encoding_alias: str - encoding_iana: str - - for encoding_alias, encoding_iana in aliases.items(): - if cp_name in [encoding_alias, encoding_iana]: - return encoding_iana - - if strict: - raise ValueError(f"Unable to retrieve IANA for '{cp_name}'") - - return cp_name - - -def cp_similarity(iana_name_a: str, iana_name_b: str) -> float: - if is_multi_byte_encoding(iana_name_a) or is_multi_byte_encoding(iana_name_b): - return 0.0 - - decoder_a = importlib.import_module(f"encodings.{iana_name_a}").IncrementalDecoder - decoder_b = importlib.import_module(f"encodings.{iana_name_b}").IncrementalDecoder - - id_a: IncrementalDecoder = decoder_a(errors="ignore") - id_b: IncrementalDecoder = decoder_b(errors="ignore") - - character_match_count: int = 0 - - for i in range(256): - to_be_decoded: bytes = bytes([i]) - if id_a.decode(to_be_decoded) == id_b.decode(to_be_decoded): - character_match_count += 1 - - return character_match_count / 256 - - -def is_cp_similar(iana_name_a: str, iana_name_b: str) -> bool: - """ - Determine if two code page are at least 80% similar. IANA_SUPPORTED_SIMILAR dict was generated using - the function cp_similarity. - """ - return ( - iana_name_a in IANA_SUPPORTED_SIMILAR - and iana_name_b in IANA_SUPPORTED_SIMILAR[iana_name_a] - ) - - -def set_logging_handler( - name: str = "charset_normalizer", - level: int = logging.INFO, - format_string: str = "%(asctime)s | %(levelname)s | %(message)s", -) -> None: - logger = logging.getLogger(name) - logger.setLevel(level) - - handler = logging.StreamHandler() - handler.setFormatter(logging.Formatter(format_string)) - logger.addHandler(handler) - - -def cut_sequence_chunks( - sequences: bytes | bytearray, - encoding_iana: str, - offsets: range, - chunk_size: int, - bom_or_sig_available: bool, - strip_sig_or_bom: bool, - sig_payload: bytes, - is_multi_byte_decoder: bool, - decoded_payload: str | None = None, -) -> Generator[str, None, None]: - if decoded_payload and is_multi_byte_decoder is False: - for i in offsets: - chunk = decoded_payload[i : i + chunk_size] - if not chunk: - break - yield chunk - else: - for i in offsets: - chunk_end = i + chunk_size - if chunk_end > len(sequences) + 8: - continue - - cut_sequence = sequences[i : i + chunk_size] - - if bom_or_sig_available and strip_sig_or_bom is False: - cut_sequence = sig_payload + cut_sequence - - chunk = cut_sequence.decode( - encoding_iana, - errors="ignore" if is_multi_byte_decoder else "strict", - ) - - # multi-byte bad cutting detector and adjustment - # not the cleanest way to perform that fix but clever enough for now. - if is_multi_byte_decoder and i > 0: - chunk_partial_size_chk: int = min(chunk_size, 16) - - if ( - decoded_payload - and chunk[:chunk_partial_size_chk] not in decoded_payload - ): - for j in range(i, i - 4, -1): - cut_sequence = sequences[j:chunk_end] - - if bom_or_sig_available and strip_sig_or_bom is False: - cut_sequence = sig_payload + cut_sequence - - chunk = cut_sequence.decode(encoding_iana, errors="ignore") - - if chunk[:chunk_partial_size_chk] in decoded_payload: - break - - yield chunk diff --git a/venv/lib/python3.12/site-packages/charset_normalizer/version.py b/venv/lib/python3.12/site-packages/charset_normalizer/version.py deleted file mode 100644 index a93d367..0000000 --- a/venv/lib/python3.12/site-packages/charset_normalizer/version.py +++ /dev/null @@ -1,8 +0,0 @@ -""" -Expose version -""" - -from __future__ import annotations - -__version__ = "3.4.7" -VERSION = __version__.split(".") diff --git a/venv/lib/python3.12/site-packages/click-8.3.2.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/click-8.3.2.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/click-8.3.2.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/click-8.3.2.dist-info/METADATA b/venv/lib/python3.12/site-packages/click-8.3.2.dist-info/METADATA deleted file mode 100644 index 00bad31..0000000 --- a/venv/lib/python3.12/site-packages/click-8.3.2.dist-info/METADATA +++ /dev/null @@ -1,84 +0,0 @@ -Metadata-Version: 2.4 -Name: click -Version: 8.3.2 -Summary: Composable command line interface toolkit -Maintainer-email: Pallets -Requires-Python: >=3.10 -Description-Content-Type: text/markdown -License-Expression: BSD-3-Clause -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Typing :: Typed -License-File: LICENSE.txt -Requires-Dist: colorama; platform_system == 'Windows' -Project-URL: Changes, https://click.palletsprojects.com/page/changes/ -Project-URL: Chat, https://discord.gg/pallets -Project-URL: Documentation, https://click.palletsprojects.com/ -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Source, https://github.com/pallets/click/ - -
- -# Click - -Click is a Python package for creating beautiful command line interfaces -in a composable way with as little code as necessary. It's the "Command -Line Interface Creation Kit". It's highly configurable but comes with -sensible defaults out of the box. - -It aims to make the process of writing command line tools quick and fun -while also preventing any frustration caused by the inability to -implement an intended CLI API. - -Click in three points: - -- Arbitrary nesting of commands -- Automatic help page generation -- Supports lazy loading of subcommands at runtime - - -## A Simple Example - -```python -import click - -@click.command() -@click.option("--count", default=1, help="Number of greetings.") -@click.option("--name", prompt="Your name", help="The person to greet.") -def hello(count, name): - """Simple program that greets NAME for a total of COUNT times.""" - for _ in range(count): - click.echo(f"Hello, {name}!") - -if __name__ == '__main__': - hello() -``` - -``` -$ python hello.py --count=3 -Your name: Click -Hello, Click! -Hello, Click! -Hello, Click! -``` - - -## Donate - -The Pallets organization develops and supports Click and other popular -packages. In order to grow the community of contributors and users, and -allow the maintainers to devote more time to the projects, [please -donate today][]. - -[please donate today]: https://palletsprojects.com/donate - -## Contributing - -See our [detailed contributing documentation][contrib] for many ways to -contribute, including reporting issues, requesting features, asking or answering -questions, and making PRs. - -[contrib]: https://palletsprojects.com/contributing/ - diff --git a/venv/lib/python3.12/site-packages/click-8.3.2.dist-info/RECORD b/venv/lib/python3.12/site-packages/click-8.3.2.dist-info/RECORD deleted file mode 100644 index 5bd5e90..0000000 --- a/venv/lib/python3.12/site-packages/click-8.3.2.dist-info/RECORD +++ /dev/null @@ -1,40 +0,0 @@ -click-8.3.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -click-8.3.2.dist-info/METADATA,sha256=yA3Hu5bMxtntTd4QrI8hTFAc58rHSPhDbP6bklbUQkA,2621 -click-8.3.2.dist-info/RECORD,, -click-8.3.2.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82 -click-8.3.2.dist-info/licenses/LICENSE.txt,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475 -click/__init__.py,sha256=6YyS1aeyknZ0LYweWozNZy0A9nZ_11wmYIhv3cbQrYo,4473 -click/__pycache__/__init__.cpython-312.pyc,, -click/__pycache__/_compat.cpython-312.pyc,, -click/__pycache__/_termui_impl.cpython-312.pyc,, -click/__pycache__/_textwrap.cpython-312.pyc,, -click/__pycache__/_utils.cpython-312.pyc,, -click/__pycache__/_winconsole.cpython-312.pyc,, -click/__pycache__/core.cpython-312.pyc,, -click/__pycache__/decorators.cpython-312.pyc,, -click/__pycache__/exceptions.cpython-312.pyc,, -click/__pycache__/formatting.cpython-312.pyc,, -click/__pycache__/globals.cpython-312.pyc,, -click/__pycache__/parser.cpython-312.pyc,, -click/__pycache__/shell_completion.cpython-312.pyc,, -click/__pycache__/termui.cpython-312.pyc,, -click/__pycache__/testing.cpython-312.pyc,, -click/__pycache__/types.cpython-312.pyc,, -click/__pycache__/utils.cpython-312.pyc,, -click/_compat.py,sha256=v3xBZkFbvA1BXPRkFfBJc6-pIwPI7345m-kQEnpVAs4,18693 -click/_termui_impl.py,sha256=rgCb3On8X5A4200rA5L6i13u5iapmFer7sru57Jy6zA,27093 -click/_textwrap.py,sha256=BOae0RQ6vg3FkNgSJyOoGzG1meGMxJ_ukWVZKx_v-0o,1400 -click/_utils.py,sha256=kZwtTf5gMuCilJJceS2iTCvRvCY-0aN5rJq8gKw7p8g,943 -click/_winconsole.py,sha256=_vxUuUaxwBhoR0vUWCNuHY8VUefiMdCIyU2SXPqoF-A,8465 -click/core.py,sha256=7db9qr_wqXbQriDHCDc26OK0MsaLCSt4yrz14Kn7AEQ,132905 -click/decorators.py,sha256=5P7abhJtAQYp_KHgjUvhMv464ERwOzrv2enNknlwHyQ,18461 -click/exceptions.py,sha256=8utf8w6V5hJXMnO_ic1FNrtbwuEn1NUu1aDwV8UqnG4,9954 -click/formatting.py,sha256=RVfwwr0rwWNpgGr8NaHodPzkIr7_tUyVh_nDdanLMNc,9730 -click/globals.py,sha256=gM-Nh6A4M0HB_SgkaF5M4ncGGMDHc_flHXu9_oh4GEU,1923 -click/parser.py,sha256=Q31pH0FlQZEq-UXE_ABRzlygEfvxPTuZbWNh4xfXmzw,19010 -click/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -click/shell_completion.py,sha256=Cc4GQUFuWpfQBa9sF5qXeeYI7n3tI_1k6ZdSn4BZbT0,20994 -click/termui.py,sha256=hqCEjNndU-nzW08nRAkBaVgfZp_FdCA9KxfIWlKYaMc,31037 -click/testing.py,sha256=LjNfHqNctxc3GfRkLgifO6gnRetblh8yGXzjw4FPFCQ,18978 -click/types.py,sha256=ek54BNSFwPKsqtfT7jsqcc4WHui8AIFVMKM4oVZIXhc,39927 -click/utils.py,sha256=gCUoewdAhA-QLBUUHxrLh4uj6m7T1WjZZMNPvR0I7YA,20257 diff --git a/venv/lib/python3.12/site-packages/click-8.3.2.dist-info/WHEEL b/venv/lib/python3.12/site-packages/click-8.3.2.dist-info/WHEEL deleted file mode 100644 index d8b9936..0000000 --- a/venv/lib/python3.12/site-packages/click-8.3.2.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.12.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/lib/python3.12/site-packages/click-8.3.2.dist-info/licenses/LICENSE.txt b/venv/lib/python3.12/site-packages/click-8.3.2.dist-info/licenses/LICENSE.txt deleted file mode 100644 index d12a849..0000000 --- a/venv/lib/python3.12/site-packages/click-8.3.2.dist-info/licenses/LICENSE.txt +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2014 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/lib/python3.12/site-packages/click/__init__.py b/venv/lib/python3.12/site-packages/click/__init__.py deleted file mode 100644 index 1aa547c..0000000 --- a/venv/lib/python3.12/site-packages/click/__init__.py +++ /dev/null @@ -1,123 +0,0 @@ -""" -Click is a simple Python module inspired by the stdlib optparse to make -writing command line scripts fun. Unlike other modules, it's based -around a simple API that does not come with too much magic and is -composable. -""" - -from __future__ import annotations - -from .core import Argument as Argument -from .core import Command as Command -from .core import CommandCollection as CommandCollection -from .core import Context as Context -from .core import Group as Group -from .core import Option as Option -from .core import Parameter as Parameter -from .decorators import argument as argument -from .decorators import command as command -from .decorators import confirmation_option as confirmation_option -from .decorators import group as group -from .decorators import help_option as help_option -from .decorators import make_pass_decorator as make_pass_decorator -from .decorators import option as option -from .decorators import pass_context as pass_context -from .decorators import pass_obj as pass_obj -from .decorators import password_option as password_option -from .decorators import version_option as version_option -from .exceptions import Abort as Abort -from .exceptions import BadArgumentUsage as BadArgumentUsage -from .exceptions import BadOptionUsage as BadOptionUsage -from .exceptions import BadParameter as BadParameter -from .exceptions import ClickException as ClickException -from .exceptions import FileError as FileError -from .exceptions import MissingParameter as MissingParameter -from .exceptions import NoSuchOption as NoSuchOption -from .exceptions import UsageError as UsageError -from .formatting import HelpFormatter as HelpFormatter -from .formatting import wrap_text as wrap_text -from .globals import get_current_context as get_current_context -from .termui import clear as clear -from .termui import confirm as confirm -from .termui import echo_via_pager as echo_via_pager -from .termui import edit as edit -from .termui import getchar as getchar -from .termui import launch as launch -from .termui import pause as pause -from .termui import progressbar as progressbar -from .termui import prompt as prompt -from .termui import secho as secho -from .termui import style as style -from .termui import unstyle as unstyle -from .types import BOOL as BOOL -from .types import Choice as Choice -from .types import DateTime as DateTime -from .types import File as File -from .types import FLOAT as FLOAT -from .types import FloatRange as FloatRange -from .types import INT as INT -from .types import IntRange as IntRange -from .types import ParamType as ParamType -from .types import Path as Path -from .types import STRING as STRING -from .types import Tuple as Tuple -from .types import UNPROCESSED as UNPROCESSED -from .types import UUID as UUID -from .utils import echo as echo -from .utils import format_filename as format_filename -from .utils import get_app_dir as get_app_dir -from .utils import get_binary_stream as get_binary_stream -from .utils import get_text_stream as get_text_stream -from .utils import open_file as open_file - - -def __getattr__(name: str) -> object: - import warnings - - if name == "BaseCommand": - from .core import _BaseCommand - - warnings.warn( - "'BaseCommand' is deprecated and will be removed in Click 9.0. Use" - " 'Command' instead.", - DeprecationWarning, - stacklevel=2, - ) - return _BaseCommand - - if name == "MultiCommand": - from .core import _MultiCommand - - warnings.warn( - "'MultiCommand' is deprecated and will be removed in Click 9.0. Use" - " 'Group' instead.", - DeprecationWarning, - stacklevel=2, - ) - return _MultiCommand - - if name == "OptionParser": - from .parser import _OptionParser - - warnings.warn( - "'OptionParser' is deprecated and will be removed in Click 9.0. The" - " old parser is available in 'optparse'.", - DeprecationWarning, - stacklevel=2, - ) - return _OptionParser - - if name == "__version__": - import importlib.metadata - import warnings - - warnings.warn( - "The '__version__' attribute is deprecated and will be removed in" - " Click 9.1. Use feature detection or" - " 'importlib.metadata.version(\"click\")' instead.", - DeprecationWarning, - stacklevel=2, - ) - return importlib.metadata.version("click") - - raise AttributeError(name) diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 2ca417b..0000000 Binary files a/venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/_compat.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/_compat.cpython-312.pyc deleted file mode 100644 index edc4c38..0000000 Binary files a/venv/lib/python3.12/site-packages/click/__pycache__/_compat.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/_termui_impl.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/_termui_impl.cpython-312.pyc deleted file mode 100644 index 3a2b01c..0000000 Binary files a/venv/lib/python3.12/site-packages/click/__pycache__/_termui_impl.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/_textwrap.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/_textwrap.cpython-312.pyc deleted file mode 100644 index 0b02704..0000000 Binary files a/venv/lib/python3.12/site-packages/click/__pycache__/_textwrap.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/_utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/_utils.cpython-312.pyc deleted file mode 100644 index b1bc42d..0000000 Binary files a/venv/lib/python3.12/site-packages/click/__pycache__/_utils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/_winconsole.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/_winconsole.cpython-312.pyc deleted file mode 100644 index e5dbe9f..0000000 Binary files a/venv/lib/python3.12/site-packages/click/__pycache__/_winconsole.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/core.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/core.cpython-312.pyc deleted file mode 100644 index 7ea278d..0000000 Binary files a/venv/lib/python3.12/site-packages/click/__pycache__/core.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/decorators.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/decorators.cpython-312.pyc deleted file mode 100644 index 1bc0bf7..0000000 Binary files a/venv/lib/python3.12/site-packages/click/__pycache__/decorators.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/exceptions.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index 47a9ee5..0000000 Binary files a/venv/lib/python3.12/site-packages/click/__pycache__/exceptions.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc deleted file mode 100644 index 129dede..0000000 Binary files a/venv/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/globals.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/globals.cpython-312.pyc deleted file mode 100644 index fde8be9..0000000 Binary files a/venv/lib/python3.12/site-packages/click/__pycache__/globals.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc deleted file mode 100644 index dd93ad0..0000000 Binary files a/venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/shell_completion.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/shell_completion.cpython-312.pyc deleted file mode 100644 index 82047db..0000000 Binary files a/venv/lib/python3.12/site-packages/click/__pycache__/shell_completion.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc deleted file mode 100644 index 0ad6d99..0000000 Binary files a/venv/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/testing.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/testing.cpython-312.pyc deleted file mode 100644 index 4bb5836..0000000 Binary files a/venv/lib/python3.12/site-packages/click/__pycache__/testing.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/types.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/types.cpython-312.pyc deleted file mode 100644 index 3c675ea..0000000 Binary files a/venv/lib/python3.12/site-packages/click/__pycache__/types.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index f99f5fc..0000000 Binary files a/venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/click/_compat.py b/venv/lib/python3.12/site-packages/click/_compat.py deleted file mode 100644 index f2726b9..0000000 --- a/venv/lib/python3.12/site-packages/click/_compat.py +++ /dev/null @@ -1,622 +0,0 @@ -from __future__ import annotations - -import codecs -import collections.abc as cabc -import io -import os -import re -import sys -import typing as t -from types import TracebackType -from weakref import WeakKeyDictionary - -CYGWIN = sys.platform.startswith("cygwin") -WIN = sys.platform.startswith("win") -auto_wrap_for_ansi: t.Callable[[t.TextIO], t.TextIO] | None = None -_ansi_re = re.compile(r"\033\[[;?0-9]*[a-zA-Z]") - - -def _make_text_stream( - stream: t.BinaryIO, - encoding: str | None, - errors: str | None, - force_readable: bool = False, - force_writable: bool = False, -) -> t.TextIO: - if encoding is None: - encoding = get_best_encoding(stream) - if errors is None: - errors = "replace" - return _NonClosingTextIOWrapper( - stream, - encoding, - errors, - line_buffering=True, - force_readable=force_readable, - force_writable=force_writable, - ) - - -def is_ascii_encoding(encoding: str) -> bool: - """Checks if a given encoding is ascii.""" - try: - return codecs.lookup(encoding).name == "ascii" - except LookupError: - return False - - -def get_best_encoding(stream: t.IO[t.Any]) -> str: - """Returns the default stream encoding if not found.""" - rv = getattr(stream, "encoding", None) or sys.getdefaultencoding() - if is_ascii_encoding(rv): - return "utf-8" - return rv - - -class _NonClosingTextIOWrapper(io.TextIOWrapper): - def __init__( - self, - stream: t.BinaryIO, - encoding: str | None, - errors: str | None, - force_readable: bool = False, - force_writable: bool = False, - **extra: t.Any, - ) -> None: - self._stream = stream = t.cast( - t.BinaryIO, _FixupStream(stream, force_readable, force_writable) - ) - super().__init__(stream, encoding, errors, **extra) - - def __del__(self) -> None: - try: - self.detach() - except Exception: - pass - - def isatty(self) -> bool: - # https://bitbucket.org/pypy/pypy/issue/1803 - return self._stream.isatty() - - -class _FixupStream: - """The new io interface needs more from streams than streams - traditionally implement. As such, this fix-up code is necessary in - some circumstances. - - The forcing of readable and writable flags are there because some tools - put badly patched objects on sys (one such offender are certain version - of jupyter notebook). - """ - - def __init__( - self, - stream: t.BinaryIO, - force_readable: bool = False, - force_writable: bool = False, - ): - self._stream = stream - self._force_readable = force_readable - self._force_writable = force_writable - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._stream, name) - - def read1(self, size: int) -> bytes: - f = getattr(self._stream, "read1", None) - - if f is not None: - return t.cast(bytes, f(size)) - - return self._stream.read(size) - - def readable(self) -> bool: - if self._force_readable: - return True - x = getattr(self._stream, "readable", None) - if x is not None: - return t.cast(bool, x()) - try: - self._stream.read(0) - except Exception: - return False - return True - - def writable(self) -> bool: - if self._force_writable: - return True - x = getattr(self._stream, "writable", None) - if x is not None: - return t.cast(bool, x()) - try: - self._stream.write(b"") - except Exception: - try: - self._stream.write(b"") - except Exception: - return False - return True - - def seekable(self) -> bool: - x = getattr(self._stream, "seekable", None) - if x is not None: - return t.cast(bool, x()) - try: - self._stream.seek(self._stream.tell()) - except Exception: - return False - return True - - -def _is_binary_reader(stream: t.IO[t.Any], default: bool = False) -> bool: - try: - return isinstance(stream.read(0), bytes) - except Exception: - return default - # This happens in some cases where the stream was already - # closed. In this case, we assume the default. - - -def _is_binary_writer(stream: t.IO[t.Any], default: bool = False) -> bool: - try: - stream.write(b"") - except Exception: - try: - stream.write("") - return False - except Exception: - pass - return default - return True - - -def _find_binary_reader(stream: t.IO[t.Any]) -> t.BinaryIO | None: - # We need to figure out if the given stream is already binary. - # This can happen because the official docs recommend detaching - # the streams to get binary streams. Some code might do this, so - # we need to deal with this case explicitly. - if _is_binary_reader(stream, False): - return t.cast(t.BinaryIO, stream) - - buf = getattr(stream, "buffer", None) - - # Same situation here; this time we assume that the buffer is - # actually binary in case it's closed. - if buf is not None and _is_binary_reader(buf, True): - return t.cast(t.BinaryIO, buf) - - return None - - -def _find_binary_writer(stream: t.IO[t.Any]) -> t.BinaryIO | None: - # We need to figure out if the given stream is already binary. - # This can happen because the official docs recommend detaching - # the streams to get binary streams. Some code might do this, so - # we need to deal with this case explicitly. - if _is_binary_writer(stream, False): - return t.cast(t.BinaryIO, stream) - - buf = getattr(stream, "buffer", None) - - # Same situation here; this time we assume that the buffer is - # actually binary in case it's closed. - if buf is not None and _is_binary_writer(buf, True): - return t.cast(t.BinaryIO, buf) - - return None - - -def _stream_is_misconfigured(stream: t.TextIO) -> bool: - """A stream is misconfigured if its encoding is ASCII.""" - # If the stream does not have an encoding set, we assume it's set - # to ASCII. This appears to happen in certain unittest - # environments. It's not quite clear what the correct behavior is - # but this at least will force Click to recover somehow. - return is_ascii_encoding(getattr(stream, "encoding", None) or "ascii") - - -def _is_compat_stream_attr(stream: t.TextIO, attr: str, value: str | None) -> bool: - """A stream attribute is compatible if it is equal to the - desired value or the desired value is unset and the attribute - has a value. - """ - stream_value = getattr(stream, attr, None) - return stream_value == value or (value is None and stream_value is not None) - - -def _is_compatible_text_stream( - stream: t.TextIO, encoding: str | None, errors: str | None -) -> bool: - """Check if a stream's encoding and errors attributes are - compatible with the desired values. - """ - return _is_compat_stream_attr( - stream, "encoding", encoding - ) and _is_compat_stream_attr(stream, "errors", errors) - - -def _force_correct_text_stream( - text_stream: t.IO[t.Any], - encoding: str | None, - errors: str | None, - is_binary: t.Callable[[t.IO[t.Any], bool], bool], - find_binary: t.Callable[[t.IO[t.Any]], t.BinaryIO | None], - force_readable: bool = False, - force_writable: bool = False, -) -> t.TextIO: - if is_binary(text_stream, False): - binary_reader = t.cast(t.BinaryIO, text_stream) - else: - text_stream = t.cast(t.TextIO, text_stream) - # If the stream looks compatible, and won't default to a - # misconfigured ascii encoding, return it as-is. - if _is_compatible_text_stream(text_stream, encoding, errors) and not ( - encoding is None and _stream_is_misconfigured(text_stream) - ): - return text_stream - - # Otherwise, get the underlying binary reader. - possible_binary_reader = find_binary(text_stream) - - # If that's not possible, silently use the original reader - # and get mojibake instead of exceptions. - if possible_binary_reader is None: - return text_stream - - binary_reader = possible_binary_reader - - # Default errors to replace instead of strict in order to get - # something that works. - if errors is None: - errors = "replace" - - # Wrap the binary stream in a text stream with the correct - # encoding parameters. - return _make_text_stream( - binary_reader, - encoding, - errors, - force_readable=force_readable, - force_writable=force_writable, - ) - - -def _force_correct_text_reader( - text_reader: t.IO[t.Any], - encoding: str | None, - errors: str | None, - force_readable: bool = False, -) -> t.TextIO: - return _force_correct_text_stream( - text_reader, - encoding, - errors, - _is_binary_reader, - _find_binary_reader, - force_readable=force_readable, - ) - - -def _force_correct_text_writer( - text_writer: t.IO[t.Any], - encoding: str | None, - errors: str | None, - force_writable: bool = False, -) -> t.TextIO: - return _force_correct_text_stream( - text_writer, - encoding, - errors, - _is_binary_writer, - _find_binary_writer, - force_writable=force_writable, - ) - - -def get_binary_stdin() -> t.BinaryIO: - reader = _find_binary_reader(sys.stdin) - if reader is None: - raise RuntimeError("Was not able to determine binary stream for sys.stdin.") - return reader - - -def get_binary_stdout() -> t.BinaryIO: - writer = _find_binary_writer(sys.stdout) - if writer is None: - raise RuntimeError("Was not able to determine binary stream for sys.stdout.") - return writer - - -def get_binary_stderr() -> t.BinaryIO: - writer = _find_binary_writer(sys.stderr) - if writer is None: - raise RuntimeError("Was not able to determine binary stream for sys.stderr.") - return writer - - -def get_text_stdin(encoding: str | None = None, errors: str | None = None) -> t.TextIO: - rv = _get_windows_console_stream(sys.stdin, encoding, errors) - if rv is not None: - return rv - return _force_correct_text_reader(sys.stdin, encoding, errors, force_readable=True) - - -def get_text_stdout(encoding: str | None = None, errors: str | None = None) -> t.TextIO: - rv = _get_windows_console_stream(sys.stdout, encoding, errors) - if rv is not None: - return rv - return _force_correct_text_writer(sys.stdout, encoding, errors, force_writable=True) - - -def get_text_stderr(encoding: str | None = None, errors: str | None = None) -> t.TextIO: - rv = _get_windows_console_stream(sys.stderr, encoding, errors) - if rv is not None: - return rv - return _force_correct_text_writer(sys.stderr, encoding, errors, force_writable=True) - - -def _wrap_io_open( - file: str | os.PathLike[str] | int, - mode: str, - encoding: str | None, - errors: str | None, -) -> t.IO[t.Any]: - """Handles not passing ``encoding`` and ``errors`` in binary mode.""" - if "b" in mode: - return open(file, mode) - - return open(file, mode, encoding=encoding, errors=errors) - - -def open_stream( - filename: str | os.PathLike[str], - mode: str = "r", - encoding: str | None = None, - errors: str | None = "strict", - atomic: bool = False, -) -> tuple[t.IO[t.Any], bool]: - binary = "b" in mode - filename = os.fspath(filename) - - # Standard streams first. These are simple because they ignore the - # atomic flag. Use fsdecode to handle Path("-"). - if os.fsdecode(filename) == "-": - if any(m in mode for m in ["w", "a", "x"]): - if binary: - return get_binary_stdout(), False - return get_text_stdout(encoding=encoding, errors=errors), False - if binary: - return get_binary_stdin(), False - return get_text_stdin(encoding=encoding, errors=errors), False - - # Non-atomic writes directly go out through the regular open functions. - if not atomic: - return _wrap_io_open(filename, mode, encoding, errors), True - - # Some usability stuff for atomic writes - if "a" in mode: - raise ValueError( - "Appending to an existing file is not supported, because that" - " would involve an expensive `copy`-operation to a temporary" - " file. Open the file in normal `w`-mode and copy explicitly" - " if that's what you're after." - ) - if "x" in mode: - raise ValueError("Use the `overwrite`-parameter instead.") - if "w" not in mode: - raise ValueError("Atomic writes only make sense with `w`-mode.") - - # Atomic writes are more complicated. They work by opening a file - # as a proxy in the same folder and then using the fdopen - # functionality to wrap it in a Python file. Then we wrap it in an - # atomic file that moves the file over on close. - import errno - import random - - try: - perm: int | None = os.stat(filename).st_mode - except OSError: - perm = None - - flags = os.O_RDWR | os.O_CREAT | os.O_EXCL - - if binary: - flags |= getattr(os, "O_BINARY", 0) - - while True: - tmp_filename = os.path.join( - os.path.dirname(filename), - f".__atomic-write{random.randrange(1 << 32):08x}", - ) - try: - fd = os.open(tmp_filename, flags, 0o666 if perm is None else perm) - break - except OSError as e: - if e.errno == errno.EEXIST or ( - os.name == "nt" - and e.errno == errno.EACCES - and os.path.isdir(e.filename) - and os.access(e.filename, os.W_OK) - ): - continue - raise - - if perm is not None: - os.chmod(tmp_filename, perm) # in case perm includes bits in umask - - f = _wrap_io_open(fd, mode, encoding, errors) - af = _AtomicFile(f, tmp_filename, os.path.realpath(filename)) - return t.cast(t.IO[t.Any], af), True - - -class _AtomicFile: - def __init__(self, f: t.IO[t.Any], tmp_filename: str, real_filename: str) -> None: - self._f = f - self._tmp_filename = tmp_filename - self._real_filename = real_filename - self.closed = False - - @property - def name(self) -> str: - return self._real_filename - - def close(self, delete: bool = False) -> None: - if self.closed: - return - self._f.close() - os.replace(self._tmp_filename, self._real_filename) - self.closed = True - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._f, name) - - def __enter__(self) -> _AtomicFile: - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - self.close(delete=exc_type is not None) - - def __repr__(self) -> str: - return repr(self._f) - - -def strip_ansi(value: str) -> str: - return _ansi_re.sub("", value) - - -def _is_jupyter_kernel_output(stream: t.IO[t.Any]) -> bool: - while isinstance(stream, (_FixupStream, _NonClosingTextIOWrapper)): - stream = stream._stream - - return stream.__class__.__module__.startswith("ipykernel.") - - -def should_strip_ansi( - stream: t.IO[t.Any] | None = None, color: bool | None = None -) -> bool: - if color is None: - if stream is None: - stream = sys.stdin - return not isatty(stream) and not _is_jupyter_kernel_output(stream) - return not color - - -# On Windows, wrap the output streams with colorama to support ANSI -# color codes. -# NOTE: double check is needed so mypy does not analyze this on Linux -if sys.platform.startswith("win") and WIN: - from ._winconsole import _get_windows_console_stream - - def _get_argv_encoding() -> str: - import locale - - return locale.getpreferredencoding() - - _ansi_stream_wrappers: cabc.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() - - def auto_wrap_for_ansi(stream: t.TextIO, color: bool | None = None) -> t.TextIO: - """Support ANSI color and style codes on Windows by wrapping a - stream with colorama. - """ - try: - cached = _ansi_stream_wrappers.get(stream) - except Exception: - cached = None - - if cached is not None: - return cached - - import colorama - - strip = should_strip_ansi(stream, color) - ansi_wrapper = colorama.AnsiToWin32(stream, strip=strip) - rv = t.cast(t.TextIO, ansi_wrapper.stream) - _write = rv.write - - def _safe_write(s: str) -> int: - try: - return _write(s) - except BaseException: - ansi_wrapper.reset_all() - raise - - rv.write = _safe_write # type: ignore[method-assign] - - try: - _ansi_stream_wrappers[stream] = rv - except Exception: - pass - - return rv - -else: - - def _get_argv_encoding() -> str: - return getattr(sys.stdin, "encoding", None) or sys.getfilesystemencoding() - - def _get_windows_console_stream( - f: t.TextIO, encoding: str | None, errors: str | None - ) -> t.TextIO | None: - return None - - -def term_len(x: str) -> int: - return len(strip_ansi(x)) - - -def isatty(stream: t.IO[t.Any]) -> bool: - try: - return stream.isatty() - except Exception: - return False - - -def _make_cached_stream_func( - src_func: t.Callable[[], t.TextIO | None], - wrapper_func: t.Callable[[], t.TextIO], -) -> t.Callable[[], t.TextIO | None]: - cache: cabc.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() - - def func() -> t.TextIO | None: - stream = src_func() - - if stream is None: - return None - - try: - rv = cache.get(stream) - except Exception: - rv = None - if rv is not None: - return rv - rv = wrapper_func() - try: - cache[stream] = rv - except Exception: - pass - return rv - - return func - - -_default_text_stdin = _make_cached_stream_func(lambda: sys.stdin, get_text_stdin) -_default_text_stdout = _make_cached_stream_func(lambda: sys.stdout, get_text_stdout) -_default_text_stderr = _make_cached_stream_func(lambda: sys.stderr, get_text_stderr) - - -binary_streams: cabc.Mapping[str, t.Callable[[], t.BinaryIO]] = { - "stdin": get_binary_stdin, - "stdout": get_binary_stdout, - "stderr": get_binary_stderr, -} - -text_streams: cabc.Mapping[str, t.Callable[[str | None, str | None], t.TextIO]] = { - "stdin": get_text_stdin, - "stdout": get_text_stdout, - "stderr": get_text_stderr, -} diff --git a/venv/lib/python3.12/site-packages/click/_termui_impl.py b/venv/lib/python3.12/site-packages/click/_termui_impl.py deleted file mode 100644 index ee8225c..0000000 --- a/venv/lib/python3.12/site-packages/click/_termui_impl.py +++ /dev/null @@ -1,852 +0,0 @@ -""" -This module contains implementations for the termui module. To keep the -import time of Click down, some infrequently used functionality is -placed in this module and only imported as needed. -""" - -from __future__ import annotations - -import collections.abc as cabc -import contextlib -import math -import os -import shlex -import sys -import time -import typing as t -from gettext import gettext as _ -from io import StringIO -from pathlib import Path -from types import TracebackType - -from ._compat import _default_text_stdout -from ._compat import CYGWIN -from ._compat import get_best_encoding -from ._compat import isatty -from ._compat import open_stream -from ._compat import strip_ansi -from ._compat import term_len -from ._compat import WIN -from .exceptions import ClickException -from .utils import echo - -V = t.TypeVar("V") - -if os.name == "nt": - BEFORE_BAR = "\r" - AFTER_BAR = "\n" -else: - BEFORE_BAR = "\r\033[?25l" - AFTER_BAR = "\033[?25h\n" - - -class ProgressBar(t.Generic[V]): - def __init__( - self, - iterable: cabc.Iterable[V] | None, - length: int | None = None, - fill_char: str = "#", - empty_char: str = " ", - bar_template: str = "%(bar)s", - info_sep: str = " ", - hidden: bool = False, - show_eta: bool = True, - show_percent: bool | None = None, - show_pos: bool = False, - item_show_func: t.Callable[[V | None], str | None] | None = None, - label: str | None = None, - file: t.TextIO | None = None, - color: bool | None = None, - update_min_steps: int = 1, - width: int = 30, - ) -> None: - self.fill_char = fill_char - self.empty_char = empty_char - self.bar_template = bar_template - self.info_sep = info_sep - self.hidden = hidden - self.show_eta = show_eta - self.show_percent = show_percent - self.show_pos = show_pos - self.item_show_func = item_show_func - self.label: str = label or "" - - if file is None: - file = _default_text_stdout() - - # There are no standard streams attached to write to. For example, - # pythonw on Windows. - if file is None: - file = StringIO() - - self.file = file - self.color = color - self.update_min_steps = update_min_steps - self._completed_intervals = 0 - self.width: int = width - self.autowidth: bool = width == 0 - - if length is None: - from operator import length_hint - - length = length_hint(iterable, -1) - - if length == -1: - length = None - if iterable is None: - if length is None: - raise TypeError("iterable or length is required") - iterable = t.cast("cabc.Iterable[V]", range(length)) - self.iter: cabc.Iterable[V] = iter(iterable) - self.length = length - self.pos: int = 0 - self.avg: list[float] = [] - self.last_eta: float - self.start: float - self.start = self.last_eta = time.time() - self.eta_known: bool = False - self.finished: bool = False - self.max_width: int | None = None - self.entered: bool = False - self.current_item: V | None = None - self._is_atty = isatty(self.file) - self._last_line: str | None = None - - def __enter__(self) -> ProgressBar[V]: - self.entered = True - self.render_progress() - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - self.render_finish() - - def __iter__(self) -> cabc.Iterator[V]: - if not self.entered: - raise RuntimeError("You need to use progress bars in a with block.") - self.render_progress() - return self.generator() - - def __next__(self) -> V: - # Iteration is defined in terms of a generator function, - # returned by iter(self); use that to define next(). This works - # because `self.iter` is an iterable consumed by that generator, - # so it is re-entry safe. Calling `next(self.generator())` - # twice works and does "what you want". - return next(iter(self)) - - def render_finish(self) -> None: - if self.hidden or not self._is_atty: - return - self.file.write(AFTER_BAR) - self.file.flush() - - @property - def pct(self) -> float: - if self.finished: - return 1.0 - return min(self.pos / (float(self.length or 1) or 1), 1.0) - - @property - def time_per_iteration(self) -> float: - if not self.avg: - return 0.0 - return sum(self.avg) / float(len(self.avg)) - - @property - def eta(self) -> float: - if self.length is not None and not self.finished: - return self.time_per_iteration * (self.length - self.pos) - return 0.0 - - def format_eta(self) -> str: - if self.eta_known: - t = int(self.eta) - seconds = t % 60 - t //= 60 - minutes = t % 60 - t //= 60 - hours = t % 24 - t //= 24 - if t > 0: - return f"{t}d {hours:02}:{minutes:02}:{seconds:02}" - else: - return f"{hours:02}:{minutes:02}:{seconds:02}" - return "" - - def format_pos(self) -> str: - pos = str(self.pos) - if self.length is not None: - pos += f"/{self.length}" - return pos - - def format_pct(self) -> str: - return f"{int(self.pct * 100): 4}%"[1:] - - def format_bar(self) -> str: - if self.length is not None: - bar_length = int(self.pct * self.width) - bar = self.fill_char * bar_length - bar += self.empty_char * (self.width - bar_length) - elif self.finished: - bar = self.fill_char * self.width - else: - chars = list(self.empty_char * (self.width or 1)) - if self.time_per_iteration != 0: - chars[ - int( - (math.cos(self.pos * self.time_per_iteration) / 2.0 + 0.5) - * self.width - ) - ] = self.fill_char - bar = "".join(chars) - return bar - - def format_progress_line(self) -> str: - show_percent = self.show_percent - - info_bits = [] - if self.length is not None and show_percent is None: - show_percent = not self.show_pos - - if self.show_pos: - info_bits.append(self.format_pos()) - if show_percent: - info_bits.append(self.format_pct()) - if self.show_eta and self.eta_known and not self.finished: - info_bits.append(self.format_eta()) - if self.item_show_func is not None: - item_info = self.item_show_func(self.current_item) - if item_info is not None: - info_bits.append(item_info) - - return ( - self.bar_template - % { - "label": self.label, - "bar": self.format_bar(), - "info": self.info_sep.join(info_bits), - } - ).rstrip() - - def render_progress(self) -> None: - if self.hidden: - return - - if not self._is_atty: - # Only output the label once if the output is not a TTY. - if self._last_line != self.label: - self._last_line = self.label - echo(self.label, file=self.file, color=self.color) - return - - buf = [] - # Update width in case the terminal has been resized - if self.autowidth: - import shutil - - old_width = self.width - self.width = 0 - clutter_length = term_len(self.format_progress_line()) - new_width = max(0, shutil.get_terminal_size().columns - clutter_length) - if new_width < old_width and self.max_width is not None: - buf.append(BEFORE_BAR) - buf.append(" " * self.max_width) - self.max_width = new_width - self.width = new_width - - clear_width = self.width - if self.max_width is not None: - clear_width = self.max_width - - buf.append(BEFORE_BAR) - line = self.format_progress_line() - line_len = term_len(line) - if self.max_width is None or self.max_width < line_len: - self.max_width = line_len - - buf.append(line) - buf.append(" " * (clear_width - line_len)) - line = "".join(buf) - # Render the line only if it changed. - - if line != self._last_line: - self._last_line = line - echo(line, file=self.file, color=self.color, nl=False) - self.file.flush() - - def make_step(self, n_steps: int) -> None: - self.pos += n_steps - if self.length is not None and self.pos >= self.length: - self.finished = True - - if (time.time() - self.last_eta) < 1.0: - return - - self.last_eta = time.time() - - # self.avg is a rolling list of length <= 7 of steps where steps are - # defined as time elapsed divided by the total progress through - # self.length. - if self.pos: - step = (time.time() - self.start) / self.pos - else: - step = time.time() - self.start - - self.avg = self.avg[-6:] + [step] - - self.eta_known = self.length is not None - - def update(self, n_steps: int, current_item: V | None = None) -> None: - """Update the progress bar by advancing a specified number of - steps, and optionally set the ``current_item`` for this new - position. - - :param n_steps: Number of steps to advance. - :param current_item: Optional item to set as ``current_item`` - for the updated position. - - .. versionchanged:: 8.0 - Added the ``current_item`` optional parameter. - - .. versionchanged:: 8.0 - Only render when the number of steps meets the - ``update_min_steps`` threshold. - """ - if current_item is not None: - self.current_item = current_item - - self._completed_intervals += n_steps - - if self._completed_intervals >= self.update_min_steps: - self.make_step(self._completed_intervals) - self.render_progress() - self._completed_intervals = 0 - - def finish(self) -> None: - self.eta_known = False - self.current_item = None - self.finished = True - - def generator(self) -> cabc.Iterator[V]: - """Return a generator which yields the items added to the bar - during construction, and updates the progress bar *after* the - yielded block returns. - """ - # WARNING: the iterator interface for `ProgressBar` relies on - # this and only works because this is a simple generator which - # doesn't create or manage additional state. If this function - # changes, the impact should be evaluated both against - # `iter(bar)` and `next(bar)`. `next()` in particular may call - # `self.generator()` repeatedly, and this must remain safe in - # order for that interface to work. - if not self.entered: - raise RuntimeError("You need to use progress bars in a with block.") - - if not self._is_atty: - yield from self.iter - else: - for rv in self.iter: - self.current_item = rv - - # This allows show_item_func to be updated before the - # item is processed. Only trigger at the beginning of - # the update interval. - if self._completed_intervals == 0: - self.render_progress() - - yield rv - self.update(1) - - self.finish() - self.render_progress() - - -def pager(generator: cabc.Iterable[str], color: bool | None = None) -> None: - """Decide what method to use for paging through text.""" - stdout = _default_text_stdout() - - # There are no standard streams attached to write to. For example, - # pythonw on Windows. - if stdout is None: - stdout = StringIO() - - if not isatty(sys.stdin) or not isatty(stdout): - return _nullpager(stdout, generator, color) - - # Split and normalize the pager command into parts. - pager_cmd_parts = shlex.split(os.environ.get("PAGER", ""), posix=False) - if pager_cmd_parts: - if WIN: - if _tempfilepager(generator, pager_cmd_parts, color): - return - elif _pipepager(generator, pager_cmd_parts, color): - return - - if os.environ.get("TERM") in ("dumb", "emacs"): - return _nullpager(stdout, generator, color) - if (WIN or sys.platform.startswith("os2")) and _tempfilepager( - generator, ["more"], color - ): - return - if _pipepager(generator, ["less"], color): - return - - import tempfile - - fd, filename = tempfile.mkstemp() - os.close(fd) - try: - if _pipepager(generator, ["more"], color): - return - return _nullpager(stdout, generator, color) - finally: - os.unlink(filename) - - -def _pipepager( - generator: cabc.Iterable[str], cmd_parts: list[str], color: bool | None -) -> bool: - """Page through text by feeding it to another program. Invoking a - pager through this might support colors. - - Returns `True` if the command was found, `False` otherwise and thus another - pager should be attempted. - """ - # Split the command into the invoked CLI and its parameters. - if not cmd_parts: - return False - - import shutil - - cmd = cmd_parts[0] - cmd_params = cmd_parts[1:] - - cmd_filepath = shutil.which(cmd) - if not cmd_filepath: - return False - - # Produces a normalized absolute path string. - # multi-call binaries such as busybox derive their identity from the symlink - # less -> busybox. resolve() causes them to misbehave. (eg. less becomes busybox) - cmd_path = Path(cmd_filepath).absolute() - cmd_name = cmd_path.name - - import subprocess - - # Make a local copy of the environment to not affect the global one. - env = dict(os.environ) - - # If we're piping to less and the user hasn't decided on colors, we enable - # them by default we find the -R flag in the command line arguments. - if color is None and cmd_name == "less": - less_flags = f"{os.environ.get('LESS', '')}{' '.join(cmd_params)}" - if not less_flags: - env["LESS"] = "-R" - color = True - elif "r" in less_flags or "R" in less_flags: - color = True - - c = subprocess.Popen( - [str(cmd_path)] + cmd_params, - shell=False, - stdin=subprocess.PIPE, - env=env, - errors="replace", - text=True, - ) - assert c.stdin is not None - try: - for text in generator: - if not color: - text = strip_ansi(text) - - c.stdin.write(text) - except BrokenPipeError: - # In case the pager exited unexpectedly, ignore the broken pipe error. - pass - except Exception as e: - # In case there is an exception we want to close the pager immediately - # and let the caller handle it. - # Otherwise the pager will keep running, and the user may not notice - # the error message, or worse yet it may leave the terminal in a broken state. - c.terminate() - raise e - finally: - # We must close stdin and wait for the pager to exit before we continue - try: - c.stdin.close() - # Close implies flush, so it might throw a BrokenPipeError if the pager - # process exited already. - except BrokenPipeError: - pass - - # Less doesn't respect ^C, but catches it for its own UI purposes (aborting - # search or other commands inside less). - # - # That means when the user hits ^C, the parent process (click) terminates, - # but less is still alive, paging the output and messing up the terminal. - # - # If the user wants to make the pager exit on ^C, they should set - # `LESS='-K'`. It's not our decision to make. - while True: - try: - c.wait() - except KeyboardInterrupt: - pass - else: - break - - return True - - -def _tempfilepager( - generator: cabc.Iterable[str], cmd_parts: list[str], color: bool | None -) -> bool: - """Page through text by invoking a program on a temporary file. - - Returns `True` if the command was found, `False` otherwise and thus another - pager should be attempted. - """ - # Split the command into the invoked CLI and its parameters. - if not cmd_parts: - return False - - import shutil - - cmd = cmd_parts[0] - - cmd_filepath = shutil.which(cmd) - if not cmd_filepath: - return False - # Produces a normalized absolute path string. - # multi-call binaries such as busybox derive their identity from the symlink - # less -> busybox. resolve() causes them to misbehave. (eg. less becomes busybox) - cmd_path = Path(cmd_filepath).absolute() - - import subprocess - import tempfile - - fd, filename = tempfile.mkstemp() - # TODO: This never terminates if the passed generator never terminates. - text = "".join(generator) - if not color: - text = strip_ansi(text) - encoding = get_best_encoding(sys.stdout) - with open_stream(filename, "wb")[0] as f: - f.write(text.encode(encoding)) - try: - subprocess.call([str(cmd_path), filename]) - except OSError: - # Command not found - pass - finally: - os.close(fd) - os.unlink(filename) - - return True - - -def _nullpager( - stream: t.TextIO, generator: cabc.Iterable[str], color: bool | None -) -> None: - """Simply print unformatted text. This is the ultimate fallback.""" - for text in generator: - if not color: - text = strip_ansi(text) - stream.write(text) - - -class Editor: - def __init__( - self, - editor: str | None = None, - env: cabc.Mapping[str, str] | None = None, - require_save: bool = True, - extension: str = ".txt", - ) -> None: - self.editor = editor - self.env = env - self.require_save = require_save - self.extension = extension - - def get_editor(self) -> str: - if self.editor is not None: - return self.editor - for key in "VISUAL", "EDITOR": - rv = os.environ.get(key) - if rv: - return rv - if WIN: - return "notepad" - - from shutil import which - - for editor in "sensible-editor", "vim", "nano": - if which(editor) is not None: - return editor - return "vi" - - def edit_files(self, filenames: cabc.Iterable[str]) -> None: - import subprocess - - editor = self.get_editor() - environ: dict[str, str] | None = None - - if self.env: - environ = os.environ.copy() - environ.update(self.env) - - exc_filename = " ".join(f'"{filename}"' for filename in filenames) - - try: - c = subprocess.Popen( - args=f"{editor} {exc_filename}", env=environ, shell=True - ) - exit_code = c.wait() - if exit_code != 0: - raise ClickException( - _("{editor}: Editing failed").format(editor=editor) - ) - except OSError as e: - raise ClickException( - _("{editor}: Editing failed: {e}").format(editor=editor, e=e) - ) from e - - @t.overload - def edit(self, text: bytes | bytearray) -> bytes | None: ... - - # We cannot know whether or not the type expected is str or bytes when None - # is passed, so str is returned as that was what was done before. - @t.overload - def edit(self, text: str | None) -> str | None: ... - - def edit(self, text: str | bytes | bytearray | None) -> str | bytes | None: - import tempfile - - if text is None: - data: bytes | bytearray = b"" - elif isinstance(text, (bytes, bytearray)): - data = text - else: - if text and not text.endswith("\n"): - text += "\n" - - if WIN: - data = text.replace("\n", "\r\n").encode("utf-8-sig") - else: - data = text.encode("utf-8") - - fd, name = tempfile.mkstemp(prefix="editor-", suffix=self.extension) - f: t.BinaryIO - - try: - with os.fdopen(fd, "wb") as f: - f.write(data) - - # If the filesystem resolution is 1 second, like Mac OS - # 10.12 Extended, or 2 seconds, like FAT32, and the editor - # closes very fast, require_save can fail. Set the modified - # time to be 2 seconds in the past to work around this. - os.utime(name, (os.path.getatime(name), os.path.getmtime(name) - 2)) - # Depending on the resolution, the exact value might not be - # recorded, so get the new recorded value. - timestamp = os.path.getmtime(name) - - self.edit_files((name,)) - - if self.require_save and os.path.getmtime(name) == timestamp: - return None - - with open(name, "rb") as f: - rv = f.read() - - if isinstance(text, (bytes, bytearray)): - return rv - - return rv.decode("utf-8-sig").replace("\r\n", "\n") - finally: - os.unlink(name) - - -def open_url(url: str, wait: bool = False, locate: bool = False) -> int: - import subprocess - - def _unquote_file(url: str) -> str: - from urllib.parse import unquote - - if url.startswith("file://"): - url = unquote(url[7:]) - - return url - - if sys.platform == "darwin": - args = ["open"] - if wait: - args.append("-W") - if locate: - args.append("-R") - args.append(_unquote_file(url)) - null = open("/dev/null", "w") - try: - return subprocess.Popen(args, stderr=null).wait() - finally: - null.close() - elif WIN: - if locate: - url = _unquote_file(url) - args = ["explorer", f"/select,{url}"] - else: - args = ["start"] - if wait: - args.append("/WAIT") - args.append("") - args.append(url) - try: - return subprocess.call(args) - except OSError: - # Command not found - return 127 - elif CYGWIN: - if locate: - url = _unquote_file(url) - args = ["cygstart", os.path.dirname(url)] - else: - args = ["cygstart"] - if wait: - args.append("-w") - args.append(url) - try: - return subprocess.call(args) - except OSError: - # Command not found - return 127 - - try: - if locate: - url = os.path.dirname(_unquote_file(url)) or "." - else: - url = _unquote_file(url) - c = subprocess.Popen(["xdg-open", url]) - if wait: - return c.wait() - return 0 - except OSError: - if url.startswith(("http://", "https://")) and not locate and not wait: - import webbrowser - - webbrowser.open(url) - return 0 - return 1 - - -def _translate_ch_to_exc(ch: str) -> None: - if ch == "\x03": - raise KeyboardInterrupt() - - if ch == "\x04" and not WIN: # Unix-like, Ctrl+D - raise EOFError() - - if ch == "\x1a" and WIN: # Windows, Ctrl+Z - raise EOFError() - - return None - - -if sys.platform == "win32": - import msvcrt - - @contextlib.contextmanager - def raw_terminal() -> cabc.Iterator[int]: - yield -1 - - def getchar(echo: bool) -> str: - # The function `getch` will return a bytes object corresponding to - # the pressed character. Since Windows 10 build 1803, it will also - # return \x00 when called a second time after pressing a regular key. - # - # `getwch` does not share this probably-bugged behavior. Moreover, it - # returns a Unicode object by default, which is what we want. - # - # Either of these functions will return \x00 or \xe0 to indicate - # a special key, and you need to call the same function again to get - # the "rest" of the code. The fun part is that \u00e0 is - # "latin small letter a with grave", so if you type that on a French - # keyboard, you _also_ get a \xe0. - # E.g., consider the Up arrow. This returns \xe0 and then \x48. The - # resulting Unicode string reads as "a with grave" + "capital H". - # This is indistinguishable from when the user actually types - # "a with grave" and then "capital H". - # - # When \xe0 is returned, we assume it's part of a special-key sequence - # and call `getwch` again, but that means that when the user types - # the \u00e0 character, `getchar` doesn't return until a second - # character is typed. - # The alternative is returning immediately, but that would mess up - # cross-platform handling of arrow keys and others that start with - # \xe0. Another option is using `getch`, but then we can't reliably - # read non-ASCII characters, because return values of `getch` are - # limited to the current 8-bit codepage. - # - # Anyway, Click doesn't claim to do this Right(tm), and using `getwch` - # is doing the right thing in more situations than with `getch`. - - if echo: - func = t.cast(t.Callable[[], str], msvcrt.getwche) - else: - func = t.cast(t.Callable[[], str], msvcrt.getwch) - - rv = func() - - if rv in ("\x00", "\xe0"): - # \x00 and \xe0 are control characters that indicate special key, - # see above. - rv += func() - - _translate_ch_to_exc(rv) - return rv - -else: - import termios - import tty - - @contextlib.contextmanager - def raw_terminal() -> cabc.Iterator[int]: - f: t.TextIO | None - fd: int - - if not isatty(sys.stdin): - f = open("/dev/tty") - fd = f.fileno() - else: - fd = sys.stdin.fileno() - f = None - - try: - old_settings = termios.tcgetattr(fd) - - try: - tty.setraw(fd) - yield fd - finally: - termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) - sys.stdout.flush() - - if f is not None: - f.close() - except termios.error: - pass - - def getchar(echo: bool) -> str: - with raw_terminal() as fd: - ch = os.read(fd, 32).decode(get_best_encoding(sys.stdin), "replace") - - if echo and isatty(sys.stdout): - sys.stdout.write(ch) - - _translate_ch_to_exc(ch) - return ch diff --git a/venv/lib/python3.12/site-packages/click/_textwrap.py b/venv/lib/python3.12/site-packages/click/_textwrap.py deleted file mode 100644 index 97fbee3..0000000 --- a/venv/lib/python3.12/site-packages/click/_textwrap.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import textwrap -from contextlib import contextmanager - - -class TextWrapper(textwrap.TextWrapper): - def _handle_long_word( - self, - reversed_chunks: list[str], - cur_line: list[str], - cur_len: int, - width: int, - ) -> None: - space_left = max(width - cur_len, 1) - - if self.break_long_words: - last = reversed_chunks[-1] - cut = last[:space_left] - res = last[space_left:] - cur_line.append(cut) - reversed_chunks[-1] = res - elif not cur_line: - cur_line.append(reversed_chunks.pop()) - - @contextmanager - def extra_indent(self, indent: str) -> cabc.Iterator[None]: - old_initial_indent = self.initial_indent - old_subsequent_indent = self.subsequent_indent - self.initial_indent += indent - self.subsequent_indent += indent - - try: - yield - finally: - self.initial_indent = old_initial_indent - self.subsequent_indent = old_subsequent_indent - - def indent_only(self, text: str) -> str: - rv = [] - - for idx, line in enumerate(text.splitlines()): - indent = self.initial_indent - - if idx > 0: - indent = self.subsequent_indent - - rv.append(f"{indent}{line}") - - return "\n".join(rv) diff --git a/venv/lib/python3.12/site-packages/click/_utils.py b/venv/lib/python3.12/site-packages/click/_utils.py deleted file mode 100644 index 09fb008..0000000 --- a/venv/lib/python3.12/site-packages/click/_utils.py +++ /dev/null @@ -1,36 +0,0 @@ -from __future__ import annotations - -import enum -import typing as t - - -class Sentinel(enum.Enum): - """Enum used to define sentinel values. - - .. seealso:: - - `PEP 661 - Sentinel Values `_. - """ - - UNSET = object() - FLAG_NEEDS_VALUE = object() - - def __repr__(self) -> str: - return f"{self.__class__.__name__}.{self.name}" - - -UNSET = Sentinel.UNSET -"""Sentinel used to indicate that a value is not set.""" - -FLAG_NEEDS_VALUE = Sentinel.FLAG_NEEDS_VALUE -"""Sentinel used to indicate an option was passed as a flag without a -value but is not a flag option. - -``Option.consume_value`` uses this to prompt or use the ``flag_value``. -""" - -T_UNSET = t.Literal[UNSET] # type: ignore[valid-type] -"""Type hint for the :data:`UNSET` sentinel value.""" - -T_FLAG_NEEDS_VALUE = t.Literal[FLAG_NEEDS_VALUE] # type: ignore[valid-type] -"""Type hint for the :data:`FLAG_NEEDS_VALUE` sentinel value.""" diff --git a/venv/lib/python3.12/site-packages/click/_winconsole.py b/venv/lib/python3.12/site-packages/click/_winconsole.py deleted file mode 100644 index e56c7c6..0000000 --- a/venv/lib/python3.12/site-packages/click/_winconsole.py +++ /dev/null @@ -1,296 +0,0 @@ -# This module is based on the excellent work by Adam Bartoš who -# provided a lot of what went into the implementation here in -# the discussion to issue1602 in the Python bug tracker. -# -# There are some general differences in regards to how this works -# compared to the original patches as we do not need to patch -# the entire interpreter but just work in our little world of -# echo and prompt. -from __future__ import annotations - -import collections.abc as cabc -import io -import sys -import time -import typing as t -from ctypes import Array -from ctypes import byref -from ctypes import c_char -from ctypes import c_char_p -from ctypes import c_int -from ctypes import c_ssize_t -from ctypes import c_ulong -from ctypes import c_void_p -from ctypes import POINTER -from ctypes import py_object -from ctypes import Structure -from ctypes.wintypes import DWORD -from ctypes.wintypes import HANDLE -from ctypes.wintypes import LPCWSTR -from ctypes.wintypes import LPWSTR - -from ._compat import _NonClosingTextIOWrapper - -assert sys.platform == "win32" -import msvcrt # noqa: E402 -from ctypes import windll # noqa: E402 -from ctypes import WINFUNCTYPE # noqa: E402 - -c_ssize_p = POINTER(c_ssize_t) - -kernel32 = windll.kernel32 -GetStdHandle = kernel32.GetStdHandle -ReadConsoleW = kernel32.ReadConsoleW -WriteConsoleW = kernel32.WriteConsoleW -GetConsoleMode = kernel32.GetConsoleMode -GetLastError = kernel32.GetLastError -GetCommandLineW = WINFUNCTYPE(LPWSTR)(("GetCommandLineW", windll.kernel32)) -CommandLineToArgvW = WINFUNCTYPE(POINTER(LPWSTR), LPCWSTR, POINTER(c_int))( - ("CommandLineToArgvW", windll.shell32) -) -LocalFree = WINFUNCTYPE(c_void_p, c_void_p)(("LocalFree", windll.kernel32)) - -STDIN_HANDLE = GetStdHandle(-10) -STDOUT_HANDLE = GetStdHandle(-11) -STDERR_HANDLE = GetStdHandle(-12) - -PyBUF_SIMPLE = 0 -PyBUF_WRITABLE = 1 - -ERROR_SUCCESS = 0 -ERROR_NOT_ENOUGH_MEMORY = 8 -ERROR_OPERATION_ABORTED = 995 - -STDIN_FILENO = 0 -STDOUT_FILENO = 1 -STDERR_FILENO = 2 - -EOF = b"\x1a" -MAX_BYTES_WRITTEN = 32767 - -if t.TYPE_CHECKING: - try: - # Using `typing_extensions.Buffer` instead of `collections.abc` - # on Windows for some reason does not have `Sized` implemented. - from collections.abc import Buffer # type: ignore - except ImportError: - from typing_extensions import Buffer - -try: - from ctypes import pythonapi -except ImportError: - # On PyPy we cannot get buffers so our ability to operate here is - # severely limited. - get_buffer = None -else: - - class Py_buffer(Structure): - _fields_ = [ # noqa: RUF012 - ("buf", c_void_p), - ("obj", py_object), - ("len", c_ssize_t), - ("itemsize", c_ssize_t), - ("readonly", c_int), - ("ndim", c_int), - ("format", c_char_p), - ("shape", c_ssize_p), - ("strides", c_ssize_p), - ("suboffsets", c_ssize_p), - ("internal", c_void_p), - ] - - PyObject_GetBuffer = pythonapi.PyObject_GetBuffer - PyBuffer_Release = pythonapi.PyBuffer_Release - - def get_buffer(obj: Buffer, writable: bool = False) -> Array[c_char]: - buf = Py_buffer() - flags: int = PyBUF_WRITABLE if writable else PyBUF_SIMPLE - PyObject_GetBuffer(py_object(obj), byref(buf), flags) - - try: - buffer_type = c_char * buf.len - out: Array[c_char] = buffer_type.from_address(buf.buf) - return out - finally: - PyBuffer_Release(byref(buf)) - - -class _WindowsConsoleRawIOBase(io.RawIOBase): - def __init__(self, handle: int | None) -> None: - self.handle = handle - - def isatty(self) -> t.Literal[True]: - super().isatty() - return True - - -class _WindowsConsoleReader(_WindowsConsoleRawIOBase): - def readable(self) -> t.Literal[True]: - return True - - def readinto(self, b: Buffer) -> int: - bytes_to_be_read = len(b) - if not bytes_to_be_read: - return 0 - elif bytes_to_be_read % 2: - raise ValueError( - "cannot read odd number of bytes from UTF-16-LE encoded console" - ) - - buffer = get_buffer(b, writable=True) - code_units_to_be_read = bytes_to_be_read // 2 - code_units_read = c_ulong() - - rv = ReadConsoleW( - HANDLE(self.handle), - buffer, - code_units_to_be_read, - byref(code_units_read), - None, - ) - if GetLastError() == ERROR_OPERATION_ABORTED: - # wait for KeyboardInterrupt - time.sleep(0.1) - if not rv: - raise OSError(f"Windows error: {GetLastError()}") - - if buffer[0] == EOF: - return 0 - return 2 * code_units_read.value - - -class _WindowsConsoleWriter(_WindowsConsoleRawIOBase): - def writable(self) -> t.Literal[True]: - return True - - @staticmethod - def _get_error_message(errno: int) -> str: - if errno == ERROR_SUCCESS: - return "ERROR_SUCCESS" - elif errno == ERROR_NOT_ENOUGH_MEMORY: - return "ERROR_NOT_ENOUGH_MEMORY" - return f"Windows error {errno}" - - def write(self, b: Buffer) -> int: - bytes_to_be_written = len(b) - buf = get_buffer(b) - code_units_to_be_written = min(bytes_to_be_written, MAX_BYTES_WRITTEN) // 2 - code_units_written = c_ulong() - - WriteConsoleW( - HANDLE(self.handle), - buf, - code_units_to_be_written, - byref(code_units_written), - None, - ) - bytes_written = 2 * code_units_written.value - - if bytes_written == 0 and bytes_to_be_written > 0: - raise OSError(self._get_error_message(GetLastError())) - return bytes_written - - -class ConsoleStream: - def __init__(self, text_stream: t.TextIO, byte_stream: t.BinaryIO) -> None: - self._text_stream = text_stream - self.buffer = byte_stream - - @property - def name(self) -> str: - return self.buffer.name - - def write(self, x: t.AnyStr) -> int: - if isinstance(x, str): - return self._text_stream.write(x) - try: - self.flush() - except Exception: - pass - return self.buffer.write(x) - - def writelines(self, lines: cabc.Iterable[t.AnyStr]) -> None: - for line in lines: - self.write(line) - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._text_stream, name) - - def isatty(self) -> bool: - return self.buffer.isatty() - - def __repr__(self) -> str: - return f"" - - -def _get_text_stdin(buffer_stream: t.BinaryIO) -> t.TextIO: - text_stream = _NonClosingTextIOWrapper( - io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)), - "utf-16-le", - "strict", - line_buffering=True, - ) - return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) - - -def _get_text_stdout(buffer_stream: t.BinaryIO) -> t.TextIO: - text_stream = _NonClosingTextIOWrapper( - io.BufferedWriter(_WindowsConsoleWriter(STDOUT_HANDLE)), - "utf-16-le", - "strict", - line_buffering=True, - ) - return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) - - -def _get_text_stderr(buffer_stream: t.BinaryIO) -> t.TextIO: - text_stream = _NonClosingTextIOWrapper( - io.BufferedWriter(_WindowsConsoleWriter(STDERR_HANDLE)), - "utf-16-le", - "strict", - line_buffering=True, - ) - return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) - - -_stream_factories: cabc.Mapping[int, t.Callable[[t.BinaryIO], t.TextIO]] = { - 0: _get_text_stdin, - 1: _get_text_stdout, - 2: _get_text_stderr, -} - - -def _is_console(f: t.TextIO) -> bool: - if not hasattr(f, "fileno"): - return False - - try: - fileno = f.fileno() - except (OSError, io.UnsupportedOperation): - return False - - handle = msvcrt.get_osfhandle(fileno) - return bool(GetConsoleMode(handle, byref(DWORD()))) - - -def _get_windows_console_stream( - f: t.TextIO, encoding: str | None, errors: str | None -) -> t.TextIO | None: - if ( - get_buffer is None - or encoding not in {"utf-16-le", None} - or errors not in {"strict", None} - or not _is_console(f) - ): - return None - - func = _stream_factories.get(f.fileno()) - if func is None: - return None - - b = getattr(f, "buffer", None) - - if b is None: - return None - - return func(b) diff --git a/venv/lib/python3.12/site-packages/click/core.py b/venv/lib/python3.12/site-packages/click/core.py deleted file mode 100644 index f0a624b..0000000 --- a/venv/lib/python3.12/site-packages/click/core.py +++ /dev/null @@ -1,3437 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import enum -import errno -import inspect -import os -import sys -import typing as t -from collections import abc -from collections import Counter -from contextlib import AbstractContextManager -from contextlib import contextmanager -from contextlib import ExitStack -from functools import update_wrapper -from gettext import gettext as _ -from gettext import ngettext -from itertools import repeat -from types import TracebackType - -from . import types -from ._utils import FLAG_NEEDS_VALUE -from ._utils import UNSET -from .exceptions import Abort -from .exceptions import BadParameter -from .exceptions import ClickException -from .exceptions import Exit -from .exceptions import MissingParameter -from .exceptions import NoArgsIsHelpError -from .exceptions import UsageError -from .formatting import HelpFormatter -from .formatting import join_options -from .globals import pop_context -from .globals import push_context -from .parser import _OptionParser -from .parser import _split_opt -from .termui import confirm -from .termui import prompt -from .termui import style -from .utils import _detect_program_name -from .utils import _expand_args -from .utils import echo -from .utils import make_default_short_help -from .utils import make_str -from .utils import PacifyFlushWrapper - -if t.TYPE_CHECKING: - from .shell_completion import CompletionItem - -F = t.TypeVar("F", bound="t.Callable[..., t.Any]") -V = t.TypeVar("V") - - -def _complete_visible_commands( - ctx: Context, incomplete: str -) -> cabc.Iterator[tuple[str, Command]]: - """List all the subcommands of a group that start with the - incomplete value and aren't hidden. - - :param ctx: Invocation context for the group. - :param incomplete: Value being completed. May be empty. - """ - multi = t.cast(Group, ctx.command) - - for name in multi.list_commands(ctx): - if name.startswith(incomplete): - command = multi.get_command(ctx, name) - - if command is not None and not command.hidden: - yield name, command - - -def _check_nested_chain( - base_command: Group, cmd_name: str, cmd: Command, register: bool = False -) -> None: - if not base_command.chain or not isinstance(cmd, Group): - return - - if register: - message = ( - f"It is not possible to add the group {cmd_name!r} to another" - f" group {base_command.name!r} that is in chain mode." - ) - else: - message = ( - f"Found the group {cmd_name!r} as subcommand to another group " - f" {base_command.name!r} that is in chain mode. This is not supported." - ) - - raise RuntimeError(message) - - -def batch(iterable: cabc.Iterable[V], batch_size: int) -> list[tuple[V, ...]]: - return list(zip(*repeat(iter(iterable), batch_size), strict=False)) - - -@contextmanager -def augment_usage_errors( - ctx: Context, param: Parameter | None = None -) -> cabc.Iterator[None]: - """Context manager that attaches extra information to exceptions.""" - try: - yield - except BadParameter as e: - if e.ctx is None: - e.ctx = ctx - if param is not None and e.param is None: - e.param = param - raise - except UsageError as e: - if e.ctx is None: - e.ctx = ctx - raise - - -def iter_params_for_processing( - invocation_order: cabc.Sequence[Parameter], - declaration_order: cabc.Sequence[Parameter], -) -> list[Parameter]: - """Returns all declared parameters in the order they should be processed. - - The declared parameters are re-shuffled depending on the order in which - they were invoked, as well as the eagerness of each parameters. - - The invocation order takes precedence over the declaration order. I.e. the - order in which the user provided them to the CLI is respected. - - This behavior and its effect on callback evaluation is detailed at: - https://click.palletsprojects.com/en/stable/advanced/#callback-evaluation-order - """ - - def sort_key(item: Parameter) -> tuple[bool, float]: - try: - idx: float = invocation_order.index(item) - except ValueError: - idx = float("inf") - - return not item.is_eager, idx - - return sorted(declaration_order, key=sort_key) - - -class ParameterSource(enum.Enum): - """This is an :class:`~enum.Enum` that indicates the source of a - parameter's value. - - Use :meth:`click.Context.get_parameter_source` to get the - source for a parameter by name. - - .. versionchanged:: 8.0 - Use :class:`~enum.Enum` and drop the ``validate`` method. - - .. versionchanged:: 8.0 - Added the ``PROMPT`` value. - """ - - COMMANDLINE = enum.auto() - """The value was provided by the command line args.""" - ENVIRONMENT = enum.auto() - """The value was provided with an environment variable.""" - DEFAULT = enum.auto() - """Used the default specified by the parameter.""" - DEFAULT_MAP = enum.auto() - """Used a default provided by :attr:`Context.default_map`.""" - PROMPT = enum.auto() - """Used a prompt to confirm a default or provide a value.""" - - -class Context: - """The context is a special internal object that holds state relevant - for the script execution at every single level. It's normally invisible - to commands unless they opt-in to getting access to it. - - The context is useful as it can pass internal objects around and can - control special execution features such as reading data from - environment variables. - - A context can be used as context manager in which case it will call - :meth:`close` on teardown. - - :param command: the command class for this context. - :param parent: the parent context. - :param info_name: the info name for this invocation. Generally this - is the most descriptive name for the script or - command. For the toplevel script it is usually - the name of the script, for commands below it it's - the name of the script. - :param obj: an arbitrary object of user data. - :param auto_envvar_prefix: the prefix to use for automatic environment - variables. If this is `None` then reading - from environment variables is disabled. This - does not affect manually set environment - variables which are always read. - :param default_map: a dictionary (like object) with default values - for parameters. - :param terminal_width: the width of the terminal. The default is - inherit from parent context. If no context - defines the terminal width then auto - detection will be applied. - :param max_content_width: the maximum width for content rendered by - Click (this currently only affects help - pages). This defaults to 80 characters if - not overridden. In other words: even if the - terminal is larger than that, Click will not - format things wider than 80 characters by - default. In addition to that, formatters might - add some safety mapping on the right. - :param resilient_parsing: if this flag is enabled then Click will - parse without any interactivity or callback - invocation. Default values will also be - ignored. This is useful for implementing - things such as completion support. - :param allow_extra_args: if this is set to `True` then extra arguments - at the end will not raise an error and will be - kept on the context. The default is to inherit - from the command. - :param allow_interspersed_args: if this is set to `False` then options - and arguments cannot be mixed. The - default is to inherit from the command. - :param ignore_unknown_options: instructs click to ignore options it does - not know and keeps them for later - processing. - :param help_option_names: optionally a list of strings that define how - the default help parameter is named. The - default is ``['--help']``. - :param token_normalize_func: an optional function that is used to - normalize tokens (options, choices, - etc.). This for instance can be used to - implement case insensitive behavior. - :param color: controls if the terminal supports ANSI colors or not. The - default is autodetection. This is only needed if ANSI - codes are used in texts that Click prints which is by - default not the case. This for instance would affect - help output. - :param show_default: Show the default value for commands. If this - value is not set, it defaults to the value from the parent - context. ``Command.show_default`` overrides this default for the - specific command. - - .. versionchanged:: 8.2 - The ``protected_args`` attribute is deprecated and will be removed in - Click 9.0. ``args`` will contain remaining unparsed tokens. - - .. versionchanged:: 8.1 - The ``show_default`` parameter is overridden by - ``Command.show_default``, instead of the other way around. - - .. versionchanged:: 8.0 - The ``show_default`` parameter defaults to the value from the - parent context. - - .. versionchanged:: 7.1 - Added the ``show_default`` parameter. - - .. versionchanged:: 4.0 - Added the ``color``, ``ignore_unknown_options``, and - ``max_content_width`` parameters. - - .. versionchanged:: 3.0 - Added the ``allow_extra_args`` and ``allow_interspersed_args`` - parameters. - - .. versionchanged:: 2.0 - Added the ``resilient_parsing``, ``help_option_names``, and - ``token_normalize_func`` parameters. - """ - - #: The formatter class to create with :meth:`make_formatter`. - #: - #: .. versionadded:: 8.0 - formatter_class: type[HelpFormatter] = HelpFormatter - - def __init__( - self, - command: Command, - parent: Context | None = None, - info_name: str | None = None, - obj: t.Any | None = None, - auto_envvar_prefix: str | None = None, - default_map: cabc.MutableMapping[str, t.Any] | None = None, - terminal_width: int | None = None, - max_content_width: int | None = None, - resilient_parsing: bool = False, - allow_extra_args: bool | None = None, - allow_interspersed_args: bool | None = None, - ignore_unknown_options: bool | None = None, - help_option_names: list[str] | None = None, - token_normalize_func: t.Callable[[str], str] | None = None, - color: bool | None = None, - show_default: bool | None = None, - ) -> None: - #: the parent context or `None` if none exists. - self.parent = parent - #: the :class:`Command` for this context. - self.command = command - #: the descriptive information name - self.info_name = info_name - #: Map of parameter names to their parsed values. Parameters - #: with ``expose_value=False`` are not stored. - self.params: dict[str, t.Any] = {} - #: the leftover arguments. - self.args: list[str] = [] - #: protected arguments. These are arguments that are prepended - #: to `args` when certain parsing scenarios are encountered but - #: must be never propagated to another arguments. This is used - #: to implement nested parsing. - self._protected_args: list[str] = [] - #: the collected prefixes of the command's options. - self._opt_prefixes: set[str] = set(parent._opt_prefixes) if parent else set() - - if obj is None and parent is not None: - obj = parent.obj - - #: the user object stored. - self.obj: t.Any = obj - self._meta: dict[str, t.Any] = getattr(parent, "meta", {}) - - #: A dictionary (-like object) with defaults for parameters. - if ( - default_map is None - and info_name is not None - and parent is not None - and parent.default_map is not None - ): - default_map = parent.default_map.get(info_name) - - self.default_map: cabc.MutableMapping[str, t.Any] | None = default_map - - #: This flag indicates if a subcommand is going to be executed. A - #: group callback can use this information to figure out if it's - #: being executed directly or because the execution flow passes - #: onwards to a subcommand. By default it's None, but it can be - #: the name of the subcommand to execute. - #: - #: If chaining is enabled this will be set to ``'*'`` in case - #: any commands are executed. It is however not possible to - #: figure out which ones. If you require this knowledge you - #: should use a :func:`result_callback`. - self.invoked_subcommand: str | None = None - - if terminal_width is None and parent is not None: - terminal_width = parent.terminal_width - - #: The width of the terminal (None is autodetection). - self.terminal_width: int | None = terminal_width - - if max_content_width is None and parent is not None: - max_content_width = parent.max_content_width - - #: The maximum width of formatted content (None implies a sensible - #: default which is 80 for most things). - self.max_content_width: int | None = max_content_width - - if allow_extra_args is None: - allow_extra_args = command.allow_extra_args - - #: Indicates if the context allows extra args or if it should - #: fail on parsing. - #: - #: .. versionadded:: 3.0 - self.allow_extra_args = allow_extra_args - - if allow_interspersed_args is None: - allow_interspersed_args = command.allow_interspersed_args - - #: Indicates if the context allows mixing of arguments and - #: options or not. - #: - #: .. versionadded:: 3.0 - self.allow_interspersed_args: bool = allow_interspersed_args - - if ignore_unknown_options is None: - ignore_unknown_options = command.ignore_unknown_options - - #: Instructs click to ignore options that a command does not - #: understand and will store it on the context for later - #: processing. This is primarily useful for situations where you - #: want to call into external programs. Generally this pattern is - #: strongly discouraged because it's not possibly to losslessly - #: forward all arguments. - #: - #: .. versionadded:: 4.0 - self.ignore_unknown_options: bool = ignore_unknown_options - - if help_option_names is None: - if parent is not None: - help_option_names = parent.help_option_names - else: - help_option_names = ["--help"] - - #: The names for the help options. - self.help_option_names: list[str] = help_option_names - - if token_normalize_func is None and parent is not None: - token_normalize_func = parent.token_normalize_func - - #: An optional normalization function for tokens. This is - #: options, choices, commands etc. - self.token_normalize_func: t.Callable[[str], str] | None = token_normalize_func - - #: Indicates if resilient parsing is enabled. In that case Click - #: will do its best to not cause any failures and default values - #: will be ignored. Useful for completion. - self.resilient_parsing: bool = resilient_parsing - - # If there is no envvar prefix yet, but the parent has one and - # the command on this level has a name, we can expand the envvar - # prefix automatically. - if auto_envvar_prefix is None: - if ( - parent is not None - and parent.auto_envvar_prefix is not None - and self.info_name is not None - ): - auto_envvar_prefix = ( - f"{parent.auto_envvar_prefix}_{self.info_name.upper()}" - ) - else: - auto_envvar_prefix = auto_envvar_prefix.upper() - - if auto_envvar_prefix is not None: - auto_envvar_prefix = auto_envvar_prefix.replace("-", "_") - - self.auto_envvar_prefix: str | None = auto_envvar_prefix - - if color is None and parent is not None: - color = parent.color - - #: Controls if styling output is wanted or not. - self.color: bool | None = color - - if show_default is None and parent is not None: - show_default = parent.show_default - - #: Show option default values when formatting help text. - self.show_default: bool | None = show_default - - self._close_callbacks: list[t.Callable[[], t.Any]] = [] - self._depth = 0 - self._parameter_source: dict[str, ParameterSource] = {} - self._exit_stack = ExitStack() - - @property - def protected_args(self) -> list[str]: - import warnings - - warnings.warn( - "'protected_args' is deprecated and will be removed in Click 9.0." - " 'args' will contain remaining unparsed tokens.", - DeprecationWarning, - stacklevel=2, - ) - return self._protected_args - - def to_info_dict(self) -> dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. This traverses the entire CLI - structure. - - .. code-block:: python - - with Context(cli) as ctx: - info = ctx.to_info_dict() - - .. versionadded:: 8.0 - """ - return { - "command": self.command.to_info_dict(self), - "info_name": self.info_name, - "allow_extra_args": self.allow_extra_args, - "allow_interspersed_args": self.allow_interspersed_args, - "ignore_unknown_options": self.ignore_unknown_options, - "auto_envvar_prefix": self.auto_envvar_prefix, - } - - def __enter__(self) -> Context: - self._depth += 1 - push_context(self) - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> bool | None: - self._depth -= 1 - exit_result: bool | None = None - if self._depth == 0: - exit_result = self._close_with_exception_info(exc_type, exc_value, tb) - pop_context() - - return exit_result - - @contextmanager - def scope(self, cleanup: bool = True) -> cabc.Iterator[Context]: - """This helper method can be used with the context object to promote - it to the current thread local (see :func:`get_current_context`). - The default behavior of this is to invoke the cleanup functions which - can be disabled by setting `cleanup` to `False`. The cleanup - functions are typically used for things such as closing file handles. - - If the cleanup is intended the context object can also be directly - used as a context manager. - - Example usage:: - - with ctx.scope(): - assert get_current_context() is ctx - - This is equivalent:: - - with ctx: - assert get_current_context() is ctx - - .. versionadded:: 5.0 - - :param cleanup: controls if the cleanup functions should be run or - not. The default is to run these functions. In - some situations the context only wants to be - temporarily pushed in which case this can be disabled. - Nested pushes automatically defer the cleanup. - """ - if not cleanup: - self._depth += 1 - try: - with self as rv: - yield rv - finally: - if not cleanup: - self._depth -= 1 - - @property - def meta(self) -> dict[str, t.Any]: - """This is a dictionary which is shared with all the contexts - that are nested. It exists so that click utilities can store some - state here if they need to. It is however the responsibility of - that code to manage this dictionary well. - - The keys are supposed to be unique dotted strings. For instance - module paths are a good choice for it. What is stored in there is - irrelevant for the operation of click. However what is important is - that code that places data here adheres to the general semantics of - the system. - - Example usage:: - - LANG_KEY = f'{__name__}.lang' - - def set_language(value): - ctx = get_current_context() - ctx.meta[LANG_KEY] = value - - def get_language(): - return get_current_context().meta.get(LANG_KEY, 'en_US') - - .. versionadded:: 5.0 - """ - return self._meta - - def make_formatter(self) -> HelpFormatter: - """Creates the :class:`~click.HelpFormatter` for the help and - usage output. - - To quickly customize the formatter class used without overriding - this method, set the :attr:`formatter_class` attribute. - - .. versionchanged:: 8.0 - Added the :attr:`formatter_class` attribute. - """ - return self.formatter_class( - width=self.terminal_width, max_width=self.max_content_width - ) - - def with_resource(self, context_manager: AbstractContextManager[V]) -> V: - """Register a resource as if it were used in a ``with`` - statement. The resource will be cleaned up when the context is - popped. - - Uses :meth:`contextlib.ExitStack.enter_context`. It calls the - resource's ``__enter__()`` method and returns the result. When - the context is popped, it closes the stack, which calls the - resource's ``__exit__()`` method. - - To register a cleanup function for something that isn't a - context manager, use :meth:`call_on_close`. Or use something - from :mod:`contextlib` to turn it into a context manager first. - - .. code-block:: python - - @click.group() - @click.option("--name") - @click.pass_context - def cli(ctx): - ctx.obj = ctx.with_resource(connect_db(name)) - - :param context_manager: The context manager to enter. - :return: Whatever ``context_manager.__enter__()`` returns. - - .. versionadded:: 8.0 - """ - return self._exit_stack.enter_context(context_manager) - - def call_on_close(self, f: t.Callable[..., t.Any]) -> t.Callable[..., t.Any]: - """Register a function to be called when the context tears down. - - This can be used to close resources opened during the script - execution. Resources that support Python's context manager - protocol which would be used in a ``with`` statement should be - registered with :meth:`with_resource` instead. - - :param f: The function to execute on teardown. - """ - return self._exit_stack.callback(f) - - def close(self) -> None: - """Invoke all close callbacks registered with - :meth:`call_on_close`, and exit all context managers entered - with :meth:`with_resource`. - """ - self._close_with_exception_info(None, None, None) - - def _close_with_exception_info( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> bool | None: - """Unwind the exit stack by calling its :meth:`__exit__` providing the exception - information to allow for exception handling by the various resources registered - using :meth;`with_resource` - - :return: Whatever ``exit_stack.__exit__()`` returns. - """ - exit_result = self._exit_stack.__exit__(exc_type, exc_value, tb) - # In case the context is reused, create a new exit stack. - self._exit_stack = ExitStack() - - return exit_result - - @property - def command_path(self) -> str: - """The computed command path. This is used for the ``usage`` - information on the help page. It's automatically created by - combining the info names of the chain of contexts to the root. - """ - rv = "" - if self.info_name is not None: - rv = self.info_name - if self.parent is not None: - parent_command_path = [self.parent.command_path] - - if isinstance(self.parent.command, Command): - for param in self.parent.command.get_params(self): - parent_command_path.extend(param.get_usage_pieces(self)) - - rv = f"{' '.join(parent_command_path)} {rv}" - return rv.lstrip() - - def find_root(self) -> Context: - """Finds the outermost context.""" - node = self - while node.parent is not None: - node = node.parent - return node - - def find_object(self, object_type: type[V]) -> V | None: - """Finds the closest object of a given type.""" - node: Context | None = self - - while node is not None: - if isinstance(node.obj, object_type): - return node.obj - - node = node.parent - - return None - - def ensure_object(self, object_type: type[V]) -> V: - """Like :meth:`find_object` but sets the innermost object to a - new instance of `object_type` if it does not exist. - """ - rv = self.find_object(object_type) - if rv is None: - self.obj = rv = object_type() - return rv - - @t.overload - def lookup_default( - self, name: str, call: t.Literal[True] = True - ) -> t.Any | None: ... - - @t.overload - def lookup_default( - self, name: str, call: t.Literal[False] = ... - ) -> t.Any | t.Callable[[], t.Any] | None: ... - - def lookup_default(self, name: str, call: bool = True) -> t.Any | None: - """Get the default for a parameter from :attr:`default_map`. - - :param name: Name of the parameter. - :param call: If the default is a callable, call it. Disable to - return the callable instead. - - .. versionchanged:: 8.0 - Added the ``call`` parameter. - """ - if self.default_map is not None: - value = self.default_map.get(name) - - if call and callable(value): - return value() - - return value - - return None - - def fail(self, message: str) -> t.NoReturn: - """Aborts the execution of the program with a specific error - message. - - :param message: the error message to fail with. - """ - raise UsageError(message, self) - - def abort(self) -> t.NoReturn: - """Aborts the script.""" - raise Abort() - - def exit(self, code: int = 0) -> t.NoReturn: - """Exits the application with a given exit code. - - .. versionchanged:: 8.2 - Callbacks and context managers registered with :meth:`call_on_close` - and :meth:`with_resource` are closed before exiting. - """ - self.close() - raise Exit(code) - - def get_usage(self) -> str: - """Helper method to get formatted usage string for the current - context and command. - """ - return self.command.get_usage(self) - - def get_help(self) -> str: - """Helper method to get formatted help page for the current - context and command. - """ - return self.command.get_help(self) - - def _make_sub_context(self, command: Command) -> Context: - """Create a new context of the same type as this context, but - for a new command. - - :meta private: - """ - return type(self)(command, info_name=command.name, parent=self) - - @t.overload - def invoke( - self, callback: t.Callable[..., V], /, *args: t.Any, **kwargs: t.Any - ) -> V: ... - - @t.overload - def invoke(self, callback: Command, /, *args: t.Any, **kwargs: t.Any) -> t.Any: ... - - def invoke( - self, callback: Command | t.Callable[..., V], /, *args: t.Any, **kwargs: t.Any - ) -> t.Any | V: - """Invokes a command callback in exactly the way it expects. There - are two ways to invoke this method: - - 1. the first argument can be a callback and all other arguments and - keyword arguments are forwarded directly to the function. - 2. the first argument is a click command object. In that case all - arguments are forwarded as well but proper click parameters - (options and click arguments) must be keyword arguments and Click - will fill in defaults. - - .. versionchanged:: 8.0 - All ``kwargs`` are tracked in :attr:`params` so they will be - passed if :meth:`forward` is called at multiple levels. - - .. versionchanged:: 3.2 - A new context is created, and missing arguments use default values. - """ - if isinstance(callback, Command): - other_cmd = callback - - if other_cmd.callback is None: - raise TypeError( - "The given command does not have a callback that can be invoked." - ) - else: - callback = t.cast("t.Callable[..., V]", other_cmd.callback) - - ctx = self._make_sub_context(other_cmd) - - for param in other_cmd.params: - if param.name not in kwargs and param.expose_value: - default_value = param.get_default(ctx) - # We explicitly hide the :attr:`UNSET` value to the user, as we - # choose to make it an implementation detail. And because ``invoke`` - # has been designed as part of Click public API, we return ``None`` - # instead. Refs: - # https://github.com/pallets/click/issues/3066 - # https://github.com/pallets/click/issues/3065 - # https://github.com/pallets/click/pull/3068 - if default_value is UNSET: - default_value = None - kwargs[param.name] = param.type_cast_value( # type: ignore - ctx, default_value - ) - - # Track all kwargs as params, so that forward() will pass - # them on in subsequent calls. - ctx.params.update(kwargs) - else: - ctx = self - - with augment_usage_errors(self): - with ctx: - return callback(*args, **kwargs) - - def forward(self, cmd: Command, /, *args: t.Any, **kwargs: t.Any) -> t.Any: - """Similar to :meth:`invoke` but fills in default keyword - arguments from the current context if the other command expects - it. This cannot invoke callbacks directly, only other commands. - - .. versionchanged:: 8.0 - All ``kwargs`` are tracked in :attr:`params` so they will be - passed if ``forward`` is called at multiple levels. - """ - # Can only forward to other commands, not direct callbacks. - if not isinstance(cmd, Command): - raise TypeError("Callback is not a command.") - - for param in self.params: - if param not in kwargs: - kwargs[param] = self.params[param] - - return self.invoke(cmd, *args, **kwargs) - - def set_parameter_source(self, name: str, source: ParameterSource) -> None: - """Set the source of a parameter. This indicates the location - from which the value of the parameter was obtained. - - :param name: The name of the parameter. - :param source: A member of :class:`~click.core.ParameterSource`. - """ - self._parameter_source[name] = source - - def get_parameter_source(self, name: str) -> ParameterSource | None: - """Get the source of a parameter. This indicates the location - from which the value of the parameter was obtained. - - This can be useful for determining when a user specified a value - on the command line that is the same as the default value. It - will be :attr:`~click.core.ParameterSource.DEFAULT` only if the - value was actually taken from the default. - - :param name: The name of the parameter. - :rtype: ParameterSource - - .. versionchanged:: 8.0 - Returns ``None`` if the parameter was not provided from any - source. - """ - return self._parameter_source.get(name) - - -class Command: - """Commands are the basic building block of command line interfaces in - Click. A basic command handles command line parsing and might dispatch - more parsing to commands nested below it. - - :param name: the name of the command to use unless a group overrides it. - :param context_settings: an optional dictionary with defaults that are - passed to the context object. - :param callback: the callback to invoke. This is optional. - :param params: the parameters to register with this command. This can - be either :class:`Option` or :class:`Argument` objects. - :param help: the help string to use for this command. - :param epilog: like the help string but it's printed at the end of the - help page after everything else. - :param short_help: the short help to use for this command. This is - shown on the command listing of the parent command. - :param add_help_option: by default each command registers a ``--help`` - option. This can be disabled by this parameter. - :param no_args_is_help: this controls what happens if no arguments are - provided. This option is disabled by default. - If enabled this will add ``--help`` as argument - if no arguments are passed - :param hidden: hide this command from help outputs. - :param deprecated: If ``True`` or non-empty string, issues a message - indicating that the command is deprecated and highlights - its deprecation in --help. The message can be customized - by using a string as the value. - - .. versionchanged:: 8.2 - This is the base class for all commands, not ``BaseCommand``. - ``deprecated`` can be set to a string as well to customize the - deprecation message. - - .. versionchanged:: 8.1 - ``help``, ``epilog``, and ``short_help`` are stored unprocessed, - all formatting is done when outputting help text, not at init, - and is done even if not using the ``@command`` decorator. - - .. versionchanged:: 8.0 - Added a ``repr`` showing the command name. - - .. versionchanged:: 7.1 - Added the ``no_args_is_help`` parameter. - - .. versionchanged:: 2.0 - Added the ``context_settings`` parameter. - """ - - #: The context class to create with :meth:`make_context`. - #: - #: .. versionadded:: 8.0 - context_class: type[Context] = Context - - #: the default for the :attr:`Context.allow_extra_args` flag. - allow_extra_args = False - - #: the default for the :attr:`Context.allow_interspersed_args` flag. - allow_interspersed_args = True - - #: the default for the :attr:`Context.ignore_unknown_options` flag. - ignore_unknown_options = False - - def __init__( - self, - name: str | None, - context_settings: cabc.MutableMapping[str, t.Any] | None = None, - callback: t.Callable[..., t.Any] | None = None, - params: list[Parameter] | None = None, - help: str | None = None, - epilog: str | None = None, - short_help: str | None = None, - options_metavar: str | None = "[OPTIONS]", - add_help_option: bool = True, - no_args_is_help: bool = False, - hidden: bool = False, - deprecated: bool | str = False, - ) -> None: - #: the name the command thinks it has. Upon registering a command - #: on a :class:`Group` the group will default the command name - #: with this information. You should instead use the - #: :class:`Context`\'s :attr:`~Context.info_name` attribute. - self.name = name - - if context_settings is None: - context_settings = {} - - #: an optional dictionary with defaults passed to the context. - self.context_settings: cabc.MutableMapping[str, t.Any] = context_settings - - #: the callback to execute when the command fires. This might be - #: `None` in which case nothing happens. - self.callback = callback - #: the list of parameters for this command in the order they - #: should show up in the help page and execute. Eager parameters - #: will automatically be handled before non eager ones. - self.params: list[Parameter] = params or [] - self.help = help - self.epilog = epilog - self.options_metavar = options_metavar - self.short_help = short_help - self.add_help_option = add_help_option - self._help_option = None - self.no_args_is_help = no_args_is_help - self.hidden = hidden - self.deprecated = deprecated - - def to_info_dict(self, ctx: Context) -> dict[str, t.Any]: - return { - "name": self.name, - "params": [param.to_info_dict() for param in self.get_params(ctx)], - "help": self.help, - "epilog": self.epilog, - "short_help": self.short_help, - "hidden": self.hidden, - "deprecated": self.deprecated, - } - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} {self.name}>" - - def get_usage(self, ctx: Context) -> str: - """Formats the usage line into a string and returns it. - - Calls :meth:`format_usage` internally. - """ - formatter = ctx.make_formatter() - self.format_usage(ctx, formatter) - return formatter.getvalue().rstrip("\n") - - def get_params(self, ctx: Context) -> list[Parameter]: - params = self.params - help_option = self.get_help_option(ctx) - - if help_option is not None: - params = [*params, help_option] - - if __debug__: - import warnings - - opts = [opt for param in params for opt in param.opts] - opts_counter = Counter(opts) - duplicate_opts = (opt for opt, count in opts_counter.items() if count > 1) - - for duplicate_opt in duplicate_opts: - warnings.warn( - ( - f"The parameter {duplicate_opt} is used more than once. " - "Remove its duplicate as parameters should be unique." - ), - stacklevel=3, - ) - - return params - - def format_usage(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the usage line into the formatter. - - This is a low-level method called by :meth:`get_usage`. - """ - pieces = self.collect_usage_pieces(ctx) - formatter.write_usage(ctx.command_path, " ".join(pieces)) - - def collect_usage_pieces(self, ctx: Context) -> list[str]: - """Returns all the pieces that go into the usage line and returns - it as a list of strings. - """ - rv = [self.options_metavar] if self.options_metavar else [] - - for param in self.get_params(ctx): - rv.extend(param.get_usage_pieces(ctx)) - - return rv - - def get_help_option_names(self, ctx: Context) -> list[str]: - """Returns the names for the help option.""" - all_names = set(ctx.help_option_names) - for param in self.params: - all_names.difference_update(param.opts) - all_names.difference_update(param.secondary_opts) - return list(all_names) - - def get_help_option(self, ctx: Context) -> Option | None: - """Returns the help option object. - - Skipped if :attr:`add_help_option` is ``False``. - - .. versionchanged:: 8.1.8 - The help option is now cached to avoid creating it multiple times. - """ - help_option_names = self.get_help_option_names(ctx) - - if not help_option_names or not self.add_help_option: - return None - - # Cache the help option object in private _help_option attribute to - # avoid creating it multiple times. Not doing this will break the - # callback odering by iter_params_for_processing(), which relies on - # object comparison. - if self._help_option is None: - # Avoid circular import. - from .decorators import help_option - - # Apply help_option decorator and pop resulting option - help_option(*help_option_names)(self) - self._help_option = self.params.pop() # type: ignore[assignment] - - return self._help_option - - def make_parser(self, ctx: Context) -> _OptionParser: - """Creates the underlying option parser for this command.""" - parser = _OptionParser(ctx) - for param in self.get_params(ctx): - param.add_to_parser(parser, ctx) - return parser - - def get_help(self, ctx: Context) -> str: - """Formats the help into a string and returns it. - - Calls :meth:`format_help` internally. - """ - formatter = ctx.make_formatter() - self.format_help(ctx, formatter) - return formatter.getvalue().rstrip("\n") - - def get_short_help_str(self, limit: int = 45) -> str: - """Gets short help for the command or makes it by shortening the - long help string. - """ - if self.short_help: - text = inspect.cleandoc(self.short_help) - elif self.help: - text = make_default_short_help(self.help, limit) - else: - text = "" - - if self.deprecated: - deprecated_message = ( - f"(DEPRECATED: {self.deprecated})" - if isinstance(self.deprecated, str) - else "(DEPRECATED)" - ) - text = _("{text} {deprecated_message}").format( - text=text, deprecated_message=deprecated_message - ) - - return text.strip() - - def format_help(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the help into the formatter if it exists. - - This is a low-level method called by :meth:`get_help`. - - This calls the following methods: - - - :meth:`format_usage` - - :meth:`format_help_text` - - :meth:`format_options` - - :meth:`format_epilog` - """ - self.format_usage(ctx, formatter) - self.format_help_text(ctx, formatter) - self.format_options(ctx, formatter) - self.format_epilog(ctx, formatter) - - def format_help_text(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the help text to the formatter if it exists.""" - if self.help is not None: - # truncate the help text to the first form feed - text = inspect.cleandoc(self.help).partition("\f")[0] - else: - text = "" - - if self.deprecated: - deprecated_message = ( - f"(DEPRECATED: {self.deprecated})" - if isinstance(self.deprecated, str) - else "(DEPRECATED)" - ) - text = _("{text} {deprecated_message}").format( - text=text, deprecated_message=deprecated_message - ) - - if text: - formatter.write_paragraph() - - with formatter.indentation(): - formatter.write_text(text) - - def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes all the options into the formatter if they exist.""" - opts = [] - for param in self.get_params(ctx): - rv = param.get_help_record(ctx) - if rv is not None: - opts.append(rv) - - if opts: - with formatter.section(_("Options")): - formatter.write_dl(opts) - - def format_epilog(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the epilog into the formatter if it exists.""" - if self.epilog: - epilog = inspect.cleandoc(self.epilog) - formatter.write_paragraph() - - with formatter.indentation(): - formatter.write_text(epilog) - - def make_context( - self, - info_name: str | None, - args: list[str], - parent: Context | None = None, - **extra: t.Any, - ) -> Context: - """This function when given an info name and arguments will kick - off the parsing and create a new :class:`Context`. It does not - invoke the actual command callback though. - - To quickly customize the context class used without overriding - this method, set the :attr:`context_class` attribute. - - :param info_name: the info name for this invocation. Generally this - is the most descriptive name for the script or - command. For the toplevel script it's usually - the name of the script, for commands below it's - the name of the command. - :param args: the arguments to parse as list of strings. - :param parent: the parent context if available. - :param extra: extra keyword arguments forwarded to the context - constructor. - - .. versionchanged:: 8.0 - Added the :attr:`context_class` attribute. - """ - for key, value in self.context_settings.items(): - if key not in extra: - extra[key] = value - - ctx = self.context_class(self, info_name=info_name, parent=parent, **extra) - - with ctx.scope(cleanup=False): - self.parse_args(ctx, args) - return ctx - - def parse_args(self, ctx: Context, args: list[str]) -> list[str]: - if not args and self.no_args_is_help and not ctx.resilient_parsing: - raise NoArgsIsHelpError(ctx) - - parser = self.make_parser(ctx) - opts, args, param_order = parser.parse_args(args=args) - - for param in iter_params_for_processing(param_order, self.get_params(ctx)): - _, args = param.handle_parse_result(ctx, opts, args) - - # We now have all parameters' values into `ctx.params`, but the data may contain - # the `UNSET` sentinel. - # Convert `UNSET` to `None` to ensure that the user doesn't see `UNSET`. - # - # Waiting until after the initial parse to convert allows us to treat `UNSET` - # more like a missing value when multiple params use the same name. - # Refs: - # https://github.com/pallets/click/issues/3071 - # https://github.com/pallets/click/pull/3079 - for name, value in ctx.params.items(): - if value is UNSET: - ctx.params[name] = None - - if args and not ctx.allow_extra_args and not ctx.resilient_parsing: - ctx.fail( - ngettext( - "Got unexpected extra argument ({args})", - "Got unexpected extra arguments ({args})", - len(args), - ).format(args=" ".join(map(str, args))) - ) - - ctx.args = args - ctx._opt_prefixes.update(parser._opt_prefixes) - return args - - def invoke(self, ctx: Context) -> t.Any: - """Given a context, this invokes the attached callback (if it exists) - in the right way. - """ - if self.deprecated: - extra_message = ( - f" {self.deprecated}" if isinstance(self.deprecated, str) else "" - ) - message = _( - "DeprecationWarning: The command {name!r} is deprecated.{extra_message}" - ).format(name=self.name, extra_message=extra_message) - echo(style(message, fg="red"), err=True) - - if self.callback is not None: - return ctx.invoke(self.callback, **ctx.params) - - def shell_complete(self, ctx: Context, incomplete: str) -> list[CompletionItem]: - """Return a list of completions for the incomplete value. Looks - at the names of options and chained multi-commands. - - Any command could be part of a chained multi-command, so sibling - commands are valid at any point during command completion. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - results: list[CompletionItem] = [] - - if incomplete and not incomplete[0].isalnum(): - for param in self.get_params(ctx): - if ( - not isinstance(param, Option) - or param.hidden - or ( - not param.multiple - and ctx.get_parameter_source(param.name) # type: ignore - is ParameterSource.COMMANDLINE - ) - ): - continue - - results.extend( - CompletionItem(name, help=param.help) - for name in [*param.opts, *param.secondary_opts] - if name.startswith(incomplete) - ) - - while ctx.parent is not None: - ctx = ctx.parent - - if isinstance(ctx.command, Group) and ctx.command.chain: - results.extend( - CompletionItem(name, help=command.get_short_help_str()) - for name, command in _complete_visible_commands(ctx, incomplete) - if name not in ctx._protected_args - ) - - return results - - @t.overload - def main( - self, - args: cabc.Sequence[str] | None = None, - prog_name: str | None = None, - complete_var: str | None = None, - standalone_mode: t.Literal[True] = True, - **extra: t.Any, - ) -> t.NoReturn: ... - - @t.overload - def main( - self, - args: cabc.Sequence[str] | None = None, - prog_name: str | None = None, - complete_var: str | None = None, - standalone_mode: bool = ..., - **extra: t.Any, - ) -> t.Any: ... - - def main( - self, - args: cabc.Sequence[str] | None = None, - prog_name: str | None = None, - complete_var: str | None = None, - standalone_mode: bool = True, - windows_expand_args: bool = True, - **extra: t.Any, - ) -> t.Any: - """This is the way to invoke a script with all the bells and - whistles as a command line application. This will always terminate - the application after a call. If this is not wanted, ``SystemExit`` - needs to be caught. - - This method is also available by directly calling the instance of - a :class:`Command`. - - :param args: the arguments that should be used for parsing. If not - provided, ``sys.argv[1:]`` is used. - :param prog_name: the program name that should be used. By default - the program name is constructed by taking the file - name from ``sys.argv[0]``. - :param complete_var: the environment variable that controls the - bash completion support. The default is - ``"__COMPLETE"`` with prog_name in - uppercase. - :param standalone_mode: the default behavior is to invoke the script - in standalone mode. Click will then - handle exceptions and convert them into - error messages and the function will never - return but shut down the interpreter. If - this is set to `False` they will be - propagated to the caller and the return - value of this function is the return value - of :meth:`invoke`. - :param windows_expand_args: Expand glob patterns, user dir, and - env vars in command line args on Windows. - :param extra: extra keyword arguments are forwarded to the context - constructor. See :class:`Context` for more information. - - .. versionchanged:: 8.0.1 - Added the ``windows_expand_args`` parameter to allow - disabling command line arg expansion on Windows. - - .. versionchanged:: 8.0 - When taking arguments from ``sys.argv`` on Windows, glob - patterns, user dir, and env vars are expanded. - - .. versionchanged:: 3.0 - Added the ``standalone_mode`` parameter. - """ - if args is None: - args = sys.argv[1:] - - if os.name == "nt" and windows_expand_args: - args = _expand_args(args) - else: - args = list(args) - - if prog_name is None: - prog_name = _detect_program_name() - - # Process shell completion requests and exit early. - self._main_shell_completion(extra, prog_name, complete_var) - - try: - try: - with self.make_context(prog_name, args, **extra) as ctx: - rv = self.invoke(ctx) - if not standalone_mode: - return rv - # it's not safe to `ctx.exit(rv)` here! - # note that `rv` may actually contain data like "1" which - # has obvious effects - # more subtle case: `rv=[None, None]` can come out of - # chained commands which all returned `None` -- so it's not - # even always obvious that `rv` indicates success/failure - # by its truthiness/falsiness - ctx.exit() - except (EOFError, KeyboardInterrupt) as e: - echo(file=sys.stderr) - raise Abort() from e - except ClickException as e: - if not standalone_mode: - raise - e.show() - sys.exit(e.exit_code) - except OSError as e: - if e.errno == errno.EPIPE: - sys.stdout = t.cast(t.TextIO, PacifyFlushWrapper(sys.stdout)) - sys.stderr = t.cast(t.TextIO, PacifyFlushWrapper(sys.stderr)) - sys.exit(1) - else: - raise - except Exit as e: - if standalone_mode: - sys.exit(e.exit_code) - else: - # in non-standalone mode, return the exit code - # note that this is only reached if `self.invoke` above raises - # an Exit explicitly -- thus bypassing the check there which - # would return its result - # the results of non-standalone execution may therefore be - # somewhat ambiguous: if there are codepaths which lead to - # `ctx.exit(1)` and to `return 1`, the caller won't be able to - # tell the difference between the two - return e.exit_code - except Abort: - if not standalone_mode: - raise - echo(_("Aborted!"), file=sys.stderr) - sys.exit(1) - - def _main_shell_completion( - self, - ctx_args: cabc.MutableMapping[str, t.Any], - prog_name: str, - complete_var: str | None = None, - ) -> None: - """Check if the shell is asking for tab completion, process - that, then exit early. Called from :meth:`main` before the - program is invoked. - - :param prog_name: Name of the executable in the shell. - :param complete_var: Name of the environment variable that holds - the completion instruction. Defaults to - ``_{PROG_NAME}_COMPLETE``. - - .. versionchanged:: 8.2.0 - Dots (``.``) in ``prog_name`` are replaced with underscores (``_``). - """ - if complete_var is None: - complete_name = prog_name.replace("-", "_").replace(".", "_") - complete_var = f"_{complete_name}_COMPLETE".upper() - - instruction = os.environ.get(complete_var) - - if not instruction: - return - - from .shell_completion import shell_complete - - rv = shell_complete(self, ctx_args, prog_name, complete_var, instruction) - sys.exit(rv) - - def __call__(self, *args: t.Any, **kwargs: t.Any) -> t.Any: - """Alias for :meth:`main`.""" - return self.main(*args, **kwargs) - - -class _FakeSubclassCheck(type): - def __subclasscheck__(cls, subclass: type) -> bool: - return issubclass(subclass, cls.__bases__[0]) - - def __instancecheck__(cls, instance: t.Any) -> bool: - return isinstance(instance, cls.__bases__[0]) - - -class _BaseCommand(Command, metaclass=_FakeSubclassCheck): - """ - .. deprecated:: 8.2 - Will be removed in Click 9.0. Use ``Command`` instead. - """ - - -class Group(Command): - """A group is a command that nests other commands (or more groups). - - :param name: The name of the group command. - :param commands: Map names to :class:`Command` objects. Can be a list, which - will use :attr:`Command.name` as the keys. - :param invoke_without_command: Invoke the group's callback even if a - subcommand is not given. - :param no_args_is_help: If no arguments are given, show the group's help and - exit. Defaults to the opposite of ``invoke_without_command``. - :param subcommand_metavar: How to represent the subcommand argument in help. - The default will represent whether ``chain`` is set or not. - :param chain: Allow passing more than one subcommand argument. After parsing - a command's arguments, if any arguments remain another command will be - matched, and so on. - :param result_callback: A function to call after the group's and - subcommand's callbacks. The value returned by the subcommand is passed. - If ``chain`` is enabled, the value will be a list of values returned by - all the commands. If ``invoke_without_command`` is enabled, the value - will be the value returned by the group's callback, or an empty list if - ``chain`` is enabled. - :param kwargs: Other arguments passed to :class:`Command`. - - .. versionchanged:: 8.0 - The ``commands`` argument can be a list of command objects. - - .. versionchanged:: 8.2 - Merged with and replaces the ``MultiCommand`` base class. - """ - - allow_extra_args = True - allow_interspersed_args = False - - #: If set, this is used by the group's :meth:`command` decorator - #: as the default :class:`Command` class. This is useful to make all - #: subcommands use a custom command class. - #: - #: .. versionadded:: 8.0 - command_class: type[Command] | None = None - - #: If set, this is used by the group's :meth:`group` decorator - #: as the default :class:`Group` class. This is useful to make all - #: subgroups use a custom group class. - #: - #: If set to the special value :class:`type` (literally - #: ``group_class = type``), this group's class will be used as the - #: default class. This makes a custom group class continue to make - #: custom groups. - #: - #: .. versionadded:: 8.0 - group_class: type[Group] | type[type] | None = None - # Literal[type] isn't valid, so use Type[type] - - def __init__( - self, - name: str | None = None, - commands: cabc.MutableMapping[str, Command] - | cabc.Sequence[Command] - | None = None, - invoke_without_command: bool = False, - no_args_is_help: bool | None = None, - subcommand_metavar: str | None = None, - chain: bool = False, - result_callback: t.Callable[..., t.Any] | None = None, - **kwargs: t.Any, - ) -> None: - super().__init__(name, **kwargs) - - if commands is None: - commands = {} - elif isinstance(commands, abc.Sequence): - commands = {c.name: c for c in commands if c.name is not None} - - #: The registered subcommands by their exported names. - self.commands: cabc.MutableMapping[str, Command] = commands - - if no_args_is_help is None: - no_args_is_help = not invoke_without_command - - self.no_args_is_help = no_args_is_help - self.invoke_without_command = invoke_without_command - - if subcommand_metavar is None: - if chain: - subcommand_metavar = "COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]..." - else: - subcommand_metavar = "COMMAND [ARGS]..." - - self.subcommand_metavar = subcommand_metavar - self.chain = chain - # The result callback that is stored. This can be set or - # overridden with the :func:`result_callback` decorator. - self._result_callback = result_callback - - if self.chain: - for param in self.params: - if isinstance(param, Argument) and not param.required: - raise RuntimeError( - "A group in chain mode cannot have optional arguments." - ) - - def to_info_dict(self, ctx: Context) -> dict[str, t.Any]: - info_dict = super().to_info_dict(ctx) - commands = {} - - for name in self.list_commands(ctx): - command = self.get_command(ctx, name) - - if command is None: - continue - - sub_ctx = ctx._make_sub_context(command) - - with sub_ctx.scope(cleanup=False): - commands[name] = command.to_info_dict(sub_ctx) - - info_dict.update(commands=commands, chain=self.chain) - return info_dict - - def add_command(self, cmd: Command, name: str | None = None) -> None: - """Registers another :class:`Command` with this group. If the name - is not provided, the name of the command is used. - """ - name = name or cmd.name - if name is None: - raise TypeError("Command has no name.") - _check_nested_chain(self, name, cmd, register=True) - self.commands[name] = cmd - - @t.overload - def command(self, __func: t.Callable[..., t.Any]) -> Command: ... - - @t.overload - def command( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], Command]: ... - - def command( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], Command] | Command: - """A shortcut decorator for declaring and attaching a command to - the group. This takes the same arguments as :func:`command` and - immediately registers the created command with this group by - calling :meth:`add_command`. - - To customize the command class used, set the - :attr:`command_class` attribute. - - .. versionchanged:: 8.1 - This decorator can be applied without parentheses. - - .. versionchanged:: 8.0 - Added the :attr:`command_class` attribute. - """ - from .decorators import command - - func: t.Callable[..., t.Any] | None = None - - if args and callable(args[0]): - assert len(args) == 1 and not kwargs, ( - "Use 'command(**kwargs)(callable)' to provide arguments." - ) - (func,) = args - args = () - - if self.command_class and kwargs.get("cls") is None: - kwargs["cls"] = self.command_class - - def decorator(f: t.Callable[..., t.Any]) -> Command: - cmd: Command = command(*args, **kwargs)(f) - self.add_command(cmd) - return cmd - - if func is not None: - return decorator(func) - - return decorator - - @t.overload - def group(self, __func: t.Callable[..., t.Any]) -> Group: ... - - @t.overload - def group( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], Group]: ... - - def group( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], Group] | Group: - """A shortcut decorator for declaring and attaching a group to - the group. This takes the same arguments as :func:`group` and - immediately registers the created group with this group by - calling :meth:`add_command`. - - To customize the group class used, set the :attr:`group_class` - attribute. - - .. versionchanged:: 8.1 - This decorator can be applied without parentheses. - - .. versionchanged:: 8.0 - Added the :attr:`group_class` attribute. - """ - from .decorators import group - - func: t.Callable[..., t.Any] | None = None - - if args and callable(args[0]): - assert len(args) == 1 and not kwargs, ( - "Use 'group(**kwargs)(callable)' to provide arguments." - ) - (func,) = args - args = () - - if self.group_class is not None and kwargs.get("cls") is None: - if self.group_class is type: - kwargs["cls"] = type(self) - else: - kwargs["cls"] = self.group_class - - def decorator(f: t.Callable[..., t.Any]) -> Group: - cmd: Group = group(*args, **kwargs)(f) - self.add_command(cmd) - return cmd - - if func is not None: - return decorator(func) - - return decorator - - def result_callback(self, replace: bool = False) -> t.Callable[[F], F]: - """Adds a result callback to the command. By default if a - result callback is already registered this will chain them but - this can be disabled with the `replace` parameter. The result - callback is invoked with the return value of the subcommand - (or the list of return values from all subcommands if chaining - is enabled) as well as the parameters as they would be passed - to the main callback. - - Example:: - - @click.group() - @click.option('-i', '--input', default=23) - def cli(input): - return 42 - - @cli.result_callback() - def process_result(result, input): - return result + input - - :param replace: if set to `True` an already existing result - callback will be removed. - - .. versionchanged:: 8.0 - Renamed from ``resultcallback``. - - .. versionadded:: 3.0 - """ - - def decorator(f: F) -> F: - old_callback = self._result_callback - - if old_callback is None or replace: - self._result_callback = f - return f - - def function(value: t.Any, /, *args: t.Any, **kwargs: t.Any) -> t.Any: - inner = old_callback(value, *args, **kwargs) - return f(inner, *args, **kwargs) - - self._result_callback = rv = update_wrapper(t.cast(F, function), f) - return rv # type: ignore[return-value] - - return decorator - - def get_command(self, ctx: Context, cmd_name: str) -> Command | None: - """Given a context and a command name, this returns a :class:`Command` - object if it exists or returns ``None``. - """ - return self.commands.get(cmd_name) - - def list_commands(self, ctx: Context) -> list[str]: - """Returns a list of subcommand names in the order they should appear.""" - return sorted(self.commands) - - def collect_usage_pieces(self, ctx: Context) -> list[str]: - rv = super().collect_usage_pieces(ctx) - rv.append(self.subcommand_metavar) - return rv - - def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: - super().format_options(ctx, formatter) - self.format_commands(ctx, formatter) - - def format_commands(self, ctx: Context, formatter: HelpFormatter) -> None: - """Extra format methods for multi methods that adds all the commands - after the options. - """ - commands = [] - for subcommand in self.list_commands(ctx): - cmd = self.get_command(ctx, subcommand) - # What is this, the tool lied about a command. Ignore it - if cmd is None: - continue - if cmd.hidden: - continue - - commands.append((subcommand, cmd)) - - # allow for 3 times the default spacing - if len(commands): - limit = formatter.width - 6 - max(len(cmd[0]) for cmd in commands) - - rows = [] - for subcommand, cmd in commands: - help = cmd.get_short_help_str(limit) - rows.append((subcommand, help)) - - if rows: - with formatter.section(_("Commands")): - formatter.write_dl(rows) - - def parse_args(self, ctx: Context, args: list[str]) -> list[str]: - if not args and self.no_args_is_help and not ctx.resilient_parsing: - raise NoArgsIsHelpError(ctx) - - rest = super().parse_args(ctx, args) - - if self.chain: - ctx._protected_args = rest - ctx.args = [] - elif rest: - ctx._protected_args, ctx.args = rest[:1], rest[1:] - - return ctx.args - - def invoke(self, ctx: Context) -> t.Any: - def _process_result(value: t.Any) -> t.Any: - if self._result_callback is not None: - value = ctx.invoke(self._result_callback, value, **ctx.params) - return value - - if not ctx._protected_args: - if self.invoke_without_command: - # No subcommand was invoked, so the result callback is - # invoked with the group return value for regular - # groups, or an empty list for chained groups. - with ctx: - rv = super().invoke(ctx) - return _process_result([] if self.chain else rv) - ctx.fail(_("Missing command.")) - - # Fetch args back out - args = [*ctx._protected_args, *ctx.args] - ctx.args = [] - ctx._protected_args = [] - - # If we're not in chain mode, we only allow the invocation of a - # single command but we also inform the current context about the - # name of the command to invoke. - if not self.chain: - # Make sure the context is entered so we do not clean up - # resources until the result processor has worked. - with ctx: - cmd_name, cmd, args = self.resolve_command(ctx, args) - assert cmd is not None - ctx.invoked_subcommand = cmd_name - super().invoke(ctx) - sub_ctx = cmd.make_context(cmd_name, args, parent=ctx) - with sub_ctx: - return _process_result(sub_ctx.command.invoke(sub_ctx)) - - # In chain mode we create the contexts step by step, but after the - # base command has been invoked. Because at that point we do not - # know the subcommands yet, the invoked subcommand attribute is - # set to ``*`` to inform the command that subcommands are executed - # but nothing else. - with ctx: - ctx.invoked_subcommand = "*" if args else None - super().invoke(ctx) - - # Otherwise we make every single context and invoke them in a - # chain. In that case the return value to the result processor - # is the list of all invoked subcommand's results. - contexts = [] - while args: - cmd_name, cmd, args = self.resolve_command(ctx, args) - assert cmd is not None - sub_ctx = cmd.make_context( - cmd_name, - args, - parent=ctx, - allow_extra_args=True, - allow_interspersed_args=False, - ) - contexts.append(sub_ctx) - args, sub_ctx.args = sub_ctx.args, [] - - rv = [] - for sub_ctx in contexts: - with sub_ctx: - rv.append(sub_ctx.command.invoke(sub_ctx)) - return _process_result(rv) - - def resolve_command( - self, ctx: Context, args: list[str] - ) -> tuple[str | None, Command | None, list[str]]: - cmd_name = make_str(args[0]) - original_cmd_name = cmd_name - - # Get the command - cmd = self.get_command(ctx, cmd_name) - - # If we can't find the command but there is a normalization - # function available, we try with that one. - if cmd is None and ctx.token_normalize_func is not None: - cmd_name = ctx.token_normalize_func(cmd_name) - cmd = self.get_command(ctx, cmd_name) - - # If we don't find the command we want to show an error message - # to the user that it was not provided. However, there is - # something else we should do: if the first argument looks like - # an option we want to kick off parsing again for arguments to - # resolve things like --help which now should go to the main - # place. - if cmd is None and not ctx.resilient_parsing: - if _split_opt(cmd_name)[0]: - self.parse_args(ctx, args) - ctx.fail(_("No such command {name!r}.").format(name=original_cmd_name)) - return cmd_name if cmd else None, cmd, args[1:] - - def shell_complete(self, ctx: Context, incomplete: str) -> list[CompletionItem]: - """Return a list of completions for the incomplete value. Looks - at the names of options, subcommands, and chained - multi-commands. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - results = [ - CompletionItem(name, help=command.get_short_help_str()) - for name, command in _complete_visible_commands(ctx, incomplete) - ] - results.extend(super().shell_complete(ctx, incomplete)) - return results - - -class _MultiCommand(Group, metaclass=_FakeSubclassCheck): - """ - .. deprecated:: 8.2 - Will be removed in Click 9.0. Use ``Group`` instead. - """ - - -class CommandCollection(Group): - """A :class:`Group` that looks up subcommands on other groups. If a command - is not found on this group, each registered source is checked in order. - Parameters on a source are not added to this group, and a source's callback - is not invoked when invoking its commands. In other words, this "flattens" - commands in many groups into this one group. - - :param name: The name of the group command. - :param sources: A list of :class:`Group` objects to look up commands from. - :param kwargs: Other arguments passed to :class:`Group`. - - .. versionchanged:: 8.2 - This is a subclass of ``Group``. Commands are looked up first on this - group, then each of its sources. - """ - - def __init__( - self, - name: str | None = None, - sources: list[Group] | None = None, - **kwargs: t.Any, - ) -> None: - super().__init__(name, **kwargs) - #: The list of registered groups. - self.sources: list[Group] = sources or [] - - def add_source(self, group: Group) -> None: - """Add a group as a source of commands.""" - self.sources.append(group) - - def get_command(self, ctx: Context, cmd_name: str) -> Command | None: - rv = super().get_command(ctx, cmd_name) - - if rv is not None: - return rv - - for source in self.sources: - rv = source.get_command(ctx, cmd_name) - - if rv is not None: - if self.chain: - _check_nested_chain(self, cmd_name, rv) - - return rv - - return None - - def list_commands(self, ctx: Context) -> list[str]: - rv: set[str] = set(super().list_commands(ctx)) - - for source in self.sources: - rv.update(source.list_commands(ctx)) - - return sorted(rv) - - -def _check_iter(value: t.Any) -> cabc.Iterator[t.Any]: - """Check if the value is iterable but not a string. Raises a type - error, or return an iterator over the value. - """ - if isinstance(value, str): - raise TypeError - - return iter(value) - - -class Parameter: - r"""A parameter to a command comes in two versions: they are either - :class:`Option`\s or :class:`Argument`\s. Other subclasses are currently - not supported by design as some of the internals for parsing are - intentionally not finalized. - - Some settings are supported by both options and arguments. - - :param param_decls: the parameter declarations for this option or - argument. This is a list of flags or argument - names. - :param type: the type that should be used. Either a :class:`ParamType` - or a Python type. The latter is converted into the former - automatically if supported. - :param required: controls if this is optional or not. - :param default: the default value if omitted. This can also be a callable, - in which case it's invoked when the default is needed - without any arguments. - :param callback: A function to further process or validate the value - after type conversion. It is called as ``f(ctx, param, value)`` - and must return the value. It is called for all sources, - including prompts. - :param nargs: the number of arguments to match. If not ``1`` the return - value is a tuple instead of single value. The default for - nargs is ``1`` (except if the type is a tuple, then it's - the arity of the tuple). If ``nargs=-1``, all remaining - parameters are collected. - :param metavar: how the value is represented in the help page. - :param expose_value: if this is `True` then the value is passed onwards - to the command callback and stored on the context, - otherwise it's skipped. - :param is_eager: eager values are processed before non eager ones. This - should not be set for arguments or it will inverse the - order of processing. - :param envvar: environment variable(s) that are used to provide a default value for - this parameter. This can be a string or a sequence of strings. If a sequence is - given, only the first non-empty environment variable is used for the parameter. - :param shell_complete: A function that returns custom shell - completions. Used instead of the param's type completion if - given. Takes ``ctx, param, incomplete`` and must return a list - of :class:`~click.shell_completion.CompletionItem` or a list of - strings. - :param deprecated: If ``True`` or non-empty string, issues a message - indicating that the argument is deprecated and highlights - its deprecation in --help. The message can be customized - by using a string as the value. A deprecated parameter - cannot be required, a ValueError will be raised otherwise. - - .. versionchanged:: 8.2.0 - Introduction of ``deprecated``. - - .. versionchanged:: 8.2 - Adding duplicate parameter names to a :class:`~click.core.Command` will - result in a ``UserWarning`` being shown. - - .. versionchanged:: 8.2 - Adding duplicate parameter names to a :class:`~click.core.Command` will - result in a ``UserWarning`` being shown. - - .. versionchanged:: 8.0 - ``process_value`` validates required parameters and bounded - ``nargs``, and invokes the parameter callback before returning - the value. This allows the callback to validate prompts. - ``full_process_value`` is removed. - - .. versionchanged:: 8.0 - ``autocompletion`` is renamed to ``shell_complete`` and has new - semantics described above. The old name is deprecated and will - be removed in 8.1, until then it will be wrapped to match the - new requirements. - - .. versionchanged:: 8.0 - For ``multiple=True, nargs>1``, the default must be a list of - tuples. - - .. versionchanged:: 8.0 - Setting a default is no longer required for ``nargs>1``, it will - default to ``None``. ``multiple=True`` or ``nargs=-1`` will - default to ``()``. - - .. versionchanged:: 7.1 - Empty environment variables are ignored rather than taking the - empty string value. This makes it possible for scripts to clear - variables if they can't unset them. - - .. versionchanged:: 2.0 - Changed signature for parameter callback to also be passed the - parameter. The old callback format will still work, but it will - raise a warning to give you a chance to migrate the code easier. - """ - - param_type_name = "parameter" - - def __init__( - self, - param_decls: cabc.Sequence[str] | None = None, - type: types.ParamType | t.Any | None = None, - required: bool = False, - # XXX The default historically embed two concepts: - # - the declaration of a Parameter object carrying the default (handy to - # arbitrage the default value of coupled Parameters sharing the same - # self.name, like flag options), - # - and the actual value of the default. - # It is confusing and is the source of many issues discussed in: - # https://github.com/pallets/click/pull/3030 - # In the future, we might think of splitting it in two, not unlike - # Option.is_flag and Option.flag_value: we could have something like - # Parameter.is_default and Parameter.default_value. - default: t.Any | t.Callable[[], t.Any] | None = UNSET, - callback: t.Callable[[Context, Parameter, t.Any], t.Any] | None = None, - nargs: int | None = None, - multiple: bool = False, - metavar: str | None = None, - expose_value: bool = True, - is_eager: bool = False, - envvar: str | cabc.Sequence[str] | None = None, - shell_complete: t.Callable[ - [Context, Parameter, str], list[CompletionItem] | list[str] - ] - | None = None, - deprecated: bool | str = False, - ) -> None: - self.name: str | None - self.opts: list[str] - self.secondary_opts: list[str] - self.name, self.opts, self.secondary_opts = self._parse_decls( - param_decls or (), expose_value - ) - self.type: types.ParamType = types.convert_type(type, default) - - # Default nargs to what the type tells us if we have that - # information available. - if nargs is None: - if self.type.is_composite: - nargs = self.type.arity - else: - nargs = 1 - - self.required = required - self.callback = callback - self.nargs = nargs - self.multiple = multiple - self.expose_value = expose_value - self.default: t.Any | t.Callable[[], t.Any] | None = default - self.is_eager = is_eager - self.metavar = metavar - self.envvar = envvar - self._custom_shell_complete = shell_complete - self.deprecated = deprecated - - if __debug__: - if self.type.is_composite and nargs != self.type.arity: - raise ValueError( - f"'nargs' must be {self.type.arity} (or None) for" - f" type {self.type!r}, but it was {nargs}." - ) - - if required and deprecated: - raise ValueError( - f"The {self.param_type_name} '{self.human_readable_name}' " - "is deprecated and still required. A deprecated " - f"{self.param_type_name} cannot be required." - ) - - def to_info_dict(self) -> dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. - - Use :meth:`click.Context.to_info_dict` to traverse the entire - CLI structure. - - .. versionchanged:: 8.3.0 - Returns ``None`` for the :attr:`default` if it was not set. - - .. versionadded:: 8.0 - """ - return { - "name": self.name, - "param_type_name": self.param_type_name, - "opts": self.opts, - "secondary_opts": self.secondary_opts, - "type": self.type.to_info_dict(), - "required": self.required, - "nargs": self.nargs, - "multiple": self.multiple, - # We explicitly hide the :attr:`UNSET` value to the user, as we choose to - # make it an implementation detail. And because ``to_info_dict`` has been - # designed for documentation purposes, we return ``None`` instead. - "default": self.default if self.default is not UNSET else None, - "envvar": self.envvar, - } - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} {self.name}>" - - def _parse_decls( - self, decls: cabc.Sequence[str], expose_value: bool - ) -> tuple[str | None, list[str], list[str]]: - raise NotImplementedError() - - @property - def human_readable_name(self) -> str: - """Returns the human readable name of this parameter. This is the - same as the name for options, but the metavar for arguments. - """ - return self.name # type: ignore - - def make_metavar(self, ctx: Context) -> str: - if self.metavar is not None: - return self.metavar - - metavar = self.type.get_metavar(param=self, ctx=ctx) - - if metavar is None: - metavar = self.type.name.upper() - - if self.nargs != 1: - metavar += "..." - - return metavar - - @t.overload - def get_default( - self, ctx: Context, call: t.Literal[True] = True - ) -> t.Any | None: ... - - @t.overload - def get_default( - self, ctx: Context, call: bool = ... - ) -> t.Any | t.Callable[[], t.Any] | None: ... - - def get_default( - self, ctx: Context, call: bool = True - ) -> t.Any | t.Callable[[], t.Any] | None: - """Get the default for the parameter. Tries - :meth:`Context.lookup_default` first, then the local default. - - :param ctx: Current context. - :param call: If the default is a callable, call it. Disable to - return the callable instead. - - .. versionchanged:: 8.0.2 - Type casting is no longer performed when getting a default. - - .. versionchanged:: 8.0.1 - Type casting can fail in resilient parsing mode. Invalid - defaults will not prevent showing help text. - - .. versionchanged:: 8.0 - Looks at ``ctx.default_map`` first. - - .. versionchanged:: 8.0 - Added the ``call`` parameter. - """ - name = self.name - value = ctx.lookup_default(name, call=False) if name is not None else None - - if value is None and not ( - ctx.default_map is not None and name is not None and name in ctx.default_map - ): - value = self.default - - if call and callable(value): - value = value() - - return value - - def add_to_parser(self, parser: _OptionParser, ctx: Context) -> None: - raise NotImplementedError() - - def consume_value( - self, ctx: Context, opts: cabc.Mapping[str, t.Any] - ) -> tuple[t.Any, ParameterSource]: - """Returns the parameter value produced by the parser. - - If the parser did not produce a value from user input, the value is either - sourced from the environment variable, the default map, or the parameter's - default value. In that order of precedence. - - If no value is found, an internal sentinel value is returned. - - :meta private: - """ - # Collect from the parse the value passed by the user to the CLI. - value = opts.get(self.name, UNSET) # type: ignore - # If the value is set, it means it was sourced from the command line by the - # parser, otherwise it left unset by default. - source = ( - ParameterSource.COMMANDLINE - if value is not UNSET - else ParameterSource.DEFAULT - ) - - if value is UNSET: - envvar_value = self.value_from_envvar(ctx) - if envvar_value is not None: - value = envvar_value - source = ParameterSource.ENVIRONMENT - - if value is UNSET: - default_map_value = ctx.lookup_default(self.name) # type: ignore[arg-type] - if default_map_value is not None or ( - ctx.default_map is not None and self.name in ctx.default_map - ): - value = default_map_value - source = ParameterSource.DEFAULT_MAP - - if value is UNSET: - default_value = self.get_default(ctx) - if default_value is not UNSET: - value = default_value - source = ParameterSource.DEFAULT - - return value, source - - def type_cast_value(self, ctx: Context, value: t.Any) -> t.Any: - """Convert and validate a value against the parameter's - :attr:`type`, :attr:`multiple`, and :attr:`nargs`. - """ - if value is None: - if self.multiple or self.nargs == -1: - return () - else: - return value - - def check_iter(value: t.Any) -> cabc.Iterator[t.Any]: - try: - return _check_iter(value) - except TypeError: - # This should only happen when passing in args manually, - # the parser should construct an iterable when parsing - # the command line. - raise BadParameter( - _("Value must be an iterable."), ctx=ctx, param=self - ) from None - - # Define the conversion function based on nargs and type. - - if self.nargs == 1 or self.type.is_composite: - - def convert(value: t.Any) -> t.Any: - return self.type(value, param=self, ctx=ctx) - - elif self.nargs == -1: - - def convert(value: t.Any) -> t.Any: # tuple[t.Any, ...] - return tuple(self.type(x, self, ctx) for x in check_iter(value)) - - else: # nargs > 1 - - def convert(value: t.Any) -> t.Any: # tuple[t.Any, ...] - value = tuple(check_iter(value)) - - if len(value) != self.nargs: - raise BadParameter( - ngettext( - "Takes {nargs} values but 1 was given.", - "Takes {nargs} values but {len} were given.", - len(value), - ).format(nargs=self.nargs, len=len(value)), - ctx=ctx, - param=self, - ) - - return tuple(self.type(x, self, ctx) for x in value) - - if self.multiple: - return tuple(convert(x) for x in check_iter(value)) - - return convert(value) - - def value_is_missing(self, value: t.Any) -> bool: - """A value is considered missing if: - - - it is :attr:`UNSET`, - - or if it is an empty sequence while the parameter is suppose to have - non-single value (i.e. :attr:`nargs` is not ``1`` or :attr:`multiple` is - set). - - :meta private: - """ - if value is UNSET: - return True - - if (self.nargs != 1 or self.multiple) and value == (): - return True - - return False - - def process_value(self, ctx: Context, value: t.Any) -> t.Any: - """Process the value of this parameter: - - 1. Type cast the value using :meth:`type_cast_value`. - 2. Check if the value is missing (see: :meth:`value_is_missing`), and raise - :exc:`MissingParameter` if it is required. - 3. If a :attr:`callback` is set, call it to have the value replaced by the - result of the callback. If the value was not set, the callback receive - ``None``. This keep the legacy behavior as it was before the introduction of - the :attr:`UNSET` sentinel. - - :meta private: - """ - # shelter `type_cast_value` from ever seeing an `UNSET` value by handling the - # cases in which `UNSET` gets special treatment explicitly at this layer - # - # Refs: - # https://github.com/pallets/click/issues/3069 - if value is UNSET: - if self.multiple or self.nargs == -1: - value = () - else: - value = self.type_cast_value(ctx, value) - - if self.required and self.value_is_missing(value): - raise MissingParameter(ctx=ctx, param=self) - - if self.callback is not None: - # Legacy case: UNSET is not exposed directly to the callback, but converted - # to None. - if value is UNSET: - value = None - - # Search for parameters with UNSET values in the context. - unset_keys = {k: None for k, v in ctx.params.items() if v is UNSET} - # No UNSET values, call the callback as usual. - if not unset_keys: - value = self.callback(ctx, self, value) - - # Legacy case: provide a temporarily manipulated context to the callback - # to hide UNSET values as None. - # - # Refs: - # https://github.com/pallets/click/issues/3136 - # https://github.com/pallets/click/pull/3137 - else: - # Add another layer to the context stack to clearly hint that the - # context is temporarily modified. - with ctx: - # Update the context parameters to replace UNSET with None. - ctx.params.update(unset_keys) - # Feed these fake context parameters to the callback. - value = self.callback(ctx, self, value) - # Restore the UNSET values in the context parameters. - ctx.params.update( - { - k: UNSET - for k in unset_keys - # Only restore keys that are present and still None, in case - # the callback modified other parameters. - if k in ctx.params and ctx.params[k] is None - } - ) - - return value - - def resolve_envvar_value(self, ctx: Context) -> str | None: - """Returns the value found in the environment variable(s) attached to this - parameter. - - Environment variables values are `always returned as strings - `_. - - This method returns ``None`` if: - - - the :attr:`envvar` property is not set on the :class:`Parameter`, - - the environment variable is not found in the environment, - - the variable is found in the environment but its value is empty (i.e. the - environment variable is present but has an empty string). - - If :attr:`envvar` is setup with multiple environment variables, - then only the first non-empty value is returned. - - .. caution:: - - The raw value extracted from the environment is not normalized and is - returned as-is. Any normalization or reconciliation is performed later by - the :class:`Parameter`'s :attr:`type`. - - :meta private: - """ - if not self.envvar: - return None - - if isinstance(self.envvar, str): - rv = os.environ.get(self.envvar) - - if rv: - return rv - else: - for envvar in self.envvar: - rv = os.environ.get(envvar) - - # Return the first non-empty value of the list of environment variables. - if rv: - return rv - # Else, absence of value is interpreted as an environment variable that - # is not set, so proceed to the next one. - - return None - - def value_from_envvar(self, ctx: Context) -> str | cabc.Sequence[str] | None: - """Process the raw environment variable string for this parameter. - - Returns the string as-is or splits it into a sequence of strings if the - parameter is expecting multiple values (i.e. its :attr:`nargs` property is set - to a value other than ``1``). - - :meta private: - """ - rv = self.resolve_envvar_value(ctx) - - if rv is not None and self.nargs != 1: - return self.type.split_envvar_value(rv) - - return rv - - def handle_parse_result( - self, ctx: Context, opts: cabc.Mapping[str, t.Any], args: list[str] - ) -> tuple[t.Any, list[str]]: - """Process the value produced by the parser from user input. - - Always process the value through the Parameter's :attr:`type`, wherever it - comes from. - - If the parameter is deprecated, this method warn the user about it. But only if - the value has been explicitly set by the user (and as such, is not coming from - a default). - - :meta private: - """ - with augment_usage_errors(ctx, param=self): - value, source = self.consume_value(ctx, opts) - - ctx.set_parameter_source(self.name, source) # type: ignore - - # Display a deprecation warning if necessary. - if ( - self.deprecated - and value is not UNSET - and source not in (ParameterSource.DEFAULT, ParameterSource.DEFAULT_MAP) - ): - extra_message = ( - f" {self.deprecated}" if isinstance(self.deprecated, str) else "" - ) - message = _( - "DeprecationWarning: The {param_type} {name!r} is deprecated." - "{extra_message}" - ).format( - param_type=self.param_type_name, - name=self.human_readable_name, - extra_message=extra_message, - ) - echo(style(message, fg="red"), err=True) - - # Process the value through the parameter's type. - try: - value = self.process_value(ctx, value) - except Exception: - if not ctx.resilient_parsing: - raise - # In resilient parsing mode, we do not want to fail the command if the - # value is incompatible with the parameter type, so we reset the value - # to UNSET, which will be interpreted as a missing value. - value = UNSET - - # Add parameter's value to the context. - if ( - self.expose_value - # We skip adding the value if it was previously set by another parameter - # targeting the same variable name. This prevents parameters competing for - # the same name to override each other. - and (self.name not in ctx.params or ctx.params[self.name] is UNSET) - ): - # Click is logically enforcing that the name is None if the parameter is - # not to be exposed. We still assert it here to please the type checker. - assert self.name is not None, ( - f"{self!r} parameter's name should not be None when exposing value." - ) - ctx.params[self.name] = value - - return value, args - - def get_help_record(self, ctx: Context) -> tuple[str, str] | None: - pass - - def get_usage_pieces(self, ctx: Context) -> list[str]: - return [] - - def get_error_hint(self, ctx: Context) -> str: - """Get a stringified version of the param for use in error messages to - indicate which param caused the error. - """ - hint_list = self.opts or [self.human_readable_name] - return " / ".join(f"'{x}'" for x in hint_list) - - def shell_complete(self, ctx: Context, incomplete: str) -> list[CompletionItem]: - """Return a list of completions for the incomplete value. If a - ``shell_complete`` function was given during init, it is used. - Otherwise, the :attr:`type` - :meth:`~click.types.ParamType.shell_complete` function is used. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - if self._custom_shell_complete is not None: - results = self._custom_shell_complete(ctx, self, incomplete) - - if results and isinstance(results[0], str): - from click.shell_completion import CompletionItem - - results = [CompletionItem(c) for c in results] - - return t.cast("list[CompletionItem]", results) - - return self.type.shell_complete(ctx, self, incomplete) - - -class Option(Parameter): - """Options are usually optional values on the command line and - have some extra features that arguments don't have. - - All other parameters are passed onwards to the parameter constructor. - - :param show_default: Show the default value for this option in its - help text. Values are not shown by default, unless - :attr:`Context.show_default` is ``True``. If this value is a - string, it shows that string in parentheses instead of the - actual value. This is particularly useful for dynamic options. - For single option boolean flags, the default remains hidden if - its value is ``False``. - :param show_envvar: Controls if an environment variable should be - shown on the help page and error messages. - Normally, environment variables are not shown. - :param prompt: If set to ``True`` or a non empty string then the - user will be prompted for input. If set to ``True`` the prompt - will be the option name capitalized. A deprecated option cannot be - prompted. - :param confirmation_prompt: Prompt a second time to confirm the - value if it was prompted for. Can be set to a string instead of - ``True`` to customize the message. - :param prompt_required: If set to ``False``, the user will be - prompted for input only when the option was specified as a flag - without a value. - :param hide_input: If this is ``True`` then the input on the prompt - will be hidden from the user. This is useful for password input. - :param is_flag: forces this option to act as a flag. The default is - auto detection. - :param flag_value: which value should be used for this flag if it's - enabled. This is set to a boolean automatically if - the option string contains a slash to mark two options. - :param multiple: if this is set to `True` then the argument is accepted - multiple times and recorded. This is similar to ``nargs`` - in how it works but supports arbitrary number of - arguments. - :param count: this flag makes an option increment an integer. - :param allow_from_autoenv: if this is enabled then the value of this - parameter will be pulled from an environment - variable in case a prefix is defined on the - context. - :param help: the help string. - :param hidden: hide this option from help outputs. - :param attrs: Other command arguments described in :class:`Parameter`. - - .. versionchanged:: 8.2 - ``envvar`` used with ``flag_value`` will always use the ``flag_value``, - previously it would use the value of the environment variable. - - .. versionchanged:: 8.1 - Help text indentation is cleaned here instead of only in the - ``@option`` decorator. - - .. versionchanged:: 8.1 - The ``show_default`` parameter overrides - ``Context.show_default``. - - .. versionchanged:: 8.1 - The default of a single option boolean flag is not shown if the - default value is ``False``. - - .. versionchanged:: 8.0.1 - ``type`` is detected from ``flag_value`` if given. - """ - - param_type_name = "option" - - def __init__( - self, - param_decls: cabc.Sequence[str] | None = None, - show_default: bool | str | None = None, - prompt: bool | str = False, - confirmation_prompt: bool | str = False, - prompt_required: bool = True, - hide_input: bool = False, - is_flag: bool | None = None, - flag_value: t.Any = UNSET, - multiple: bool = False, - count: bool = False, - allow_from_autoenv: bool = True, - type: types.ParamType | t.Any | None = None, - help: str | None = None, - hidden: bool = False, - show_choices: bool = True, - show_envvar: bool = False, - deprecated: bool | str = False, - **attrs: t.Any, - ) -> None: - if help: - help = inspect.cleandoc(help) - - super().__init__( - param_decls, type=type, multiple=multiple, deprecated=deprecated, **attrs - ) - - if prompt is True: - if self.name is None: - raise TypeError("'name' is required with 'prompt=True'.") - - prompt_text: str | None = self.name.replace("_", " ").capitalize() - elif prompt is False: - prompt_text = None - else: - prompt_text = prompt - - if deprecated: - deprecated_message = ( - f"(DEPRECATED: {deprecated})" - if isinstance(deprecated, str) - else "(DEPRECATED)" - ) - help = help + deprecated_message if help is not None else deprecated_message - - self.prompt = prompt_text - self.confirmation_prompt = confirmation_prompt - self.prompt_required = prompt_required - self.hide_input = hide_input - self.hidden = hidden - - # The _flag_needs_value property tells the parser that this option is a flag - # that cannot be used standalone and needs a value. With this information, the - # parser can determine whether to consider the next user-provided argument in - # the CLI as a value for this flag or as a new option. - # If prompt is enabled but not required, then it opens the possibility for the - # option to gets its value from the user. - self._flag_needs_value = self.prompt is not None and not self.prompt_required - - # Auto-detect if this is a flag or not. - if is_flag is None: - # Implicitly a flag because flag_value was set. - if flag_value is not UNSET: - is_flag = True - # Not a flag, but when used as a flag it shows a prompt. - elif self._flag_needs_value: - is_flag = False - # Implicitly a flag because secondary options names were given. - elif self.secondary_opts: - is_flag = True - - # The option is explicitly not a flag, but to determine whether or not it needs - # value, we need to check if `flag_value` or `default` was set. Either one is - # sufficient. - # Ref: https://github.com/pallets/click/issues/3084 - elif is_flag is False and not self._flag_needs_value: - self._flag_needs_value = flag_value is not UNSET or self.default is UNSET - - if is_flag: - # Set missing default for flags if not explicitly required or prompted. - if self.default is UNSET and not self.required and not self.prompt: - if multiple: - self.default = () - - # Auto-detect the type of the flag based on the flag_value. - if type is None: - # A flag without a flag_value is a boolean flag. - if flag_value is UNSET: - self.type: types.ParamType = types.BoolParamType() - # If the flag value is a boolean, use BoolParamType. - elif isinstance(flag_value, bool): - self.type = types.BoolParamType() - # Otherwise, guess the type from the flag value. - else: - self.type = types.convert_type(None, flag_value) - - self.is_flag: bool = bool(is_flag) - self.is_bool_flag: bool = bool( - is_flag and isinstance(self.type, types.BoolParamType) - ) - self.flag_value: t.Any = flag_value - - # Set boolean flag default to False if unset and not required. - if self.is_bool_flag: - if self.default is UNSET and not self.required: - self.default = False - - # The alignement of default to the flag_value is resolved lazily in - # get_default() to prevent callable flag_values (like classes) from - # being instantiated. Refs: - # https://github.com/pallets/click/issues/3121 - # https://github.com/pallets/click/issues/3024#issuecomment-3146199461 - # https://github.com/pallets/click/pull/3030/commits/06847da - - # Set the default flag_value if it is not set. - if self.flag_value is UNSET: - if self.is_flag: - self.flag_value = True - else: - self.flag_value = None - - # Counting. - self.count = count - if count: - if type is None: - self.type = types.IntRange(min=0) - if self.default is UNSET: - self.default = 0 - - self.allow_from_autoenv = allow_from_autoenv - self.help = help - self.show_default = show_default - self.show_choices = show_choices - self.show_envvar = show_envvar - - if __debug__: - if deprecated and prompt: - raise ValueError("`deprecated` options cannot use `prompt`.") - - if self.nargs == -1: - raise TypeError("nargs=-1 is not supported for options.") - - if not self.is_bool_flag and self.secondary_opts: - raise TypeError("Secondary flag is not valid for non-boolean flag.") - - if self.is_bool_flag and self.hide_input and self.prompt is not None: - raise TypeError( - "'prompt' with 'hide_input' is not valid for boolean flag." - ) - - if self.count: - if self.multiple: - raise TypeError("'count' is not valid with 'multiple'.") - - if self.is_flag: - raise TypeError("'count' is not valid with 'is_flag'.") - - def to_info_dict(self) -> dict[str, t.Any]: - """ - .. versionchanged:: 8.3.0 - Returns ``None`` for the :attr:`flag_value` if it was not set. - """ - info_dict = super().to_info_dict() - info_dict.update( - help=self.help, - prompt=self.prompt, - is_flag=self.is_flag, - # We explicitly hide the :attr:`UNSET` value to the user, as we choose to - # make it an implementation detail. And because ``to_info_dict`` has been - # designed for documentation purposes, we return ``None`` instead. - flag_value=self.flag_value if self.flag_value is not UNSET else None, - count=self.count, - hidden=self.hidden, - ) - return info_dict - - def get_default( - self, ctx: Context, call: bool = True - ) -> t.Any | t.Callable[[], t.Any] | None: - value = super().get_default(ctx, call=False) - - # Lazily resolve default=True to flag_value. Doing this here - # (instead of eagerly in __init__) prevents callable flag_values - # (like classes) from being instantiated by the callable check below. - # https://github.com/pallets/click/issues/3121 - if value is True and self.is_flag: - value = self.flag_value - elif call and callable(value): - value = value() - - return value - - def get_error_hint(self, ctx: Context) -> str: - result = super().get_error_hint(ctx) - if self.show_envvar and self.envvar is not None: - result += f" (env var: '{self.envvar}')" - return result - - def _parse_decls( - self, decls: cabc.Sequence[str], expose_value: bool - ) -> tuple[str | None, list[str], list[str]]: - opts = [] - secondary_opts = [] - name = None - possible_names = [] - - for decl in decls: - if decl.isidentifier(): - if name is not None: - raise TypeError(f"Name '{name}' defined twice") - name = decl - else: - split_char = ";" if decl[:1] == "/" else "/" - if split_char in decl: - first, second = decl.split(split_char, 1) - first = first.rstrip() - if first: - possible_names.append(_split_opt(first)) - opts.append(first) - second = second.lstrip() - if second: - secondary_opts.append(second.lstrip()) - if first == second: - raise ValueError( - f"Boolean option {decl!r} cannot use the" - " same flag for true/false." - ) - else: - possible_names.append(_split_opt(decl)) - opts.append(decl) - - if name is None and possible_names: - possible_names.sort(key=lambda x: -len(x[0])) # group long options first - name = possible_names[0][1].replace("-", "_").lower() - if not name.isidentifier(): - name = None - - if name is None: - if not expose_value: - return None, opts, secondary_opts - raise TypeError( - f"Could not determine name for option with declarations {decls!r}" - ) - - if not opts and not secondary_opts: - raise TypeError( - f"No options defined but a name was passed ({name})." - " Did you mean to declare an argument instead? Did" - f" you mean to pass '--{name}'?" - ) - - return name, opts, secondary_opts - - def add_to_parser(self, parser: _OptionParser, ctx: Context) -> None: - if self.multiple: - action = "append" - elif self.count: - action = "count" - else: - action = "store" - - if self.is_flag: - action = f"{action}_const" - - if self.is_bool_flag and self.secondary_opts: - parser.add_option( - obj=self, opts=self.opts, dest=self.name, action=action, const=True - ) - parser.add_option( - obj=self, - opts=self.secondary_opts, - dest=self.name, - action=action, - const=False, - ) - else: - parser.add_option( - obj=self, - opts=self.opts, - dest=self.name, - action=action, - const=self.flag_value, - ) - else: - parser.add_option( - obj=self, - opts=self.opts, - dest=self.name, - action=action, - nargs=self.nargs, - ) - - def get_help_record(self, ctx: Context) -> tuple[str, str] | None: - if self.hidden: - return None - - any_prefix_is_slash = False - - def _write_opts(opts: cabc.Sequence[str]) -> str: - nonlocal any_prefix_is_slash - - rv, any_slashes = join_options(opts) - - if any_slashes: - any_prefix_is_slash = True - - if not self.is_flag and not self.count: - rv += f" {self.make_metavar(ctx=ctx)}" - - return rv - - rv = [_write_opts(self.opts)] - - if self.secondary_opts: - rv.append(_write_opts(self.secondary_opts)) - - help = self.help or "" - - extra = self.get_help_extra(ctx) - extra_items = [] - if "envvars" in extra: - extra_items.append( - _("env var: {var}").format(var=", ".join(extra["envvars"])) - ) - if "default" in extra: - extra_items.append(_("default: {default}").format(default=extra["default"])) - if "range" in extra: - extra_items.append(extra["range"]) - if "required" in extra: - extra_items.append(_(extra["required"])) - - if extra_items: - extra_str = "; ".join(extra_items) - help = f"{help} [{extra_str}]" if help else f"[{extra_str}]" - - return ("; " if any_prefix_is_slash else " / ").join(rv), help - - def get_help_extra(self, ctx: Context) -> types.OptionHelpExtra: - extra: types.OptionHelpExtra = {} - - if self.show_envvar: - envvar = self.envvar - - if envvar is None: - if ( - self.allow_from_autoenv - and ctx.auto_envvar_prefix is not None - and self.name is not None - ): - envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" - - if envvar is not None: - if isinstance(envvar, str): - extra["envvars"] = (envvar,) - else: - extra["envvars"] = tuple(str(d) for d in envvar) - - # Temporarily enable resilient parsing to avoid type casting - # failing for the default. Might be possible to extend this to - # help formatting in general. - resilient = ctx.resilient_parsing - ctx.resilient_parsing = True - - try: - default_value = self.get_default(ctx, call=False) - finally: - ctx.resilient_parsing = resilient - - show_default = False - show_default_is_str = False - - if self.show_default is not None: - if isinstance(self.show_default, str): - show_default_is_str = show_default = True - else: - show_default = self.show_default - elif ctx.show_default is not None: - show_default = ctx.show_default - - if show_default_is_str or ( - show_default and (default_value not in (None, UNSET)) - ): - if show_default_is_str: - default_string = f"({self.show_default})" - elif isinstance(default_value, (list, tuple)): - default_string = ", ".join(str(d) for d in default_value) - elif isinstance(default_value, enum.Enum): - default_string = default_value.name - elif inspect.isfunction(default_value): - default_string = _("(dynamic)") - elif self.is_bool_flag and self.secondary_opts: - # For boolean flags that have distinct True/False opts, - # use the opt without prefix instead of the value. - default_string = _split_opt( - (self.opts if default_value else self.secondary_opts)[0] - )[1] - elif self.is_bool_flag and not self.secondary_opts and not default_value: - default_string = "" - elif default_value == "": - default_string = '""' - else: - default_string = str(default_value) - - if default_string: - extra["default"] = default_string - - if ( - isinstance(self.type, types._NumberRangeBase) - # skip count with default range type - and not (self.count and self.type.min == 0 and self.type.max is None) - ): - range_str = self.type._describe_range() - - if range_str: - extra["range"] = range_str - - if self.required: - extra["required"] = "required" - - return extra - - def prompt_for_value(self, ctx: Context) -> t.Any: - """This is an alternative flow that can be activated in the full - value processing if a value does not exist. It will prompt the - user until a valid value exists and then returns the processed - value as result. - """ - assert self.prompt is not None - - # Calculate the default before prompting anything to lock in the value before - # attempting any user interaction. - default = self.get_default(ctx) - - # A boolean flag can use a simplified [y/n] confirmation prompt. - if self.is_bool_flag: - # If we have no boolean default, we force the user to explicitly provide - # one. - if default in (UNSET, None): - default = None - # Nothing prevent you to declare an option that is simultaneously: - # 1) auto-detected as a boolean flag, - # 2) allowed to prompt, and - # 3) still declare a non-boolean default. - # This forced casting into a boolean is necessary to align any non-boolean - # default to the prompt, which is going to be a [y/n]-style confirmation - # because the option is still a boolean flag. That way, instead of [y/n], - # we get [Y/n] or [y/N] depending on the truthy value of the default. - # Refs: https://github.com/pallets/click/pull/3030#discussion_r2289180249 - else: - default = bool(default) - return confirm(self.prompt, default) - - # If show_default is set to True/False, provide this to `prompt` as well. For - # non-bool values of `show_default`, we use `prompt`'s default behavior - prompt_kwargs: t.Any = {} - if isinstance(self.show_default, bool): - prompt_kwargs["show_default"] = self.show_default - - return prompt( - self.prompt, - # Use ``None`` to inform the prompt() function to reiterate until a valid - # value is provided by the user if we have no default. - default=None if default is UNSET else default, - type=self.type, - hide_input=self.hide_input, - show_choices=self.show_choices, - confirmation_prompt=self.confirmation_prompt, - value_proc=lambda x: self.process_value(ctx, x), - **prompt_kwargs, - ) - - def resolve_envvar_value(self, ctx: Context) -> str | None: - """:class:`Option` resolves its environment variable the same way as - :func:`Parameter.resolve_envvar_value`, but it also supports - :attr:`Context.auto_envvar_prefix`. If we could not find an environment from - the :attr:`envvar` property, we fallback on :attr:`Context.auto_envvar_prefix` - to build dynamiccaly the environment variable name using the - :python:`{ctx.auto_envvar_prefix}_{self.name.upper()}` template. - - :meta private: - """ - rv = super().resolve_envvar_value(ctx) - - if rv is not None: - return rv - - if ( - self.allow_from_autoenv - and ctx.auto_envvar_prefix is not None - and self.name is not None - ): - envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" - rv = os.environ.get(envvar) - - if rv: - return rv - - return None - - def value_from_envvar(self, ctx: Context) -> t.Any: - """For :class:`Option`, this method processes the raw environment variable - string the same way as :func:`Parameter.value_from_envvar` does. - - But in the case of non-boolean flags, the value is analyzed to determine if the - flag is activated or not, and returns a boolean of its activation, or the - :attr:`flag_value` if the latter is set. - - This method also takes care of repeated options (i.e. options with - :attr:`multiple` set to ``True``). - - :meta private: - """ - rv = self.resolve_envvar_value(ctx) - - # Absent environment variable or an empty string is interpreted as unset. - if rv is None: - return None - - # Non-boolean flags are more liberal in what they accept. But a flag being a - # flag, its envvar value still needs to be analyzed to determine if the flag is - # activated or not. - if self.is_flag and not self.is_bool_flag: - # If the flag_value is set and match the envvar value, return it - # directly. - if self.flag_value is not UNSET and rv == self.flag_value: - return self.flag_value - # Analyze the envvar value as a boolean to know if the flag is - # activated or not. - return types.BoolParamType.str_to_bool(rv) - - # Split the envvar value if it is allowed to be repeated. - value_depth = (self.nargs != 1) + bool(self.multiple) - if value_depth > 0: - multi_rv = self.type.split_envvar_value(rv) - if self.multiple and self.nargs != 1: - multi_rv = batch(multi_rv, self.nargs) # type: ignore[assignment] - - return multi_rv - - return rv - - def consume_value( - self, ctx: Context, opts: cabc.Mapping[str, Parameter] - ) -> tuple[t.Any, ParameterSource]: - """For :class:`Option`, the value can be collected from an interactive prompt - if the option is a flag that needs a value (and the :attr:`prompt` property is - set). - - Additionally, this method handles flag option that are activated without a - value, in which case the :attr:`flag_value` is returned. - - :meta private: - """ - value, source = super().consume_value(ctx, opts) - - # The parser will emit a sentinel value if the option is allowed to as a flag - # without a value. - if value is FLAG_NEEDS_VALUE: - # If the option allows for a prompt, we start an interaction with the user. - if self.prompt is not None and not ctx.resilient_parsing: - value = self.prompt_for_value(ctx) - source = ParameterSource.PROMPT - # Else the flag takes its flag_value as value. - else: - value = self.flag_value - source = ParameterSource.COMMANDLINE - - # A flag which is activated always returns the flag value, unless the value - # comes from the explicitly sets default. - elif ( - self.is_flag - and value is True - and not self.is_bool_flag - and source not in (ParameterSource.DEFAULT, ParameterSource.DEFAULT_MAP) - ): - value = self.flag_value - - # Re-interpret a multiple option which has been sent as-is by the parser. - # Here we replace each occurrence of value-less flags (marked by the - # FLAG_NEEDS_VALUE sentinel) with the flag_value. - elif ( - self.multiple - and value is not UNSET - and source not in (ParameterSource.DEFAULT, ParameterSource.DEFAULT_MAP) - and any(v is FLAG_NEEDS_VALUE for v in value) - ): - value = [self.flag_value if v is FLAG_NEEDS_VALUE else v for v in value] - source = ParameterSource.COMMANDLINE - - # The value wasn't set, or used the param's default, prompt for one to the user - # if prompting is enabled. - elif ( - ( - value is UNSET - or source in (ParameterSource.DEFAULT, ParameterSource.DEFAULT_MAP) - ) - and self.prompt is not None - and (self.required or self.prompt_required) - and not ctx.resilient_parsing - ): - value = self.prompt_for_value(ctx) - source = ParameterSource.PROMPT - - return value, source - - def process_value(self, ctx: Context, value: t.Any) -> t.Any: - # process_value has to be overridden on Options in order to capture - # `value == UNSET` cases before `type_cast_value()` gets called. - # - # Refs: - # https://github.com/pallets/click/issues/3069 - if self.is_flag and not self.required and self.is_bool_flag and value is UNSET: - value = False - - if self.callback is not None: - value = self.callback(ctx, self, value) - - return value - - # in the normal case, rely on Parameter.process_value - return super().process_value(ctx, value) - - -class Argument(Parameter): - """Arguments are positional parameters to a command. They generally - provide fewer features than options but can have infinite ``nargs`` - and are required by default. - - All parameters are passed onwards to the constructor of :class:`Parameter`. - """ - - param_type_name = "argument" - - def __init__( - self, - param_decls: cabc.Sequence[str], - required: bool | None = None, - **attrs: t.Any, - ) -> None: - # Auto-detect the requirement status of the argument if not explicitly set. - if required is None: - # The argument gets automatically required if it has no explicit default - # value set and is setup to match at least one value. - if attrs.get("default", UNSET) is UNSET: - required = attrs.get("nargs", 1) > 0 - # If the argument has a default value, it is not required. - else: - required = False - - if "multiple" in attrs: - raise TypeError("__init__() got an unexpected keyword argument 'multiple'.") - - super().__init__(param_decls, required=required, **attrs) - - @property - def human_readable_name(self) -> str: - if self.metavar is not None: - return self.metavar - return self.name.upper() # type: ignore - - def make_metavar(self, ctx: Context) -> str: - if self.metavar is not None: - return self.metavar - var = self.type.get_metavar(param=self, ctx=ctx) - if not var: - var = self.name.upper() # type: ignore - if self.deprecated: - var += "!" - if not self.required: - var = f"[{var}]" - if self.nargs != 1: - var += "..." - return var - - def _parse_decls( - self, decls: cabc.Sequence[str], expose_value: bool - ) -> tuple[str | None, list[str], list[str]]: - if not decls: - if not expose_value: - return None, [], [] - raise TypeError("Argument is marked as exposed, but does not have a name.") - if len(decls) == 1: - name = arg = decls[0] - name = name.replace("-", "_").lower() - else: - raise TypeError( - "Arguments take exactly one parameter declaration, got" - f" {len(decls)}: {decls}." - ) - return name, [arg], [] - - def get_usage_pieces(self, ctx: Context) -> list[str]: - return [self.make_metavar(ctx)] - - def get_error_hint(self, ctx: Context) -> str: - return f"'{self.make_metavar(ctx)}'" - - def add_to_parser(self, parser: _OptionParser, ctx: Context) -> None: - parser.add_argument(dest=self.name, nargs=self.nargs, obj=self) - - -def __getattr__(name: str) -> object: - import warnings - - if name == "BaseCommand": - warnings.warn( - "'BaseCommand' is deprecated and will be removed in Click 9.0. Use" - " 'Command' instead.", - DeprecationWarning, - stacklevel=2, - ) - return _BaseCommand - - if name == "MultiCommand": - warnings.warn( - "'MultiCommand' is deprecated and will be removed in Click 9.0. Use" - " 'Group' instead.", - DeprecationWarning, - stacklevel=2, - ) - return _MultiCommand - - raise AttributeError(name) diff --git a/venv/lib/python3.12/site-packages/click/decorators.py b/venv/lib/python3.12/site-packages/click/decorators.py deleted file mode 100644 index 21f4c34..0000000 --- a/venv/lib/python3.12/site-packages/click/decorators.py +++ /dev/null @@ -1,551 +0,0 @@ -from __future__ import annotations - -import inspect -import typing as t -from functools import update_wrapper -from gettext import gettext as _ - -from .core import Argument -from .core import Command -from .core import Context -from .core import Group -from .core import Option -from .core import Parameter -from .globals import get_current_context -from .utils import echo - -if t.TYPE_CHECKING: - import typing_extensions as te - - P = te.ParamSpec("P") - -R = t.TypeVar("R") -T = t.TypeVar("T") -_AnyCallable = t.Callable[..., t.Any] -FC = t.TypeVar("FC", bound="_AnyCallable | Command") - - -def pass_context(f: t.Callable[te.Concatenate[Context, P], R]) -> t.Callable[P, R]: - """Marks a callback as wanting to receive the current context - object as first argument. - """ - - def new_func(*args: P.args, **kwargs: P.kwargs) -> R: - return f(get_current_context(), *args, **kwargs) - - return update_wrapper(new_func, f) - - -def pass_obj(f: t.Callable[te.Concatenate[T, P], R]) -> t.Callable[P, R]: - """Similar to :func:`pass_context`, but only pass the object on the - context onwards (:attr:`Context.obj`). This is useful if that object - represents the state of a nested system. - """ - - def new_func(*args: P.args, **kwargs: P.kwargs) -> R: - return f(get_current_context().obj, *args, **kwargs) - - return update_wrapper(new_func, f) - - -def make_pass_decorator( - object_type: type[T], ensure: bool = False -) -> t.Callable[[t.Callable[te.Concatenate[T, P], R]], t.Callable[P, R]]: - """Given an object type this creates a decorator that will work - similar to :func:`pass_obj` but instead of passing the object of the - current context, it will find the innermost context of type - :func:`object_type`. - - This generates a decorator that works roughly like this:: - - from functools import update_wrapper - - def decorator(f): - @pass_context - def new_func(ctx, *args, **kwargs): - obj = ctx.find_object(object_type) - return ctx.invoke(f, obj, *args, **kwargs) - return update_wrapper(new_func, f) - return decorator - - :param object_type: the type of the object to pass. - :param ensure: if set to `True`, a new object will be created and - remembered on the context if it's not there yet. - """ - - def decorator(f: t.Callable[te.Concatenate[T, P], R]) -> t.Callable[P, R]: - def new_func(*args: P.args, **kwargs: P.kwargs) -> R: - ctx = get_current_context() - - obj: T | None - if ensure: - obj = ctx.ensure_object(object_type) - else: - obj = ctx.find_object(object_type) - - if obj is None: - raise RuntimeError( - "Managed to invoke callback without a context" - f" object of type {object_type.__name__!r}" - " existing." - ) - - return ctx.invoke(f, obj, *args, **kwargs) - - return update_wrapper(new_func, f) - - return decorator - - -def pass_meta_key( - key: str, *, doc_description: str | None = None -) -> t.Callable[[t.Callable[te.Concatenate[T, P], R]], t.Callable[P, R]]: - """Create a decorator that passes a key from - :attr:`click.Context.meta` as the first argument to the decorated - function. - - :param key: Key in ``Context.meta`` to pass. - :param doc_description: Description of the object being passed, - inserted into the decorator's docstring. Defaults to "the 'key' - key from Context.meta". - - .. versionadded:: 8.0 - """ - - def decorator(f: t.Callable[te.Concatenate[T, P], R]) -> t.Callable[P, R]: - def new_func(*args: P.args, **kwargs: P.kwargs) -> R: - ctx = get_current_context() - obj = ctx.meta[key] - return ctx.invoke(f, obj, *args, **kwargs) - - return update_wrapper(new_func, f) - - if doc_description is None: - doc_description = f"the {key!r} key from :attr:`click.Context.meta`" - - decorator.__doc__ = ( - f"Decorator that passes {doc_description} as the first argument" - " to the decorated function." - ) - return decorator - - -CmdType = t.TypeVar("CmdType", bound=Command) - - -# variant: no call, directly as decorator for a function. -@t.overload -def command(name: _AnyCallable) -> Command: ... - - -# variant: with positional name and with positional or keyword cls argument: -# @command(namearg, CommandCls, ...) or @command(namearg, cls=CommandCls, ...) -@t.overload -def command( - name: str | None, - cls: type[CmdType], - **attrs: t.Any, -) -> t.Callable[[_AnyCallable], CmdType]: ... - - -# variant: name omitted, cls _must_ be a keyword argument, @command(cls=CommandCls, ...) -@t.overload -def command( - name: None = None, - *, - cls: type[CmdType], - **attrs: t.Any, -) -> t.Callable[[_AnyCallable], CmdType]: ... - - -# variant: with optional string name, no cls argument provided. -@t.overload -def command( - name: str | None = ..., cls: None = None, **attrs: t.Any -) -> t.Callable[[_AnyCallable], Command]: ... - - -def command( - name: str | _AnyCallable | None = None, - cls: type[CmdType] | None = None, - **attrs: t.Any, -) -> Command | t.Callable[[_AnyCallable], Command | CmdType]: - r"""Creates a new :class:`Command` and uses the decorated function as - callback. This will also automatically attach all decorated - :func:`option`\s and :func:`argument`\s as parameters to the command. - - The name of the command defaults to the name of the function, converted to - lowercase, with underscores ``_`` replaced by dashes ``-``, and the suffixes - ``_command``, ``_cmd``, ``_group``, and ``_grp`` are removed. For example, - ``init_data_command`` becomes ``init-data``. - - All keyword arguments are forwarded to the underlying command class. - For the ``params`` argument, any decorated params are appended to - the end of the list. - - Once decorated the function turns into a :class:`Command` instance - that can be invoked as a command line utility or be attached to a - command :class:`Group`. - - :param name: The name of the command. Defaults to modifying the function's - name as described above. - :param cls: The command class to create. Defaults to :class:`Command`. - - .. versionchanged:: 8.2 - The suffixes ``_command``, ``_cmd``, ``_group``, and ``_grp`` are - removed when generating the name. - - .. versionchanged:: 8.1 - This decorator can be applied without parentheses. - - .. versionchanged:: 8.1 - The ``params`` argument can be used. Decorated params are - appended to the end of the list. - """ - - func: t.Callable[[_AnyCallable], t.Any] | None = None - - if callable(name): - func = name - name = None - assert cls is None, "Use 'command(cls=cls)(callable)' to specify a class." - assert not attrs, "Use 'command(**kwargs)(callable)' to provide arguments." - - if cls is None: - cls = t.cast("type[CmdType]", Command) - - def decorator(f: _AnyCallable) -> CmdType: - if isinstance(f, Command): - raise TypeError("Attempted to convert a callback into a command twice.") - - attr_params = attrs.pop("params", None) - params = attr_params if attr_params is not None else [] - - try: - decorator_params = f.__click_params__ # type: ignore - except AttributeError: - pass - else: - del f.__click_params__ # type: ignore - params.extend(reversed(decorator_params)) - - if attrs.get("help") is None: - attrs["help"] = f.__doc__ - - if t.TYPE_CHECKING: - assert cls is not None - assert not callable(name) - - if name is not None: - cmd_name = name - else: - cmd_name = f.__name__.lower().replace("_", "-") - cmd_left, sep, suffix = cmd_name.rpartition("-") - - if sep and suffix in {"command", "cmd", "group", "grp"}: - cmd_name = cmd_left - - cmd = cls(name=cmd_name, callback=f, params=params, **attrs) - cmd.__doc__ = f.__doc__ - return cmd - - if func is not None: - return decorator(func) - - return decorator - - -GrpType = t.TypeVar("GrpType", bound=Group) - - -# variant: no call, directly as decorator for a function. -@t.overload -def group(name: _AnyCallable) -> Group: ... - - -# variant: with positional name and with positional or keyword cls argument: -# @group(namearg, GroupCls, ...) or @group(namearg, cls=GroupCls, ...) -@t.overload -def group( - name: str | None, - cls: type[GrpType], - **attrs: t.Any, -) -> t.Callable[[_AnyCallable], GrpType]: ... - - -# variant: name omitted, cls _must_ be a keyword argument, @group(cmd=GroupCls, ...) -@t.overload -def group( - name: None = None, - *, - cls: type[GrpType], - **attrs: t.Any, -) -> t.Callable[[_AnyCallable], GrpType]: ... - - -# variant: with optional string name, no cls argument provided. -@t.overload -def group( - name: str | None = ..., cls: None = None, **attrs: t.Any -) -> t.Callable[[_AnyCallable], Group]: ... - - -def group( - name: str | _AnyCallable | None = None, - cls: type[GrpType] | None = None, - **attrs: t.Any, -) -> Group | t.Callable[[_AnyCallable], Group | GrpType]: - """Creates a new :class:`Group` with a function as callback. This - works otherwise the same as :func:`command` just that the `cls` - parameter is set to :class:`Group`. - - .. versionchanged:: 8.1 - This decorator can be applied without parentheses. - """ - if cls is None: - cls = t.cast("type[GrpType]", Group) - - if callable(name): - return command(cls=cls, **attrs)(name) - - return command(name, cls, **attrs) - - -def _param_memo(f: t.Callable[..., t.Any], param: Parameter) -> None: - if isinstance(f, Command): - f.params.append(param) - else: - if not hasattr(f, "__click_params__"): - f.__click_params__ = [] # type: ignore - - f.__click_params__.append(param) # type: ignore - - -def argument( - *param_decls: str, cls: type[Argument] | None = None, **attrs: t.Any -) -> t.Callable[[FC], FC]: - """Attaches an argument to the command. All positional arguments are - passed as parameter declarations to :class:`Argument`; all keyword - arguments are forwarded unchanged (except ``cls``). - This is equivalent to creating an :class:`Argument` instance manually - and attaching it to the :attr:`Command.params` list. - - For the default argument class, refer to :class:`Argument` and - :class:`Parameter` for descriptions of parameters. - - :param cls: the argument class to instantiate. This defaults to - :class:`Argument`. - :param param_decls: Passed as positional arguments to the constructor of - ``cls``. - :param attrs: Passed as keyword arguments to the constructor of ``cls``. - """ - if cls is None: - cls = Argument - - def decorator(f: FC) -> FC: - _param_memo(f, cls(param_decls, **attrs)) - return f - - return decorator - - -def option( - *param_decls: str, cls: type[Option] | None = None, **attrs: t.Any -) -> t.Callable[[FC], FC]: - """Attaches an option to the command. All positional arguments are - passed as parameter declarations to :class:`Option`; all keyword - arguments are forwarded unchanged (except ``cls``). - This is equivalent to creating an :class:`Option` instance manually - and attaching it to the :attr:`Command.params` list. - - For the default option class, refer to :class:`Option` and - :class:`Parameter` for descriptions of parameters. - - :param cls: the option class to instantiate. This defaults to - :class:`Option`. - :param param_decls: Passed as positional arguments to the constructor of - ``cls``. - :param attrs: Passed as keyword arguments to the constructor of ``cls``. - """ - if cls is None: - cls = Option - - def decorator(f: FC) -> FC: - _param_memo(f, cls(param_decls, **attrs)) - return f - - return decorator - - -def confirmation_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: - """Add a ``--yes`` option which shows a prompt before continuing if - not passed. If the prompt is declined, the program will exit. - - :param param_decls: One or more option names. Defaults to the single - value ``"--yes"``. - :param kwargs: Extra arguments are passed to :func:`option`. - """ - - def callback(ctx: Context, param: Parameter, value: bool) -> None: - if not value: - ctx.abort() - - if not param_decls: - param_decls = ("--yes",) - - kwargs.setdefault("is_flag", True) - kwargs.setdefault("callback", callback) - kwargs.setdefault("expose_value", False) - kwargs.setdefault("prompt", "Do you want to continue?") - kwargs.setdefault("help", "Confirm the action without prompting.") - return option(*param_decls, **kwargs) - - -def password_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: - """Add a ``--password`` option which prompts for a password, hiding - input and asking to enter the value again for confirmation. - - :param param_decls: One or more option names. Defaults to the single - value ``"--password"``. - :param kwargs: Extra arguments are passed to :func:`option`. - """ - if not param_decls: - param_decls = ("--password",) - - kwargs.setdefault("prompt", True) - kwargs.setdefault("confirmation_prompt", True) - kwargs.setdefault("hide_input", True) - return option(*param_decls, **kwargs) - - -def version_option( - version: str | None = None, - *param_decls: str, - package_name: str | None = None, - prog_name: str | None = None, - message: str | None = None, - **kwargs: t.Any, -) -> t.Callable[[FC], FC]: - """Add a ``--version`` option which immediately prints the version - number and exits the program. - - If ``version`` is not provided, Click will try to detect it using - :func:`importlib.metadata.version` to get the version for the - ``package_name``. - - If ``package_name`` is not provided, Click will try to detect it by - inspecting the stack frames. This will be used to detect the - version, so it must match the name of the installed package. - - :param version: The version number to show. If not provided, Click - will try to detect it. - :param param_decls: One or more option names. Defaults to the single - value ``"--version"``. - :param package_name: The package name to detect the version from. If - not provided, Click will try to detect it. - :param prog_name: The name of the CLI to show in the message. If not - provided, it will be detected from the command. - :param message: The message to show. The values ``%(prog)s``, - ``%(package)s``, and ``%(version)s`` are available. Defaults to - ``"%(prog)s, version %(version)s"``. - :param kwargs: Extra arguments are passed to :func:`option`. - :raise RuntimeError: ``version`` could not be detected. - - .. versionchanged:: 8.0 - Add the ``package_name`` parameter, and the ``%(package)s`` - value for messages. - - .. versionchanged:: 8.0 - Use :mod:`importlib.metadata` instead of ``pkg_resources``. The - version is detected based on the package name, not the entry - point name. The Python package name must match the installed - package name, or be passed with ``package_name=``. - """ - if message is None: - message = _("%(prog)s, version %(version)s") - - if version is None and package_name is None: - frame = inspect.currentframe() - f_back = frame.f_back if frame is not None else None - f_globals = f_back.f_globals if f_back is not None else None - # break reference cycle - # https://docs.python.org/3/library/inspect.html#the-interpreter-stack - del frame - - if f_globals is not None: - package_name = f_globals.get("__name__") - - if package_name == "__main__": - package_name = f_globals.get("__package__") - - if package_name: - package_name = package_name.partition(".")[0] - - def callback(ctx: Context, param: Parameter, value: bool) -> None: - if not value or ctx.resilient_parsing: - return - - nonlocal prog_name - nonlocal version - - if prog_name is None: - prog_name = ctx.find_root().info_name - - if version is None and package_name is not None: - import importlib.metadata - - try: - version = importlib.metadata.version(package_name) - except importlib.metadata.PackageNotFoundError: - raise RuntimeError( - f"{package_name!r} is not installed. Try passing" - " 'package_name' instead." - ) from None - - if version is None: - raise RuntimeError( - f"Could not determine the version for {package_name!r} automatically." - ) - - echo( - message % {"prog": prog_name, "package": package_name, "version": version}, - color=ctx.color, - ) - ctx.exit() - - if not param_decls: - param_decls = ("--version",) - - kwargs.setdefault("is_flag", True) - kwargs.setdefault("expose_value", False) - kwargs.setdefault("is_eager", True) - kwargs.setdefault("help", _("Show the version and exit.")) - kwargs["callback"] = callback - return option(*param_decls, **kwargs) - - -def help_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: - """Pre-configured ``--help`` option which immediately prints the help page - and exits the program. - - :param param_decls: One or more option names. Defaults to the single - value ``"--help"``. - :param kwargs: Extra arguments are passed to :func:`option`. - """ - - def show_help(ctx: Context, param: Parameter, value: bool) -> None: - """Callback that print the help page on ```` and exits.""" - if value and not ctx.resilient_parsing: - echo(ctx.get_help(), color=ctx.color) - ctx.exit() - - if not param_decls: - param_decls = ("--help",) - - kwargs.setdefault("is_flag", True) - kwargs.setdefault("expose_value", False) - kwargs.setdefault("is_eager", True) - kwargs.setdefault("help", _("Show this message and exit.")) - kwargs.setdefault("callback", show_help) - - return option(*param_decls, **kwargs) diff --git a/venv/lib/python3.12/site-packages/click/exceptions.py b/venv/lib/python3.12/site-packages/click/exceptions.py deleted file mode 100644 index 4d782ee..0000000 --- a/venv/lib/python3.12/site-packages/click/exceptions.py +++ /dev/null @@ -1,308 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import typing as t -from gettext import gettext as _ -from gettext import ngettext - -from ._compat import get_text_stderr -from .globals import resolve_color_default -from .utils import echo -from .utils import format_filename - -if t.TYPE_CHECKING: - from .core import Command - from .core import Context - from .core import Parameter - - -def _join_param_hints(param_hint: cabc.Sequence[str] | str | None) -> str | None: - if param_hint is not None and not isinstance(param_hint, str): - return " / ".join(repr(x) for x in param_hint) - - return param_hint - - -class ClickException(Exception): - """An exception that Click can handle and show to the user.""" - - #: The exit code for this exception. - exit_code = 1 - - def __init__(self, message: str) -> None: - super().__init__(message) - # The context will be removed by the time we print the message, so cache - # the color settings here to be used later on (in `show`) - self.show_color: bool | None = resolve_color_default() - self.message = message - - def format_message(self) -> str: - return self.message - - def __str__(self) -> str: - return self.message - - def show(self, file: t.IO[t.Any] | None = None) -> None: - if file is None: - file = get_text_stderr() - - echo( - _("Error: {message}").format(message=self.format_message()), - file=file, - color=self.show_color, - ) - - -class UsageError(ClickException): - """An internal exception that signals a usage error. This typically - aborts any further handling. - - :param message: the error message to display. - :param ctx: optionally the context that caused this error. Click will - fill in the context automatically in some situations. - """ - - exit_code = 2 - - def __init__(self, message: str, ctx: Context | None = None) -> None: - super().__init__(message) - self.ctx = ctx - self.cmd: Command | None = self.ctx.command if self.ctx else None - - def show(self, file: t.IO[t.Any] | None = None) -> None: - if file is None: - file = get_text_stderr() - color = None - hint = "" - if ( - self.ctx is not None - and self.ctx.command.get_help_option(self.ctx) is not None - ): - hint = _("Try '{command} {option}' for help.").format( - command=self.ctx.command_path, option=self.ctx.help_option_names[0] - ) - hint = f"{hint}\n" - if self.ctx is not None: - color = self.ctx.color - echo(f"{self.ctx.get_usage()}\n{hint}", file=file, color=color) - echo( - _("Error: {message}").format(message=self.format_message()), - file=file, - color=color, - ) - - -class BadParameter(UsageError): - """An exception that formats out a standardized error message for a - bad parameter. This is useful when thrown from a callback or type as - Click will attach contextual information to it (for instance, which - parameter it is). - - .. versionadded:: 2.0 - - :param param: the parameter object that caused this error. This can - be left out, and Click will attach this info itself - if possible. - :param param_hint: a string that shows up as parameter name. This - can be used as alternative to `param` in cases - where custom validation should happen. If it is - a string it's used as such, if it's a list then - each item is quoted and separated. - """ - - def __init__( - self, - message: str, - ctx: Context | None = None, - param: Parameter | None = None, - param_hint: cabc.Sequence[str] | str | None = None, - ) -> None: - super().__init__(message, ctx) - self.param = param - self.param_hint = param_hint - - def format_message(self) -> str: - if self.param_hint is not None: - param_hint = self.param_hint - elif self.param is not None: - param_hint = self.param.get_error_hint(self.ctx) # type: ignore - else: - return _("Invalid value: {message}").format(message=self.message) - - return _("Invalid value for {param_hint}: {message}").format( - param_hint=_join_param_hints(param_hint), message=self.message - ) - - -class MissingParameter(BadParameter): - """Raised if click required an option or argument but it was not - provided when invoking the script. - - .. versionadded:: 4.0 - - :param param_type: a string that indicates the type of the parameter. - The default is to inherit the parameter type from - the given `param`. Valid values are ``'parameter'``, - ``'option'`` or ``'argument'``. - """ - - def __init__( - self, - message: str | None = None, - ctx: Context | None = None, - param: Parameter | None = None, - param_hint: cabc.Sequence[str] | str | None = None, - param_type: str | None = None, - ) -> None: - super().__init__(message or "", ctx, param, param_hint) - self.param_type = param_type - - def format_message(self) -> str: - if self.param_hint is not None: - param_hint: cabc.Sequence[str] | str | None = self.param_hint - elif self.param is not None: - param_hint = self.param.get_error_hint(self.ctx) # type: ignore - else: - param_hint = None - - param_hint = _join_param_hints(param_hint) - param_hint = f" {param_hint}" if param_hint else "" - - param_type = self.param_type - if param_type is None and self.param is not None: - param_type = self.param.param_type_name - - msg = self.message - if self.param is not None: - msg_extra = self.param.type.get_missing_message( - param=self.param, ctx=self.ctx - ) - if msg_extra: - if msg: - msg += f". {msg_extra}" - else: - msg = msg_extra - - msg = f" {msg}" if msg else "" - - # Translate param_type for known types. - if param_type == "argument": - missing = _("Missing argument") - elif param_type == "option": - missing = _("Missing option") - elif param_type == "parameter": - missing = _("Missing parameter") - else: - missing = _("Missing {param_type}").format(param_type=param_type) - - return f"{missing}{param_hint}.{msg}" - - def __str__(self) -> str: - if not self.message: - param_name = self.param.name if self.param else None - return _("Missing parameter: {param_name}").format(param_name=param_name) - else: - return self.message - - -class NoSuchOption(UsageError): - """Raised if click attempted to handle an option that does not - exist. - - .. versionadded:: 4.0 - """ - - def __init__( - self, - option_name: str, - message: str | None = None, - possibilities: cabc.Sequence[str] | None = None, - ctx: Context | None = None, - ) -> None: - if message is None: - message = _("No such option: {name}").format(name=option_name) - - super().__init__(message, ctx) - self.option_name = option_name - self.possibilities = possibilities - - def format_message(self) -> str: - if not self.possibilities: - return self.message - - possibility_str = ", ".join(sorted(self.possibilities)) - suggest = ngettext( - "Did you mean {possibility}?", - "(Possible options: {possibilities})", - len(self.possibilities), - ).format(possibility=possibility_str, possibilities=possibility_str) - return f"{self.message} {suggest}" - - -class BadOptionUsage(UsageError): - """Raised if an option is generally supplied but the use of the option - was incorrect. This is for instance raised if the number of arguments - for an option is not correct. - - .. versionadded:: 4.0 - - :param option_name: the name of the option being used incorrectly. - """ - - def __init__( - self, option_name: str, message: str, ctx: Context | None = None - ) -> None: - super().__init__(message, ctx) - self.option_name = option_name - - -class BadArgumentUsage(UsageError): - """Raised if an argument is generally supplied but the use of the argument - was incorrect. This is for instance raised if the number of values - for an argument is not correct. - - .. versionadded:: 6.0 - """ - - -class NoArgsIsHelpError(UsageError): - def __init__(self, ctx: Context) -> None: - self.ctx: Context - super().__init__(ctx.get_help(), ctx=ctx) - - def show(self, file: t.IO[t.Any] | None = None) -> None: - echo(self.format_message(), file=file, err=True, color=self.ctx.color) - - -class FileError(ClickException): - """Raised if a file cannot be opened.""" - - def __init__(self, filename: str, hint: str | None = None) -> None: - if hint is None: - hint = _("unknown error") - - super().__init__(hint) - self.ui_filename: str = format_filename(filename) - self.filename = filename - - def format_message(self) -> str: - return _("Could not open file {filename!r}: {message}").format( - filename=self.ui_filename, message=self.message - ) - - -class Abort(RuntimeError): - """An internal signalling exception that signals Click to abort.""" - - -class Exit(RuntimeError): - """An exception that indicates that the application should exit with some - status code. - - :param code: the status code to exit with. - """ - - __slots__ = ("exit_code",) - - def __init__(self, code: int = 0) -> None: - self.exit_code: int = code diff --git a/venv/lib/python3.12/site-packages/click/formatting.py b/venv/lib/python3.12/site-packages/click/formatting.py deleted file mode 100644 index 0b64f83..0000000 --- a/venv/lib/python3.12/site-packages/click/formatting.py +++ /dev/null @@ -1,301 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -from contextlib import contextmanager -from gettext import gettext as _ - -from ._compat import term_len -from .parser import _split_opt - -# Can force a width. This is used by the test system -FORCED_WIDTH: int | None = None - - -def measure_table(rows: cabc.Iterable[tuple[str, str]]) -> tuple[int, ...]: - widths: dict[int, int] = {} - - for row in rows: - for idx, col in enumerate(row): - widths[idx] = max(widths.get(idx, 0), term_len(col)) - - return tuple(y for x, y in sorted(widths.items())) - - -def iter_rows( - rows: cabc.Iterable[tuple[str, str]], col_count: int -) -> cabc.Iterator[tuple[str, ...]]: - for row in rows: - yield row + ("",) * (col_count - len(row)) - - -def wrap_text( - text: str, - width: int = 78, - initial_indent: str = "", - subsequent_indent: str = "", - preserve_paragraphs: bool = False, -) -> str: - """A helper function that intelligently wraps text. By default, it - assumes that it operates on a single paragraph of text but if the - `preserve_paragraphs` parameter is provided it will intelligently - handle paragraphs (defined by two empty lines). - - If paragraphs are handled, a paragraph can be prefixed with an empty - line containing the ``\\b`` character (``\\x08``) to indicate that - no rewrapping should happen in that block. - - :param text: the text that should be rewrapped. - :param width: the maximum width for the text. - :param initial_indent: the initial indent that should be placed on the - first line as a string. - :param subsequent_indent: the indent string that should be placed on - each consecutive line. - :param preserve_paragraphs: if this flag is set then the wrapping will - intelligently handle paragraphs. - """ - from ._textwrap import TextWrapper - - text = text.expandtabs() - wrapper = TextWrapper( - width, - initial_indent=initial_indent, - subsequent_indent=subsequent_indent, - replace_whitespace=False, - ) - if not preserve_paragraphs: - return wrapper.fill(text) - - p: list[tuple[int, bool, str]] = [] - buf: list[str] = [] - indent = None - - def _flush_par() -> None: - if not buf: - return - if buf[0].strip() == "\b": - p.append((indent or 0, True, "\n".join(buf[1:]))) - else: - p.append((indent or 0, False, " ".join(buf))) - del buf[:] - - for line in text.splitlines(): - if not line: - _flush_par() - indent = None - else: - if indent is None: - orig_len = term_len(line) - line = line.lstrip() - indent = orig_len - term_len(line) - buf.append(line) - _flush_par() - - rv = [] - for indent, raw, text in p: - with wrapper.extra_indent(" " * indent): - if raw: - rv.append(wrapper.indent_only(text)) - else: - rv.append(wrapper.fill(text)) - - return "\n\n".join(rv) - - -class HelpFormatter: - """This class helps with formatting text-based help pages. It's - usually just needed for very special internal cases, but it's also - exposed so that developers can write their own fancy outputs. - - At present, it always writes into memory. - - :param indent_increment: the additional increment for each level. - :param width: the width for the text. This defaults to the terminal - width clamped to a maximum of 78. - """ - - def __init__( - self, - indent_increment: int = 2, - width: int | None = None, - max_width: int | None = None, - ) -> None: - self.indent_increment = indent_increment - if max_width is None: - max_width = 80 - if width is None: - import shutil - - width = FORCED_WIDTH - if width is None: - width = max(min(shutil.get_terminal_size().columns, max_width) - 2, 50) - self.width = width - self.current_indent: int = 0 - self.buffer: list[str] = [] - - def write(self, string: str) -> None: - """Writes a unicode string into the internal buffer.""" - self.buffer.append(string) - - def indent(self) -> None: - """Increases the indentation.""" - self.current_indent += self.indent_increment - - def dedent(self) -> None: - """Decreases the indentation.""" - self.current_indent -= self.indent_increment - - def write_usage(self, prog: str, args: str = "", prefix: str | None = None) -> None: - """Writes a usage line into the buffer. - - :param prog: the program name. - :param args: whitespace separated list of arguments. - :param prefix: The prefix for the first line. Defaults to - ``"Usage: "``. - """ - if prefix is None: - prefix = f"{_('Usage:')} " - - usage_prefix = f"{prefix:>{self.current_indent}}{prog} " - text_width = self.width - self.current_indent - - if text_width >= (term_len(usage_prefix) + 20): - # The arguments will fit to the right of the prefix. - indent = " " * term_len(usage_prefix) - self.write( - wrap_text( - args, - text_width, - initial_indent=usage_prefix, - subsequent_indent=indent, - ) - ) - else: - # The prefix is too long, put the arguments on the next line. - self.write(usage_prefix) - self.write("\n") - indent = " " * (max(self.current_indent, term_len(prefix)) + 4) - self.write( - wrap_text( - args, text_width, initial_indent=indent, subsequent_indent=indent - ) - ) - - self.write("\n") - - def write_heading(self, heading: str) -> None: - """Writes a heading into the buffer.""" - self.write(f"{'':>{self.current_indent}}{heading}:\n") - - def write_paragraph(self) -> None: - """Writes a paragraph into the buffer.""" - if self.buffer: - self.write("\n") - - def write_text(self, text: str) -> None: - """Writes re-indented text into the buffer. This rewraps and - preserves paragraphs. - """ - indent = " " * self.current_indent - self.write( - wrap_text( - text, - self.width, - initial_indent=indent, - subsequent_indent=indent, - preserve_paragraphs=True, - ) - ) - self.write("\n") - - def write_dl( - self, - rows: cabc.Sequence[tuple[str, str]], - col_max: int = 30, - col_spacing: int = 2, - ) -> None: - """Writes a definition list into the buffer. This is how options - and commands are usually formatted. - - :param rows: a list of two item tuples for the terms and values. - :param col_max: the maximum width of the first column. - :param col_spacing: the number of spaces between the first and - second column. - """ - rows = list(rows) - widths = measure_table(rows) - if len(widths) != 2: - raise TypeError("Expected two columns for definition list") - - first_col = min(widths[0], col_max) + col_spacing - - for first, second in iter_rows(rows, len(widths)): - self.write(f"{'':>{self.current_indent}}{first}") - if not second: - self.write("\n") - continue - if term_len(first) <= first_col - col_spacing: - self.write(" " * (first_col - term_len(first))) - else: - self.write("\n") - self.write(" " * (first_col + self.current_indent)) - - text_width = max(self.width - first_col - 2, 10) - wrapped_text = wrap_text(second, text_width, preserve_paragraphs=True) - lines = wrapped_text.splitlines() - - if lines: - self.write(f"{lines[0]}\n") - - for line in lines[1:]: - self.write(f"{'':>{first_col + self.current_indent}}{line}\n") - else: - self.write("\n") - - @contextmanager - def section(self, name: str) -> cabc.Iterator[None]: - """Helpful context manager that writes a paragraph, a heading, - and the indents. - - :param name: the section name that is written as heading. - """ - self.write_paragraph() - self.write_heading(name) - self.indent() - try: - yield - finally: - self.dedent() - - @contextmanager - def indentation(self) -> cabc.Iterator[None]: - """A context manager that increases the indentation.""" - self.indent() - try: - yield - finally: - self.dedent() - - def getvalue(self) -> str: - """Returns the buffer contents.""" - return "".join(self.buffer) - - -def join_options(options: cabc.Sequence[str]) -> tuple[str, bool]: - """Given a list of option strings this joins them in the most appropriate - way and returns them in the form ``(formatted_string, - any_prefix_is_slash)`` where the second item in the tuple is a flag that - indicates if any of the option prefixes was a slash. - """ - rv = [] - any_prefix_is_slash = False - - for opt in options: - prefix = _split_opt(opt)[0] - - if prefix == "/": - any_prefix_is_slash = True - - rv.append((len(prefix), opt)) - - rv.sort(key=lambda x: x[0]) - return ", ".join(x[1] for x in rv), any_prefix_is_slash diff --git a/venv/lib/python3.12/site-packages/click/globals.py b/venv/lib/python3.12/site-packages/click/globals.py deleted file mode 100644 index a2f9172..0000000 --- a/venv/lib/python3.12/site-packages/click/globals.py +++ /dev/null @@ -1,67 +0,0 @@ -from __future__ import annotations - -import typing as t -from threading import local - -if t.TYPE_CHECKING: - from .core import Context - -_local = local() - - -@t.overload -def get_current_context(silent: t.Literal[False] = False) -> Context: ... - - -@t.overload -def get_current_context(silent: bool = ...) -> Context | None: ... - - -def get_current_context(silent: bool = False) -> Context | None: - """Returns the current click context. This can be used as a way to - access the current context object from anywhere. This is a more implicit - alternative to the :func:`pass_context` decorator. This function is - primarily useful for helpers such as :func:`echo` which might be - interested in changing its behavior based on the current context. - - To push the current context, :meth:`Context.scope` can be used. - - .. versionadded:: 5.0 - - :param silent: if set to `True` the return value is `None` if no context - is available. The default behavior is to raise a - :exc:`RuntimeError`. - """ - try: - return t.cast("Context", _local.stack[-1]) - except (AttributeError, IndexError) as e: - if not silent: - raise RuntimeError("There is no active click context.") from e - - return None - - -def push_context(ctx: Context) -> None: - """Pushes a new context to the current stack.""" - _local.__dict__.setdefault("stack", []).append(ctx) - - -def pop_context() -> None: - """Removes the top level from the stack.""" - _local.stack.pop() - - -def resolve_color_default(color: bool | None = None) -> bool | None: - """Internal helper to get the default value of the color flag. If a - value is passed it's returned unchanged, otherwise it's looked up from - the current context. - """ - if color is not None: - return color - - ctx = get_current_context(silent=True) - - if ctx is not None: - return ctx.color - - return None diff --git a/venv/lib/python3.12/site-packages/click/parser.py b/venv/lib/python3.12/site-packages/click/parser.py deleted file mode 100644 index 1ea1f71..0000000 --- a/venv/lib/python3.12/site-packages/click/parser.py +++ /dev/null @@ -1,532 +0,0 @@ -""" -This module started out as largely a copy paste from the stdlib's -optparse module with the features removed that we do not need from -optparse because we implement them in Click on a higher level (for -instance type handling, help formatting and a lot more). - -The plan is to remove more and more from here over time. - -The reason this is a different module and not optparse from the stdlib -is that there are differences in 2.x and 3.x about the error messages -generated and optparse in the stdlib uses gettext for no good reason -and might cause us issues. - -Click uses parts of optparse written by Gregory P. Ward and maintained -by the Python Software Foundation. This is limited to code in parser.py. - -Copyright 2001-2006 Gregory P. Ward. All rights reserved. -Copyright 2002-2006 Python Software Foundation. All rights reserved. -""" - -# This code uses parts of optparse written by Gregory P. Ward and -# maintained by the Python Software Foundation. -# Copyright 2001-2006 Gregory P. Ward -# Copyright 2002-2006 Python Software Foundation -from __future__ import annotations - -import collections.abc as cabc -import typing as t -from collections import deque -from gettext import gettext as _ -from gettext import ngettext - -from ._utils import FLAG_NEEDS_VALUE -from ._utils import UNSET -from .exceptions import BadArgumentUsage -from .exceptions import BadOptionUsage -from .exceptions import NoSuchOption -from .exceptions import UsageError - -if t.TYPE_CHECKING: - from ._utils import T_FLAG_NEEDS_VALUE - from ._utils import T_UNSET - from .core import Argument as CoreArgument - from .core import Context - from .core import Option as CoreOption - from .core import Parameter as CoreParameter - -V = t.TypeVar("V") - - -def _unpack_args( - args: cabc.Sequence[str], nargs_spec: cabc.Sequence[int] -) -> tuple[cabc.Sequence[str | cabc.Sequence[str | None] | None], list[str]]: - """Given an iterable of arguments and an iterable of nargs specifications, - it returns a tuple with all the unpacked arguments at the first index - and all remaining arguments as the second. - - The nargs specification is the number of arguments that should be consumed - or `-1` to indicate that this position should eat up all the remainders. - - Missing items are filled with ``UNSET``. - """ - args = deque(args) - nargs_spec = deque(nargs_spec) - rv: list[str | tuple[str | T_UNSET, ...] | T_UNSET] = [] - spos: int | None = None - - def _fetch(c: deque[V]) -> V | T_UNSET: - try: - if spos is None: - return c.popleft() - else: - return c.pop() - except IndexError: - return UNSET - - while nargs_spec: - nargs = _fetch(nargs_spec) - - if nargs is None: - continue - - if nargs == 1: - rv.append(_fetch(args)) # type: ignore[arg-type] - elif nargs > 1: - x = [_fetch(args) for _ in range(nargs)] - - # If we're reversed, we're pulling in the arguments in reverse, - # so we need to turn them around. - if spos is not None: - x.reverse() - - rv.append(tuple(x)) - elif nargs < 0: - if spos is not None: - raise TypeError("Cannot have two nargs < 0") - - spos = len(rv) - rv.append(UNSET) - - # spos is the position of the wildcard (star). If it's not `None`, - # we fill it with the remainder. - if spos is not None: - rv[spos] = tuple(args) - args = [] - rv[spos + 1 :] = reversed(rv[spos + 1 :]) - - return tuple(rv), list(args) - - -def _split_opt(opt: str) -> tuple[str, str]: - first = opt[:1] - if first.isalnum(): - return "", opt - if opt[1:2] == first: - return opt[:2], opt[2:] - return first, opt[1:] - - -def _normalize_opt(opt: str, ctx: Context | None) -> str: - if ctx is None or ctx.token_normalize_func is None: - return opt - prefix, opt = _split_opt(opt) - return f"{prefix}{ctx.token_normalize_func(opt)}" - - -class _Option: - def __init__( - self, - obj: CoreOption, - opts: cabc.Sequence[str], - dest: str | None, - action: str | None = None, - nargs: int = 1, - const: t.Any | None = None, - ): - self._short_opts = [] - self._long_opts = [] - self.prefixes: set[str] = set() - - for opt in opts: - prefix, value = _split_opt(opt) - if not prefix: - raise ValueError(f"Invalid start character for option ({opt})") - self.prefixes.add(prefix[0]) - if len(prefix) == 1 and len(value) == 1: - self._short_opts.append(opt) - else: - self._long_opts.append(opt) - self.prefixes.add(prefix) - - if action is None: - action = "store" - - self.dest = dest - self.action = action - self.nargs = nargs - self.const = const - self.obj = obj - - @property - def takes_value(self) -> bool: - return self.action in ("store", "append") - - def process(self, value: t.Any, state: _ParsingState) -> None: - if self.action == "store": - state.opts[self.dest] = value # type: ignore - elif self.action == "store_const": - state.opts[self.dest] = self.const # type: ignore - elif self.action == "append": - state.opts.setdefault(self.dest, []).append(value) # type: ignore - elif self.action == "append_const": - state.opts.setdefault(self.dest, []).append(self.const) # type: ignore - elif self.action == "count": - state.opts[self.dest] = state.opts.get(self.dest, 0) + 1 # type: ignore - else: - raise ValueError(f"unknown action '{self.action}'") - state.order.append(self.obj) - - -class _Argument: - def __init__(self, obj: CoreArgument, dest: str | None, nargs: int = 1): - self.dest = dest - self.nargs = nargs - self.obj = obj - - def process( - self, - value: str | cabc.Sequence[str | None] | None | T_UNSET, - state: _ParsingState, - ) -> None: - if self.nargs > 1: - assert isinstance(value, cabc.Sequence) - holes = sum(1 for x in value if x is UNSET) - if holes == len(value): - value = UNSET - elif holes != 0: - raise BadArgumentUsage( - _("Argument {name!r} takes {nargs} values.").format( - name=self.dest, nargs=self.nargs - ) - ) - - # We failed to collect any argument value so we consider the argument as unset. - if value == (): - value = UNSET - - state.opts[self.dest] = value # type: ignore - state.order.append(self.obj) - - -class _ParsingState: - def __init__(self, rargs: list[str]) -> None: - self.opts: dict[str, t.Any] = {} - self.largs: list[str] = [] - self.rargs = rargs - self.order: list[CoreParameter] = [] - - -class _OptionParser: - """The option parser is an internal class that is ultimately used to - parse options and arguments. It's modelled after optparse and brings - a similar but vastly simplified API. It should generally not be used - directly as the high level Click classes wrap it for you. - - It's not nearly as extensible as optparse or argparse as it does not - implement features that are implemented on a higher level (such as - types or defaults). - - :param ctx: optionally the :class:`~click.Context` where this parser - should go with. - - .. deprecated:: 8.2 - Will be removed in Click 9.0. - """ - - def __init__(self, ctx: Context | None = None) -> None: - #: The :class:`~click.Context` for this parser. This might be - #: `None` for some advanced use cases. - self.ctx = ctx - #: This controls how the parser deals with interspersed arguments. - #: If this is set to `False`, the parser will stop on the first - #: non-option. Click uses this to implement nested subcommands - #: safely. - self.allow_interspersed_args: bool = True - #: This tells the parser how to deal with unknown options. By - #: default it will error out (which is sensible), but there is a - #: second mode where it will ignore it and continue processing - #: after shifting all the unknown options into the resulting args. - self.ignore_unknown_options: bool = False - - if ctx is not None: - self.allow_interspersed_args = ctx.allow_interspersed_args - self.ignore_unknown_options = ctx.ignore_unknown_options - - self._short_opt: dict[str, _Option] = {} - self._long_opt: dict[str, _Option] = {} - self._opt_prefixes = {"-", "--"} - self._args: list[_Argument] = [] - - def add_option( - self, - obj: CoreOption, - opts: cabc.Sequence[str], - dest: str | None, - action: str | None = None, - nargs: int = 1, - const: t.Any | None = None, - ) -> None: - """Adds a new option named `dest` to the parser. The destination - is not inferred (unlike with optparse) and needs to be explicitly - provided. Action can be any of ``store``, ``store_const``, - ``append``, ``append_const`` or ``count``. - - The `obj` can be used to identify the option in the order list - that is returned from the parser. - """ - opts = [_normalize_opt(opt, self.ctx) for opt in opts] - option = _Option(obj, opts, dest, action=action, nargs=nargs, const=const) - self._opt_prefixes.update(option.prefixes) - for opt in option._short_opts: - self._short_opt[opt] = option - for opt in option._long_opts: - self._long_opt[opt] = option - - def add_argument(self, obj: CoreArgument, dest: str | None, nargs: int = 1) -> None: - """Adds a positional argument named `dest` to the parser. - - The `obj` can be used to identify the option in the order list - that is returned from the parser. - """ - self._args.append(_Argument(obj, dest=dest, nargs=nargs)) - - def parse_args( - self, args: list[str] - ) -> tuple[dict[str, t.Any], list[str], list[CoreParameter]]: - """Parses positional arguments and returns ``(values, args, order)`` - for the parsed options and arguments as well as the leftover - arguments if there are any. The order is a list of objects as they - appear on the command line. If arguments appear multiple times they - will be memorized multiple times as well. - """ - state = _ParsingState(args) - try: - self._process_args_for_options(state) - self._process_args_for_args(state) - except UsageError: - if self.ctx is None or not self.ctx.resilient_parsing: - raise - return state.opts, state.largs, state.order - - def _process_args_for_args(self, state: _ParsingState) -> None: - pargs, args = _unpack_args( - state.largs + state.rargs, [x.nargs for x in self._args] - ) - - for idx, arg in enumerate(self._args): - arg.process(pargs[idx], state) - - state.largs = args - state.rargs = [] - - def _process_args_for_options(self, state: _ParsingState) -> None: - while state.rargs: - arg = state.rargs.pop(0) - arglen = len(arg) - # Double dashes always handled explicitly regardless of what - # prefixes are valid. - if arg == "--": - return - elif arg[:1] in self._opt_prefixes and arglen > 1: - self._process_opts(arg, state) - elif self.allow_interspersed_args: - state.largs.append(arg) - else: - state.rargs.insert(0, arg) - return - - # Say this is the original argument list: - # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)] - # ^ - # (we are about to process arg(i)). - # - # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of - # [arg0, ..., arg(i-1)] (any options and their arguments will have - # been removed from largs). - # - # The while loop will usually consume 1 or more arguments per pass. - # If it consumes 1 (eg. arg is an option that takes no arguments), - # then after _process_arg() is done the situation is: - # - # largs = subset of [arg0, ..., arg(i)] - # rargs = [arg(i+1), ..., arg(N-1)] - # - # If allow_interspersed_args is false, largs will always be - # *empty* -- still a subset of [arg0, ..., arg(i-1)], but - # not a very interesting subset! - - def _match_long_opt( - self, opt: str, explicit_value: str | None, state: _ParsingState - ) -> None: - if opt not in self._long_opt: - from difflib import get_close_matches - - possibilities = get_close_matches(opt, self._long_opt) - raise NoSuchOption(opt, possibilities=possibilities, ctx=self.ctx) - - option = self._long_opt[opt] - if option.takes_value: - # At this point it's safe to modify rargs by injecting the - # explicit value, because no exception is raised in this - # branch. This means that the inserted value will be fully - # consumed. - if explicit_value is not None: - state.rargs.insert(0, explicit_value) - - value = self._get_value_from_state(opt, option, state) - - elif explicit_value is not None: - raise BadOptionUsage( - opt, _("Option {name!r} does not take a value.").format(name=opt) - ) - - else: - value = UNSET - - option.process(value, state) - - def _match_short_opt(self, arg: str, state: _ParsingState) -> None: - stop = False - i = 1 - prefix = arg[0] - unknown_options = [] - - for ch in arg[1:]: - opt = _normalize_opt(f"{prefix}{ch}", self.ctx) - option = self._short_opt.get(opt) - i += 1 - - if not option: - if self.ignore_unknown_options: - unknown_options.append(ch) - continue - raise NoSuchOption(opt, ctx=self.ctx) - if option.takes_value: - # Any characters left in arg? Pretend they're the - # next arg, and stop consuming characters of arg. - if i < len(arg): - state.rargs.insert(0, arg[i:]) - stop = True - - value = self._get_value_from_state(opt, option, state) - - else: - value = UNSET - - option.process(value, state) - - if stop: - break - - # If we got any unknown options we recombine the string of the - # remaining options and re-attach the prefix, then report that - # to the state as new larg. This way there is basic combinatorics - # that can be achieved while still ignoring unknown arguments. - if self.ignore_unknown_options and unknown_options: - state.largs.append(f"{prefix}{''.join(unknown_options)}") - - def _get_value_from_state( - self, option_name: str, option: _Option, state: _ParsingState - ) -> str | cabc.Sequence[str] | T_FLAG_NEEDS_VALUE: - nargs = option.nargs - - value: str | cabc.Sequence[str] | T_FLAG_NEEDS_VALUE - - if len(state.rargs) < nargs: - if option.obj._flag_needs_value: - # Option allows omitting the value. - value = FLAG_NEEDS_VALUE - else: - raise BadOptionUsage( - option_name, - ngettext( - "Option {name!r} requires an argument.", - "Option {name!r} requires {nargs} arguments.", - nargs, - ).format(name=option_name, nargs=nargs), - ) - elif nargs == 1: - next_rarg = state.rargs[0] - - if ( - option.obj._flag_needs_value - and isinstance(next_rarg, str) - and next_rarg[:1] in self._opt_prefixes - and len(next_rarg) > 1 - ): - # The next arg looks like the start of an option, don't - # use it as the value if omitting the value is allowed. - value = FLAG_NEEDS_VALUE - else: - value = state.rargs.pop(0) - else: - value = tuple(state.rargs[:nargs]) - del state.rargs[:nargs] - - return value - - def _process_opts(self, arg: str, state: _ParsingState) -> None: - explicit_value = None - # Long option handling happens in two parts. The first part is - # supporting explicitly attached values. In any case, we will try - # to long match the option first. - if "=" in arg: - long_opt, explicit_value = arg.split("=", 1) - else: - long_opt = arg - norm_long_opt = _normalize_opt(long_opt, self.ctx) - - # At this point we will match the (assumed) long option through - # the long option matching code. Note that this allows options - # like "-foo" to be matched as long options. - try: - self._match_long_opt(norm_long_opt, explicit_value, state) - except NoSuchOption: - # At this point the long option matching failed, and we need - # to try with short options. However there is a special rule - # which says, that if we have a two character options prefix - # (applies to "--foo" for instance), we do not dispatch to the - # short option code and will instead raise the no option - # error. - if arg[:2] not in self._opt_prefixes: - self._match_short_opt(arg, state) - return - - if not self.ignore_unknown_options: - raise - - state.largs.append(arg) - - -def __getattr__(name: str) -> object: - import warnings - - if name in { - "OptionParser", - "Argument", - "Option", - "split_opt", - "normalize_opt", - "ParsingState", - }: - warnings.warn( - f"'parser.{name}' is deprecated and will be removed in Click 9.0." - " The old parser is available in 'optparse'.", - DeprecationWarning, - stacklevel=2, - ) - return globals()[f"_{name}"] - - if name == "split_arg_string": - from .shell_completion import split_arg_string - - warnings.warn( - "Importing 'parser.split_arg_string' is deprecated, it will only be" - " available in 'shell_completion' in Click 9.0.", - DeprecationWarning, - stacklevel=2, - ) - return split_arg_string - - raise AttributeError(name) diff --git a/venv/lib/python3.12/site-packages/click/py.typed b/venv/lib/python3.12/site-packages/click/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/click/shell_completion.py b/venv/lib/python3.12/site-packages/click/shell_completion.py deleted file mode 100644 index 8f1564c..0000000 --- a/venv/lib/python3.12/site-packages/click/shell_completion.py +++ /dev/null @@ -1,667 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import os -import re -import typing as t -from gettext import gettext as _ - -from .core import Argument -from .core import Command -from .core import Context -from .core import Group -from .core import Option -from .core import Parameter -from .core import ParameterSource -from .utils import echo - - -def shell_complete( - cli: Command, - ctx_args: cabc.MutableMapping[str, t.Any], - prog_name: str, - complete_var: str, - instruction: str, -) -> int: - """Perform shell completion for the given CLI program. - - :param cli: Command being called. - :param ctx_args: Extra arguments to pass to - ``cli.make_context``. - :param prog_name: Name of the executable in the shell. - :param complete_var: Name of the environment variable that holds - the completion instruction. - :param instruction: Value of ``complete_var`` with the completion - instruction and shell, in the form ``instruction_shell``. - :return: Status code to exit with. - """ - shell, _, instruction = instruction.partition("_") - comp_cls = get_completion_class(shell) - - if comp_cls is None: - return 1 - - comp = comp_cls(cli, ctx_args, prog_name, complete_var) - - if instruction == "source": - echo(comp.source()) - return 0 - - if instruction == "complete": - echo(comp.complete()) - return 0 - - return 1 - - -class CompletionItem: - """Represents a completion value and metadata about the value. The - default metadata is ``type`` to indicate special shell handling, - and ``help`` if a shell supports showing a help string next to the - value. - - Arbitrary parameters can be passed when creating the object, and - accessed using ``item.attr``. If an attribute wasn't passed, - accessing it returns ``None``. - - :param value: The completion suggestion. - :param type: Tells the shell script to provide special completion - support for the type. Click uses ``"dir"`` and ``"file"``. - :param help: String shown next to the value if supported. - :param kwargs: Arbitrary metadata. The built-in implementations - don't use this, but custom type completions paired with custom - shell support could use it. - """ - - __slots__ = ("value", "type", "help", "_info") - - def __init__( - self, - value: t.Any, - type: str = "plain", - help: str | None = None, - **kwargs: t.Any, - ) -> None: - self.value: t.Any = value - self.type: str = type - self.help: str | None = help - self._info = kwargs - - def __getattr__(self, name: str) -> t.Any: - return self._info.get(name) - - -# Only Bash >= 4.4 has the nosort option. -_SOURCE_BASH = """\ -%(complete_func)s() { - local IFS=$'\\n' - local response - - response=$(env COMP_WORDS="${COMP_WORDS[*]}" COMP_CWORD=$COMP_CWORD \ -%(complete_var)s=bash_complete $1) - - for completion in $response; do - IFS=',' read type value <<< "$completion" - - if [[ $type == 'dir' ]]; then - COMPREPLY=() - compopt -o dirnames - elif [[ $type == 'file' ]]; then - COMPREPLY=() - compopt -o default - elif [[ $type == 'plain' ]]; then - COMPREPLY+=($value) - fi - done - - return 0 -} - -%(complete_func)s_setup() { - complete -o nosort -F %(complete_func)s %(prog_name)s -} - -%(complete_func)s_setup; -""" - -# See ZshComplete.format_completion below, and issue #2703, before -# changing this script. -# -# (TL;DR: _describe is picky about the format, but this Zsh script snippet -# is already widely deployed. So freeze this script, and use clever-ish -# handling of colons in ZshComplet.format_completion.) -_SOURCE_ZSH = """\ -#compdef %(prog_name)s - -%(complete_func)s() { - local -a completions - local -a completions_with_descriptions - local -a response - (( ! $+commands[%(prog_name)s] )) && return 1 - - response=("${(@f)$(env COMP_WORDS="${words[*]}" COMP_CWORD=$((CURRENT-1)) \ -%(complete_var)s=zsh_complete %(prog_name)s)}") - - for type key descr in ${response}; do - if [[ "$type" == "plain" ]]; then - if [[ "$descr" == "_" ]]; then - completions+=("$key") - else - completions_with_descriptions+=("$key":"$descr") - fi - elif [[ "$type" == "dir" ]]; then - _path_files -/ - elif [[ "$type" == "file" ]]; then - _path_files -f - fi - done - - if [ -n "$completions_with_descriptions" ]; then - _describe -V unsorted completions_with_descriptions -U - fi - - if [ -n "$completions" ]; then - compadd -U -V unsorted -a completions - fi -} - -if [[ $zsh_eval_context[-1] == loadautofunc ]]; then - # autoload from fpath, call function directly - %(complete_func)s "$@" -else - # eval/source/. command, register function for later - compdef %(complete_func)s %(prog_name)s -fi -""" - -_SOURCE_FISH = """\ -function %(complete_func)s; - set -l response (env %(complete_var)s=fish_complete COMP_WORDS=(commandline -cp) \ -COMP_CWORD=(commandline -t) %(prog_name)s); - - for completion in $response; - set -l metadata (string split "," $completion); - - if test $metadata[1] = "dir"; - __fish_complete_directories $metadata[2]; - else if test $metadata[1] = "file"; - __fish_complete_path $metadata[2]; - else if test $metadata[1] = "plain"; - echo $metadata[2]; - end; - end; -end; - -complete --no-files --command %(prog_name)s --arguments \ -"(%(complete_func)s)"; -""" - - -class ShellComplete: - """Base class for providing shell completion support. A subclass for - a given shell will override attributes and methods to implement the - completion instructions (``source`` and ``complete``). - - :param cli: Command being called. - :param prog_name: Name of the executable in the shell. - :param complete_var: Name of the environment variable that holds - the completion instruction. - - .. versionadded:: 8.0 - """ - - name: t.ClassVar[str] - """Name to register the shell as with :func:`add_completion_class`. - This is used in completion instructions (``{name}_source`` and - ``{name}_complete``). - """ - - source_template: t.ClassVar[str] - """Completion script template formatted by :meth:`source`. This must - be provided by subclasses. - """ - - def __init__( - self, - cli: Command, - ctx_args: cabc.MutableMapping[str, t.Any], - prog_name: str, - complete_var: str, - ) -> None: - self.cli = cli - self.ctx_args = ctx_args - self.prog_name = prog_name - self.complete_var = complete_var - - @property - def func_name(self) -> str: - """The name of the shell function defined by the completion - script. - """ - safe_name = re.sub(r"\W*", "", self.prog_name.replace("-", "_"), flags=re.ASCII) - return f"_{safe_name}_completion" - - def source_vars(self) -> dict[str, t.Any]: - """Vars for formatting :attr:`source_template`. - - By default this provides ``complete_func``, ``complete_var``, - and ``prog_name``. - """ - return { - "complete_func": self.func_name, - "complete_var": self.complete_var, - "prog_name": self.prog_name, - } - - def source(self) -> str: - """Produce the shell script that defines the completion - function. By default this ``%``-style formats - :attr:`source_template` with the dict returned by - :meth:`source_vars`. - """ - return self.source_template % self.source_vars() - - def get_completion_args(self) -> tuple[list[str], str]: - """Use the env vars defined by the shell script to return a - tuple of ``args, incomplete``. This must be implemented by - subclasses. - """ - raise NotImplementedError - - def get_completions(self, args: list[str], incomplete: str) -> list[CompletionItem]: - """Determine the context and last complete command or parameter - from the complete args. Call that object's ``shell_complete`` - method to get the completions for the incomplete value. - - :param args: List of complete args before the incomplete value. - :param incomplete: Value being completed. May be empty. - """ - ctx = _resolve_context(self.cli, self.ctx_args, self.prog_name, args) - obj, incomplete = _resolve_incomplete(ctx, args, incomplete) - return obj.shell_complete(ctx, incomplete) - - def format_completion(self, item: CompletionItem) -> str: - """Format a completion item into the form recognized by the - shell script. This must be implemented by subclasses. - - :param item: Completion item to format. - """ - raise NotImplementedError - - def complete(self) -> str: - """Produce the completion data to send back to the shell. - - By default this calls :meth:`get_completion_args`, gets the - completions, then calls :meth:`format_completion` for each - completion. - """ - args, incomplete = self.get_completion_args() - completions = self.get_completions(args, incomplete) - out = [self.format_completion(item) for item in completions] - return "\n".join(out) - - -class BashComplete(ShellComplete): - """Shell completion for Bash.""" - - name = "bash" - source_template = _SOURCE_BASH - - @staticmethod - def _check_version() -> None: - import shutil - import subprocess - - bash_exe = shutil.which("bash") - - if bash_exe is None: - match = None - else: - output = subprocess.run( - [bash_exe, "--norc", "-c", 'echo "${BASH_VERSION}"'], - stdout=subprocess.PIPE, - ) - match = re.search(r"^(\d+)\.(\d+)\.\d+", output.stdout.decode()) - - if match is not None: - major, minor = match.groups() - - if major < "4" or major == "4" and minor < "4": - echo( - _( - "Shell completion is not supported for Bash" - " versions older than 4.4." - ), - err=True, - ) - else: - echo( - _("Couldn't detect Bash version, shell completion is not supported."), - err=True, - ) - - def source(self) -> str: - self._check_version() - return super().source() - - def get_completion_args(self) -> tuple[list[str], str]: - cwords = split_arg_string(os.environ["COMP_WORDS"]) - cword = int(os.environ["COMP_CWORD"]) - args = cwords[1:cword] - - try: - incomplete = cwords[cword] - except IndexError: - incomplete = "" - - return args, incomplete - - def format_completion(self, item: CompletionItem) -> str: - return f"{item.type},{item.value}" - - -class ZshComplete(ShellComplete): - """Shell completion for Zsh.""" - - name = "zsh" - source_template = _SOURCE_ZSH - - def get_completion_args(self) -> tuple[list[str], str]: - cwords = split_arg_string(os.environ["COMP_WORDS"]) - cword = int(os.environ["COMP_CWORD"]) - args = cwords[1:cword] - - try: - incomplete = cwords[cword] - except IndexError: - incomplete = "" - - return args, incomplete - - def format_completion(self, item: CompletionItem) -> str: - help_ = item.help or "_" - # The zsh completion script uses `_describe` on items with help - # texts (which splits the item help from the item value at the - # first unescaped colon) and `compadd` on items without help - # text (which uses the item value as-is and does not support - # colon escaping). So escape colons in the item value if and - # only if the item help is not the sentinel "_" value, as used - # by the completion script. - # - # (The zsh completion script is potentially widely deployed, and - # thus harder to fix than this method.) - # - # See issue #1812 and issue #2703 for further context. - value = item.value.replace(":", r"\:") if help_ != "_" else item.value - return f"{item.type}\n{value}\n{help_}" - - -class FishComplete(ShellComplete): - """Shell completion for Fish.""" - - name = "fish" - source_template = _SOURCE_FISH - - def get_completion_args(self) -> tuple[list[str], str]: - cwords = split_arg_string(os.environ["COMP_WORDS"]) - incomplete = os.environ["COMP_CWORD"] - if incomplete: - incomplete = split_arg_string(incomplete)[0] - args = cwords[1:] - - # Fish stores the partial word in both COMP_WORDS and - # COMP_CWORD, remove it from complete args. - if incomplete and args and args[-1] == incomplete: - args.pop() - - return args, incomplete - - def format_completion(self, item: CompletionItem) -> str: - if item.help: - return f"{item.type},{item.value}\t{item.help}" - - return f"{item.type},{item.value}" - - -ShellCompleteType = t.TypeVar("ShellCompleteType", bound="type[ShellComplete]") - - -_available_shells: dict[str, type[ShellComplete]] = { - "bash": BashComplete, - "fish": FishComplete, - "zsh": ZshComplete, -} - - -def add_completion_class( - cls: ShellCompleteType, name: str | None = None -) -> ShellCompleteType: - """Register a :class:`ShellComplete` subclass under the given name. - The name will be provided by the completion instruction environment - variable during completion. - - :param cls: The completion class that will handle completion for the - shell. - :param name: Name to register the class under. Defaults to the - class's ``name`` attribute. - """ - if name is None: - name = cls.name - - _available_shells[name] = cls - - return cls - - -def get_completion_class(shell: str) -> type[ShellComplete] | None: - """Look up a registered :class:`ShellComplete` subclass by the name - provided by the completion instruction environment variable. If the - name isn't registered, returns ``None``. - - :param shell: Name the class is registered under. - """ - return _available_shells.get(shell) - - -def split_arg_string(string: str) -> list[str]: - """Split an argument string as with :func:`shlex.split`, but don't - fail if the string is incomplete. Ignores a missing closing quote or - incomplete escape sequence and uses the partial token as-is. - - .. code-block:: python - - split_arg_string("example 'my file") - ["example", "my file"] - - split_arg_string("example my\\") - ["example", "my"] - - :param string: String to split. - - .. versionchanged:: 8.2 - Moved to ``shell_completion`` from ``parser``. - """ - import shlex - - lex = shlex.shlex(string, posix=True) - lex.whitespace_split = True - lex.commenters = "" - out = [] - - try: - for token in lex: - out.append(token) - except ValueError: - # Raised when end-of-string is reached in an invalid state. Use - # the partial token as-is. The quote or escape character is in - # lex.state, not lex.token. - out.append(lex.token) - - return out - - -def _is_incomplete_argument(ctx: Context, param: Parameter) -> bool: - """Determine if the given parameter is an argument that can still - accept values. - - :param ctx: Invocation context for the command represented by the - parsed complete args. - :param param: Argument object being checked. - """ - if not isinstance(param, Argument): - return False - - assert param.name is not None - # Will be None if expose_value is False. - value = ctx.params.get(param.name) - return ( - param.nargs == -1 - or ctx.get_parameter_source(param.name) is not ParameterSource.COMMANDLINE - or ( - param.nargs > 1 - and isinstance(value, (tuple, list)) - and len(value) < param.nargs - ) - ) - - -def _start_of_option(ctx: Context, value: str) -> bool: - """Check if the value looks like the start of an option.""" - if not value: - return False - - c = value[0] - return c in ctx._opt_prefixes - - -def _is_incomplete_option(ctx: Context, args: list[str], param: Parameter) -> bool: - """Determine if the given parameter is an option that needs a value. - - :param args: List of complete args before the incomplete value. - :param param: Option object being checked. - """ - if not isinstance(param, Option): - return False - - if param.is_flag or param.count: - return False - - last_option = None - - for index, arg in enumerate(reversed(args)): - if index + 1 > param.nargs: - break - - if _start_of_option(ctx, arg): - last_option = arg - break - - return last_option is not None and last_option in param.opts - - -def _resolve_context( - cli: Command, - ctx_args: cabc.MutableMapping[str, t.Any], - prog_name: str, - args: list[str], -) -> Context: - """Produce the context hierarchy starting with the command and - traversing the complete arguments. This only follows the commands, - it doesn't trigger input prompts or callbacks. - - :param cli: Command being called. - :param prog_name: Name of the executable in the shell. - :param args: List of complete args before the incomplete value. - """ - ctx_args["resilient_parsing"] = True - with cli.make_context(prog_name, args.copy(), **ctx_args) as ctx: - args = ctx._protected_args + ctx.args - - while args: - command = ctx.command - - if isinstance(command, Group): - if not command.chain: - name, cmd, args = command.resolve_command(ctx, args) - - if cmd is None: - return ctx - - with cmd.make_context( - name, args, parent=ctx, resilient_parsing=True - ) as sub_ctx: - ctx = sub_ctx - args = ctx._protected_args + ctx.args - else: - sub_ctx = ctx - - while args: - name, cmd, args = command.resolve_command(ctx, args) - - if cmd is None: - return ctx - - with cmd.make_context( - name, - args, - parent=ctx, - allow_extra_args=True, - allow_interspersed_args=False, - resilient_parsing=True, - ) as sub_sub_ctx: - sub_ctx = sub_sub_ctx - args = sub_ctx.args - - ctx = sub_ctx - args = [*sub_ctx._protected_args, *sub_ctx.args] - else: - break - - return ctx - - -def _resolve_incomplete( - ctx: Context, args: list[str], incomplete: str -) -> tuple[Command | Parameter, str]: - """Find the Click object that will handle the completion of the - incomplete value. Return the object and the incomplete value. - - :param ctx: Invocation context for the command represented by - the parsed complete args. - :param args: List of complete args before the incomplete value. - :param incomplete: Value being completed. May be empty. - """ - # Different shells treat an "=" between a long option name and - # value differently. Might keep the value joined, return the "=" - # as a separate item, or return the split name and value. Always - # split and discard the "=" to make completion easier. - if incomplete == "=": - incomplete = "" - elif "=" in incomplete and _start_of_option(ctx, incomplete): - name, _, incomplete = incomplete.partition("=") - args.append(name) - - # The "--" marker tells Click to stop treating values as options - # even if they start with the option character. If it hasn't been - # given and the incomplete arg looks like an option, the current - # command will provide option name completions. - if "--" not in args and _start_of_option(ctx, incomplete): - return ctx.command, incomplete - - params = ctx.command.get_params(ctx) - - # If the last complete arg is an option name with an incomplete - # value, the option will provide value completions. - for param in params: - if _is_incomplete_option(ctx, args, param): - return param, incomplete - - # It's not an option name or value. The first argument without a - # parsed value will provide value completions. - for param in params: - if _is_incomplete_argument(ctx, param): - return param, incomplete - - # There were no unparsed arguments, the command may be a group that - # will provide command name completions. - return ctx.command, incomplete diff --git a/venv/lib/python3.12/site-packages/click/termui.py b/venv/lib/python3.12/site-packages/click/termui.py deleted file mode 100644 index 2e98a07..0000000 --- a/venv/lib/python3.12/site-packages/click/termui.py +++ /dev/null @@ -1,883 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import inspect -import io -import itertools -import sys -import typing as t -from contextlib import AbstractContextManager -from gettext import gettext as _ - -from ._compat import isatty -from ._compat import strip_ansi -from .exceptions import Abort -from .exceptions import UsageError -from .globals import resolve_color_default -from .types import Choice -from .types import convert_type -from .types import ParamType -from .utils import echo -from .utils import LazyFile - -if t.TYPE_CHECKING: - from ._termui_impl import ProgressBar - -V = t.TypeVar("V") - -# The prompt functions to use. The doc tools currently override these -# functions to customize how they work. -visible_prompt_func: t.Callable[[str], str] = input - -_ansi_colors = { - "black": 30, - "red": 31, - "green": 32, - "yellow": 33, - "blue": 34, - "magenta": 35, - "cyan": 36, - "white": 37, - "reset": 39, - "bright_black": 90, - "bright_red": 91, - "bright_green": 92, - "bright_yellow": 93, - "bright_blue": 94, - "bright_magenta": 95, - "bright_cyan": 96, - "bright_white": 97, -} -_ansi_reset_all = "\033[0m" - - -def hidden_prompt_func(prompt: str) -> str: - import getpass - - return getpass.getpass(prompt) - - -def _build_prompt( - text: str, - suffix: str, - show_default: bool = False, - default: t.Any | None = None, - show_choices: bool = True, - type: ParamType | None = None, -) -> str: - prompt = text - if type is not None and show_choices and isinstance(type, Choice): - prompt += f" ({', '.join(map(str, type.choices))})" - if default is not None and show_default: - prompt = f"{prompt} [{_format_default(default)}]" - return f"{prompt}{suffix}" - - -def _format_default(default: t.Any) -> t.Any: - if isinstance(default, (io.IOBase, LazyFile)) and hasattr(default, "name"): - return default.name - - return default - - -def prompt( - text: str, - default: t.Any | None = None, - hide_input: bool = False, - confirmation_prompt: bool | str = False, - type: ParamType | t.Any | None = None, - value_proc: t.Callable[[str], t.Any] | None = None, - prompt_suffix: str = ": ", - show_default: bool = True, - err: bool = False, - show_choices: bool = True, -) -> t.Any: - """Prompts a user for input. This is a convenience function that can - be used to prompt a user for input later. - - If the user aborts the input by sending an interrupt signal, this - function will catch it and raise a :exc:`Abort` exception. - - :param text: the text to show for the prompt. - :param default: the default value to use if no input happens. If this - is not given it will prompt until it's aborted. - :param hide_input: if this is set to true then the input value will - be hidden. - :param confirmation_prompt: Prompt a second time to confirm the - value. Can be set to a string instead of ``True`` to customize - the message. - :param type: the type to use to check the value against. - :param value_proc: if this parameter is provided it's a function that - is invoked instead of the type conversion to - convert a value. - :param prompt_suffix: a suffix that should be added to the prompt. - :param show_default: shows or hides the default value in the prompt. - :param err: if set to true the file defaults to ``stderr`` instead of - ``stdout``, the same as with echo. - :param show_choices: Show or hide choices if the passed type is a Choice. - For example if type is a Choice of either day or week, - show_choices is true and text is "Group by" then the - prompt will be "Group by (day, week): ". - - .. versionchanged:: 8.3.1 - A space is no longer appended to the prompt. - - .. versionadded:: 8.0 - ``confirmation_prompt`` can be a custom string. - - .. versionadded:: 7.0 - Added the ``show_choices`` parameter. - - .. versionadded:: 6.0 - Added unicode support for cmd.exe on Windows. - - .. versionadded:: 4.0 - Added the `err` parameter. - - """ - - def prompt_func(text: str) -> str: - f = hidden_prompt_func if hide_input else visible_prompt_func - try: - # Write the prompt separately so that we get nice - # coloring through colorama on Windows - echo(text[:-1], nl=False, err=err) - # Echo the last character to stdout to work around an issue where - # readline causes backspace to clear the whole line. - return f(text[-1:]) - except (KeyboardInterrupt, EOFError): - # getpass doesn't print a newline if the user aborts input with ^C. - # Allegedly this behavior is inherited from getpass(3). - # A doc bug has been filed at https://bugs.python.org/issue24711 - if hide_input: - echo(None, err=err) - raise Abort() from None - - if value_proc is None: - value_proc = convert_type(type, default) - - prompt = _build_prompt( - text, prompt_suffix, show_default, default, show_choices, type - ) - - if confirmation_prompt: - if confirmation_prompt is True: - confirmation_prompt = _("Repeat for confirmation") - - confirmation_prompt = _build_prompt(confirmation_prompt, prompt_suffix) - - while True: - while True: - value = prompt_func(prompt) - if value: - break - elif default is not None: - value = default - break - try: - result = value_proc(value) - except UsageError as e: - if hide_input: - echo(_("Error: The value you entered was invalid."), err=err) - else: - echo(_("Error: {e.message}").format(e=e), err=err) - continue - if not confirmation_prompt: - return result - while True: - value2 = prompt_func(confirmation_prompt) - is_empty = not value and not value2 - if value2 or is_empty: - break - if value == value2: - return result - echo(_("Error: The two entered values do not match."), err=err) - - -def confirm( - text: str, - default: bool | None = False, - abort: bool = False, - prompt_suffix: str = ": ", - show_default: bool = True, - err: bool = False, -) -> bool: - """Prompts for confirmation (yes/no question). - - If the user aborts the input by sending a interrupt signal this - function will catch it and raise a :exc:`Abort` exception. - - :param text: the question to ask. - :param default: The default value to use when no input is given. If - ``None``, repeat until input is given. - :param abort: if this is set to `True` a negative answer aborts the - exception by raising :exc:`Abort`. - :param prompt_suffix: a suffix that should be added to the prompt. - :param show_default: shows or hides the default value in the prompt. - :param err: if set to true the file defaults to ``stderr`` instead of - ``stdout``, the same as with echo. - - .. versionchanged:: 8.3.1 - A space is no longer appended to the prompt. - - .. versionchanged:: 8.0 - Repeat until input is given if ``default`` is ``None``. - - .. versionadded:: 4.0 - Added the ``err`` parameter. - """ - prompt = _build_prompt( - text, - prompt_suffix, - show_default, - "y/n" if default is None else ("Y/n" if default else "y/N"), - ) - - while True: - try: - # Write the prompt separately so that we get nice - # coloring through colorama on Windows - echo(prompt[:-1], nl=False, err=err) - # Echo the last character to stdout to work around an issue where - # readline causes backspace to clear the whole line. - value = visible_prompt_func(prompt[-1:]).lower().strip() - except (KeyboardInterrupt, EOFError): - raise Abort() from None - if value in ("y", "yes"): - rv = True - elif value in ("n", "no"): - rv = False - elif default is not None and value == "": - rv = default - else: - echo(_("Error: invalid input"), err=err) - continue - break - if abort and not rv: - raise Abort() - return rv - - -def echo_via_pager( - text_or_generator: cabc.Iterable[str] | t.Callable[[], cabc.Iterable[str]] | str, - color: bool | None = None, -) -> None: - """This function takes a text and shows it via an environment specific - pager on stdout. - - .. versionchanged:: 3.0 - Added the `color` flag. - - :param text_or_generator: the text to page, or alternatively, a - generator emitting the text to page. - :param color: controls if the pager supports ANSI colors or not. The - default is autodetection. - """ - color = resolve_color_default(color) - - if inspect.isgeneratorfunction(text_or_generator): - i = t.cast("t.Callable[[], cabc.Iterable[str]]", text_or_generator)() - elif isinstance(text_or_generator, str): - i = [text_or_generator] - else: - i = iter(t.cast("cabc.Iterable[str]", text_or_generator)) - - # convert every element of i to a text type if necessary - text_generator = (el if isinstance(el, str) else str(el) for el in i) - - from ._termui_impl import pager - - return pager(itertools.chain(text_generator, "\n"), color) - - -@t.overload -def progressbar( - *, - length: int, - label: str | None = None, - hidden: bool = False, - show_eta: bool = True, - show_percent: bool | None = None, - show_pos: bool = False, - fill_char: str = "#", - empty_char: str = "-", - bar_template: str = "%(label)s [%(bar)s] %(info)s", - info_sep: str = " ", - width: int = 36, - file: t.TextIO | None = None, - color: bool | None = None, - update_min_steps: int = 1, -) -> ProgressBar[int]: ... - - -@t.overload -def progressbar( - iterable: cabc.Iterable[V] | None = None, - length: int | None = None, - label: str | None = None, - hidden: bool = False, - show_eta: bool = True, - show_percent: bool | None = None, - show_pos: bool = False, - item_show_func: t.Callable[[V | None], str | None] | None = None, - fill_char: str = "#", - empty_char: str = "-", - bar_template: str = "%(label)s [%(bar)s] %(info)s", - info_sep: str = " ", - width: int = 36, - file: t.TextIO | None = None, - color: bool | None = None, - update_min_steps: int = 1, -) -> ProgressBar[V]: ... - - -def progressbar( - iterable: cabc.Iterable[V] | None = None, - length: int | None = None, - label: str | None = None, - hidden: bool = False, - show_eta: bool = True, - show_percent: bool | None = None, - show_pos: bool = False, - item_show_func: t.Callable[[V | None], str | None] | None = None, - fill_char: str = "#", - empty_char: str = "-", - bar_template: str = "%(label)s [%(bar)s] %(info)s", - info_sep: str = " ", - width: int = 36, - file: t.TextIO | None = None, - color: bool | None = None, - update_min_steps: int = 1, -) -> ProgressBar[V]: - """This function creates an iterable context manager that can be used - to iterate over something while showing a progress bar. It will - either iterate over the `iterable` or `length` items (that are counted - up). While iteration happens, this function will print a rendered - progress bar to the given `file` (defaults to stdout) and will attempt - to calculate remaining time and more. By default, this progress bar - will not be rendered if the file is not a terminal. - - The context manager creates the progress bar. When the context - manager is entered the progress bar is already created. With every - iteration over the progress bar, the iterable passed to the bar is - advanced and the bar is updated. When the context manager exits, - a newline is printed and the progress bar is finalized on screen. - - Note: The progress bar is currently designed for use cases where the - total progress can be expected to take at least several seconds. - Because of this, the ProgressBar class object won't display - progress that is considered too fast, and progress where the time - between steps is less than a second. - - No printing must happen or the progress bar will be unintentionally - destroyed. - - Example usage:: - - with progressbar(items) as bar: - for item in bar: - do_something_with(item) - - Alternatively, if no iterable is specified, one can manually update the - progress bar through the `update()` method instead of directly - iterating over the progress bar. The update method accepts the number - of steps to increment the bar with:: - - with progressbar(length=chunks.total_bytes) as bar: - for chunk in chunks: - process_chunk(chunk) - bar.update(chunks.bytes) - - The ``update()`` method also takes an optional value specifying the - ``current_item`` at the new position. This is useful when used - together with ``item_show_func`` to customize the output for each - manual step:: - - with click.progressbar( - length=total_size, - label='Unzipping archive', - item_show_func=lambda a: a.filename - ) as bar: - for archive in zip_file: - archive.extract() - bar.update(archive.size, archive) - - :param iterable: an iterable to iterate over. If not provided the length - is required. - :param length: the number of items to iterate over. By default the - progressbar will attempt to ask the iterator about its - length, which might or might not work. If an iterable is - also provided this parameter can be used to override the - length. If an iterable is not provided the progress bar - will iterate over a range of that length. - :param label: the label to show next to the progress bar. - :param hidden: hide the progressbar. Defaults to ``False``. When no tty is - detected, it will only print the progressbar label. Setting this to - ``False`` also disables that. - :param show_eta: enables or disables the estimated time display. This is - automatically disabled if the length cannot be - determined. - :param show_percent: enables or disables the percentage display. The - default is `True` if the iterable has a length or - `False` if not. - :param show_pos: enables or disables the absolute position display. The - default is `False`. - :param item_show_func: A function called with the current item which - can return a string to show next to the progress bar. If the - function returns ``None`` nothing is shown. The current item can - be ``None``, such as when entering and exiting the bar. - :param fill_char: the character to use to show the filled part of the - progress bar. - :param empty_char: the character to use to show the non-filled part of - the progress bar. - :param bar_template: the format string to use as template for the bar. - The parameters in it are ``label`` for the label, - ``bar`` for the progress bar and ``info`` for the - info section. - :param info_sep: the separator between multiple info items (eta etc.) - :param width: the width of the progress bar in characters, 0 means full - terminal width - :param file: The file to write to. If this is not a terminal then - only the label is printed. - :param color: controls if the terminal supports ANSI colors or not. The - default is autodetection. This is only needed if ANSI - codes are included anywhere in the progress bar output - which is not the case by default. - :param update_min_steps: Render only when this many updates have - completed. This allows tuning for very fast iterators. - - .. versionadded:: 8.2 - The ``hidden`` argument. - - .. versionchanged:: 8.0 - Output is shown even if execution time is less than 0.5 seconds. - - .. versionchanged:: 8.0 - ``item_show_func`` shows the current item, not the previous one. - - .. versionchanged:: 8.0 - Labels are echoed if the output is not a TTY. Reverts a change - in 7.0 that removed all output. - - .. versionadded:: 8.0 - The ``update_min_steps`` parameter. - - .. versionadded:: 4.0 - The ``color`` parameter and ``update`` method. - - .. versionadded:: 2.0 - """ - from ._termui_impl import ProgressBar - - color = resolve_color_default(color) - return ProgressBar( - iterable=iterable, - length=length, - hidden=hidden, - show_eta=show_eta, - show_percent=show_percent, - show_pos=show_pos, - item_show_func=item_show_func, - fill_char=fill_char, - empty_char=empty_char, - bar_template=bar_template, - info_sep=info_sep, - file=file, - label=label, - width=width, - color=color, - update_min_steps=update_min_steps, - ) - - -def clear() -> None: - """Clears the terminal screen. This will have the effect of clearing - the whole visible space of the terminal and moving the cursor to the - top left. This does not do anything if not connected to a terminal. - - .. versionadded:: 2.0 - """ - if not isatty(sys.stdout): - return - - # ANSI escape \033[2J clears the screen, \033[1;1H moves the cursor - echo("\033[2J\033[1;1H", nl=False) - - -def _interpret_color(color: int | tuple[int, int, int] | str, offset: int = 0) -> str: - if isinstance(color, int): - return f"{38 + offset};5;{color:d}" - - if isinstance(color, (tuple, list)): - r, g, b = color - return f"{38 + offset};2;{r:d};{g:d};{b:d}" - - return str(_ansi_colors[color] + offset) - - -def style( - text: t.Any, - fg: int | tuple[int, int, int] | str | None = None, - bg: int | tuple[int, int, int] | str | None = None, - bold: bool | None = None, - dim: bool | None = None, - underline: bool | None = None, - overline: bool | None = None, - italic: bool | None = None, - blink: bool | None = None, - reverse: bool | None = None, - strikethrough: bool | None = None, - reset: bool = True, -) -> str: - """Styles a text with ANSI styles and returns the new string. By - default the styling is self contained which means that at the end - of the string a reset code is issued. This can be prevented by - passing ``reset=False``. - - Examples:: - - click.echo(click.style('Hello World!', fg='green')) - click.echo(click.style('ATTENTION!', blink=True)) - click.echo(click.style('Some things', reverse=True, fg='cyan')) - click.echo(click.style('More colors', fg=(255, 12, 128), bg=117)) - - Supported color names: - - * ``black`` (might be a gray) - * ``red`` - * ``green`` - * ``yellow`` (might be an orange) - * ``blue`` - * ``magenta`` - * ``cyan`` - * ``white`` (might be light gray) - * ``bright_black`` - * ``bright_red`` - * ``bright_green`` - * ``bright_yellow`` - * ``bright_blue`` - * ``bright_magenta`` - * ``bright_cyan`` - * ``bright_white`` - * ``reset`` (reset the color code only) - - If the terminal supports it, color may also be specified as: - - - An integer in the interval [0, 255]. The terminal must support - 8-bit/256-color mode. - - An RGB tuple of three integers in [0, 255]. The terminal must - support 24-bit/true-color mode. - - See https://en.wikipedia.org/wiki/ANSI_color and - https://gist.github.com/XVilka/8346728 for more information. - - :param text: the string to style with ansi codes. - :param fg: if provided this will become the foreground color. - :param bg: if provided this will become the background color. - :param bold: if provided this will enable or disable bold mode. - :param dim: if provided this will enable or disable dim mode. This is - badly supported. - :param underline: if provided this will enable or disable underline. - :param overline: if provided this will enable or disable overline. - :param italic: if provided this will enable or disable italic. - :param blink: if provided this will enable or disable blinking. - :param reverse: if provided this will enable or disable inverse - rendering (foreground becomes background and the - other way round). - :param strikethrough: if provided this will enable or disable - striking through text. - :param reset: by default a reset-all code is added at the end of the - string which means that styles do not carry over. This - can be disabled to compose styles. - - .. versionchanged:: 8.0 - A non-string ``message`` is converted to a string. - - .. versionchanged:: 8.0 - Added support for 256 and RGB color codes. - - .. versionchanged:: 8.0 - Added the ``strikethrough``, ``italic``, and ``overline`` - parameters. - - .. versionchanged:: 7.0 - Added support for bright colors. - - .. versionadded:: 2.0 - """ - if not isinstance(text, str): - text = str(text) - - bits = [] - - if fg: - try: - bits.append(f"\033[{_interpret_color(fg)}m") - except KeyError: - raise TypeError(f"Unknown color {fg!r}") from None - - if bg: - try: - bits.append(f"\033[{_interpret_color(bg, 10)}m") - except KeyError: - raise TypeError(f"Unknown color {bg!r}") from None - - if bold is not None: - bits.append(f"\033[{1 if bold else 22}m") - if dim is not None: - bits.append(f"\033[{2 if dim else 22}m") - if underline is not None: - bits.append(f"\033[{4 if underline else 24}m") - if overline is not None: - bits.append(f"\033[{53 if overline else 55}m") - if italic is not None: - bits.append(f"\033[{3 if italic else 23}m") - if blink is not None: - bits.append(f"\033[{5 if blink else 25}m") - if reverse is not None: - bits.append(f"\033[{7 if reverse else 27}m") - if strikethrough is not None: - bits.append(f"\033[{9 if strikethrough else 29}m") - bits.append(text) - if reset: - bits.append(_ansi_reset_all) - return "".join(bits) - - -def unstyle(text: str) -> str: - """Removes ANSI styling information from a string. Usually it's not - necessary to use this function as Click's echo function will - automatically remove styling if necessary. - - .. versionadded:: 2.0 - - :param text: the text to remove style information from. - """ - return strip_ansi(text) - - -def secho( - message: t.Any | None = None, - file: t.IO[t.AnyStr] | None = None, - nl: bool = True, - err: bool = False, - color: bool | None = None, - **styles: t.Any, -) -> None: - """This function combines :func:`echo` and :func:`style` into one - call. As such the following two calls are the same:: - - click.secho('Hello World!', fg='green') - click.echo(click.style('Hello World!', fg='green')) - - All keyword arguments are forwarded to the underlying functions - depending on which one they go with. - - Non-string types will be converted to :class:`str`. However, - :class:`bytes` are passed directly to :meth:`echo` without applying - style. If you want to style bytes that represent text, call - :meth:`bytes.decode` first. - - .. versionchanged:: 8.0 - A non-string ``message`` is converted to a string. Bytes are - passed through without style applied. - - .. versionadded:: 2.0 - """ - if message is not None and not isinstance(message, (bytes, bytearray)): - message = style(message, **styles) - - return echo(message, file=file, nl=nl, err=err, color=color) - - -@t.overload -def edit( - text: bytes | bytearray, - editor: str | None = None, - env: cabc.Mapping[str, str] | None = None, - require_save: bool = False, - extension: str = ".txt", -) -> bytes | None: ... - - -@t.overload -def edit( - text: str, - editor: str | None = None, - env: cabc.Mapping[str, str] | None = None, - require_save: bool = True, - extension: str = ".txt", -) -> str | None: ... - - -@t.overload -def edit( - text: None = None, - editor: str | None = None, - env: cabc.Mapping[str, str] | None = None, - require_save: bool = True, - extension: str = ".txt", - filename: str | cabc.Iterable[str] | None = None, -) -> None: ... - - -def edit( - text: str | bytes | bytearray | None = None, - editor: str | None = None, - env: cabc.Mapping[str, str] | None = None, - require_save: bool = True, - extension: str = ".txt", - filename: str | cabc.Iterable[str] | None = None, -) -> str | bytes | bytearray | None: - r"""Edits the given text in the defined editor. If an editor is given - (should be the full path to the executable but the regular operating - system search path is used for finding the executable) it overrides - the detected editor. Optionally, some environment variables can be - used. If the editor is closed without changes, `None` is returned. In - case a file is edited directly the return value is always `None` and - `require_save` and `extension` are ignored. - - If the editor cannot be opened a :exc:`UsageError` is raised. - - Note for Windows: to simplify cross-platform usage, the newlines are - automatically converted from POSIX to Windows and vice versa. As such, - the message here will have ``\n`` as newline markers. - - :param text: the text to edit. - :param editor: optionally the editor to use. Defaults to automatic - detection. - :param env: environment variables to forward to the editor. - :param require_save: if this is true, then not saving in the editor - will make the return value become `None`. - :param extension: the extension to tell the editor about. This defaults - to `.txt` but changing this might change syntax - highlighting. - :param filename: if provided it will edit this file instead of the - provided text contents. It will not use a temporary - file as an indirection in that case. If the editor supports - editing multiple files at once, a sequence of files may be - passed as well. Invoke `click.file` once per file instead - if multiple files cannot be managed at once or editing the - files serially is desired. - - .. versionchanged:: 8.2.0 - ``filename`` now accepts any ``Iterable[str]`` in addition to a ``str`` - if the ``editor`` supports editing multiple files at once. - - """ - from ._termui_impl import Editor - - ed = Editor(editor=editor, env=env, require_save=require_save, extension=extension) - - if filename is None: - return ed.edit(text) - - if isinstance(filename, str): - filename = (filename,) - - ed.edit_files(filenames=filename) - return None - - -def launch(url: str, wait: bool = False, locate: bool = False) -> int: - """This function launches the given URL (or filename) in the default - viewer application for this file type. If this is an executable, it - might launch the executable in a new session. The return value is - the exit code of the launched application. Usually, ``0`` indicates - success. - - Examples:: - - click.launch('https://click.palletsprojects.com/') - click.launch('/my/downloaded/file', locate=True) - - .. versionadded:: 2.0 - - :param url: URL or filename of the thing to launch. - :param wait: Wait for the program to exit before returning. This - only works if the launched program blocks. In particular, - ``xdg-open`` on Linux does not block. - :param locate: if this is set to `True` then instead of launching the - application associated with the URL it will attempt to - launch a file manager with the file located. This - might have weird effects if the URL does not point to - the filesystem. - """ - from ._termui_impl import open_url - - return open_url(url, wait=wait, locate=locate) - - -# If this is provided, getchar() calls into this instead. This is used -# for unittesting purposes. -_getchar: t.Callable[[bool], str] | None = None - - -def getchar(echo: bool = False) -> str: - """Fetches a single character from the terminal and returns it. This - will always return a unicode character and under certain rare - circumstances this might return more than one character. The - situations which more than one character is returned is when for - whatever reason multiple characters end up in the terminal buffer or - standard input was not actually a terminal. - - Note that this will always read from the terminal, even if something - is piped into the standard input. - - Note for Windows: in rare cases when typing non-ASCII characters, this - function might wait for a second character and then return both at once. - This is because certain Unicode characters look like special-key markers. - - .. versionadded:: 2.0 - - :param echo: if set to `True`, the character read will also show up on - the terminal. The default is to not show it. - """ - global _getchar - - if _getchar is None: - from ._termui_impl import getchar as f - - _getchar = f - - return _getchar(echo) - - -def raw_terminal() -> AbstractContextManager[int]: - from ._termui_impl import raw_terminal as f - - return f() - - -def pause(info: str | None = None, err: bool = False) -> None: - """This command stops execution and waits for the user to press any - key to continue. This is similar to the Windows batch "pause" - command. If the program is not run through a terminal, this command - will instead do nothing. - - .. versionadded:: 2.0 - - .. versionadded:: 4.0 - Added the `err` parameter. - - :param info: The message to print before pausing. Defaults to - ``"Press any key to continue..."``. - :param err: if set to message goes to ``stderr`` instead of - ``stdout``, the same as with echo. - """ - if not isatty(sys.stdin) or not isatty(sys.stdout): - return - - if info is None: - info = _("Press any key to continue...") - - try: - if info: - echo(info, nl=False, err=err) - try: - getchar() - except (KeyboardInterrupt, EOFError): - pass - finally: - if info: - echo(err=err) diff --git a/venv/lib/python3.12/site-packages/click/testing.py b/venv/lib/python3.12/site-packages/click/testing.py deleted file mode 100644 index ebfd54d..0000000 --- a/venv/lib/python3.12/site-packages/click/testing.py +++ /dev/null @@ -1,574 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import contextlib -import io -import os -import shlex -import sys -import tempfile -import typing as t -from types import TracebackType - -from . import _compat -from . import formatting -from . import termui -from . import utils -from ._compat import _find_binary_reader - -if t.TYPE_CHECKING: - from _typeshed import ReadableBuffer - - from .core import Command - - -class EchoingStdin: - def __init__(self, input: t.BinaryIO, output: t.BinaryIO) -> None: - self._input = input - self._output = output - self._paused = False - - def __getattr__(self, x: str) -> t.Any: - return getattr(self._input, x) - - def _echo(self, rv: bytes) -> bytes: - if not self._paused: - self._output.write(rv) - - return rv - - def read(self, n: int = -1) -> bytes: - return self._echo(self._input.read(n)) - - def read1(self, n: int = -1) -> bytes: - return self._echo(self._input.read1(n)) # type: ignore - - def readline(self, n: int = -1) -> bytes: - return self._echo(self._input.readline(n)) - - def readlines(self) -> list[bytes]: - return [self._echo(x) for x in self._input.readlines()] - - def __iter__(self) -> cabc.Iterator[bytes]: - return iter(self._echo(x) for x in self._input) - - def __repr__(self) -> str: - return repr(self._input) - - -@contextlib.contextmanager -def _pause_echo(stream: EchoingStdin | None) -> cabc.Iterator[None]: - if stream is None: - yield - else: - stream._paused = True - yield - stream._paused = False - - -class BytesIOCopy(io.BytesIO): - """Patch ``io.BytesIO`` to let the written stream be copied to another. - - .. versionadded:: 8.2 - """ - - def __init__(self, copy_to: io.BytesIO) -> None: - super().__init__() - self.copy_to = copy_to - - def flush(self) -> None: - super().flush() - self.copy_to.flush() - - def write(self, b: ReadableBuffer) -> int: - self.copy_to.write(b) - return super().write(b) - - -class StreamMixer: - """Mixes `` and `` streams. - - The result is available in the ``output`` attribute. - - .. versionadded:: 8.2 - """ - - def __init__(self) -> None: - self.output: io.BytesIO = io.BytesIO() - self.stdout: io.BytesIO = BytesIOCopy(copy_to=self.output) - self.stderr: io.BytesIO = BytesIOCopy(copy_to=self.output) - - -class _NamedTextIOWrapper(io.TextIOWrapper): - def __init__( - self, buffer: t.BinaryIO, name: str, mode: str, **kwargs: t.Any - ) -> None: - super().__init__(buffer, **kwargs) - self._name = name - self._mode = mode - - def close(self) -> None: - """ - The buffer this object contains belongs to some other object, so - prevent the default __del__ implementation from closing that buffer. - - .. versionadded:: 8.3.2 - """ - ... - - @property - def name(self) -> str: - return self._name - - @property - def mode(self) -> str: - return self._mode - - -def make_input_stream( - input: str | bytes | t.IO[t.Any] | None, charset: str -) -> t.BinaryIO: - # Is already an input stream. - if hasattr(input, "read"): - rv = _find_binary_reader(t.cast("t.IO[t.Any]", input)) - - if rv is not None: - return rv - - raise TypeError("Could not find binary reader for input stream.") - - if input is None: - input = b"" - elif isinstance(input, str): - input = input.encode(charset) - - return io.BytesIO(input) - - -class Result: - """Holds the captured result of an invoked CLI script. - - :param runner: The runner that created the result - :param stdout_bytes: The standard output as bytes. - :param stderr_bytes: The standard error as bytes. - :param output_bytes: A mix of ``stdout_bytes`` and ``stderr_bytes``, as the - user would see it in its terminal. - :param return_value: The value returned from the invoked command. - :param exit_code: The exit code as integer. - :param exception: The exception that happened if one did. - :param exc_info: Exception information (exception type, exception instance, - traceback type). - - .. versionchanged:: 8.2 - ``stderr_bytes`` no longer optional, ``output_bytes`` introduced and - ``mix_stderr`` has been removed. - - .. versionadded:: 8.0 - Added ``return_value``. - """ - - def __init__( - self, - runner: CliRunner, - stdout_bytes: bytes, - stderr_bytes: bytes, - output_bytes: bytes, - return_value: t.Any, - exit_code: int, - exception: BaseException | None, - exc_info: tuple[type[BaseException], BaseException, TracebackType] - | None = None, - ): - self.runner = runner - self.stdout_bytes = stdout_bytes - self.stderr_bytes = stderr_bytes - self.output_bytes = output_bytes - self.return_value = return_value - self.exit_code = exit_code - self.exception = exception - self.exc_info = exc_info - - @property - def output(self) -> str: - """The terminal output as unicode string, as the user would see it. - - .. versionchanged:: 8.2 - No longer a proxy for ``self.stdout``. Now has its own independent stream - that is mixing `` and ``, in the order they were written. - """ - return self.output_bytes.decode(self.runner.charset, "replace").replace( - "\r\n", "\n" - ) - - @property - def stdout(self) -> str: - """The standard output as unicode string.""" - return self.stdout_bytes.decode(self.runner.charset, "replace").replace( - "\r\n", "\n" - ) - - @property - def stderr(self) -> str: - """The standard error as unicode string. - - .. versionchanged:: 8.2 - No longer raise an exception, always returns the `` string. - """ - return self.stderr_bytes.decode(self.runner.charset, "replace").replace( - "\r\n", "\n" - ) - - def __repr__(self) -> str: - exc_str = repr(self.exception) if self.exception else "okay" - return f"<{type(self).__name__} {exc_str}>" - - -class CliRunner: - """The CLI runner provides functionality to invoke a Click command line - script for unittesting purposes in a isolated environment. This only - works in single-threaded systems without any concurrency as it changes the - global interpreter state. - - :param charset: the character set for the input and output data. - :param env: a dictionary with environment variables for overriding. - :param echo_stdin: if this is set to `True`, then reading from `` writes - to ``. This is useful for showing examples in - some circumstances. Note that regular prompts - will automatically echo the input. - :param catch_exceptions: Whether to catch any exceptions other than - ``SystemExit`` when running :meth:`~CliRunner.invoke`. - - .. versionchanged:: 8.2 - Added the ``catch_exceptions`` parameter. - - .. versionchanged:: 8.2 - ``mix_stderr`` parameter has been removed. - """ - - def __init__( - self, - charset: str = "utf-8", - env: cabc.Mapping[str, str | None] | None = None, - echo_stdin: bool = False, - catch_exceptions: bool = True, - ) -> None: - self.charset = charset - self.env: cabc.Mapping[str, str | None] = env or {} - self.echo_stdin = echo_stdin - self.catch_exceptions = catch_exceptions - - def get_default_prog_name(self, cli: Command) -> str: - """Given a command object it will return the default program name - for it. The default is the `name` attribute or ``"root"`` if not - set. - """ - return cli.name or "root" - - def make_env( - self, overrides: cabc.Mapping[str, str | None] | None = None - ) -> cabc.Mapping[str, str | None]: - """Returns the environment overrides for invoking a script.""" - rv = dict(self.env) - if overrides: - rv.update(overrides) - return rv - - @contextlib.contextmanager - def isolation( - self, - input: str | bytes | t.IO[t.Any] | None = None, - env: cabc.Mapping[str, str | None] | None = None, - color: bool = False, - ) -> cabc.Iterator[tuple[io.BytesIO, io.BytesIO, io.BytesIO]]: - """A context manager that sets up the isolation for invoking of a - command line tool. This sets up `` with the given input data - and `os.environ` with the overrides from the given dictionary. - This also rebinds some internals in Click to be mocked (like the - prompt functionality). - - This is automatically done in the :meth:`invoke` method. - - :param input: the input stream to put into `sys.stdin`. - :param env: the environment overrides as dictionary. - :param color: whether the output should contain color codes. The - application can still override this explicitly. - - .. versionadded:: 8.2 - An additional output stream is returned, which is a mix of - `` and `` streams. - - .. versionchanged:: 8.2 - Always returns the `` stream. - - .. versionchanged:: 8.0 - `` is opened with ``errors="backslashreplace"`` - instead of the default ``"strict"``. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. - """ - bytes_input = make_input_stream(input, self.charset) - echo_input = None - - old_stdin = sys.stdin - old_stdout = sys.stdout - old_stderr = sys.stderr - old_forced_width = formatting.FORCED_WIDTH - formatting.FORCED_WIDTH = 80 - - env = self.make_env(env) - - stream_mixer = StreamMixer() - - if self.echo_stdin: - bytes_input = echo_input = t.cast( - t.BinaryIO, EchoingStdin(bytes_input, stream_mixer.stdout) - ) - - sys.stdin = text_input = _NamedTextIOWrapper( - bytes_input, encoding=self.charset, name="", mode="r" - ) - - if self.echo_stdin: - # Force unbuffered reads, otherwise TextIOWrapper reads a - # large chunk which is echoed early. - text_input._CHUNK_SIZE = 1 # type: ignore - - sys.stdout = _NamedTextIOWrapper( - stream_mixer.stdout, encoding=self.charset, name="", mode="w" - ) - - sys.stderr = _NamedTextIOWrapper( - stream_mixer.stderr, - encoding=self.charset, - name="", - mode="w", - errors="backslashreplace", - ) - - @_pause_echo(echo_input) # type: ignore - def visible_input(prompt: str | None = None) -> str: - sys.stdout.write(prompt or "") - try: - val = next(text_input).rstrip("\r\n") - except StopIteration as e: - raise EOFError() from e - sys.stdout.write(f"{val}\n") - sys.stdout.flush() - return val - - @_pause_echo(echo_input) # type: ignore - def hidden_input(prompt: str | None = None) -> str: - sys.stdout.write(f"{prompt or ''}\n") - sys.stdout.flush() - try: - return next(text_input).rstrip("\r\n") - except StopIteration as e: - raise EOFError() from e - - @_pause_echo(echo_input) # type: ignore - def _getchar(echo: bool) -> str: - char = sys.stdin.read(1) - - if echo: - sys.stdout.write(char) - - sys.stdout.flush() - return char - - default_color = color - - def should_strip_ansi( - stream: t.IO[t.Any] | None = None, color: bool | None = None - ) -> bool: - if color is None: - return not default_color - return not color - - old_visible_prompt_func = termui.visible_prompt_func - old_hidden_prompt_func = termui.hidden_prompt_func - old__getchar_func = termui._getchar - old_should_strip_ansi = utils.should_strip_ansi # type: ignore - old__compat_should_strip_ansi = _compat.should_strip_ansi - termui.visible_prompt_func = visible_input - termui.hidden_prompt_func = hidden_input - termui._getchar = _getchar - utils.should_strip_ansi = should_strip_ansi # type: ignore - _compat.should_strip_ansi = should_strip_ansi - - old_env = {} - try: - for key, value in env.items(): - old_env[key] = os.environ.get(key) - if value is None: - try: - del os.environ[key] - except Exception: - pass - else: - os.environ[key] = value - yield (stream_mixer.stdout, stream_mixer.stderr, stream_mixer.output) - finally: - for key, value in old_env.items(): - if value is None: - try: - del os.environ[key] - except Exception: - pass - else: - os.environ[key] = value - sys.stdout = old_stdout - sys.stderr = old_stderr - sys.stdin = old_stdin - termui.visible_prompt_func = old_visible_prompt_func - termui.hidden_prompt_func = old_hidden_prompt_func - termui._getchar = old__getchar_func - utils.should_strip_ansi = old_should_strip_ansi # type: ignore - _compat.should_strip_ansi = old__compat_should_strip_ansi - formatting.FORCED_WIDTH = old_forced_width - - def invoke( - self, - cli: Command, - args: str | cabc.Sequence[str] | None = None, - input: str | bytes | t.IO[t.Any] | None = None, - env: cabc.Mapping[str, str | None] | None = None, - catch_exceptions: bool | None = None, - color: bool = False, - **extra: t.Any, - ) -> Result: - """Invokes a command in an isolated environment. The arguments are - forwarded directly to the command line script, the `extra` keyword - arguments are passed to the :meth:`~clickpkg.Command.main` function of - the command. - - This returns a :class:`Result` object. - - :param cli: the command to invoke - :param args: the arguments to invoke. It may be given as an iterable - or a string. When given as string it will be interpreted - as a Unix shell command. More details at - :func:`shlex.split`. - :param input: the input data for `sys.stdin`. - :param env: the environment overrides. - :param catch_exceptions: Whether to catch any other exceptions than - ``SystemExit``. If :data:`None`, the value - from :class:`CliRunner` is used. - :param extra: the keyword arguments to pass to :meth:`main`. - :param color: whether the output should contain color codes. The - application can still override this explicitly. - - .. versionadded:: 8.2 - The result object has the ``output_bytes`` attribute with - the mix of ``stdout_bytes`` and ``stderr_bytes``, as the user would - see it in its terminal. - - .. versionchanged:: 8.2 - The result object always returns the ``stderr_bytes`` stream. - - .. versionchanged:: 8.0 - The result object has the ``return_value`` attribute with - the value returned from the invoked command. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. - - .. versionchanged:: 3.0 - Added the ``catch_exceptions`` parameter. - - .. versionchanged:: 3.0 - The result object has the ``exc_info`` attribute with the - traceback if available. - """ - exc_info = None - if catch_exceptions is None: - catch_exceptions = self.catch_exceptions - - with self.isolation(input=input, env=env, color=color) as outstreams: - return_value = None - exception: BaseException | None = None - exit_code = 0 - - if isinstance(args, str): - args = shlex.split(args) - - try: - prog_name = extra.pop("prog_name") - except KeyError: - prog_name = self.get_default_prog_name(cli) - - try: - return_value = cli.main(args=args or (), prog_name=prog_name, **extra) - except SystemExit as e: - exc_info = sys.exc_info() - e_code = t.cast("int | t.Any | None", e.code) - - if e_code is None: - e_code = 0 - - if e_code != 0: - exception = e - - if not isinstance(e_code, int): - sys.stdout.write(str(e_code)) - sys.stdout.write("\n") - e_code = 1 - - exit_code = e_code - - except Exception as e: - if not catch_exceptions: - raise - exception = e - exit_code = 1 - exc_info = sys.exc_info() - finally: - sys.stdout.flush() - sys.stderr.flush() - stdout = outstreams[0].getvalue() - stderr = outstreams[1].getvalue() - output = outstreams[2].getvalue() - - return Result( - runner=self, - stdout_bytes=stdout, - stderr_bytes=stderr, - output_bytes=output, - return_value=return_value, - exit_code=exit_code, - exception=exception, - exc_info=exc_info, # type: ignore - ) - - @contextlib.contextmanager - def isolated_filesystem( - self, temp_dir: str | os.PathLike[str] | None = None - ) -> cabc.Iterator[str]: - """A context manager that creates a temporary directory and - changes the current working directory to it. This isolates tests - that affect the contents of the CWD to prevent them from - interfering with each other. - - :param temp_dir: Create the temporary directory under this - directory. If given, the created directory is not removed - when exiting. - - .. versionchanged:: 8.0 - Added the ``temp_dir`` parameter. - """ - cwd = os.getcwd() - dt = tempfile.mkdtemp(dir=temp_dir) - os.chdir(dt) - - try: - yield dt - finally: - os.chdir(cwd) - - if temp_dir is None: - import shutil - - try: - shutil.rmtree(dt) - except OSError: - pass diff --git a/venv/lib/python3.12/site-packages/click/types.py b/venv/lib/python3.12/site-packages/click/types.py deleted file mode 100644 index e71c1c2..0000000 --- a/venv/lib/python3.12/site-packages/click/types.py +++ /dev/null @@ -1,1209 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import enum -import os -import stat -import sys -import typing as t -from datetime import datetime -from gettext import gettext as _ -from gettext import ngettext - -from ._compat import _get_argv_encoding -from ._compat import open_stream -from .exceptions import BadParameter -from .utils import format_filename -from .utils import LazyFile -from .utils import safecall - -if t.TYPE_CHECKING: - import typing_extensions as te - - from .core import Context - from .core import Parameter - from .shell_completion import CompletionItem - -ParamTypeValue = t.TypeVar("ParamTypeValue") - - -class ParamType: - """Represents the type of a parameter. Validates and converts values - from the command line or Python into the correct type. - - To implement a custom type, subclass and implement at least the - following: - - - The :attr:`name` class attribute must be set. - - Calling an instance of the type with ``None`` must return - ``None``. This is already implemented by default. - - :meth:`convert` must convert string values to the correct type. - - :meth:`convert` must accept values that are already the correct - type. - - It must be able to convert a value if the ``ctx`` and ``param`` - arguments are ``None``. This can occur when converting prompt - input. - """ - - is_composite: t.ClassVar[bool] = False - arity: t.ClassVar[int] = 1 - - #: the descriptive name of this type - name: str - - #: if a list of this type is expected and the value is pulled from a - #: string environment variable, this is what splits it up. `None` - #: means any whitespace. For all parameters the general rule is that - #: whitespace splits them up. The exception are paths and files which - #: are split by ``os.path.pathsep`` by default (":" on Unix and ";" on - #: Windows). - envvar_list_splitter: t.ClassVar[str | None] = None - - def to_info_dict(self) -> dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. - - Use :meth:`click.Context.to_info_dict` to traverse the entire - CLI structure. - - .. versionadded:: 8.0 - """ - # The class name without the "ParamType" suffix. - param_type = type(self).__name__.partition("ParamType")[0] - param_type = param_type.partition("ParameterType")[0] - - # Custom subclasses might not remember to set a name. - if hasattr(self, "name"): - name = self.name - else: - name = param_type - - return {"param_type": param_type, "name": name} - - def __call__( - self, - value: t.Any, - param: Parameter | None = None, - ctx: Context | None = None, - ) -> t.Any: - if value is not None: - return self.convert(value, param, ctx) - - def get_metavar(self, param: Parameter, ctx: Context) -> str | None: - """Returns the metavar default for this param if it provides one.""" - - def get_missing_message(self, param: Parameter, ctx: Context | None) -> str | None: - """Optionally might return extra information about a missing - parameter. - - .. versionadded:: 2.0 - """ - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - """Convert the value to the correct type. This is not called if - the value is ``None`` (the missing value). - - This must accept string values from the command line, as well as - values that are already the correct type. It may also convert - other compatible types. - - The ``param`` and ``ctx`` arguments may be ``None`` in certain - situations, such as when converting prompt input. - - If the value cannot be converted, call :meth:`fail` with a - descriptive message. - - :param value: The value to convert. - :param param: The parameter that is using this type to convert - its value. May be ``None``. - :param ctx: The current context that arrived at this value. May - be ``None``. - """ - return value - - def split_envvar_value(self, rv: str) -> cabc.Sequence[str]: - """Given a value from an environment variable this splits it up - into small chunks depending on the defined envvar list splitter. - - If the splitter is set to `None`, which means that whitespace splits, - then leading and trailing whitespace is ignored. Otherwise, leading - and trailing splitters usually lead to empty items being included. - """ - return (rv or "").split(self.envvar_list_splitter) - - def fail( - self, - message: str, - param: Parameter | None = None, - ctx: Context | None = None, - ) -> t.NoReturn: - """Helper method to fail with an invalid value message.""" - raise BadParameter(message, ctx=ctx, param=param) - - def shell_complete( - self, ctx: Context, param: Parameter, incomplete: str - ) -> list[CompletionItem]: - """Return a list of - :class:`~click.shell_completion.CompletionItem` objects for the - incomplete value. Most types do not provide completions, but - some do, and this allows custom types to provide custom - completions as well. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - return [] - - -class CompositeParamType(ParamType): - is_composite = True - - @property - def arity(self) -> int: # type: ignore - raise NotImplementedError() - - -class FuncParamType(ParamType): - def __init__(self, func: t.Callable[[t.Any], t.Any]) -> None: - self.name: str = func.__name__ - self.func = func - - def to_info_dict(self) -> dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["func"] = self.func - return info_dict - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - try: - return self.func(value) - except ValueError: - try: - value = str(value) - except UnicodeError: - value = value.decode("utf-8", "replace") - - self.fail(value, param, ctx) - - -class UnprocessedParamType(ParamType): - name = "text" - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - return value - - def __repr__(self) -> str: - return "UNPROCESSED" - - -class StringParamType(ParamType): - name = "text" - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - if isinstance(value, bytes): - enc = _get_argv_encoding() - try: - value = value.decode(enc) - except UnicodeError: - fs_enc = sys.getfilesystemencoding() - if fs_enc != enc: - try: - value = value.decode(fs_enc) - except UnicodeError: - value = value.decode("utf-8", "replace") - else: - value = value.decode("utf-8", "replace") - return value - return str(value) - - def __repr__(self) -> str: - return "STRING" - - -class Choice(ParamType, t.Generic[ParamTypeValue]): - """The choice type allows a value to be checked against a fixed set - of supported values. - - You may pass any iterable value which will be converted to a tuple - and thus will only be iterated once. - - The resulting value will always be one of the originally passed choices. - See :meth:`normalize_choice` for more info on the mapping of strings - to choices. See :ref:`choice-opts` for an example. - - :param case_sensitive: Set to false to make choices case - insensitive. Defaults to true. - - .. versionchanged:: 8.2.0 - Non-``str`` ``choices`` are now supported. It can additionally be any - iterable. Before you were not recommended to pass anything but a list or - tuple. - - .. versionadded:: 8.2.0 - Choice normalization can be overridden via :meth:`normalize_choice`. - """ - - name = "choice" - - def __init__( - self, choices: cabc.Iterable[ParamTypeValue], case_sensitive: bool = True - ) -> None: - self.choices: cabc.Sequence[ParamTypeValue] = tuple(choices) - self.case_sensitive = case_sensitive - - def to_info_dict(self) -> dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["choices"] = self.choices - info_dict["case_sensitive"] = self.case_sensitive - return info_dict - - def _normalized_mapping( - self, ctx: Context | None = None - ) -> cabc.Mapping[ParamTypeValue, str]: - """ - Returns mapping where keys are the original choices and the values are - the normalized values that are accepted via the command line. - - This is a simple wrapper around :meth:`normalize_choice`, use that - instead which is supported. - """ - return { - choice: self.normalize_choice( - choice=choice, - ctx=ctx, - ) - for choice in self.choices - } - - def normalize_choice(self, choice: ParamTypeValue, ctx: Context | None) -> str: - """ - Normalize a choice value, used to map a passed string to a choice. - Each choice must have a unique normalized value. - - By default uses :meth:`Context.token_normalize_func` and if not case - sensitive, convert it to a casefolded value. - - .. versionadded:: 8.2.0 - """ - normed_value = choice.name if isinstance(choice, enum.Enum) else str(choice) - - if ctx is not None and ctx.token_normalize_func is not None: - normed_value = ctx.token_normalize_func(normed_value) - - if not self.case_sensitive: - normed_value = normed_value.casefold() - - return normed_value - - def get_metavar(self, param: Parameter, ctx: Context) -> str | None: - if param.param_type_name == "option" and not param.show_choices: # type: ignore - choice_metavars = [ - convert_type(type(choice)).name.upper() for choice in self.choices - ] - choices_str = "|".join([*dict.fromkeys(choice_metavars)]) - else: - choices_str = "|".join( - [str(i) for i in self._normalized_mapping(ctx=ctx).values()] - ) - - # Use curly braces to indicate a required argument. - if param.required and param.param_type_name == "argument": - return f"{{{choices_str}}}" - - # Use square braces to indicate an option or optional argument. - return f"[{choices_str}]" - - def get_missing_message(self, param: Parameter, ctx: Context | None) -> str: - """ - Message shown when no choice is passed. - - .. versionchanged:: 8.2.0 Added ``ctx`` argument. - """ - return _("Choose from:\n\t{choices}").format( - choices=",\n\t".join(self._normalized_mapping(ctx=ctx).values()) - ) - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> ParamTypeValue: - """ - For a given value from the parser, normalize it and find its - matching normalized value in the list of choices. Then return the - matched "original" choice. - """ - normed_value = self.normalize_choice(choice=value, ctx=ctx) - normalized_mapping = self._normalized_mapping(ctx=ctx) - - try: - return next( - original - for original, normalized in normalized_mapping.items() - if normalized == normed_value - ) - except StopIteration: - self.fail( - self.get_invalid_choice_message(value=value, ctx=ctx), - param=param, - ctx=ctx, - ) - - def get_invalid_choice_message(self, value: t.Any, ctx: Context | None) -> str: - """Get the error message when the given choice is invalid. - - :param value: The invalid value. - - .. versionadded:: 8.2 - """ - choices_str = ", ".join(map(repr, self._normalized_mapping(ctx=ctx).values())) - return ngettext( - "{value!r} is not {choice}.", - "{value!r} is not one of {choices}.", - len(self.choices), - ).format(value=value, choice=choices_str, choices=choices_str) - - def __repr__(self) -> str: - return f"Choice({list(self.choices)})" - - def shell_complete( - self, ctx: Context, param: Parameter, incomplete: str - ) -> list[CompletionItem]: - """Complete choices that start with the incomplete value. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - str_choices = map(str, self.choices) - - if self.case_sensitive: - matched = (c for c in str_choices if c.startswith(incomplete)) - else: - incomplete = incomplete.lower() - matched = (c for c in str_choices if c.lower().startswith(incomplete)) - - return [CompletionItem(c) for c in matched] - - -class DateTime(ParamType): - """The DateTime type converts date strings into `datetime` objects. - - The format strings which are checked are configurable, but default to some - common (non-timezone aware) ISO 8601 formats. - - When specifying *DateTime* formats, you should only pass a list or a tuple. - Other iterables, like generators, may lead to surprising results. - - The format strings are processed using ``datetime.strptime``, and this - consequently defines the format strings which are allowed. - - Parsing is tried using each format, in order, and the first format which - parses successfully is used. - - :param formats: A list or tuple of date format strings, in the order in - which they should be tried. Defaults to - ``'%Y-%m-%d'``, ``'%Y-%m-%dT%H:%M:%S'``, - ``'%Y-%m-%d %H:%M:%S'``. - """ - - name = "datetime" - - def __init__(self, formats: cabc.Sequence[str] | None = None): - self.formats: cabc.Sequence[str] = formats or [ - "%Y-%m-%d", - "%Y-%m-%dT%H:%M:%S", - "%Y-%m-%d %H:%M:%S", - ] - - def to_info_dict(self) -> dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["formats"] = self.formats - return info_dict - - def get_metavar(self, param: Parameter, ctx: Context) -> str | None: - return f"[{'|'.join(self.formats)}]" - - def _try_to_convert_date(self, value: t.Any, format: str) -> datetime | None: - try: - return datetime.strptime(value, format) - except ValueError: - return None - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - if isinstance(value, datetime): - return value - - for format in self.formats: - converted = self._try_to_convert_date(value, format) - - if converted is not None: - return converted - - formats_str = ", ".join(map(repr, self.formats)) - self.fail( - ngettext( - "{value!r} does not match the format {format}.", - "{value!r} does not match the formats {formats}.", - len(self.formats), - ).format(value=value, format=formats_str, formats=formats_str), - param, - ctx, - ) - - def __repr__(self) -> str: - return "DateTime" - - -class _NumberParamTypeBase(ParamType): - _number_class: t.ClassVar[type[t.Any]] - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - try: - return self._number_class(value) - except ValueError: - self.fail( - _("{value!r} is not a valid {number_type}.").format( - value=value, number_type=self.name - ), - param, - ctx, - ) - - -class _NumberRangeBase(_NumberParamTypeBase): - def __init__( - self, - min: float | None = None, - max: float | None = None, - min_open: bool = False, - max_open: bool = False, - clamp: bool = False, - ) -> None: - self.min = min - self.max = max - self.min_open = min_open - self.max_open = max_open - self.clamp = clamp - - def to_info_dict(self) -> dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update( - min=self.min, - max=self.max, - min_open=self.min_open, - max_open=self.max_open, - clamp=self.clamp, - ) - return info_dict - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - import operator - - rv = super().convert(value, param, ctx) - lt_min: bool = self.min is not None and ( - operator.le if self.min_open else operator.lt - )(rv, self.min) - gt_max: bool = self.max is not None and ( - operator.ge if self.max_open else operator.gt - )(rv, self.max) - - if self.clamp: - if lt_min: - return self._clamp(self.min, 1, self.min_open) # type: ignore - - if gt_max: - return self._clamp(self.max, -1, self.max_open) # type: ignore - - if lt_min or gt_max: - self.fail( - _("{value} is not in the range {range}.").format( - value=rv, range=self._describe_range() - ), - param, - ctx, - ) - - return rv - - def _clamp(self, bound: float, dir: t.Literal[1, -1], open: bool) -> float: - """Find the valid value to clamp to bound in the given - direction. - - :param bound: The boundary value. - :param dir: 1 or -1 indicating the direction to move. - :param open: If true, the range does not include the bound. - """ - raise NotImplementedError - - def _describe_range(self) -> str: - """Describe the range for use in help text.""" - if self.min is None: - op = "<" if self.max_open else "<=" - return f"x{op}{self.max}" - - if self.max is None: - op = ">" if self.min_open else ">=" - return f"x{op}{self.min}" - - lop = "<" if self.min_open else "<=" - rop = "<" if self.max_open else "<=" - return f"{self.min}{lop}x{rop}{self.max}" - - def __repr__(self) -> str: - clamp = " clamped" if self.clamp else "" - return f"<{type(self).__name__} {self._describe_range()}{clamp}>" - - -class IntParamType(_NumberParamTypeBase): - name = "integer" - _number_class = int - - def __repr__(self) -> str: - return "INT" - - -class IntRange(_NumberRangeBase, IntParamType): - """Restrict an :data:`click.INT` value to a range of accepted - values. See :ref:`ranges`. - - If ``min`` or ``max`` are not passed, any value is accepted in that - direction. If ``min_open`` or ``max_open`` are enabled, the - corresponding boundary is not included in the range. - - If ``clamp`` is enabled, a value outside the range is clamped to the - boundary instead of failing. - - .. versionchanged:: 8.0 - Added the ``min_open`` and ``max_open`` parameters. - """ - - name = "integer range" - - def _clamp( # type: ignore - self, bound: int, dir: t.Literal[1, -1], open: bool - ) -> int: - if not open: - return bound - - return bound + dir - - -class FloatParamType(_NumberParamTypeBase): - name = "float" - _number_class = float - - def __repr__(self) -> str: - return "FLOAT" - - -class FloatRange(_NumberRangeBase, FloatParamType): - """Restrict a :data:`click.FLOAT` value to a range of accepted - values. See :ref:`ranges`. - - If ``min`` or ``max`` are not passed, any value is accepted in that - direction. If ``min_open`` or ``max_open`` are enabled, the - corresponding boundary is not included in the range. - - If ``clamp`` is enabled, a value outside the range is clamped to the - boundary instead of failing. This is not supported if either - boundary is marked ``open``. - - .. versionchanged:: 8.0 - Added the ``min_open`` and ``max_open`` parameters. - """ - - name = "float range" - - def __init__( - self, - min: float | None = None, - max: float | None = None, - min_open: bool = False, - max_open: bool = False, - clamp: bool = False, - ) -> None: - super().__init__( - min=min, max=max, min_open=min_open, max_open=max_open, clamp=clamp - ) - - if (min_open or max_open) and clamp: - raise TypeError("Clamping is not supported for open bounds.") - - def _clamp(self, bound: float, dir: t.Literal[1, -1], open: bool) -> float: - if not open: - return bound - - # Could use math.nextafter here, but clamping an - # open float range doesn't seem to be particularly useful. It's - # left up to the user to write a callback to do it if needed. - raise RuntimeError("Clamping is not supported for open bounds.") - - -class BoolParamType(ParamType): - name = "boolean" - - bool_states: dict[str, bool] = { - "1": True, - "0": False, - "yes": True, - "no": False, - "true": True, - "false": False, - "on": True, - "off": False, - "t": True, - "f": False, - "y": True, - "n": False, - # Absence of value is considered False. - "": False, - } - """A mapping of string values to boolean states. - - Mapping is inspired by :py:attr:`configparser.ConfigParser.BOOLEAN_STATES` - and extends it. - - .. caution:: - String values are lower-cased, as the ``str_to_bool`` comparison function - below is case-insensitive. - - .. warning:: - The mapping is not exhaustive, and does not cover all possible boolean strings - representations. It will remains as it is to avoid endless bikeshedding. - - Future work my be considered to make this mapping user-configurable from public - API. - """ - - @staticmethod - def str_to_bool(value: str | bool) -> bool | None: - """Convert a string to a boolean value. - - If the value is already a boolean, it is returned as-is. If the value is a - string, it is stripped of whitespaces and lower-cased, then checked against - the known boolean states pre-defined in the `BoolParamType.bool_states` mapping - above. - - Returns `None` if the value does not match any known boolean state. - """ - if isinstance(value, bool): - return value - return BoolParamType.bool_states.get(value.strip().lower()) - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> bool: - normalized = self.str_to_bool(value) - if normalized is None: - self.fail( - _( - "{value!r} is not a valid boolean. Recognized values: {states}" - ).format(value=value, states=", ".join(sorted(self.bool_states))), - param, - ctx, - ) - return normalized - - def __repr__(self) -> str: - return "BOOL" - - -class UUIDParameterType(ParamType): - name = "uuid" - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - import uuid - - if isinstance(value, uuid.UUID): - return value - - value = value.strip() - - try: - return uuid.UUID(value) - except ValueError: - self.fail( - _("{value!r} is not a valid UUID.").format(value=value), param, ctx - ) - - def __repr__(self) -> str: - return "UUID" - - -class File(ParamType): - """Declares a parameter to be a file for reading or writing. The file - is automatically closed once the context tears down (after the command - finished working). - - Files can be opened for reading or writing. The special value ``-`` - indicates stdin or stdout depending on the mode. - - By default, the file is opened for reading text data, but it can also be - opened in binary mode or for writing. The encoding parameter can be used - to force a specific encoding. - - The `lazy` flag controls if the file should be opened immediately or upon - first IO. The default is to be non-lazy for standard input and output - streams as well as files opened for reading, `lazy` otherwise. When opening a - file lazily for reading, it is still opened temporarily for validation, but - will not be held open until first IO. lazy is mainly useful when opening - for writing to avoid creating the file until it is needed. - - Files can also be opened atomically in which case all writes go into a - separate file in the same folder and upon completion the file will - be moved over to the original location. This is useful if a file - regularly read by other users is modified. - - See :ref:`file-args` for more information. - - .. versionchanged:: 2.0 - Added the ``atomic`` parameter. - """ - - name = "filename" - envvar_list_splitter: t.ClassVar[str] = os.path.pathsep - - def __init__( - self, - mode: str = "r", - encoding: str | None = None, - errors: str | None = "strict", - lazy: bool | None = None, - atomic: bool = False, - ) -> None: - self.mode = mode - self.encoding = encoding - self.errors = errors - self.lazy = lazy - self.atomic = atomic - - def to_info_dict(self) -> dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update(mode=self.mode, encoding=self.encoding) - return info_dict - - def resolve_lazy_flag(self, value: str | os.PathLike[str]) -> bool: - if self.lazy is not None: - return self.lazy - if os.fspath(value) == "-": - return False - elif "w" in self.mode: - return True - return False - - def convert( - self, - value: str | os.PathLike[str] | t.IO[t.Any], - param: Parameter | None, - ctx: Context | None, - ) -> t.IO[t.Any]: - if _is_file_like(value): - return value - - value = t.cast("str | os.PathLike[str]", value) - - try: - lazy = self.resolve_lazy_flag(value) - - if lazy: - lf = LazyFile( - value, self.mode, self.encoding, self.errors, atomic=self.atomic - ) - - if ctx is not None: - ctx.call_on_close(lf.close_intelligently) - - return t.cast("t.IO[t.Any]", lf) - - f, should_close = open_stream( - value, self.mode, self.encoding, self.errors, atomic=self.atomic - ) - - # If a context is provided, we automatically close the file - # at the end of the context execution (or flush out). If a - # context does not exist, it's the caller's responsibility to - # properly close the file. This for instance happens when the - # type is used with prompts. - if ctx is not None: - if should_close: - ctx.call_on_close(safecall(f.close)) - else: - ctx.call_on_close(safecall(f.flush)) - - return f - except OSError as e: - self.fail(f"'{format_filename(value)}': {e.strerror}", param, ctx) - - def shell_complete( - self, ctx: Context, param: Parameter, incomplete: str - ) -> list[CompletionItem]: - """Return a special completion marker that tells the completion - system to use the shell to provide file path completions. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - return [CompletionItem(incomplete, type="file")] - - -def _is_file_like(value: t.Any) -> te.TypeGuard[t.IO[t.Any]]: - return hasattr(value, "read") or hasattr(value, "write") - - -class Path(ParamType): - """The ``Path`` type is similar to the :class:`File` type, but - returns the filename instead of an open file. Various checks can be - enabled to validate the type of file and permissions. - - :param exists: The file or directory needs to exist for the value to - be valid. If this is not set to ``True``, and the file does not - exist, then all further checks are silently skipped. - :param file_okay: Allow a file as a value. - :param dir_okay: Allow a directory as a value. - :param readable: if true, a readable check is performed. - :param writable: if true, a writable check is performed. - :param executable: if true, an executable check is performed. - :param resolve_path: Make the value absolute and resolve any - symlinks. A ``~`` is not expanded, as this is supposed to be - done by the shell only. - :param allow_dash: Allow a single dash as a value, which indicates - a standard stream (but does not open it). Use - :func:`~click.open_file` to handle opening this value. - :param path_type: Convert the incoming path value to this type. If - ``None``, keep Python's default, which is ``str``. Useful to - convert to :class:`pathlib.Path`. - - .. versionchanged:: 8.1 - Added the ``executable`` parameter. - - .. versionchanged:: 8.0 - Allow passing ``path_type=pathlib.Path``. - - .. versionchanged:: 6.0 - Added the ``allow_dash`` parameter. - """ - - envvar_list_splitter: t.ClassVar[str] = os.path.pathsep - - def __init__( - self, - exists: bool = False, - file_okay: bool = True, - dir_okay: bool = True, - writable: bool = False, - readable: bool = True, - resolve_path: bool = False, - allow_dash: bool = False, - path_type: type[t.Any] | None = None, - executable: bool = False, - ): - self.exists = exists - self.file_okay = file_okay - self.dir_okay = dir_okay - self.readable = readable - self.writable = writable - self.executable = executable - self.resolve_path = resolve_path - self.allow_dash = allow_dash - self.type = path_type - - if self.file_okay and not self.dir_okay: - self.name: str = _("file") - elif self.dir_okay and not self.file_okay: - self.name = _("directory") - else: - self.name = _("path") - - def to_info_dict(self) -> dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update( - exists=self.exists, - file_okay=self.file_okay, - dir_okay=self.dir_okay, - writable=self.writable, - readable=self.readable, - allow_dash=self.allow_dash, - ) - return info_dict - - def coerce_path_result( - self, value: str | os.PathLike[str] - ) -> str | bytes | os.PathLike[str]: - if self.type is not None and not isinstance(value, self.type): - if self.type is str: - return os.fsdecode(value) - elif self.type is bytes: - return os.fsencode(value) - else: - return t.cast("os.PathLike[str]", self.type(value)) - - return value - - def convert( - self, - value: str | os.PathLike[str], - param: Parameter | None, - ctx: Context | None, - ) -> str | bytes | os.PathLike[str]: - rv = value - - is_dash = self.file_okay and self.allow_dash and rv in (b"-", "-") - - if not is_dash: - if self.resolve_path: - rv = os.path.realpath(rv) - - try: - st = os.stat(rv) - except OSError: - if not self.exists: - return self.coerce_path_result(rv) - self.fail( - _("{name} {filename!r} does not exist.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - if not self.file_okay and stat.S_ISREG(st.st_mode): - self.fail( - _("{name} {filename!r} is a file.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - if not self.dir_okay and stat.S_ISDIR(st.st_mode): - self.fail( - _("{name} {filename!r} is a directory.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - if self.readable and not os.access(rv, os.R_OK): - self.fail( - _("{name} {filename!r} is not readable.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - if self.writable and not os.access(rv, os.W_OK): - self.fail( - _("{name} {filename!r} is not writable.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - if self.executable and not os.access(value, os.X_OK): - self.fail( - _("{name} {filename!r} is not executable.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - return self.coerce_path_result(rv) - - def shell_complete( - self, ctx: Context, param: Parameter, incomplete: str - ) -> list[CompletionItem]: - """Return a special completion marker that tells the completion - system to use the shell to provide path completions for only - directories or any paths. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - type = "dir" if self.dir_okay and not self.file_okay else "file" - return [CompletionItem(incomplete, type=type)] - - -class Tuple(CompositeParamType): - """The default behavior of Click is to apply a type on a value directly. - This works well in most cases, except for when `nargs` is set to a fixed - count and different types should be used for different items. In this - case the :class:`Tuple` type can be used. This type can only be used - if `nargs` is set to a fixed number. - - For more information see :ref:`tuple-type`. - - This can be selected by using a Python tuple literal as a type. - - :param types: a list of types that should be used for the tuple items. - """ - - def __init__(self, types: cabc.Sequence[type[t.Any] | ParamType]) -> None: - self.types: cabc.Sequence[ParamType] = [convert_type(ty) for ty in types] - - def to_info_dict(self) -> dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["types"] = [t.to_info_dict() for t in self.types] - return info_dict - - @property - def name(self) -> str: # type: ignore - return f"<{' '.join(ty.name for ty in self.types)}>" - - @property - def arity(self) -> int: # type: ignore - return len(self.types) - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - len_type = len(self.types) - len_value = len(value) - - if len_value != len_type: - self.fail( - ngettext( - "{len_type} values are required, but {len_value} was given.", - "{len_type} values are required, but {len_value} were given.", - len_value, - ).format(len_type=len_type, len_value=len_value), - param=param, - ctx=ctx, - ) - - return tuple( - ty(x, param, ctx) for ty, x in zip(self.types, value, strict=False) - ) - - -def convert_type(ty: t.Any | None, default: t.Any | None = None) -> ParamType: - """Find the most appropriate :class:`ParamType` for the given Python - type. If the type isn't provided, it can be inferred from a default - value. - """ - guessed_type = False - - if ty is None and default is not None: - if isinstance(default, (tuple, list)): - # If the default is empty, ty will remain None and will - # return STRING. - if default: - item = default[0] - - # A tuple of tuples needs to detect the inner types. - # Can't call convert recursively because that would - # incorrectly unwind the tuple to a single type. - if isinstance(item, (tuple, list)): - ty = tuple(map(type, item)) - else: - ty = type(item) - else: - ty = type(default) - - guessed_type = True - - if isinstance(ty, tuple): - return Tuple(ty) - - if isinstance(ty, ParamType): - return ty - - if ty is str or ty is None: - return STRING - - if ty is int: - return INT - - if ty is float: - return FLOAT - - if ty is bool: - return BOOL - - if guessed_type: - return STRING - - if __debug__: - try: - if issubclass(ty, ParamType): - raise AssertionError( - f"Attempted to use an uninstantiated parameter type ({ty})." - ) - except TypeError: - # ty is an instance (correct), so issubclass fails. - pass - - return FuncParamType(ty) - - -#: A dummy parameter type that just does nothing. From a user's -#: perspective this appears to just be the same as `STRING` but -#: internally no string conversion takes place if the input was bytes. -#: This is usually useful when working with file paths as they can -#: appear in bytes and unicode. -#: -#: For path related uses the :class:`Path` type is a better choice but -#: there are situations where an unprocessed type is useful which is why -#: it is is provided. -#: -#: .. versionadded:: 4.0 -UNPROCESSED = UnprocessedParamType() - -#: A unicode string parameter type which is the implicit default. This -#: can also be selected by using ``str`` as type. -STRING = StringParamType() - -#: An integer parameter. This can also be selected by using ``int`` as -#: type. -INT = IntParamType() - -#: A floating point value parameter. This can also be selected by using -#: ``float`` as type. -FLOAT = FloatParamType() - -#: A boolean parameter. This is the default for boolean flags. This can -#: also be selected by using ``bool`` as a type. -BOOL = BoolParamType() - -#: A UUID parameter. -UUID = UUIDParameterType() - - -class OptionHelpExtra(t.TypedDict, total=False): - envvars: tuple[str, ...] - default: str - range: str - required: str diff --git a/venv/lib/python3.12/site-packages/click/utils.py b/venv/lib/python3.12/site-packages/click/utils.py deleted file mode 100644 index beae26f..0000000 --- a/venv/lib/python3.12/site-packages/click/utils.py +++ /dev/null @@ -1,627 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import os -import re -import sys -import typing as t -from functools import update_wrapper -from types import ModuleType -from types import TracebackType - -from ._compat import _default_text_stderr -from ._compat import _default_text_stdout -from ._compat import _find_binary_writer -from ._compat import auto_wrap_for_ansi -from ._compat import binary_streams -from ._compat import open_stream -from ._compat import should_strip_ansi -from ._compat import strip_ansi -from ._compat import text_streams -from ._compat import WIN -from .globals import resolve_color_default - -if t.TYPE_CHECKING: - import typing_extensions as te - - P = te.ParamSpec("P") - -R = t.TypeVar("R") - - -def _posixify(name: str) -> str: - return "-".join(name.split()).lower() - - -def safecall(func: t.Callable[P, R]) -> t.Callable[P, R | None]: - """Wraps a function so that it swallows exceptions.""" - - def wrapper(*args: P.args, **kwargs: P.kwargs) -> R | None: - try: - return func(*args, **kwargs) - except Exception: - pass - return None - - return update_wrapper(wrapper, func) - - -def make_str(value: t.Any) -> str: - """Converts a value into a valid string.""" - if isinstance(value, bytes): - try: - return value.decode(sys.getfilesystemencoding()) - except UnicodeError: - return value.decode("utf-8", "replace") - return str(value) - - -def make_default_short_help(help: str, max_length: int = 45) -> str: - """Returns a condensed version of help string.""" - # Consider only the first paragraph. - paragraph_end = help.find("\n\n") - - if paragraph_end != -1: - help = help[:paragraph_end] - - # Collapse newlines, tabs, and spaces. - words = help.split() - - if not words: - return "" - - # The first paragraph started with a "no rewrap" marker, ignore it. - if words[0] == "\b": - words = words[1:] - - total_length = 0 - last_index = len(words) - 1 - - for i, word in enumerate(words): - total_length += len(word) + (i > 0) - - if total_length > max_length: # too long, truncate - break - - if word[-1] == ".": # sentence end, truncate without "..." - return " ".join(words[: i + 1]) - - if total_length == max_length and i != last_index: - break # not at sentence end, truncate with "..." - else: - return " ".join(words) # no truncation needed - - # Account for the length of the suffix. - total_length += len("...") - - # remove words until the length is short enough - while i > 0: - total_length -= len(words[i]) + (i > 0) - - if total_length <= max_length: - break - - i -= 1 - - return " ".join(words[:i]) + "..." - - -class LazyFile: - """A lazy file works like a regular file but it does not fully open - the file but it does perform some basic checks early to see if the - filename parameter does make sense. This is useful for safely opening - files for writing. - """ - - def __init__( - self, - filename: str | os.PathLike[str], - mode: str = "r", - encoding: str | None = None, - errors: str | None = "strict", - atomic: bool = False, - ): - self.name: str = os.fspath(filename) - self.mode = mode - self.encoding = encoding - self.errors = errors - self.atomic = atomic - self._f: t.IO[t.Any] | None - self.should_close: bool - - if self.name == "-": - self._f, self.should_close = open_stream(filename, mode, encoding, errors) - else: - if "r" in mode: - # Open and close the file in case we're opening it for - # reading so that we can catch at least some errors in - # some cases early. - open(filename, mode).close() - self._f = None - self.should_close = True - - def __getattr__(self, name: str) -> t.Any: - return getattr(self.open(), name) - - def __repr__(self) -> str: - if self._f is not None: - return repr(self._f) - return f"" - - def open(self) -> t.IO[t.Any]: - """Opens the file if it's not yet open. This call might fail with - a :exc:`FileError`. Not handling this error will produce an error - that Click shows. - """ - if self._f is not None: - return self._f - try: - rv, self.should_close = open_stream( - self.name, self.mode, self.encoding, self.errors, atomic=self.atomic - ) - except OSError as e: - from .exceptions import FileError - - raise FileError(self.name, hint=e.strerror) from e - self._f = rv - return rv - - def close(self) -> None: - """Closes the underlying file, no matter what.""" - if self._f is not None: - self._f.close() - - def close_intelligently(self) -> None: - """This function only closes the file if it was opened by the lazy - file wrapper. For instance this will never close stdin. - """ - if self.should_close: - self.close() - - def __enter__(self) -> LazyFile: - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - self.close_intelligently() - - def __iter__(self) -> cabc.Iterator[t.AnyStr]: - self.open() - return iter(self._f) # type: ignore - - -class KeepOpenFile: - def __init__(self, file: t.IO[t.Any]) -> None: - self._file: t.IO[t.Any] = file - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._file, name) - - def __enter__(self) -> KeepOpenFile: - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - pass - - def __repr__(self) -> str: - return repr(self._file) - - def __iter__(self) -> cabc.Iterator[t.AnyStr]: - return iter(self._file) - - -def echo( - message: t.Any | None = None, - file: t.IO[t.Any] | None = None, - nl: bool = True, - err: bool = False, - color: bool | None = None, -) -> None: - """Print a message and newline to stdout or a file. This should be - used instead of :func:`print` because it provides better support - for different data, files, and environments. - - Compared to :func:`print`, this does the following: - - - Ensures that the output encoding is not misconfigured on Linux. - - Supports Unicode in the Windows console. - - Supports writing to binary outputs, and supports writing bytes - to text outputs. - - Supports colors and styles on Windows. - - Removes ANSI color and style codes if the output does not look - like an interactive terminal. - - Always flushes the output. - - :param message: The string or bytes to output. Other objects are - converted to strings. - :param file: The file to write to. Defaults to ``stdout``. - :param err: Write to ``stderr`` instead of ``stdout``. - :param nl: Print a newline after the message. Enabled by default. - :param color: Force showing or hiding colors and other styles. By - default Click will remove color if the output does not look like - an interactive terminal. - - .. versionchanged:: 6.0 - Support Unicode output on the Windows console. Click does not - modify ``sys.stdout``, so ``sys.stdout.write()`` and ``print()`` - will still not support Unicode. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. - - .. versionadded:: 3.0 - Added the ``err`` parameter. - - .. versionchanged:: 2.0 - Support colors on Windows if colorama is installed. - """ - if file is None: - if err: - file = _default_text_stderr() - else: - file = _default_text_stdout() - - # There are no standard streams attached to write to. For example, - # pythonw on Windows. - if file is None: - return - - # Convert non bytes/text into the native string type. - if message is not None and not isinstance(message, (str, bytes, bytearray)): - out: str | bytes | bytearray | None = str(message) - else: - out = message - - if nl: - out = out or "" - if isinstance(out, str): - out += "\n" - else: - out += b"\n" - - if not out: - file.flush() - return - - # If there is a message and the value looks like bytes, we manually - # need to find the binary stream and write the message in there. - # This is done separately so that most stream types will work as you - # would expect. Eg: you can write to StringIO for other cases. - if isinstance(out, (bytes, bytearray)): - binary_file = _find_binary_writer(file) - - if binary_file is not None: - file.flush() - binary_file.write(out) - binary_file.flush() - return - - # ANSI style code support. For no message or bytes, nothing happens. - # When outputting to a file instead of a terminal, strip codes. - else: - color = resolve_color_default(color) - - if should_strip_ansi(file, color): - out = strip_ansi(out) - elif WIN: - if auto_wrap_for_ansi is not None: - file = auto_wrap_for_ansi(file, color) # type: ignore - elif not color: - out = strip_ansi(out) - - file.write(out) # type: ignore - file.flush() - - -def get_binary_stream(name: t.Literal["stdin", "stdout", "stderr"]) -> t.BinaryIO: - """Returns a system stream for byte processing. - - :param name: the name of the stream to open. Valid names are ``'stdin'``, - ``'stdout'`` and ``'stderr'`` - """ - opener = binary_streams.get(name) - if opener is None: - raise TypeError(f"Unknown standard stream '{name}'") - return opener() - - -def get_text_stream( - name: t.Literal["stdin", "stdout", "stderr"], - encoding: str | None = None, - errors: str | None = "strict", -) -> t.TextIO: - """Returns a system stream for text processing. This usually returns - a wrapped stream around a binary stream returned from - :func:`get_binary_stream` but it also can take shortcuts for already - correctly configured streams. - - :param name: the name of the stream to open. Valid names are ``'stdin'``, - ``'stdout'`` and ``'stderr'`` - :param encoding: overrides the detected default encoding. - :param errors: overrides the default error mode. - """ - opener = text_streams.get(name) - if opener is None: - raise TypeError(f"Unknown standard stream '{name}'") - return opener(encoding, errors) - - -def open_file( - filename: str | os.PathLike[str], - mode: str = "r", - encoding: str | None = None, - errors: str | None = "strict", - lazy: bool = False, - atomic: bool = False, -) -> t.IO[t.Any]: - """Open a file, with extra behavior to handle ``'-'`` to indicate - a standard stream, lazy open on write, and atomic write. Similar to - the behavior of the :class:`~click.File` param type. - - If ``'-'`` is given to open ``stdout`` or ``stdin``, the stream is - wrapped so that using it in a context manager will not close it. - This makes it possible to use the function without accidentally - closing a standard stream: - - .. code-block:: python - - with open_file(filename) as f: - ... - - :param filename: The name or Path of the file to open, or ``'-'`` for - ``stdin``/``stdout``. - :param mode: The mode in which to open the file. - :param encoding: The encoding to decode or encode a file opened in - text mode. - :param errors: The error handling mode. - :param lazy: Wait to open the file until it is accessed. For read - mode, the file is temporarily opened to raise access errors - early, then closed until it is read again. - :param atomic: Write to a temporary file and replace the given file - on close. - - .. versionadded:: 3.0 - """ - if lazy: - return t.cast( - "t.IO[t.Any]", LazyFile(filename, mode, encoding, errors, atomic=atomic) - ) - - f, should_close = open_stream(filename, mode, encoding, errors, atomic=atomic) - - if not should_close: - f = t.cast("t.IO[t.Any]", KeepOpenFile(f)) - - return f - - -def format_filename( - filename: str | bytes | os.PathLike[str] | os.PathLike[bytes], - shorten: bool = False, -) -> str: - """Format a filename as a string for display. Ensures the filename can be - displayed by replacing any invalid bytes or surrogate escapes in the name - with the replacement character ``�``. - - Invalid bytes or surrogate escapes will raise an error when written to a - stream with ``errors="strict"``. This will typically happen with ``stdout`` - when the locale is something like ``en_GB.UTF-8``. - - Many scenarios *are* safe to write surrogates though, due to PEP 538 and - PEP 540, including: - - - Writing to ``stderr``, which uses ``errors="backslashreplace"``. - - The system has ``LANG=C.UTF-8``, ``C``, or ``POSIX``. Python opens - stdout and stderr with ``errors="surrogateescape"``. - - None of ``LANG/LC_*`` are set. Python assumes ``LANG=C.UTF-8``. - - Python is started in UTF-8 mode with ``PYTHONUTF8=1`` or ``-X utf8``. - Python opens stdout and stderr with ``errors="surrogateescape"``. - - :param filename: formats a filename for UI display. This will also convert - the filename into unicode without failing. - :param shorten: this optionally shortens the filename to strip of the - path that leads up to it. - """ - if shorten: - filename = os.path.basename(filename) - else: - filename = os.fspath(filename) - - if isinstance(filename, bytes): - filename = filename.decode(sys.getfilesystemencoding(), "replace") - else: - filename = filename.encode("utf-8", "surrogateescape").decode( - "utf-8", "replace" - ) - - return filename - - -def get_app_dir(app_name: str, roaming: bool = True, force_posix: bool = False) -> str: - r"""Returns the config folder for the application. The default behavior - is to return whatever is most appropriate for the operating system. - - To give you an idea, for an app called ``"Foo Bar"``, something like - the following folders could be returned: - - Mac OS X: - ``~/Library/Application Support/Foo Bar`` - Mac OS X (POSIX): - ``~/.foo-bar`` - Unix: - ``~/.config/foo-bar`` - Unix (POSIX): - ``~/.foo-bar`` - Windows (roaming): - ``C:\Users\\AppData\Roaming\Foo Bar`` - Windows (not roaming): - ``C:\Users\\AppData\Local\Foo Bar`` - - .. versionadded:: 2.0 - - :param app_name: the application name. This should be properly capitalized - and can contain whitespace. - :param roaming: controls if the folder should be roaming or not on Windows. - Has no effect otherwise. - :param force_posix: if this is set to `True` then on any POSIX system the - folder will be stored in the home folder with a leading - dot instead of the XDG config home or darwin's - application support folder. - """ - if WIN: - key = "APPDATA" if roaming else "LOCALAPPDATA" - folder = os.environ.get(key) - if folder is None: - folder = os.path.expanduser("~") - return os.path.join(folder, app_name) - if force_posix: - return os.path.join(os.path.expanduser(f"~/.{_posixify(app_name)}")) - if sys.platform == "darwin": - return os.path.join( - os.path.expanduser("~/Library/Application Support"), app_name - ) - return os.path.join( - os.environ.get("XDG_CONFIG_HOME", os.path.expanduser("~/.config")), - _posixify(app_name), - ) - - -class PacifyFlushWrapper: - """This wrapper is used to catch and suppress BrokenPipeErrors resulting - from ``.flush()`` being called on broken pipe during the shutdown/final-GC - of the Python interpreter. Notably ``.flush()`` is always called on - ``sys.stdout`` and ``sys.stderr``. So as to have minimal impact on any - other cleanup code, and the case where the underlying file is not a broken - pipe, all calls and attributes are proxied. - """ - - def __init__(self, wrapped: t.IO[t.Any]) -> None: - self.wrapped = wrapped - - def flush(self) -> None: - try: - self.wrapped.flush() - except OSError as e: - import errno - - if e.errno != errno.EPIPE: - raise - - def __getattr__(self, attr: str) -> t.Any: - return getattr(self.wrapped, attr) - - -def _detect_program_name( - path: str | None = None, _main: ModuleType | None = None -) -> str: - """Determine the command used to run the program, for use in help - text. If a file or entry point was executed, the file name is - returned. If ``python -m`` was used to execute a module or package, - ``python -m name`` is returned. - - This doesn't try to be too precise, the goal is to give a concise - name for help text. Files are only shown as their name without the - path. ``python`` is only shown for modules, and the full path to - ``sys.executable`` is not shown. - - :param path: The Python file being executed. Python puts this in - ``sys.argv[0]``, which is used by default. - :param _main: The ``__main__`` module. This should only be passed - during internal testing. - - .. versionadded:: 8.0 - Based on command args detection in the Werkzeug reloader. - - :meta private: - """ - if _main is None: - _main = sys.modules["__main__"] - - if not path: - path = sys.argv[0] - - # The value of __package__ indicates how Python was called. It may - # not exist if a setuptools script is installed as an egg. It may be - # set incorrectly for entry points created with pip on Windows. - # It is set to "" inside a Shiv or PEX zipapp. - if getattr(_main, "__package__", None) in {None, ""} or ( - os.name == "nt" - and _main.__package__ == "" - and not os.path.exists(path) - and os.path.exists(f"{path}.exe") - ): - # Executed a file, like "python app.py". - return os.path.basename(path) - - # Executed a module, like "python -m example". - # Rewritten by Python from "-m script" to "/path/to/script.py". - # Need to look at main module to determine how it was executed. - py_module = t.cast(str, _main.__package__) - name = os.path.splitext(os.path.basename(path))[0] - - # A submodule like "example.cli". - if name != "__main__": - py_module = f"{py_module}.{name}" - - return f"python -m {py_module.lstrip('.')}" - - -def _expand_args( - args: cabc.Iterable[str], - *, - user: bool = True, - env: bool = True, - glob_recursive: bool = True, -) -> list[str]: - """Simulate Unix shell expansion with Python functions. - - See :func:`glob.glob`, :func:`os.path.expanduser`, and - :func:`os.path.expandvars`. - - This is intended for use on Windows, where the shell does not do any - expansion. It may not exactly match what a Unix shell would do. - - :param args: List of command line arguments to expand. - :param user: Expand user home directory. - :param env: Expand environment variables. - :param glob_recursive: ``**`` matches directories recursively. - - .. versionchanged:: 8.1 - Invalid glob patterns are treated as empty expansions rather - than raising an error. - - .. versionadded:: 8.0 - - :meta private: - """ - from glob import glob - - out = [] - - for arg in args: - if user: - arg = os.path.expanduser(arg) - - if env: - arg = os.path.expandvars(arg) - - try: - matches = glob(arg, recursive=glob_recursive) - except re.error: - matches = [] - - if not matches: - out.append(arg) - else: - out.extend(matches) - - return out diff --git a/venv/lib/python3.12/site-packages/dill-0.4.1.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/dill-0.4.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/dill-0.4.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/dill-0.4.1.dist-info/LICENSE b/venv/lib/python3.12/site-packages/dill-0.4.1.dist-info/LICENSE deleted file mode 100644 index 483e245..0000000 --- a/venv/lib/python3.12/site-packages/dill-0.4.1.dist-info/LICENSE +++ /dev/null @@ -1,35 +0,0 @@ -Copyright (c) 2004-2016 California Institute of Technology. -Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -All rights reserved. - -This software is available subject to the conditions and terms laid -out below. By downloading and using this software you are agreeing -to the following conditions. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - - Neither the names of the copyright holders nor the names of any of - the contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/venv/lib/python3.12/site-packages/dill-0.4.1.dist-info/METADATA b/venv/lib/python3.12/site-packages/dill-0.4.1.dist-info/METADATA deleted file mode 100644 index 934a527..0000000 --- a/venv/lib/python3.12/site-packages/dill-0.4.1.dist-info/METADATA +++ /dev/null @@ -1,281 +0,0 @@ -Metadata-Version: 2.1 -Name: dill -Version: 0.4.1 -Summary: serialize all of Python -Home-page: https://github.com/uqfoundation/dill -Download-URL: https://pypi.org/project/dill/#files -Author: Mike McKerns -Author-email: mmckerns@uqfoundation.org -Maintainer: Mike McKerns -Maintainer-email: mmckerns@uqfoundation.org -License: BSD-3-Clause -Project-URL: Documentation, http://dill.rtfd.io -Project-URL: Source Code, https://github.com/uqfoundation/dill -Project-URL: Bug Tracker, https://github.com/uqfoundation/dill/issues -Platform: Linux -Platform: Windows -Platform: Mac -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: Science/Research -Classifier: License :: OSI Approved :: BSD License -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: 3.14 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Scientific/Engineering -Classifier: Topic :: Software Development -Requires-Python: >=3.9 -License-File: LICENSE -Provides-Extra: readline -Provides-Extra: graph -Requires-Dist: objgraph>=1.7.2; extra == "graph" -Provides-Extra: profile -Requires-Dist: gprof2dot>=2022.7.29; extra == "profile" - ------------------------------ -dill: serialize all of Python ------------------------------ - -About Dill -========== - -``dill`` extends Python's ``pickle`` module for serializing and de-serializing -Python objects to the majority of the built-in Python types. Serialization -is the process of converting an object to a byte stream, and the inverse -of which is converting a byte stream back to a Python object hierarchy. - -``dill`` provides the user the same interface as the ``pickle`` module, and -also includes some additional features. In addition to pickling Python -objects, ``dill`` provides the ability to save the state of an interpreter -session in a single command. Hence, it would be feasible to save an -interpreter session, close the interpreter, ship the pickled file to -another computer, open a new interpreter, unpickle the session and -thus continue from the 'saved' state of the original interpreter -session. - -``dill`` can be used to store Python objects to a file, but the primary -usage is to send Python objects across the network as a byte stream. -``dill`` is quite flexible, and allows arbitrary user defined classes -and functions to be serialized. Thus ``dill`` is not intended to be -secure against erroneously or maliciously constructed data. It is -left to the user to decide whether the data they unpickle is from -a trustworthy source. - -``dill`` is part of ``pathos``, a Python framework for heterogeneous computing. -``dill`` is in active development, so any user feedback, bug reports, comments, -or suggestions are highly appreciated. A list of issues is located at -https://github.com/uqfoundation/dill/issues, with a legacy list maintained at -https://uqfoundation.github.io/project/pathos/query. - - -Major Features -============== - -``dill`` can pickle the following standard types: - - - none, type, bool, int, float, complex, bytes, str, - - tuple, list, dict, file, buffer, builtin, - - Python classes, namedtuples, dataclasses, metaclasses, - - instances of classes, - - set, frozenset, array, functions, exceptions - -``dill`` can also pickle more 'exotic' standard types: - - - functions with yields, nested functions, lambdas, - - cell, method, unboundmethod, module, code, methodwrapper, - - methoddescriptor, getsetdescriptor, memberdescriptor, wrapperdescriptor, - - dictproxy, slice, notimplemented, ellipsis, quit - -``dill`` cannot yet pickle these standard types: - - - frame, generator, traceback - -``dill`` also provides the capability to: - - - save and load Python interpreter sessions - - save and extract the source code from functions and classes - - interactively diagnose pickling errors - - -Current Release -=============== - -The latest released version of ``dill`` is available from: - - https://pypi.org/project/dill - -``dill`` is distributed under a 3-clause BSD license. - - -Development Version -=================== - -You can get the latest development version with all the shiny new features at: - - https://github.com/uqfoundation - -If you have a new contribution, please submit a pull request. - - -Installation -============ - -``dill`` can be installed with ``pip``:: - - $ pip install dill - -To optionally include the ``objgraph`` diagnostic tool in the install:: - - $ pip install dill[graph] - -To optionally include the ``gprof2dot`` diagnostic tool in the install:: - - $ pip install dill[profile] - -For windows users, to optionally install session history tools:: - - $ pip install dill[readline] - - -Requirements -============ - -``dill`` requires: - - - ``python`` (or ``pypy``), **>=3.9** - - ``setuptools``, **>=42** - -Optional requirements: - - - ``objgraph``, **>=1.7.2** - - ``gprof2dot``, **>=2022.7.29** - - ``pyreadline``, **>=1.7.1** (on windows) - - -Basic Usage -=========== - -``dill`` is a drop-in replacement for ``pickle``. Existing code can be -updated to allow complete pickling using:: - - >>> import dill as pickle - -or:: - - >>> from dill import dumps, loads - -``dumps`` converts the object to a unique byte string, and ``loads`` performs -the inverse operation:: - - >>> squared = lambda x: x**2 - >>> loads(dumps(squared))(3) - 9 - -There are a number of options to control serialization which are provided -as keyword arguments to several ``dill`` functions: - -* with *protocol*, the pickle protocol level can be set. This uses the - same value as the ``pickle`` module, *DEFAULT_PROTOCOL*. -* with *byref=True*, ``dill`` to behave a lot more like pickle with - certain objects (like modules) pickled by reference as opposed to - attempting to pickle the object itself. -* with *recurse=True*, objects referred to in the global dictionary are - recursively traced and pickled, instead of the default behavior of - attempting to store the entire global dictionary. -* with *fmode*, the contents of the file can be pickled along with the file - handle, which is useful if the object is being sent over the wire to a - remote system which does not have the original file on disk. Options are - *HANDLE_FMODE* for just the handle, *CONTENTS_FMODE* for the file content - and *FILE_FMODE* for content and handle. -* with *ignore=False*, objects reconstructed with types defined in the - top-level script environment use the existing type in the environment - rather than a possibly different reconstructed type. - -The default serialization can also be set globally in *dill.settings*. -Thus, we can modify how ``dill`` handles references to the global dictionary -locally or globally:: - - >>> import dill.settings - >>> dumps(absolute) == dumps(absolute, recurse=True) - False - >>> dill.settings['recurse'] = True - >>> dumps(absolute) == dumps(absolute, recurse=True) - True - -``dill`` also includes source code inspection, as an alternate to pickling:: - - >>> import dill.source - >>> print(dill.source.getsource(squared)) - squared = lambda x:x**2 - -To aid in debugging pickling issues, use *dill.detect* which provides -tools like pickle tracing:: - - >>> import dill.detect - >>> with dill.detect.trace(): - >>> dumps(squared) - ┬ F1: at 0x7fe074f8c280> - ├┬ F2: - │└ # F2 [34 B] - ├┬ Co: at 0x7fe07501eb30, file "", line 1> - │├┬ F2: - ││└ # F2 [19 B] - │└ # Co [87 B] - ├┬ D1: - │└ # D1 [22 B] - ├┬ D2: - │└ # D2 [2 B] - ├┬ D2: - │├┬ D2: - ││└ # D2 [2 B] - │└ # D2 [23 B] - └ # F1 [180 B] - -With trace, we see how ``dill`` stored the lambda (``F1``) by first storing -``_create_function``, the underlying code object (``Co``) and ``_create_code`` -(which is used to handle code objects), then we handle the reference to -the global dict (``D2``) plus other dictionaries (``D1`` and ``D2``) that -save the lambda object's state. A ``#`` marks when the object is actually stored. - - -More Information -================ - -Probably the best way to get started is to look at the documentation at -http://dill.rtfd.io. Also see ``dill.tests`` for a set of scripts that -demonstrate how ``dill`` can serialize different Python objects. You can -run the test suite with ``python -m dill.tests``. The contents of any -pickle file can be examined with ``undill``. As ``dill`` conforms to -the ``pickle`` interface, the examples and documentation found at -http://docs.python.org/library/pickle.html also apply to ``dill`` -if one will ``import dill as pickle``. The source code is also generally -well documented, so further questions may be resolved by inspecting the -code itself. Please feel free to submit a ticket on github, or ask a -question on stackoverflow (**@Mike McKerns**). -If you would like to share how you use ``dill`` in your work, please send -an email (to **mmckerns at uqfoundation dot org**). - - -Citation -======== - -If you use ``dill`` to do research that leads to publication, we ask that you -acknowledge use of ``dill`` by citing the following in your publication:: - - M.M. McKerns, L. Strand, T. Sullivan, A. Fang, M.A.G. Aivazis, - "Building a framework for predictive science", Proceedings of - the 10th Python in Science Conference, 2011; - http://arxiv.org/pdf/1202.1056 - - Michael McKerns and Michael Aivazis, - "pathos: a framework for heterogeneous computing", 2010- ; - https://uqfoundation.github.io/project/pathos - -Please see https://uqfoundation.github.io/project/pathos or -http://arxiv.org/pdf/1202.1056 for further information. diff --git a/venv/lib/python3.12/site-packages/dill-0.4.1.dist-info/RECORD b/venv/lib/python3.12/site-packages/dill-0.4.1.dist-info/RECORD deleted file mode 100644 index 9ddefdf..0000000 --- a/venv/lib/python3.12/site-packages/dill-0.4.1.dist-info/RECORD +++ /dev/null @@ -1,101 +0,0 @@ -../../../bin/get_gprof,sha256=DQ8bOZzdZGT94FMdwQsQns58brXi2qVccR-ox1Bpzos,2507 -../../../bin/get_objgraph,sha256=1zZqbXCfkKBsrawRKShYS0pKMg_T7uNLuMa0n0HLyt8,1701 -../../../bin/undill,sha256=0Jv5eMf2yfXrrXI8QEOuA2WsVUvGiNncBwKOr0HjXBM,637 -dill-0.4.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -dill-0.4.1.dist-info/LICENSE,sha256=9mnWO-v3ZbqqCyDYsMEZMpan4OoMIsUKMIt012qzk5w,1790 -dill-0.4.1.dist-info/METADATA,sha256=BA1shO3fKcjBTcKu8hSWKpGYA_VXJDgk3U-Ko7SeOGg,10171 -dill-0.4.1.dist-info/RECORD,, -dill-0.4.1.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91 -dill-0.4.1.dist-info/top_level.txt,sha256=HLSIyYIjQzJiBvs3_-16ntezE3j6mWGTW0DT1xDd7X0,5 -dill/__diff.py,sha256=7XCqWIelTWSLjieOIu3Xtr1mUui9YBmltP7-tvtrG-Q,7146 -dill/__info__.py,sha256=EGg2Nh84NhPnYq1J2j6EAPixBb3psVxY-5rAWzr8prk,10756 -dill/__init__.py,sha256=Y8usnzpfsclJxT6TvRYGarEXkWEXprv4lC2ZJ0bGM2Y,3798 -dill/__pycache__/__diff.cpython-312.pyc,, -dill/__pycache__/__info__.cpython-312.pyc,, -dill/__pycache__/__init__.cpython-312.pyc,, -dill/__pycache__/_dill.cpython-312.pyc,, -dill/__pycache__/_objects.cpython-312.pyc,, -dill/__pycache__/_shims.cpython-312.pyc,, -dill/__pycache__/detect.cpython-312.pyc,, -dill/__pycache__/logger.cpython-312.pyc,, -dill/__pycache__/objtypes.cpython-312.pyc,, -dill/__pycache__/pointers.cpython-312.pyc,, -dill/__pycache__/session.cpython-312.pyc,, -dill/__pycache__/settings.cpython-312.pyc,, -dill/__pycache__/source.cpython-312.pyc,, -dill/__pycache__/temp.cpython-312.pyc,, -dill/_dill.py,sha256=NdaVyGzOb5S57abYN0eFXcogocHQrTBkUru7cqw2fwM,91730 -dill/_objects.py,sha256=_Xc7OqnZesDmKBmtkbkrBBMDzH3TIFy_vtMRtc7lsSI,20015 -dill/_shims.py,sha256=kkIa7muWHHp9uItpNffqmbhBO4MEKPIdeyHOKxx2VF4,6635 -dill/detect.py,sha256=VbCyNMaIVudiqM1nLmGwS-yXW6M9CkdpbkVarAmnJqU,11207 -dill/logger.py,sha256=Z1wgU8BbSAEWBKoucYRHYrFhVLqqqTTi-BHcfsebi88,11143 -dill/objtypes.py,sha256=3hDEnRS040mVyA3nMJp0seIiAw9SafxbuvG5tFvthfE,736 -dill/pointers.py,sha256=zeX8XqlLBIW9vL-XH_er9HUWmInlbfWjYtva56eTmww,4467 -dill/session.py,sha256=88DJFIQrA8733P-VKkbCq0d1lyJzckQYCrGxcPeSKeE,23541 -dill/settings.py,sha256=DRFp2QC8xspPZ5Sb3eIB6abPp1wNuBNtCEjZ8DLY-x4,630 -dill/source.py,sha256=GsmYf6bEPLM9rivz1Ec7G2E-tEgAoXI95CisqdcQGGA,45710 -dill/temp.py,sha256=eFyMgZIJRUVgdRi2a4I2tZd5g3HSUFnfm5K3LV2Z93k,8027 -dill/tests/__init__.py,sha256=8OmXwJHyWK1axs4XwCD4TimAE1U_oF6S1ZIPJ8tI8Dg,479 -dill/tests/__main__.py,sha256=6jkJVIcrIHqHjyKOoDr95npJz4eASssTGKbuhWEqMow,899 -dill/tests/__pycache__/__init__.cpython-312.pyc,, -dill/tests/__pycache__/__main__.cpython-312.pyc,, -dill/tests/__pycache__/test_abc.cpython-312.pyc,, -dill/tests/__pycache__/test_check.cpython-312.pyc,, -dill/tests/__pycache__/test_classdef.cpython-312.pyc,, -dill/tests/__pycache__/test_dataclasses.cpython-312.pyc,, -dill/tests/__pycache__/test_detect.cpython-312.pyc,, -dill/tests/__pycache__/test_dictviews.cpython-312.pyc,, -dill/tests/__pycache__/test_diff.cpython-312.pyc,, -dill/tests/__pycache__/test_extendpickle.cpython-312.pyc,, -dill/tests/__pycache__/test_fglobals.cpython-312.pyc,, -dill/tests/__pycache__/test_file.cpython-312.pyc,, -dill/tests/__pycache__/test_functions.cpython-312.pyc,, -dill/tests/__pycache__/test_functors.cpython-312.pyc,, -dill/tests/__pycache__/test_logger.cpython-312.pyc,, -dill/tests/__pycache__/test_mixins.cpython-312.pyc,, -dill/tests/__pycache__/test_module.cpython-312.pyc,, -dill/tests/__pycache__/test_moduledict.cpython-312.pyc,, -dill/tests/__pycache__/test_nested.cpython-312.pyc,, -dill/tests/__pycache__/test_objects.cpython-312.pyc,, -dill/tests/__pycache__/test_properties.cpython-312.pyc,, -dill/tests/__pycache__/test_pycapsule.cpython-312.pyc,, -dill/tests/__pycache__/test_recursive.cpython-312.pyc,, -dill/tests/__pycache__/test_registered.cpython-312.pyc,, -dill/tests/__pycache__/test_restricted.cpython-312.pyc,, -dill/tests/__pycache__/test_selected.cpython-312.pyc,, -dill/tests/__pycache__/test_session.cpython-312.pyc,, -dill/tests/__pycache__/test_source.cpython-312.pyc,, -dill/tests/__pycache__/test_sources.cpython-312.pyc,, -dill/tests/__pycache__/test_temp.cpython-312.pyc,, -dill/tests/__pycache__/test_threads.cpython-312.pyc,, -dill/tests/__pycache__/test_weakref.cpython-312.pyc,, -dill/tests/test_abc.py,sha256=QJ5rW4-HPG0mj-K-96zwASOC-LqGa0XnzDTNW43Cnr4,4227 -dill/tests/test_check.py,sha256=h567c9d3L-O5lc4H8lBsN5St4NkQr5Em9eAU-0l8xYA,1396 -dill/tests/test_classdef.py,sha256=UTctS9spat_KwiubR2-05hVbMvmT5_BqZJWReDC34lM,8600 -dill/tests/test_dataclasses.py,sha256=btxL2-lqjFOLSDf8imLZAAQ4bkm9xQwvS2VlPiIrlQY,890 -dill/tests/test_detect.py,sha256=pm55LV1oi3xr6zmawc2pBlzSMSMkh4TwV7IuoAh3r8M,4329 -dill/tests/test_dictviews.py,sha256=aRqVTK5DOuIoKzxWQcPenSRnvCqLyYeM2jIQsn32Tqo,1337 -dill/tests/test_diff.py,sha256=cvfUtLcJOqlH0VcEmuIHQf69194Jy7vWoEk8pO-GLKM,2667 -dill/tests/test_extendpickle.py,sha256=kYtoA2gr_CLo7NRdyu2fwOdPMt8yp4kVzd9hki7pZBk,1315 -dill/tests/test_fglobals.py,sha256=dSyPOYarpytrnb723m3nAJqGp3zeTFovA7wfoZr6Z_o,1676 -dill/tests/test_file.py,sha256=OsM189KoskuN84bag6GbYJ4OYcTy5WlHSlMWj0j0BhQ,13578 -dill/tests/test_functions.py,sha256=40QuhQIqV-jaDvuR5pq0_Haf7Pmd9M3DYJDs2oSxjiU,4267 -dill/tests/test_functors.py,sha256=iLv95xcaTasuqZh5LQBLa6AWrPeCxFRb-TLzhNzrMB4,930 -dill/tests/test_logger.py,sha256=W0QJMVMQOUOizGb1sNsKInNVS76XqrM7UFyEX-Ei_bs,2385 -dill/tests/test_mixins.py,sha256=tlCp5-NYObO7VIiK0YkciB7yRqepRJPd_RYAc79Zcvw,4007 -dill/tests/test_module.py,sha256=LVdwwdkdbRofoEHhOfszi7oVEUoE__YZyyJzRyza_Ws,1943 -dill/tests/test_moduledict.py,sha256=s5siniJxn78G83lPiQnx4eYV6Z6isCU3m2phgRTtlVA,1182 -dill/tests/test_nested.py,sha256=EuyAWkXGuERTaUaPQDOxhO1cvDhCDWPML3vYOQ0HpFg,3146 -dill/tests/test_objects.py,sha256=6Gy-YuVDuX1efV_pQEbCen7ZpMxTazY9Ihq7y1otesQ,1931 -dill/tests/test_properties.py,sha256=ex9gCfebSawz6n5RGLS4NK5tyC7zjULJBYqPSl33Yqs,1346 -dill/tests/test_pycapsule.py,sha256=EJFsKZ0kTWi17YOQ0wwaoglXP9XqDS83EYIr1-ZsNUk,1417 -dill/tests/test_recursive.py,sha256=5zwJ62LHCtd3lFsFX7__XqflV78QKwuv-hnvBISoiVs,4182 -dill/tests/test_registered.py,sha256=fO2J8t1VlNFd6ecUtd8akgjl4nRy5TldZbnBEzymtWE,1573 -dill/tests/test_restricted.py,sha256=MG6gWcyn1X2kMNL7hX40iTZNbtre8-6QwneTt6EW7eE,783 -dill/tests/test_selected.py,sha256=1lr05NaRqy27XV-xj5A93Mh8vuOEVXbZZ_ELgjyBPl0,3069 -dill/tests/test_session.py,sha256=fILaOGfRHdMd7wED2fqkRHkHlRLY13TaTnvWIcbP8ic,10161 -dill/tests/test_source.py,sha256=3QnPpuQovYz0wAxzH7U4LWaGWI0sejOra8qPRgGj8W0,7311 -dill/tests/test_sources.py,sha256=QWX_Oc3NjpiMZqLLIJsXpK7kGGOYFDv47rCt7HIX_7s,8672 -dill/tests/test_temp.py,sha256=81i8qP5zFbX7bBlXBiYMDlm_p5GTvze6zVtAPifaD_g,2619 -dill/tests/test_threads.py,sha256=a8GRhk81_gE-TsLX21BG8Jb85vRaDd8All2AafqKzHA,1257 -dill/tests/test_weakref.py,sha256=vKT130ADMeqzhD3vx8KZnF5zvvkhTAaq8WD1tyACX2Y,1602 diff --git a/venv/lib/python3.12/site-packages/dill-0.4.1.dist-info/WHEEL b/venv/lib/python3.12/site-packages/dill-0.4.1.dist-info/WHEEL deleted file mode 100644 index ae527e7..0000000 --- a/venv/lib/python3.12/site-packages/dill-0.4.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (75.6.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv/lib/python3.12/site-packages/dill-0.4.1.dist-info/top_level.txt b/venv/lib/python3.12/site-packages/dill-0.4.1.dist-info/top_level.txt deleted file mode 100644 index 85eea70..0000000 --- a/venv/lib/python3.12/site-packages/dill-0.4.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -dill diff --git a/venv/lib/python3.12/site-packages/dill/__diff.py b/venv/lib/python3.12/site-packages/dill/__diff.py deleted file mode 100644 index 6fa8dd5..0000000 --- a/venv/lib/python3.12/site-packages/dill/__diff.py +++ /dev/null @@ -1,234 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -""" -Module to show if an object has changed since it was memorised -""" - -import builtins -import os -import sys -import types -try: - import numpy.ma - HAS_NUMPY = True -except ImportError: - HAS_NUMPY = False - -# pypy doesn't use reference counting -getrefcount = getattr(sys, 'getrefcount', lambda x:0) - -# memo of objects indexed by id to a tuple (attributes, sequence items) -# attributes is a dict indexed by attribute name to attribute id -# sequence items is either a list of ids, of a dictionary of keys to ids -memo = {} -id_to_obj = {} -# types that cannot have changing attributes -builtins_types = set((str, list, dict, set, frozenset, int)) -dont_memo = set(id(i) for i in (memo, sys.modules, sys.path_importer_cache, - os.environ, id_to_obj)) - - -def get_attrs(obj): - """ - Gets all the attributes of an object though its __dict__ or return None - """ - if type(obj) in builtins_types \ - or type(obj) is type and obj in builtins_types: - return - return getattr(obj, '__dict__', None) - - -def get_seq(obj, cache={str: False, frozenset: False, list: True, set: True, - dict: True, tuple: True, type: False, - types.ModuleType: False, types.FunctionType: False, - types.BuiltinFunctionType: False}): - """ - Gets all the items in a sequence or return None - """ - try: - o_type = obj.__class__ - except AttributeError: - o_type = type(obj) - hsattr = hasattr - if o_type in cache: - if cache[o_type]: - if hsattr(obj, "copy"): - return obj.copy() - return obj - elif HAS_NUMPY and o_type in (numpy.ndarray, numpy.ma.core.MaskedConstant): - if obj.shape and obj.size: - return obj - else: - return [] - elif hsattr(obj, "__contains__") and hsattr(obj, "__iter__") \ - and hsattr(obj, "__len__") and hsattr(o_type, "__contains__") \ - and hsattr(o_type, "__iter__") and hsattr(o_type, "__len__"): - cache[o_type] = True - if hsattr(obj, "copy"): - return obj.copy() - return obj - else: - cache[o_type] = False - return None - - -def memorise(obj, force=False): - """ - Adds an object to the memo, and recursively adds all the objects - attributes, and if it is a container, its items. Use force=True to update - an object already in the memo. Updating is not recursively done. - """ - obj_id = id(obj) - if obj_id in memo and not force or obj_id in dont_memo: - return - id_ = id - g = get_attrs(obj) - if g is None: - attrs_id = None - else: - attrs_id = dict((key,id_(value)) for key, value in g.items()) - - s = get_seq(obj) - if s is None: - seq_id = None - elif hasattr(s, "items"): - seq_id = dict((id_(key),id_(value)) for key, value in s.items()) - elif not hasattr(s, "__len__"): #XXX: avoid TypeError from unexpected case - seq_id = None - else: - seq_id = [id_(i) for i in s] - - memo[obj_id] = attrs_id, seq_id - id_to_obj[obj_id] = obj - mem = memorise - if g is not None: - [mem(value) for key, value in g.items()] - - if s is not None: - if hasattr(s, "items"): - [(mem(key), mem(item)) - for key, item in s.items()] - else: - if hasattr(s, '__len__'): - [mem(item) for item in s] - else: mem(s) - - -def release_gone(): - itop, mp, src = id_to_obj.pop, memo.pop, getrefcount - [(itop(id_), mp(id_)) for id_, obj in list(id_to_obj.items()) - if src(obj) < 4] #XXX: correct for pypy? - - -def whats_changed(obj, seen=None, simple=False, first=True): - """ - Check an object against the memo. Returns a list in the form - (attribute changes, container changed). Attribute changes is a dict of - attribute name to attribute value. container changed is a boolean. - If simple is true, just returns a boolean. None for either item means - that it has not been checked yet - """ - # Special cases - if first: - # ignore the _ variable, which only appears in interactive sessions - if "_" in builtins.__dict__: - del builtins._ - if seen is None: - seen = {} - - obj_id = id(obj) - - if obj_id in seen: - if simple: - return any(seen[obj_id]) - return seen[obj_id] - - # Safety checks - if obj_id in dont_memo: - seen[obj_id] = [{}, False] - if simple: - return False - return seen[obj_id] - elif obj_id not in memo: - if simple: - return True - else: - raise RuntimeError("Object not memorised " + str(obj)) - - seen[obj_id] = ({}, False) - - chngd = whats_changed - id_ = id - - # compare attributes - attrs = get_attrs(obj) - if attrs is None: - changed = {} - else: - obj_attrs = memo[obj_id][0] - obj_get = obj_attrs.get - changed = dict((key,None) for key in obj_attrs if key not in attrs) - for key, o in attrs.items(): - if id_(o) != obj_get(key, None) or chngd(o, seen, True, False): - changed[key] = o - - # compare sequence - items = get_seq(obj) - seq_diff = False - if (items is not None) and (hasattr(items, '__len__')): - obj_seq = memo[obj_id][1] - if (len(items) != len(obj_seq)): - seq_diff = True - elif hasattr(obj, "items"): # dict type obj - obj_get = obj_seq.get - for key, item in items.items(): - if id_(item) != obj_get(id_(key)) \ - or chngd(key, seen, True, False) \ - or chngd(item, seen, True, False): - seq_diff = True - break - else: - for i, j in zip(items, obj_seq): # list type obj - if id_(i) != j or chngd(i, seen, True, False): - seq_diff = True - break - seen[obj_id] = changed, seq_diff - if simple: - return changed or seq_diff - return changed, seq_diff - - -def has_changed(*args, **kwds): - kwds['simple'] = True # ignore simple if passed in - return whats_changed(*args, **kwds) - -__import__ = __import__ - - -def _imp(*args, **kwds): - """ - Replaces the default __import__, to allow a module to be memorised - before the user can change it - """ - before = set(sys.modules.keys()) - mod = __import__(*args, **kwds) - after = set(sys.modules.keys()).difference(before) - for m in after: - memorise(sys.modules[m]) - return mod - -builtins.__import__ = _imp -if hasattr(builtins, "_"): - del builtins._ - -# memorise all already imported modules. This implies that this must be -# imported first for any changes to be recorded -for mod in list(sys.modules.values()): - memorise(mod) -release_gone() diff --git a/venv/lib/python3.12/site-packages/dill/__info__.py b/venv/lib/python3.12/site-packages/dill/__info__.py deleted file mode 100644 index 87b181b..0000000 --- a/venv/lib/python3.12/site-packages/dill/__info__.py +++ /dev/null @@ -1,291 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE -''' ------------------------------ -dill: serialize all of Python ------------------------------ - -About Dill -========== - -``dill`` extends Python's ``pickle`` module for serializing and de-serializing -Python objects to the majority of the built-in Python types. Serialization -is the process of converting an object to a byte stream, and the inverse -of which is converting a byte stream back to a Python object hierarchy. - -``dill`` provides the user the same interface as the ``pickle`` module, and -also includes some additional features. In addition to pickling Python -objects, ``dill`` provides the ability to save the state of an interpreter -session in a single command. Hence, it would be feasible to save an -interpreter session, close the interpreter, ship the pickled file to -another computer, open a new interpreter, unpickle the session and -thus continue from the 'saved' state of the original interpreter -session. - -``dill`` can be used to store Python objects to a file, but the primary -usage is to send Python objects across the network as a byte stream. -``dill`` is quite flexible, and allows arbitrary user defined classes -and functions to be serialized. Thus ``dill`` is not intended to be -secure against erroneously or maliciously constructed data. It is -left to the user to decide whether the data they unpickle is from -a trustworthy source. - -``dill`` is part of ``pathos``, a Python framework for heterogeneous computing. -``dill`` is in active development, so any user feedback, bug reports, comments, -or suggestions are highly appreciated. A list of issues is located at -https://github.com/uqfoundation/dill/issues, with a legacy list maintained at -https://uqfoundation.github.io/project/pathos/query. - - -Major Features -============== - -``dill`` can pickle the following standard types: - - - none, type, bool, int, float, complex, bytes, str, - - tuple, list, dict, file, buffer, builtin, - - Python classes, namedtuples, dataclasses, metaclasses, - - instances of classes, - - set, frozenset, array, functions, exceptions - -``dill`` can also pickle more 'exotic' standard types: - - - functions with yields, nested functions, lambdas, - - cell, method, unboundmethod, module, code, methodwrapper, - - methoddescriptor, getsetdescriptor, memberdescriptor, wrapperdescriptor, - - dictproxy, slice, notimplemented, ellipsis, quit - -``dill`` cannot yet pickle these standard types: - - - frame, generator, traceback - -``dill`` also provides the capability to: - - - save and load Python interpreter sessions - - save and extract the source code from functions and classes - - interactively diagnose pickling errors - - -Current Release -=============== - -The latest released version of ``dill`` is available from: - - https://pypi.org/project/dill - -``dill`` is distributed under a 3-clause BSD license. - - -Development Version -=================== - -You can get the latest development version with all the shiny new features at: - - https://github.com/uqfoundation - -If you have a new contribution, please submit a pull request. - - -Installation -============ - -``dill`` can be installed with ``pip``:: - - $ pip install dill - -To optionally include the ``objgraph`` diagnostic tool in the install:: - - $ pip install dill[graph] - -To optionally include the ``gprof2dot`` diagnostic tool in the install:: - - $ pip install dill[profile] - -For windows users, to optionally install session history tools:: - - $ pip install dill[readline] - - -Requirements -============ - -``dill`` requires: - - - ``python`` (or ``pypy``), **>=3.9** - - ``setuptools``, **>=42** - -Optional requirements: - - - ``objgraph``, **>=1.7.2** - - ``gprof2dot``, **>=2022.7.29** - - ``pyreadline``, **>=1.7.1** (on windows) - - -Basic Usage -=========== - -``dill`` is a drop-in replacement for ``pickle``. Existing code can be -updated to allow complete pickling using:: - - >>> import dill as pickle - -or:: - - >>> from dill import dumps, loads - -``dumps`` converts the object to a unique byte string, and ``loads`` performs -the inverse operation:: - - >>> squared = lambda x: x**2 - >>> loads(dumps(squared))(3) - 9 - -There are a number of options to control serialization which are provided -as keyword arguments to several ``dill`` functions: - -* with *protocol*, the pickle protocol level can be set. This uses the - same value as the ``pickle`` module, *DEFAULT_PROTOCOL*. -* with *byref=True*, ``dill`` to behave a lot more like pickle with - certain objects (like modules) pickled by reference as opposed to - attempting to pickle the object itself. -* with *recurse=True*, objects referred to in the global dictionary are - recursively traced and pickled, instead of the default behavior of - attempting to store the entire global dictionary. -* with *fmode*, the contents of the file can be pickled along with the file - handle, which is useful if the object is being sent over the wire to a - remote system which does not have the original file on disk. Options are - *HANDLE_FMODE* for just the handle, *CONTENTS_FMODE* for the file content - and *FILE_FMODE* for content and handle. -* with *ignore=False*, objects reconstructed with types defined in the - top-level script environment use the existing type in the environment - rather than a possibly different reconstructed type. - -The default serialization can also be set globally in *dill.settings*. -Thus, we can modify how ``dill`` handles references to the global dictionary -locally or globally:: - - >>> import dill.settings - >>> dumps(absolute) == dumps(absolute, recurse=True) - False - >>> dill.settings['recurse'] = True - >>> dumps(absolute) == dumps(absolute, recurse=True) - True - -``dill`` also includes source code inspection, as an alternate to pickling:: - - >>> import dill.source - >>> print(dill.source.getsource(squared)) - squared = lambda x:x**2 - -To aid in debugging pickling issues, use *dill.detect* which provides -tools like pickle tracing:: - - >>> import dill.detect - >>> with dill.detect.trace(): - >>> dumps(squared) - ┬ F1: at 0x7fe074f8c280> - ├┬ F2: - │└ # F2 [34 B] - ├┬ Co: at 0x7fe07501eb30, file "", line 1> - │├┬ F2: - ││└ # F2 [19 B] - │└ # Co [87 B] - ├┬ D1: - │└ # D1 [22 B] - ├┬ D2: - │└ # D2 [2 B] - ├┬ D2: - │├┬ D2: - ││└ # D2 [2 B] - │└ # D2 [23 B] - └ # F1 [180 B] - -With trace, we see how ``dill`` stored the lambda (``F1``) by first storing -``_create_function``, the underlying code object (``Co``) and ``_create_code`` -(which is used to handle code objects), then we handle the reference to -the global dict (``D2``) plus other dictionaries (``D1`` and ``D2``) that -save the lambda object's state. A ``#`` marks when the object is actually stored. - - -More Information -================ - -Probably the best way to get started is to look at the documentation at -http://dill.rtfd.io. Also see ``dill.tests`` for a set of scripts that -demonstrate how ``dill`` can serialize different Python objects. You can -run the test suite with ``python -m dill.tests``. The contents of any -pickle file can be examined with ``undill``. As ``dill`` conforms to -the ``pickle`` interface, the examples and documentation found at -http://docs.python.org/library/pickle.html also apply to ``dill`` -if one will ``import dill as pickle``. The source code is also generally -well documented, so further questions may be resolved by inspecting the -code itself. Please feel free to submit a ticket on github, or ask a -question on stackoverflow (**@Mike McKerns**). -If you would like to share how you use ``dill`` in your work, please send -an email (to **mmckerns at uqfoundation dot org**). - - -Citation -======== - -If you use ``dill`` to do research that leads to publication, we ask that you -acknowledge use of ``dill`` by citing the following in your publication:: - - M.M. McKerns, L. Strand, T. Sullivan, A. Fang, M.A.G. Aivazis, - "Building a framework for predictive science", Proceedings of - the 10th Python in Science Conference, 2011; - http://arxiv.org/pdf/1202.1056 - - Michael McKerns and Michael Aivazis, - "pathos: a framework for heterogeneous computing", 2010- ; - https://uqfoundation.github.io/project/pathos - -Please see https://uqfoundation.github.io/project/pathos or -http://arxiv.org/pdf/1202.1056 for further information. - -''' - -__version__ = '0.4.1' -__author__ = 'Mike McKerns' - -__license__ = ''' -Copyright (c) 2004-2016 California Institute of Technology. -Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -All rights reserved. - -This software is available subject to the conditions and terms laid -out below. By downloading and using this software you are agreeing -to the following conditions. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - - Neither the names of the copyright holders nor the names of any of - the contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -''' diff --git a/venv/lib/python3.12/site-packages/dill/__init__.py b/venv/lib/python3.12/site-packages/dill/__init__.py deleted file mode 100644 index 8c45188..0000000 --- a/venv/lib/python3.12/site-packages/dill/__init__.py +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -# author, version, license, and long description -try: # the package is installed - from .__info__ import __version__, __author__, __doc__, __license__ -except: # pragma: no cover - import os - import sys - parent = os.path.dirname(os.path.abspath(os.path.dirname(__file__))) - sys.path.append(parent) - # get distribution meta info - from version import (__version__, __author__, - get_license_text, get_readme_as_rst) - __license__ = get_license_text(os.path.join(parent, 'LICENSE')) - __license__ = "\n%s" % __license__ - __doc__ = get_readme_as_rst(os.path.join(parent, 'README.md')) - del os, sys, parent, get_license_text, get_readme_as_rst - - -from ._dill import ( - dump, dumps, load, loads, copy, - Pickler, Unpickler, register, pickle, pickles, check, - DEFAULT_PROTOCOL, HIGHEST_PROTOCOL, HANDLE_FMODE, CONTENTS_FMODE, FILE_FMODE, - PickleError, PickleWarning, PicklingError, PicklingWarning, UnpicklingError, - UnpicklingWarning, -) -from .session import ( - dump_module, load_module, load_module_asdict, - dump_session, load_session # backward compatibility -) -from . import detect, logger, session, source, temp - -# get global settings -from .settings import settings - -# make sure "trace" is turned off -logger.trace(False) - -objects = {} -# local import of dill._objects -#from . import _objects -#objects.update(_objects.succeeds) -#del _objects - -# local import of dill.objtypes -from . import objtypes as types - -def load_types(pickleable=True, unpickleable=True): - """load pickleable and/or unpickleable types to ``dill.types`` - - ``dill.types`` is meant to mimic the ``types`` module, providing a - registry of object types. By default, the module is empty (for import - speed purposes). Use the ``load_types`` function to load selected object - types to the ``dill.types`` module. - - Args: - pickleable (bool, default=True): if True, load pickleable types. - unpickleable (bool, default=True): if True, load unpickleable types. - - Returns: - None - """ - from importlib import reload - # local import of dill.objects - from . import _objects - if pickleable: - objects.update(_objects.succeeds) - else: - [objects.pop(obj,None) for obj in _objects.succeeds] - if unpickleable: - objects.update(_objects.failures) - else: - [objects.pop(obj,None) for obj in _objects.failures] - objects.update(_objects.registered) - del _objects - # reset contents of types to 'empty' - [types.__dict__.pop(obj) for obj in list(types.__dict__.keys()) \ - if obj.find('Type') != -1] - # add corresponding types from objects to types - reload(types) - -def extend(use_dill=True): - '''add (or remove) dill types to/from the pickle registry - - by default, ``dill`` populates its types to ``pickle.Pickler.dispatch``. - Thus, all ``dill`` types are available upon calling ``'import pickle'``. - To drop all ``dill`` types from the ``pickle`` dispatch, *use_dill=False*. - - Args: - use_dill (bool, default=True): if True, extend the dispatch table. - - Returns: - None - ''' - from ._dill import _revert_extension, _extend - if use_dill: _extend() - else: _revert_extension() - return - -extend() - - -def license(): - """print license""" - print (__license__) - return - -def citation(): - """print citation""" - print (__doc__[-491:-118]) - return - -# end of file diff --git a/venv/lib/python3.12/site-packages/dill/__pycache__/__diff.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/__pycache__/__diff.cpython-312.pyc deleted file mode 100644 index baa1d5b..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/__pycache__/__diff.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/__pycache__/__info__.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/__pycache__/__info__.cpython-312.pyc deleted file mode 100644 index f1ae510..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/__pycache__/__info__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index ef45c0c..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/__pycache__/_dill.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/__pycache__/_dill.cpython-312.pyc deleted file mode 100644 index 288bb44..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/__pycache__/_dill.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/__pycache__/_objects.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/__pycache__/_objects.cpython-312.pyc deleted file mode 100644 index 27f441a..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/__pycache__/_objects.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/__pycache__/_shims.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/__pycache__/_shims.cpython-312.pyc deleted file mode 100644 index 9bf4ec4..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/__pycache__/_shims.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/__pycache__/detect.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/__pycache__/detect.cpython-312.pyc deleted file mode 100644 index 72bbea9..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/__pycache__/detect.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/__pycache__/logger.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/__pycache__/logger.cpython-312.pyc deleted file mode 100644 index 211f127..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/__pycache__/logger.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/__pycache__/objtypes.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/__pycache__/objtypes.cpython-312.pyc deleted file mode 100644 index 772b7b1..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/__pycache__/objtypes.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/__pycache__/pointers.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/__pycache__/pointers.cpython-312.pyc deleted file mode 100644 index 91ca071..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/__pycache__/pointers.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/__pycache__/session.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/__pycache__/session.cpython-312.pyc deleted file mode 100644 index 6c47efd..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/__pycache__/session.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/__pycache__/settings.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/__pycache__/settings.cpython-312.pyc deleted file mode 100644 index 7ad7171..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/__pycache__/settings.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/__pycache__/source.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/__pycache__/source.cpython-312.pyc deleted file mode 100644 index 3f06e37..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/__pycache__/source.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/__pycache__/temp.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/__pycache__/temp.cpython-312.pyc deleted file mode 100644 index d5b3820..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/__pycache__/temp.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/_dill.py b/venv/lib/python3.12/site-packages/dill/_dill.py deleted file mode 100644 index 27ab56c..0000000 --- a/venv/lib/python3.12/site-packages/dill/_dill.py +++ /dev/null @@ -1,2265 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2015 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE -""" -dill: a utility for serialization of python objects - -The primary functions in `dill` are :func:`dump` and -:func:`dumps` for serialization ("pickling") to a -file or to a string, respectively, and :func:`load` -and :func:`loads` for deserialization ("unpickling"), -similarly, from a file or from a string. Other notable -functions are :func:`~dill.dump_module` and -:func:`~dill.load_module`, which are used to save and -restore module objects, including an intepreter session. - -Based on code written by Oren Tirosh and Armin Ronacher. -Extended to a (near) full set of the builtin types (in types module), -and coded to the pickle interface, by . -Initial port to python3 by Jonathan Dobson, continued by mmckerns. -Tested against "all" python types (Std. Lib. CH 1-15 @ 2.7) by mmckerns. -Tested against CH16+ Std. Lib. ... TBD. -""" - -from __future__ import annotations - -__all__ = [ - 'dump','dumps','load','loads','copy', - 'Pickler','Unpickler','register','pickle','pickles','check', - 'DEFAULT_PROTOCOL','HIGHEST_PROTOCOL','HANDLE_FMODE','CONTENTS_FMODE','FILE_FMODE', - 'PickleError','PickleWarning','PicklingError','PicklingWarning','UnpicklingError', - 'UnpicklingWarning', -] - -__module__ = 'dill' - -import warnings -from .logger import adapter as logger -from .logger import trace as _trace -log = logger # backward compatibility (see issue #582) - -import os -import sys -diff = None -_use_diff = False -OLD38 = (sys.hexversion < 0x3080000) -OLD39 = (sys.hexversion < 0x3090000) -OLD310 = (sys.hexversion < 0x30a0000) -OLD312a7 = (sys.hexversion < 0x30c00a7) -#XXX: get types from .objtypes ? -import builtins as __builtin__ -from pickle import _Pickler as StockPickler, Unpickler as StockUnpickler -from pickle import GLOBAL, POP -from _contextvars import Context as ContextType -from _thread import LockType -from _thread import RLock as RLockType -try: - from _thread import _ExceptHookArgs as ExceptHookArgsType -except ImportError: - ExceptHookArgsType = None -try: - from _thread import _ThreadHandle as ThreadHandleType -except ImportError: - ThreadHandleType = None -#from io import IOBase -from types import CodeType, FunctionType, MethodType, GeneratorType, \ - TracebackType, FrameType, ModuleType, BuiltinMethodType -BufferType = memoryview #XXX: unregistered -ClassType = type # no 'old-style' classes -EllipsisType = type(Ellipsis) -#FileType = IOBase -NotImplementedType = type(NotImplemented) -SliceType = slice -TypeType = type # 'new-style' classes #XXX: unregistered -XRangeType = range -from types import MappingProxyType as DictProxyType, new_class -from pickle import DEFAULT_PROTOCOL, HIGHEST_PROTOCOL, PickleError, PicklingError, UnpicklingError -import __main__ as _main_module -import marshal -import gc -# import zlib -import abc -import dataclasses -from weakref import ReferenceType, ProxyType, CallableProxyType -from collections import OrderedDict -from enum import Enum, EnumMeta -from functools import partial -from operator import itemgetter, attrgetter -GENERATOR_FAIL = False -import importlib.machinery -EXTENSION_SUFFIXES = tuple(importlib.machinery.EXTENSION_SUFFIXES) -try: - import ctypes - HAS_CTYPES = True - # if using `pypy`, pythonapi is not found - IS_PYPY = not hasattr(ctypes, 'pythonapi') -except ImportError: - HAS_CTYPES = False - IS_PYPY = False -NumpyUfuncType = None -NumpyDType = None -NumpyArrayType = None -try: - if not importlib.machinery.PathFinder().find_spec('numpy'): - raise ImportError("No module named 'numpy'") - NumpyUfuncType = True - NumpyDType = True - NumpyArrayType = True -except ImportError: - pass -def __hook__(): - global NumpyArrayType, NumpyDType, NumpyUfuncType - from numpy import ufunc as NumpyUfuncType - from numpy import ndarray as NumpyArrayType - from numpy import dtype as NumpyDType - return True -if NumpyArrayType: # then has numpy - def ndarraysubclassinstance(obj_type): - if all((c.__module__, c.__name__) != ('numpy', 'ndarray') for c in obj_type.__mro__): - return False - # anything below here is a numpy array (or subclass) instance - __hook__() # import numpy (so the following works!!!) - # verify that __reduce__ has not been overridden - if obj_type.__reduce_ex__ is not NumpyArrayType.__reduce_ex__ \ - or obj_type.__reduce__ is not NumpyArrayType.__reduce__: - return False - return True - def numpyufunc(obj_type): - return any((c.__module__, c.__name__) == ('numpy', 'ufunc') for c in obj_type.__mro__) - def numpydtype(obj_type): - if all((c.__module__, c.__name__) != ('numpy', 'dtype') for c in obj_type.__mro__): - return False - # anything below here is a numpy dtype - __hook__() # import numpy (so the following works!!!) - return obj_type is type(NumpyDType) # handles subclasses -else: - def ndarraysubclassinstance(obj): return False - def numpyufunc(obj): return False - def numpydtype(obj): return False - -from types import GetSetDescriptorType, ClassMethodDescriptorType, \ - WrapperDescriptorType, MethodDescriptorType, MemberDescriptorType, \ - MethodWrapperType #XXX: unused - -# make sure to add these 'hand-built' types to _typemap -CellType = type((lambda x: lambda y: x)(0).__closure__[0]) -PartialType = type(partial(int, base=2)) -SuperType = type(super(Exception, TypeError())) -ItemGetterType = type(itemgetter(0)) -AttrGetterType = type(attrgetter('__repr__')) - -try: - from functools import _lru_cache_wrapper as LRUCacheType -except ImportError: - LRUCacheType = None - -if not isinstance(LRUCacheType, type): - LRUCacheType = None - -def get_file_type(*args, **kwargs): - open = kwargs.pop("open", __builtin__.open) - f = open(os.devnull, *args, **kwargs) - t = type(f) - f.close() - return t - -IS_PYODIDE = sys.platform == 'emscripten' - -FileType = get_file_type('rb', buffering=0) -TextWrapperType = get_file_type('r', buffering=-1) -BufferedRandomType = None if IS_PYODIDE else get_file_type('r+b', buffering=-1) -BufferedReaderType = get_file_type('rb', buffering=-1) -BufferedWriterType = get_file_type('wb', buffering=-1) -try: - from _pyio import open as _open - PyTextWrapperType = get_file_type('r', buffering=-1, open=_open) - PyBufferedRandomType = None if IS_PYODIDE else get_file_type('r+b', buffering=-1, open=_open) - PyBufferedReaderType = get_file_type('rb', buffering=-1, open=_open) - PyBufferedWriterType = get_file_type('wb', buffering=-1, open=_open) -except ImportError: - PyTextWrapperType = PyBufferedRandomType = PyBufferedReaderType = PyBufferedWriterType = None -from io import BytesIO as StringIO -InputType = OutputType = None -from socket import socket as SocketType -#FIXME: additionally calls ForkingPickler.register several times -from multiprocessing.reduction import _reduce_socket as reduce_socket -try: #pragma: no cover - IS_IPYTHON = __IPYTHON__ # is True - ExitType = None # IPython.core.autocall.ExitAutocall - IPYTHON_SINGLETONS = ('exit', 'quit', 'get_ipython') -except NameError: - IS_IPYTHON = False - try: ExitType = type(exit) # apparently 'exit' can be removed - except NameError: ExitType = None - IPYTHON_SINGLETONS = () - -import inspect -import typing - - -### Shims for different versions of Python and dill -class Sentinel(object): - """ - Create a unique sentinel object that is pickled as a constant. - """ - def __init__(self, name, module_name=None): - self.name = name - if module_name is None: - # Use the calling frame's module - self.__module__ = inspect.currentframe().f_back.f_globals['__name__'] - else: - self.__module__ = module_name # pragma: no cover - def __repr__(self): - return self.__module__ + '.' + self.name # pragma: no cover - def __copy__(self): - return self # pragma: no cover - def __deepcopy__(self, memo): - return self # pragma: no cover - def __reduce__(self): - return self.name - def __reduce_ex__(self, protocol): - return self.name - -from . import _shims -from ._shims import Reduce, Getattr - -### File modes -#: Pickles the file handle, preserving mode. The position of the unpickled -#: object is as for a new file handle. -HANDLE_FMODE = 0 -#: Pickles the file contents, creating a new file if on load the file does -#: not exist. The position = min(pickled position, EOF) and mode is chosen -#: as such that "best" preserves behavior of the original file. -CONTENTS_FMODE = 1 -#: Pickles the entire file (handle and contents), preserving mode and position. -FILE_FMODE = 2 - -### Shorthands (modified from python2.5/lib/pickle.py) -def copy(obj, *args, **kwds): - """ - Use pickling to 'copy' an object (i.e. `loads(dumps(obj))`). - - See :func:`dumps` and :func:`loads` for keyword arguments. - """ - ignore = kwds.pop('ignore', Unpickler.settings['ignore']) - return loads(dumps(obj, *args, **kwds), ignore=ignore) - -def dump(obj, file, protocol=None, byref=None, fmode=None, recurse=None, **kwds):#, strictio=None): - """ - Pickle an object to a file. - - See :func:`dumps` for keyword arguments. - """ - from .settings import settings - protocol = settings['protocol'] if protocol is None else int(protocol) - _kwds = kwds.copy() - _kwds.update(dict(byref=byref, fmode=fmode, recurse=recurse)) - Pickler(file, protocol, **_kwds).dump(obj) - return - -def dumps(obj, protocol=None, byref=None, fmode=None, recurse=None, **kwds):#, strictio=None): - """ - Pickle an object to a string. - - *protocol* is the pickler protocol, as defined for Python *pickle*. - - If *byref=True*, then dill behaves a lot more like pickle as certain - objects (like modules) are pickled by reference as opposed to attempting - to pickle the object itself. - - If *recurse=True*, then objects referred to in the global dictionary - are recursively traced and pickled, instead of the default behavior - of attempting to store the entire global dictionary. This is needed for - functions defined via *exec()*. - - *fmode* (:const:`HANDLE_FMODE`, :const:`CONTENTS_FMODE`, - or :const:`FILE_FMODE`) indicates how file handles will be pickled. - For example, when pickling a data file handle for transfer to a remote - compute service, *FILE_FMODE* will include the file contents in the - pickle and cursor position so that a remote method can operate - transparently on an object with an open file handle. - - Default values for keyword arguments can be set in :mod:`dill.settings`. - """ - file = StringIO() - dump(obj, file, protocol, byref, fmode, recurse, **kwds)#, strictio) - return file.getvalue() - -def load(file, ignore=None, **kwds): - """ - Unpickle an object from a file. - - See :func:`loads` for keyword arguments. - """ - return Unpickler(file, ignore=ignore, **kwds).load() - -def loads(str, ignore=None, **kwds): - """ - Unpickle an object from a string. - - If *ignore=False* then objects whose class is defined in the module - *__main__* are updated to reference the existing class in *__main__*, - otherwise they are left to refer to the reconstructed type, which may - be different. - - Default values for keyword arguments can be set in :mod:`dill.settings`. - """ - file = StringIO(str) - return load(file, ignore, **kwds) - -# def dumpzs(obj, protocol=None): -# """pickle an object to a compressed string""" -# return zlib.compress(dumps(obj, protocol)) - -# def loadzs(str): -# """unpickle an object from a compressed string""" -# return loads(zlib.decompress(str)) - -### End: Shorthands ### - -class MetaCatchingDict(dict): - def get(self, key, default=None): - try: - return self[key] - except KeyError: - return default - - def __missing__(self, key): - if issubclass(key, type): - return save_type - else: - raise KeyError() - -class PickleWarning(Warning, PickleError): - pass - -class PicklingWarning(PickleWarning, PicklingError): - pass - -class UnpicklingWarning(PickleWarning, UnpicklingError): - pass - -### Extend the Picklers -class Pickler(StockPickler): - """python's Pickler extended to interpreter sessions""" - dispatch: typing.Dict[type, typing.Callable[[Pickler, typing.Any], None]] \ - = MetaCatchingDict(StockPickler.dispatch.copy()) - """The dispatch table, a dictionary of serializing functions used - by Pickler to save objects of specific types. Use :func:`pickle` - or :func:`register` to associate types to custom functions. - - :meta hide-value: - """ - _session = False - from .settings import settings - - def __init__(self, file, *args, **kwds): - settings = Pickler.settings - _byref = kwds.pop('byref', None) - #_strictio = kwds.pop('strictio', None) - _fmode = kwds.pop('fmode', None) - _recurse = kwds.pop('recurse', None) - StockPickler.__init__(self, file, *args, **kwds) - self._main = _main_module - self._diff_cache = {} - self._byref = settings['byref'] if _byref is None else _byref - self._strictio = False #_strictio - self._fmode = settings['fmode'] if _fmode is None else _fmode - self._recurse = settings['recurse'] if _recurse is None else _recurse - self._postproc = OrderedDict() - self._file = file - - def save(self, obj, save_persistent_id=True): - # numpy hack - obj_type = type(obj) - if NumpyArrayType and not (obj_type is type or obj_type in Pickler.dispatch): - # register if the object is a numpy ufunc - # thanks to Paul Kienzle for pointing out ufuncs didn't pickle - if numpyufunc(obj_type): - @register(obj_type) - def save_numpy_ufunc(pickler, obj): - logger.trace(pickler, "Nu: %s", obj) - name = getattr(obj, '__qualname__', getattr(obj, '__name__', None)) - StockPickler.save_global(pickler, obj, name=name) - logger.trace(pickler, "# Nu") - return - # NOTE: the above 'save' performs like: - # import copy_reg - # def udump(f): return f.__name__ - # def uload(name): return getattr(numpy, name) - # copy_reg.pickle(NumpyUfuncType, udump, uload) - # register if the object is a numpy dtype - if numpydtype(obj_type): - @register(obj_type) - def save_numpy_dtype(pickler, obj): - logger.trace(pickler, "Dt: %s", obj) - pickler.save_reduce(_create_dtypemeta, (obj.type,), obj=obj) - logger.trace(pickler, "# Dt") - return - # NOTE: the above 'save' performs like: - # import copy_reg - # def uload(name): return type(NumpyDType(name)) - # def udump(f): return uload, (f.type,) - # copy_reg.pickle(NumpyDTypeType, udump, uload) - # register if the object is a subclassed numpy array instance - if ndarraysubclassinstance(obj_type): - @register(obj_type) - def save_numpy_array(pickler, obj): - logger.trace(pickler, "Nu: (%s, %s)", obj.shape, obj.dtype) - npdict = getattr(obj, '__dict__', None) - f, args, state = obj.__reduce__() - pickler.save_reduce(_create_array, (f,args,state,npdict), obj=obj) - logger.trace(pickler, "# Nu") - return - # end numpy hack - - if GENERATOR_FAIL and obj_type is GeneratorType: - msg = "Can't pickle %s: attribute lookup builtins.generator failed" % GeneratorType - raise PicklingError(msg) - StockPickler.save(self, obj, save_persistent_id) - - save.__doc__ = StockPickler.save.__doc__ - - def dump(self, obj): #NOTE: if settings change, need to update attributes - logger.trace_setup(self) - StockPickler.dump(self, obj) - dump.__doc__ = StockPickler.dump.__doc__ - -class Unpickler(StockUnpickler): - """python's Unpickler extended to interpreter sessions and more types""" - from .settings import settings - _session = False - - def find_class(self, module, name): - if (module, name) == ('__builtin__', '__main__'): - return self._main.__dict__ #XXX: above set w/save_module_dict - elif (module, name) == ('__builtin__', 'NoneType'): - return type(None) #XXX: special case: NoneType missing - if module == 'dill.dill': module = 'dill._dill' - return StockUnpickler.find_class(self, module, name) - - def __init__(self, *args, **kwds): - settings = Pickler.settings - _ignore = kwds.pop('ignore', None) - StockUnpickler.__init__(self, *args, **kwds) - self._main = _main_module - self._ignore = settings['ignore'] if _ignore is None else _ignore - - def load(self): #NOTE: if settings change, need to update attributes - obj = StockUnpickler.load(self) - if type(obj).__module__ == getattr(_main_module, '__name__', '__main__'): - if not self._ignore: - # point obj class to main - try: obj.__class__ = getattr(self._main, type(obj).__name__) - except (AttributeError,TypeError): pass # defined in a file - #_main_module.__dict__.update(obj.__dict__) #XXX: should update globals ? - return obj - load.__doc__ = StockUnpickler.load.__doc__ - pass - -''' -def dispatch_table(): - """get the dispatch table of registered types""" - return Pickler.dispatch -''' - -pickle_dispatch_copy = StockPickler.dispatch.copy() - -def pickle(t, func): - """expose :attr:`~Pickler.dispatch` table for user-created extensions""" - Pickler.dispatch[t] = func - return - -def register(t): - """decorator to register types to Pickler's :attr:`~Pickler.dispatch` table""" - def proxy(func): - Pickler.dispatch[t] = func - return func - return proxy - -def _revert_extension(): - """drop dill-registered types from pickle's dispatch table""" - for type, func in list(StockPickler.dispatch.items()): - if func.__module__ == __name__: - del StockPickler.dispatch[type] - if type in pickle_dispatch_copy: - StockPickler.dispatch[type] = pickle_dispatch_copy[type] - -def use_diff(on=True): - """ - Reduces size of pickles by only including object which have changed. - - Decreases pickle size but increases CPU time needed. - Also helps avoid some unpickleable objects. - MUST be called at start of script, otherwise changes will not be recorded. - """ - global _use_diff, diff - _use_diff = on - if _use_diff and diff is None: - try: - from . import diff as d - except ImportError: - import diff as d - diff = d - -def _create_typemap(): - import types - d = dict(list(__builtin__.__dict__.items()) + \ - list(types.__dict__.items())).items() - for key, value in d: - if getattr(value, '__module__', None) == 'builtins' \ - and type(value) is type: - yield key, value - return -_reverse_typemap = dict(_create_typemap()) -_reverse_typemap.update({ - 'PartialType': PartialType, - 'SuperType': SuperType, - 'ItemGetterType': ItemGetterType, - 'AttrGetterType': AttrGetterType, -}) -if sys.hexversion < 0x30800a2: - _reverse_typemap.update({ - 'CellType': CellType, - }) - -# "Incidental" implementation specific types. Unpickling these types in another -# implementation of Python (PyPy -> CPython) is not guaranteed to work - -# This dictionary should contain all types that appear in Python implementations -# but are not defined in https://docs.python.org/3/library/types.html#standard-interpreter-types -x=OrderedDict() -_incedental_reverse_typemap = { - 'FileType': FileType, - 'BufferedRandomType': BufferedRandomType, - 'BufferedReaderType': BufferedReaderType, - 'BufferedWriterType': BufferedWriterType, - 'TextWrapperType': TextWrapperType, - 'PyBufferedRandomType': PyBufferedRandomType, - 'PyBufferedReaderType': PyBufferedReaderType, - 'PyBufferedWriterType': PyBufferedWriterType, - 'PyTextWrapperType': PyTextWrapperType, -} - -_incedental_reverse_typemap.update({ - "DictKeysType": type({}.keys()), - "DictValuesType": type({}.values()), - "DictItemsType": type({}.items()), - - "OdictKeysType": type(x.keys()), - "OdictValuesType": type(x.values()), - "OdictItemsType": type(x.items()), -}) - -if ExitType: - _incedental_reverse_typemap['ExitType'] = ExitType -if InputType: - _incedental_reverse_typemap['InputType'] = InputType - _incedental_reverse_typemap['OutputType'] = OutputType - -''' -try: - import symtable - _incedental_reverse_typemap["SymtableEntryType"] = type(symtable.symtable("", "string", "exec")._table) -except: #FIXME: fails to pickle - pass - -if sys.hexversion >= 0x30a00a0: - _incedental_reverse_typemap['LineIteratorType'] = type(compile('3', '', 'eval').co_lines()) -''' - -if sys.hexversion >= 0x30b00b0 and not IS_PYPY: - from types import GenericAlias - _incedental_reverse_typemap["GenericAliasIteratorType"] = type(iter(GenericAlias(list, (int,)))) - ''' - _incedental_reverse_typemap['PositionsIteratorType'] = type(compile('3', '', 'eval').co_positions()) - ''' - -try: - import winreg - _incedental_reverse_typemap["HKEYType"] = winreg.HKEYType -except ImportError: - pass - -_reverse_typemap.update(_incedental_reverse_typemap) -_incedental_types = set(_incedental_reverse_typemap.values()) - -del x - -_typemap = dict((v, k) for k, v in _reverse_typemap.items()) - -def _unmarshal(string): - return marshal.loads(string) - -def _load_type(name): - return _reverse_typemap[name] - -def _create_type(typeobj, *args): - return typeobj(*args) - -def _create_function(fcode, fglobals, fname=None, fdefaults=None, - fclosure=None, fdict=None, fkwdefaults=None): - # same as FunctionType, but enable passing __dict__ to new function, - # __dict__ is the storehouse for attributes added after function creation - func = FunctionType(fcode, fglobals or dict(), fname, fdefaults, fclosure) - if fdict is not None: - func.__dict__.update(fdict) #XXX: better copy? option to copy? - if fkwdefaults is not None: - func.__kwdefaults__ = fkwdefaults - # 'recurse' only stores referenced modules/objects in fglobals, - # thus we need to make sure that we have __builtins__ as well - if "__builtins__" not in func.__globals__: - func.__globals__["__builtins__"] = globals()["__builtins__"] - # assert id(fglobals) == id(func.__globals__) - return func - -class match: - """ - Make avaialable a limited structural pattern matching-like syntax for Python < 3.10 - - Patterns can be only tuples (without types) currently. - Inspired by the package pattern-matching-PEP634. - - Usage: - >>> with match(args) as m: - >>> if m.case(('x', 'y')): - >>> # use m.x and m.y - >>> elif m.case(('x', 'y', 'z')): - >>> # use m.x, m.y and m.z - - Equivalent native code for Python >= 3.10: - >>> match args: - >>> case (x, y): - >>> # use x and y - >>> case (x, y, z): - >>> # use x, y and z - """ - def __init__(self, value): - self.value = value - self._fields = None - def __enter__(self): - return self - def __exit__(self, *exc_info): - return False - def case(self, args): # *args, **kwargs): - """just handles tuple patterns""" - if len(self.value) != len(args): # + len(kwargs): - return False - #if not all(isinstance(arg, pat) for arg, pat in zip(self.value[len(args):], kwargs.values())): - # return False - self.args = args # (*args, *kwargs) - return True - @property - def fields(self): - # Only bind names to values if necessary. - if self._fields is None: - self._fields = dict(zip(self.args, self.value)) - return self._fields - def __getattr__(self, item): - return self.fields[item] - -ALL_CODE_PARAMS = [ - # Version New attribute CodeType parameters - ((3,11,'a'), 'co_endlinetable', 'argcount posonlyargcount kwonlyargcount nlocals stacksize flags code consts names varnames filename name qualname firstlineno linetable endlinetable columntable exceptiontable freevars cellvars'), - ((3,11), 'co_exceptiontable', 'argcount posonlyargcount kwonlyargcount nlocals stacksize flags code consts names varnames filename name qualname firstlineno linetable exceptiontable freevars cellvars'), - ((3,11,'p'), 'co_qualname', 'argcount posonlyargcount kwonlyargcount nlocals stacksize flags code consts names varnames filename name qualname firstlineno linetable freevars cellvars'), - ((3,10), 'co_linetable', 'argcount posonlyargcount kwonlyargcount nlocals stacksize flags code consts names varnames filename name firstlineno linetable freevars cellvars'), - ((3,8), 'co_posonlyargcount', 'argcount posonlyargcount kwonlyargcount nlocals stacksize flags code consts names varnames filename name firstlineno lnotab freevars cellvars'), - ((3,7), 'co_kwonlyargcount', 'argcount kwonlyargcount nlocals stacksize flags code consts names varnames filename name firstlineno lnotab freevars cellvars'), - ] -for version, new_attr, params in ALL_CODE_PARAMS: - if hasattr(CodeType, new_attr): - CODE_VERSION = version - CODE_PARAMS = params.split() - break -ENCODE_PARAMS = set(CODE_PARAMS).intersection( - ['code', 'lnotab', 'linetable', 'endlinetable', 'columntable', 'exceptiontable']) - -def _create_code(*args): - if not isinstance(args[0], int): # co_lnotab stored from >= 3.10 - LNOTAB, *args = args - else: # from < 3.10 (or pre-LNOTAB storage) - LNOTAB = b'' - - with match(args) as m: - # Python 3.11/3.12a (18 members) - if m.case(( - 'argcount', 'posonlyargcount', 'kwonlyargcount', 'nlocals', 'stacksize', 'flags', # args[0:6] - 'code', 'consts', 'names', 'varnames', 'filename', 'name', 'qualname', 'firstlineno', # args[6:14] - 'linetable', 'exceptiontable', 'freevars', 'cellvars' # args[14:] - )): - if CODE_VERSION == (3,11): - return CodeType( - *args[:6], - args[6].encode() if hasattr(args[6], 'encode') else args[6], # code - *args[7:14], - args[14].encode() if hasattr(args[14], 'encode') else args[14], # linetable - args[15].encode() if hasattr(args[15], 'encode') else args[15], # exceptiontable - args[16], - args[17], - ) - fields = m.fields - # PyPy 3.11 7.3.19+ (17 members) - elif m.case(( - 'argcount', 'posonlyargcount', 'kwonlyargcount', 'nlocals', 'stacksize', 'flags', # args[0:6] - 'code', 'consts', 'names', 'varnames', 'filename', 'name', 'qualname', # args[6:13] - 'firstlineno', 'linetable', 'freevars', 'cellvars' # args[13:] - )): - if CODE_VERSION == (3,11,'p'): - return CodeType( - *args[:6], - args[6].encode() if hasattr(args[6], 'encode') else args[6], # code - *args[7:14], - args[14].encode() if hasattr(args[14], 'encode') else args[14], # linetable - args[15], - args[16], - ) - fields = m.fields - # Python 3.10 or 3.8/3.9 (16 members) - elif m.case(( - 'argcount', 'posonlyargcount', 'kwonlyargcount', 'nlocals', 'stacksize', 'flags', # args[0:6] - 'code', 'consts', 'names', 'varnames', 'filename', 'name', 'firstlineno', # args[6:13] - 'LNOTAB_OR_LINETABLE', 'freevars', 'cellvars' # args[13:] - )): - if CODE_VERSION == (3,10) or CODE_VERSION == (3,8): - return CodeType( - *args[:6], - args[6].encode() if hasattr(args[6], 'encode') else args[6], # code - *args[7:13], - args[13].encode() if hasattr(args[13], 'encode') else args[13], # lnotab/linetable - args[14], - args[15], - ) - fields = m.fields - if CODE_VERSION >= (3,10): - fields['linetable'] = m.LNOTAB_OR_LINETABLE - else: - fields['lnotab'] = LNOTAB if LNOTAB else m.LNOTAB_OR_LINETABLE - # Python 3.7 (15 args) - elif m.case(( - 'argcount', 'kwonlyargcount', 'nlocals', 'stacksize', 'flags', # args[0:5] - 'code', 'consts', 'names', 'varnames', 'filename', 'name', 'firstlineno', # args[5:12] - 'lnotab', 'freevars', 'cellvars' # args[12:] - )): - if CODE_VERSION == (3,7): - return CodeType( - *args[:5], - args[5].encode() if hasattr(args[5], 'encode') else args[5], # code - *args[6:12], - args[12].encode() if hasattr(args[12], 'encode') else args[12], # lnotab - args[13], - args[14], - ) - fields = m.fields - # Python 3.11a (20 members) - elif m.case(( - 'argcount', 'posonlyargcount', 'kwonlyargcount', 'nlocals', 'stacksize', 'flags', # args[0:6] - 'code', 'consts', 'names', 'varnames', 'filename', 'name', 'qualname', 'firstlineno', # args[6:14] - 'linetable', 'endlinetable', 'columntable', 'exceptiontable', 'freevars', 'cellvars' # args[14:] - )): - if CODE_VERSION == (3,11,'a'): - return CodeType( - *args[:6], - args[6].encode() if hasattr(args[6], 'encode') else args[6], # code - *args[7:14], - *(a.encode() if hasattr(a, 'encode') else a for a in args[14:18]), # linetable-exceptiontable - args[18], - args[19], - ) - fields = m.fields - else: - raise UnpicklingError("pattern match for code object failed") - - # The args format doesn't match this version. - fields.setdefault('posonlyargcount', 0) # from python <= 3.7 - fields.setdefault('lnotab', LNOTAB) # from python >= 3.10 - fields.setdefault('linetable', b'') # from python <= 3.9 - fields.setdefault('qualname', fields['name']) # from python <= 3.10 - fields.setdefault('exceptiontable', b'') # from python <= 3.10 - fields.setdefault('endlinetable', None) # from python != 3.11a - fields.setdefault('columntable', None) # from python != 3.11a - - args = (fields[k].encode() if k in ENCODE_PARAMS and hasattr(fields[k], 'encode') else fields[k] - for k in CODE_PARAMS) - return CodeType(*args) - -def _create_ftype(ftypeobj, func, args, kwds): - if kwds is None: - kwds = {} - if args is None: - args = () - return ftypeobj(func, *args, **kwds) - -def _create_typing_tuple(argz, *args): #NOTE: workaround python/cpython#94245 - if not argz: - return typing.Tuple[()].copy_with(()) - if argz == ((),): - return typing.Tuple[()] - return typing.Tuple[argz] - -if ThreadHandleType: - def _create_thread_handle(ident, done, *args): #XXX: ignores 'blocking' - from threading import _make_thread_handle - handle = _make_thread_handle(ident) - if done: - handle._set_done() - return handle - -def _create_lock(locked, *args): #XXX: ignores 'blocking' - from threading import Lock - lock = Lock() - if locked: - if not lock.acquire(False): - raise UnpicklingError("Cannot acquire lock") - return lock - -def _create_rlock(count, owner, *args): #XXX: ignores 'blocking' - lock = RLockType() - if owner is not None: - lock._acquire_restore((count, owner)) - if owner and not lock._is_owned(): - raise UnpicklingError("Cannot acquire lock") - return lock - -# thanks to matsjoyce for adding all the different file modes -def _create_filehandle(name, mode, position, closed, open, strictio, fmode, fdata): # buffering=0 - # only pickles the handle, not the file contents... good? or StringIO(data)? - # (for file contents see: http://effbot.org/librarybook/copy-reg.htm) - # NOTE: handle special cases first (are there more special cases?) - names = {'':sys.__stdin__, '':sys.__stdout__, - '':sys.__stderr__} #XXX: better fileno=(0,1,2) ? - if name in list(names.keys()): - f = names[name] #XXX: safer "f=sys.stdin" - elif name == '': - f = os.tmpfile() - elif name == '': - import tempfile - f = tempfile.TemporaryFile(mode) - else: - try: - exists = os.path.exists(name) - except Exception: - exists = False - if not exists: - if strictio: - raise FileNotFoundError("[Errno 2] No such file or directory: '%s'" % name) - elif "r" in mode and fmode != FILE_FMODE: - name = '' # or os.devnull? - current_size = 0 # or maintain position? - else: - current_size = os.path.getsize(name) - - if position > current_size: - if strictio: - raise ValueError("invalid buffer size") - elif fmode == CONTENTS_FMODE: - position = current_size - # try to open the file by name - # NOTE: has different fileno - try: - #FIXME: missing: *buffering*, encoding, softspace - if fmode == FILE_FMODE: - f = open(name, mode if "w" in mode else "w") - f.write(fdata) - if "w" not in mode: - f.close() - f = open(name, mode) - elif name == '': # file did not exist - import tempfile - f = tempfile.TemporaryFile(mode) - # treat x mode as w mode - elif fmode == CONTENTS_FMODE \ - and ("w" in mode or "x" in mode): - # stop truncation when opening - flags = os.O_CREAT - if "+" in mode: - flags |= os.O_RDWR - else: - flags |= os.O_WRONLY - f = os.fdopen(os.open(name, flags), mode) - # set name to the correct value - r = getattr(f, "buffer", f) - r = getattr(r, "raw", r) - r.name = name - assert f.name == name - else: - f = open(name, mode) - except (IOError, FileNotFoundError): - err = sys.exc_info()[1] - raise UnpicklingError(err) - if closed: - f.close() - elif position >= 0 and fmode != HANDLE_FMODE: - f.seek(position) - return f - -def _create_stringi(value, position, closed): - f = StringIO(value) - if closed: f.close() - else: f.seek(position) - return f - -def _create_stringo(value, position, closed): - f = StringIO() - if closed: f.close() - else: - f.write(value) - f.seek(position) - return f - -class _itemgetter_helper(object): - def __init__(self): - self.items = [] - def __getitem__(self, item): - self.items.append(item) - return - -class _attrgetter_helper(object): - def __init__(self, attrs, index=None): - self.attrs = attrs - self.index = index - def __getattribute__(self, attr): - attrs = object.__getattribute__(self, "attrs") - index = object.__getattribute__(self, "index") - if index is None: - index = len(attrs) - attrs.append(attr) - else: - attrs[index] = ".".join([attrs[index], attr]) - return type(self)(attrs, index) - -class _dictproxy_helper(dict): - def __ror__(self, a): - return a - -_dictproxy_helper_instance = _dictproxy_helper() - -__d = {} -try: - # In CPython 3.9 and later, this trick can be used to exploit the - # implementation of the __or__ function of MappingProxyType to get the true - # mapping referenced by the proxy. It may work for other implementations, - # but is not guaranteed. - MAPPING_PROXY_TRICK = __d is (DictProxyType(__d) | _dictproxy_helper_instance) -except Exception: - MAPPING_PROXY_TRICK = False -del __d - -# _CELL_REF and _CELL_EMPTY are used to stay compatible with versions of dill -# whose _create_cell functions do not have a default value. -# _CELL_REF can be safely removed entirely (replaced by empty tuples for calls -# to _create_cell) once breaking changes are allowed. -_CELL_REF = None -_CELL_EMPTY = Sentinel('_CELL_EMPTY') - -def _create_cell(contents=None): - if contents is not _CELL_EMPTY: - value = contents - return (lambda: value).__closure__[0] - -def _create_weakref(obj, *args): - from weakref import ref - if obj is None: # it's dead - from collections import UserDict - return ref(UserDict(), *args) - return ref(obj, *args) - -def _create_weakproxy(obj, callable=False, *args): - from weakref import proxy - if obj is None: # it's dead - if callable: return proxy(lambda x:x, *args) - from collections import UserDict - return proxy(UserDict(), *args) - return proxy(obj, *args) - -def _eval_repr(repr_str): - return eval(repr_str) - -def _create_array(f, args, state, npdict=None): - #array = numpy.core.multiarray._reconstruct(*args) - array = f(*args) - array.__setstate__(state) - if npdict is not None: # we also have saved state in __dict__ - array.__dict__.update(npdict) - return array - -def _create_dtypemeta(scalar_type): - if NumpyDType is True: __hook__() # a bit hacky I think - if scalar_type is None: - return NumpyDType - return type(NumpyDType(scalar_type)) - -def _create_namedtuple(name, fieldnames, modulename, defaults=None): - class_ = _import_module(modulename + '.' + name, safe=True) - if class_ is not None: - return class_ - import collections - t = collections.namedtuple(name, fieldnames, defaults=defaults, module=modulename) - return t - -def _create_capsule(pointer, name, context, destructor): - attr_found = False - try: - # based on https://github.com/python/cpython/blob/f4095e53ab708d95e019c909d5928502775ba68f/Objects/capsule.c#L209-L231 - uname = name.decode('utf8') - for i in range(1, uname.count('.')+1): - names = uname.rsplit('.', i) - try: - module = __import__(names[0]) - except ImportError: - pass - obj = module - for attr in names[1:]: - obj = getattr(obj, attr) - capsule = obj - attr_found = True - break - except Exception: - pass - - if attr_found: - if _PyCapsule_IsValid(capsule, name): - return capsule - raise UnpicklingError("%s object exists at %s but a PyCapsule object was expected." % (type(capsule), name)) - else: - #warnings.warn('Creating a new PyCapsule %s for a C data structure that may not be present in memory. Segmentation faults or other memory errors are possible.' % (name,), UnpicklingWarning) - capsule = _PyCapsule_New(pointer, name, destructor) - _PyCapsule_SetContext(capsule, context) - return capsule - -def _getattr(objclass, name, repr_str): - # hack to grab the reference directly - try: #XXX: works only for __builtin__ ? - attr = repr_str.split("'")[3] - return eval(attr+'.__dict__["'+name+'"]') - except Exception: - try: - attr = objclass.__dict__ - if type(attr) is DictProxyType: - if sys.hexversion > 0x30f00a0 and name in ('__weakref__','__dict__'): - attr = _dictproxy_helper.__dict__[name] - else: - attr = attr[name] - else: - attr = getattr(objclass,name) - except (AttributeError, KeyError): - attr = getattr(objclass,name) - return attr - -def _get_attr(self, name): - # stop recursive pickling - return getattr(self, name, None) or getattr(__builtin__, name) - -def _import_module(import_name, safe=False): - try: - if import_name.startswith('__runtime__.'): - return sys.modules[import_name] - elif '.' in import_name: - items = import_name.split('.') - module = '.'.join(items[:-1]) - obj = items[-1] - submodule = getattr(__import__(module, None, None, [obj]), obj) - if isinstance(submodule, (ModuleType, type)): - return submodule - return __import__(import_name, None, None, [obj]) - else: - return __import__(import_name) - except (ImportError, AttributeError, KeyError): - if safe: - return None - raise - -# https://github.com/python/cpython/blob/a8912a0f8d9eba6d502c37d522221f9933e976db/Lib/pickle.py#L322-L333 -def _getattribute(obj, name): - for subpath in name.split('.'): - if subpath == '': - raise AttributeError("Can't get local attribute {!r} on {!r}" - .format(name, obj)) - try: - parent = obj - obj = getattr(obj, subpath) - except AttributeError: - raise AttributeError("Can't get attribute {!r} on {!r}" - .format(name, obj)) - return obj, parent - -def _locate_function(obj, pickler=None): - module_name = getattr(obj, '__module__', None) - if module_name in ['__main__', None] or \ - pickler and is_dill(pickler, child=False) and pickler._session and module_name == pickler._main.__name__: - return False - if hasattr(obj, '__qualname__'): - module = _import_module(module_name, safe=True) - try: - found, _ = _getattribute(module, obj.__qualname__) - return found is obj - except AttributeError: - return False - else: - found = _import_module(module_name + '.' + obj.__name__, safe=True) - return found is obj - - -def _setitems(dest, source): - for k, v in source.items(): - dest[k] = v - - -def _save_with_postproc(pickler, reduction, is_pickler_dill=None, obj=Getattr.NO_DEFAULT, postproc_list=None): - if obj is Getattr.NO_DEFAULT: - obj = Reduce(reduction) # pragma: no cover - - if is_pickler_dill is None: - is_pickler_dill = is_dill(pickler, child=True) - if is_pickler_dill: - # assert id(obj) not in pickler._postproc, str(obj) + ' already pushed on stack!' - # if not hasattr(pickler, 'x'): pickler.x = 0 - # print(pickler.x*' ', 'push', obj, id(obj), pickler._recurse) - # pickler.x += 1 - if postproc_list is None: - postproc_list = [] - - # Recursive object not supported. Default to a global instead. - if id(obj) in pickler._postproc: - name = '%s.%s ' % (obj.__module__, getattr(obj, '__qualname__', obj.__name__)) if hasattr(obj, '__module__') else '' - warnings.warn('Cannot pickle %r: %shas recursive self-references that trigger a RecursionError.' % (obj, name), PicklingWarning) - pickler.save_global(obj) - return - pickler._postproc[id(obj)] = postproc_list - - # TODO: Use state_setter in Python 3.8 to allow for faster cPickle implementations - pickler.save_reduce(*reduction, obj=obj) - - if is_pickler_dill: - # pickler.x -= 1 - # print(pickler.x*' ', 'pop', obj, id(obj)) - postproc = pickler._postproc.pop(id(obj)) - # assert postproc_list == postproc, 'Stack tampered!' - for reduction in reversed(postproc): - if reduction[0] is _setitems: - # use the internal machinery of pickle.py to speedup when - # updating a dictionary in postproc - dest, source = reduction[1] - if source: - pickler.write(pickler.get(pickler.memo[id(dest)][0])) - if sys.hexversion < 0x30e00a1: - pickler._batch_setitems(iter(source.items())) - else: - pickler._batch_setitems(iter(source.items()), obj=obj) - else: - # Updating with an empty dictionary. Same as doing nothing. - continue - else: - pickler.save_reduce(*reduction) - # pop None created by calling preprocessing step off stack - pickler.write(POP) - -#@register(CodeType) -#def save_code(pickler, obj): -# logger.trace(pickler, "Co: %s", obj) -# pickler.save_reduce(_unmarshal, (marshal.dumps(obj),), obj=obj) -# logger.trace(pickler, "# Co") -# return - -# The following function is based on 'save_codeobject' from 'cloudpickle' -# Copyright (c) 2012, Regents of the University of California. -# Copyright (c) 2009 `PiCloud, Inc. `_. -# License: https://github.com/cloudpipe/cloudpickle/blob/master/LICENSE -@register(CodeType) -def save_code(pickler, obj): - logger.trace(pickler, "Co: %s", obj) - if hasattr(obj, "co_endlinetable"): # python 3.11a (20 args) - args = ( - obj.co_lnotab, # for < python 3.10 [not counted in args] - obj.co_argcount, obj.co_posonlyargcount, - obj.co_kwonlyargcount, obj.co_nlocals, obj.co_stacksize, - obj.co_flags, obj.co_code, obj.co_consts, obj.co_names, - obj.co_varnames, obj.co_filename, obj.co_name, obj.co_qualname, - obj.co_firstlineno, obj.co_linetable, obj.co_endlinetable, - obj.co_columntable, obj.co_exceptiontable, obj.co_freevars, - obj.co_cellvars - ) - elif hasattr(obj, "co_exceptiontable"): # python 3.11 (18 args) - with warnings.catch_warnings(): - if not OLD312a7: # issue 597 - warnings.filterwarnings('ignore', category=DeprecationWarning) - args = ( - obj.co_lnotab, # for < python 3.10 [not counted in args] - obj.co_argcount, obj.co_posonlyargcount, - obj.co_kwonlyargcount, obj.co_nlocals, obj.co_stacksize, - obj.co_flags, obj.co_code, obj.co_consts, obj.co_names, - obj.co_varnames, obj.co_filename, obj.co_name, obj.co_qualname, - obj.co_firstlineno, obj.co_linetable, obj.co_exceptiontable, - obj.co_freevars, obj.co_cellvars - ) - elif hasattr(obj, "co_qualname"): # pypy 3.11 7.3.19+ (17 args) - args = ( - obj.co_lnotab, obj.co_argcount, obj.co_posonlyargcount, - obj.co_kwonlyargcount, obj.co_nlocals, obj.co_stacksize, - obj.co_flags, obj.co_code, obj.co_consts, obj.co_names, - obj.co_varnames, obj.co_filename, obj.co_name, obj.co_qualname, - obj.co_firstlineno, obj.co_linetable, obj.co_freevars, - obj.co_cellvars - ) - elif hasattr(obj, "co_linetable"): # python 3.10 (16 args) - args = ( - obj.co_lnotab, # for < python 3.10 [not counted in args] - obj.co_argcount, obj.co_posonlyargcount, - obj.co_kwonlyargcount, obj.co_nlocals, obj.co_stacksize, - obj.co_flags, obj.co_code, obj.co_consts, obj.co_names, - obj.co_varnames, obj.co_filename, obj.co_name, - obj.co_firstlineno, obj.co_linetable, obj.co_freevars, - obj.co_cellvars - ) - elif hasattr(obj, "co_posonlyargcount"): # python 3.8 (16 args) - args = ( - obj.co_argcount, obj.co_posonlyargcount, - obj.co_kwonlyargcount, obj.co_nlocals, obj.co_stacksize, - obj.co_flags, obj.co_code, obj.co_consts, obj.co_names, - obj.co_varnames, obj.co_filename, obj.co_name, - obj.co_firstlineno, obj.co_lnotab, obj.co_freevars, - obj.co_cellvars - ) - else: # python 3.7 (15 args) - args = ( - obj.co_argcount, obj.co_kwonlyargcount, obj.co_nlocals, - obj.co_stacksize, obj.co_flags, obj.co_code, obj.co_consts, - obj.co_names, obj.co_varnames, obj.co_filename, - obj.co_name, obj.co_firstlineno, obj.co_lnotab, - obj.co_freevars, obj.co_cellvars - ) - - pickler.save_reduce(_create_code, args, obj=obj) - logger.trace(pickler, "# Co") - return - -def _repr_dict(obj): - """Make a short string representation of a dictionary.""" - return "<%s object at %#012x>" % (type(obj).__name__, id(obj)) - -@register(dict) -def save_module_dict(pickler, obj): - if is_dill(pickler, child=False) and obj == pickler._main.__dict__ and \ - not (pickler._session and pickler._first_pass): - logger.trace(pickler, "D1: %s", _repr_dict(obj)) # obj - pickler.write(bytes('c__builtin__\n__main__\n', 'UTF-8')) - logger.trace(pickler, "# D1") - elif (not is_dill(pickler, child=False)) and (obj == _main_module.__dict__): - logger.trace(pickler, "D3: %s", _repr_dict(obj)) # obj - pickler.write(bytes('c__main__\n__dict__\n', 'UTF-8')) #XXX: works in general? - logger.trace(pickler, "# D3") - elif '__name__' in obj and obj != _main_module.__dict__ \ - and type(obj['__name__']) is str \ - and obj is getattr(_import_module(obj['__name__'],True), '__dict__', None): - logger.trace(pickler, "D4: %s", _repr_dict(obj)) # obj - pickler.write(bytes('c%s\n__dict__\n' % obj['__name__'], 'UTF-8')) - logger.trace(pickler, "# D4") - else: - logger.trace(pickler, "D2: %s", _repr_dict(obj)) # obj - if is_dill(pickler, child=False) and pickler._session: - # we only care about session the first pass thru - pickler._first_pass = False - StockPickler.save_dict(pickler, obj) - logger.trace(pickler, "# D2") - return - - -if not OLD310 and MAPPING_PROXY_TRICK: - def save_dict_view(dicttype): - def save_dict_view_for_function(func): - def _save_dict_view(pickler, obj): - logger.trace(pickler, "Dkvi: <%s>", obj) - mapping = obj.mapping | _dictproxy_helper_instance - pickler.save_reduce(func, (mapping,), obj=obj) - logger.trace(pickler, "# Dkvi") - return _save_dict_view - return [ - (funcname, save_dict_view_for_function(getattr(dicttype, funcname))) - for funcname in ('keys', 'values', 'items') - ] -else: - # The following functions are based on 'cloudpickle' - # https://github.com/cloudpipe/cloudpickle/blob/5d89947288a18029672596a4d719093cc6d5a412/cloudpickle/cloudpickle.py#L922-L940 - # Copyright (c) 2012, Regents of the University of California. - # Copyright (c) 2009 `PiCloud, Inc. `_. - # License: https://github.com/cloudpipe/cloudpickle/blob/master/LICENSE - def save_dict_view(dicttype): - def save_dict_keys(pickler, obj): - logger.trace(pickler, "Dk: <%s>", obj) - dict_constructor = _shims.Reduce(dicttype.fromkeys, (list(obj),)) - pickler.save_reduce(dicttype.keys, (dict_constructor,), obj=obj) - logger.trace(pickler, "# Dk") - - def save_dict_values(pickler, obj): - logger.trace(pickler, "Dv: <%s>", obj) - dict_constructor = _shims.Reduce(dicttype, (enumerate(obj),)) - pickler.save_reduce(dicttype.values, (dict_constructor,), obj=obj) - logger.trace(pickler, "# Dv") - - def save_dict_items(pickler, obj): - logger.trace(pickler, "Di: <%s>", obj) - pickler.save_reduce(dicttype.items, (dicttype(obj),), obj=obj) - logger.trace(pickler, "# Di") - - return ( - ('keys', save_dict_keys), - ('values', save_dict_values), - ('items', save_dict_items) - ) - -for __dicttype in ( - dict, - OrderedDict -): - __obj = __dicttype() - for __funcname, __savefunc in save_dict_view(__dicttype): - __tview = type(getattr(__obj, __funcname)()) - if __tview not in Pickler.dispatch: - Pickler.dispatch[__tview] = __savefunc -del __dicttype, __obj, __funcname, __tview, __savefunc - - -@register(ClassType) -def save_classobj(pickler, obj): #FIXME: enable pickler._byref - if not _locate_function(obj, pickler): - logger.trace(pickler, "C1: %s", obj) - pickler.save_reduce(ClassType, (obj.__name__, obj.__bases__, - obj.__dict__), obj=obj) - #XXX: or obj.__dict__.copy()), obj=obj) ? - logger.trace(pickler, "# C1") - else: - logger.trace(pickler, "C2: %s", obj) - name = getattr(obj, '__qualname__', getattr(obj, '__name__', None)) - StockPickler.save_global(pickler, obj, name=name) - logger.trace(pickler, "# C2") - return - -@register(typing._GenericAlias) -def save_generic_alias(pickler, obj): - args = obj.__args__ - if type(obj.__reduce__()) is str: - logger.trace(pickler, "Ga0: %s", obj) - StockPickler.save_global(pickler, obj, name=obj.__reduce__()) - logger.trace(pickler, "# Ga0") - elif obj.__origin__ is tuple and (not args or args == ((),)): - logger.trace(pickler, "Ga1: %s", obj) - pickler.save_reduce(_create_typing_tuple, (args,), obj=obj) - logger.trace(pickler, "# Ga1") - else: - logger.trace(pickler, "Ga2: %s", obj) - StockPickler.save_reduce(pickler, *obj.__reduce__(), obj=obj) - logger.trace(pickler, "# Ga2") - return - -if ThreadHandleType: - @register(ThreadHandleType) - def save_thread_handle(pickler, obj): - logger.trace(pickler, "Th: %s", obj) - pickler.save_reduce(_create_thread_handle, (obj.ident, obj.is_done()), obj=obj) - logger.trace(pickler, "# Th") - return - -@register(LockType) #XXX: copied Thread will have new Event (due to new Lock) -def save_lock(pickler, obj): - logger.trace(pickler, "Lo: %s", obj) - pickler.save_reduce(_create_lock, (obj.locked(),), obj=obj) - logger.trace(pickler, "# Lo") - return - -@register(RLockType) -def save_rlock(pickler, obj): - logger.trace(pickler, "RL: %s", obj) - r = obj.__repr__() # don't use _release_save as it unlocks the lock - count = int(r.split('count=')[1].split()[0].rstrip('>')) - owner = int(r.split('owner=')[1].split()[0]) - pickler.save_reduce(_create_rlock, (count,owner,), obj=obj) - logger.trace(pickler, "# RL") - return - -#@register(SocketType) #FIXME: causes multiprocess test_pickling FAIL -def save_socket(pickler, obj): - logger.trace(pickler, "So: %s", obj) - pickler.save_reduce(*reduce_socket(obj)) - logger.trace(pickler, "# So") - return - -def _save_file(pickler, obj, open_): - if obj.closed: - position = 0 - else: - obj.flush() - if obj in (sys.__stdout__, sys.__stderr__, sys.__stdin__): - position = -1 - else: - position = obj.tell() - if is_dill(pickler, child=True) and pickler._fmode == FILE_FMODE: - f = open_(obj.name, "r") - fdata = f.read() - f.close() - else: - fdata = "" - if is_dill(pickler, child=True): - strictio = pickler._strictio - fmode = pickler._fmode - else: - strictio = False - fmode = 0 # HANDLE_FMODE - pickler.save_reduce(_create_filehandle, (obj.name, obj.mode, position, - obj.closed, open_, strictio, - fmode, fdata), obj=obj) - return - - -@register(FileType) #XXX: in 3.x has buffer=0, needs different _create? -@register(BufferedReaderType) -@register(BufferedWriterType) -@register(TextWrapperType) -def save_file(pickler, obj): - logger.trace(pickler, "Fi: %s", obj) - f = _save_file(pickler, obj, open) - logger.trace(pickler, "# Fi") - return f - -if BufferedRandomType: - @register(BufferedRandomType) - def save_file(pickler, obj): - logger.trace(pickler, "Fi: %s", obj) - f = _save_file(pickler, obj, open) - logger.trace(pickler, "# Fi") - return f - -if PyTextWrapperType: - @register(PyBufferedReaderType) - @register(PyBufferedWriterType) - @register(PyTextWrapperType) - def save_file(pickler, obj): - logger.trace(pickler, "Fi: %s", obj) - f = _save_file(pickler, obj, _open) - logger.trace(pickler, "# Fi") - return f - - if PyBufferedRandomType: - @register(PyBufferedRandomType) - def save_file(pickler, obj): - logger.trace(pickler, "Fi: %s", obj) - f = _save_file(pickler, obj, _open) - logger.trace(pickler, "# Fi") - return f - - -# The following two functions are based on 'saveCStringIoInput' -# and 'saveCStringIoOutput' from spickle -# Copyright (c) 2011 by science+computing ag -# License: http://www.apache.org/licenses/LICENSE-2.0 -if InputType: - @register(InputType) - def save_stringi(pickler, obj): - logger.trace(pickler, "Io: %s", obj) - if obj.closed: - value = ''; position = 0 - else: - value = obj.getvalue(); position = obj.tell() - pickler.save_reduce(_create_stringi, (value, position, \ - obj.closed), obj=obj) - logger.trace(pickler, "# Io") - return - - @register(OutputType) - def save_stringo(pickler, obj): - logger.trace(pickler, "Io: %s", obj) - if obj.closed: - value = ''; position = 0 - else: - value = obj.getvalue(); position = obj.tell() - pickler.save_reduce(_create_stringo, (value, position, \ - obj.closed), obj=obj) - logger.trace(pickler, "# Io") - return - -if LRUCacheType is not None: - from functools import lru_cache - @register(LRUCacheType) - def save_lru_cache(pickler, obj): - logger.trace(pickler, "LRU: %s", obj) - if OLD39: - kwargs = obj.cache_info() - args = (kwargs.maxsize,) - else: - kwargs = obj.cache_parameters() - args = (kwargs['maxsize'], kwargs['typed']) - if args != lru_cache.__defaults__: - wrapper = Reduce(lru_cache, args, is_callable=True) - else: - wrapper = lru_cache - pickler.save_reduce(wrapper, (obj.__wrapped__,), obj=obj) - logger.trace(pickler, "# LRU") - return - -@register(SuperType) -def save_super(pickler, obj): - logger.trace(pickler, "Su: %s", obj) - pickler.save_reduce(super, (obj.__thisclass__, obj.__self__), obj=obj) - logger.trace(pickler, "# Su") - return - -if IS_PYPY: - @register(MethodType) - def save_instancemethod0(pickler, obj): - code = getattr(obj.__func__, '__code__', None) - if code is not None and type(code) is not CodeType \ - and getattr(obj.__self__, obj.__name__) == obj: - # Some PyPy builtin functions have no module name - logger.trace(pickler, "Me2: %s", obj) - # TODO: verify that this works for all PyPy builtin methods - pickler.save_reduce(getattr, (obj.__self__, obj.__name__), obj=obj) - logger.trace(pickler, "# Me2") - return - - logger.trace(pickler, "Me1: %s", obj) - pickler.save_reduce(MethodType, (obj.__func__, obj.__self__), obj=obj) - logger.trace(pickler, "# Me1") - return -else: - @register(MethodType) - def save_instancemethod0(pickler, obj): - logger.trace(pickler, "Me1: %s", obj) - pickler.save_reduce(MethodType, (obj.__func__, obj.__self__), obj=obj) - logger.trace(pickler, "# Me1") - return - -if not IS_PYPY: - @register(MemberDescriptorType) - @register(GetSetDescriptorType) - @register(MethodDescriptorType) - @register(WrapperDescriptorType) - @register(ClassMethodDescriptorType) - def save_wrapper_descriptor(pickler, obj): - logger.trace(pickler, "Wr: %s", obj) - pickler.save_reduce(_getattr, (obj.__objclass__, obj.__name__, - obj.__repr__()), obj=obj) - logger.trace(pickler, "# Wr") - return -else: - @register(MemberDescriptorType) - @register(GetSetDescriptorType) - def save_wrapper_descriptor(pickler, obj): - logger.trace(pickler, "Wr: %s", obj) - pickler.save_reduce(_getattr, (obj.__objclass__, obj.__name__, - obj.__repr__()), obj=obj) - logger.trace(pickler, "# Wr") - return - -@register(CellType) -def save_cell(pickler, obj): - try: - f = obj.cell_contents - except ValueError: # cell is empty - logger.trace(pickler, "Ce3: %s", obj) - # _shims._CELL_EMPTY is defined in _shims.py to support PyPy 2.7. - # It unpickles to a sentinel object _dill._CELL_EMPTY, also created in - # _shims.py. This object is not present in Python 3 because the cell's - # contents can be deleted in newer versions of Python. The reduce object - # will instead unpickle to None if unpickled in Python 3. - - # When breaking changes are made to dill, (_shims._CELL_EMPTY,) can - # be replaced by () OR the delattr function can be removed repending on - # whichever is more convienient. - pickler.save_reduce(_create_cell, (_shims._CELL_EMPTY,), obj=obj) - # Call the function _delattr on the cell's cell_contents attribute - # The result of this function call will be None - pickler.save_reduce(_shims._delattr, (obj, 'cell_contents')) - # pop None created by calling _delattr off stack - pickler.write(POP) - logger.trace(pickler, "# Ce3") - return - if is_dill(pickler, child=True): - if id(f) in pickler._postproc: - # Already seen. Add to its postprocessing. - postproc = pickler._postproc[id(f)] - else: - # Haven't seen it. Add to the highest possible object and set its - # value as late as possible to prevent cycle. - postproc = next(iter(pickler._postproc.values()), None) - if postproc is not None: - logger.trace(pickler, "Ce2: %s", obj) - # _CELL_REF is defined in _shims.py to support older versions of - # dill. When breaking changes are made to dill, (_CELL_REF,) can - # be replaced by () - pickler.save_reduce(_create_cell, (_CELL_REF,), obj=obj) - postproc.append((_shims._setattr, (obj, 'cell_contents', f))) - logger.trace(pickler, "# Ce2") - return - logger.trace(pickler, "Ce1: %s", obj) - pickler.save_reduce(_create_cell, (f,), obj=obj) - logger.trace(pickler, "# Ce1") - return - -if MAPPING_PROXY_TRICK: - @register(DictProxyType) - def save_dictproxy(pickler, obj): - logger.trace(pickler, "Mp: %s", _repr_dict(obj)) # obj - mapping = obj | _dictproxy_helper_instance - pickler.save_reduce(DictProxyType, (mapping,), obj=obj) - logger.trace(pickler, "# Mp") - return -else: - @register(DictProxyType) - def save_dictproxy(pickler, obj): - logger.trace(pickler, "Mp: %s", _repr_dict(obj)) # obj - pickler.save_reduce(DictProxyType, (obj.copy(),), obj=obj) - logger.trace(pickler, "# Mp") - return - -@register(SliceType) -def save_slice(pickler, obj): - logger.trace(pickler, "Sl: %s", obj) - pickler.save_reduce(slice, (obj.start, obj.stop, obj.step), obj=obj) - logger.trace(pickler, "# Sl") - return - -@register(XRangeType) -@register(EllipsisType) -@register(NotImplementedType) -def save_singleton(pickler, obj): - logger.trace(pickler, "Si: %s", obj) - pickler.save_reduce(_eval_repr, (obj.__repr__(),), obj=obj) - logger.trace(pickler, "# Si") - return - -def _proxy_helper(obj): # a dead proxy returns a reference to None - """get memory address of proxy's reference object""" - _repr = repr(obj) - try: _str = str(obj) - except ReferenceError: # it's a dead proxy - return id(None) - if _str == _repr: return id(obj) # it's a repr - try: # either way, it's a proxy from here - address = int(_str.rstrip('>').split(' at ')[-1], base=16) - except ValueError: # special case: proxy of a 'type' - if not IS_PYPY: - address = int(_repr.rstrip('>').split(' at ')[-1], base=16) - else: - objects = iter(gc.get_objects()) - for _obj in objects: - if repr(_obj) == _str: return id(_obj) - # all bad below... nothing found so throw ReferenceError - msg = "Cannot reference object for proxy at '%s'" % id(obj) - raise ReferenceError(msg) - return address - -def _locate_object(address, module=None): - """get object located at the given memory address (inverse of id(obj))""" - special = [None, True, False] #XXX: more...? - for obj in special: - if address == id(obj): return obj - if module: - objects = iter(module.__dict__.values()) - else: objects = iter(gc.get_objects()) - for obj in objects: - if address == id(obj): return obj - # all bad below... nothing found so throw ReferenceError or TypeError - try: address = hex(address) - except TypeError: - raise TypeError("'%s' is not a valid memory address" % str(address)) - raise ReferenceError("Cannot reference object at '%s'" % address) - -@register(ReferenceType) -def save_weakref(pickler, obj): - refobj = obj() - logger.trace(pickler, "R1: %s", obj) - #refobj = ctypes.pythonapi.PyWeakref_GetObject(obj) # dead returns "None" - pickler.save_reduce(_create_weakref, (refobj,), obj=obj) - logger.trace(pickler, "# R1") - return - -@register(ProxyType) -@register(CallableProxyType) -def save_weakproxy(pickler, obj): - # Must do string substitution here and use %r to avoid ReferenceError. - logger.trace(pickler, "R2: %r" % obj) - refobj = _locate_object(_proxy_helper(obj)) - pickler.save_reduce(_create_weakproxy, (refobj, callable(obj)), obj=obj) - logger.trace(pickler, "# R2") - return - -def _is_builtin_module(module): - if not hasattr(module, "__file__"): return True - if module.__file__ is None: return False - # If a module file name starts with prefix, it should be a builtin - # module, so should always be pickled as a reference. - names = ["base_prefix", "base_exec_prefix", "exec_prefix", "prefix", "real_prefix"] - rp = os.path.realpath - # See https://github.com/uqfoundation/dill/issues/566 - return ( - any( - module.__file__.startswith(getattr(sys, name)) - or rp(module.__file__).startswith(rp(getattr(sys, name))) - for name in names - if hasattr(sys, name) - ) - or module.__file__.endswith(EXTENSION_SUFFIXES) - or 'site-packages' in module.__file__ - ) - -def _is_imported_module(module): - return getattr(module, '__loader__', None) is not None or module in sys.modules.values() - -@register(ModuleType) -def save_module(pickler, obj): - if False: #_use_diff: - if obj.__name__.split('.', 1)[0] != "dill": - try: - changed = diff.whats_changed(obj, seen=pickler._diff_cache)[0] - except RuntimeError: # not memorised module, probably part of dill - pass - else: - logger.trace(pickler, "M2: %s with diff", obj) - logger.info("Diff: %s", changed.keys()) - pickler.save_reduce(_import_module, (obj.__name__,), obj=obj, - state=changed) - logger.trace(pickler, "# M2") - return - - logger.trace(pickler, "M1: %s", obj) - pickler.save_reduce(_import_module, (obj.__name__,), obj=obj) - logger.trace(pickler, "# M1") - else: - builtin_mod = _is_builtin_module(obj) - is_session_main = is_dill(pickler, child=True) and obj is pickler._main - if (obj.__name__ not in ("builtins", "dill", "dill._dill") and not builtin_mod - or is_session_main): - logger.trace(pickler, "M1: %s", obj) - # Hack for handling module-type objects in load_module(). - mod_name = obj.__name__ if _is_imported_module(obj) else '__runtime__.%s' % obj.__name__ - # Second references are saved as __builtin__.__main__ in save_module_dict(). - main_dict = obj.__dict__.copy() - for item in ('__builtins__', '__loader__'): - main_dict.pop(item, None) - for item in IPYTHON_SINGLETONS: #pragma: no cover - if getattr(main_dict.get(item), '__module__', '').startswith('IPython'): - del main_dict[item] - pickler.save_reduce(_import_module, (mod_name,), obj=obj, state=main_dict) - logger.trace(pickler, "# M1") - elif obj.__name__ == "dill._dill": - logger.trace(pickler, "M2: %s", obj) - pickler.save_global(obj, name="_dill") - logger.trace(pickler, "# M2") - else: - logger.trace(pickler, "M2: %s", obj) - pickler.save_reduce(_import_module, (obj.__name__,), obj=obj) - logger.trace(pickler, "# M2") - return - -# The following function is based on '_extract_class_dict' from 'cloudpickle' -# Copyright (c) 2012, Regents of the University of California. -# Copyright (c) 2009 `PiCloud, Inc. `_. -# License: https://github.com/cloudpipe/cloudpickle/blob/master/LICENSE -def _get_typedict_type(cls, clsdict, attrs, postproc_list): - """Retrieve a copy of the dict of a class without the inherited methods""" - if len(cls.__bases__) == 1: - inherited_dict = cls.__bases__[0].__dict__ - else: - inherited_dict = {} - for base in reversed(cls.__bases__): - inherited_dict.update(base.__dict__) - to_remove = [] - for name, value in dict.items(clsdict): - try: - base_value = inherited_dict[name] - if value is base_value and hasattr(value, '__qualname__'): - to_remove.append(name) - except KeyError: - pass - for name in to_remove: - dict.pop(clsdict, name) - - if issubclass(type(cls), type): - clsdict.pop('__dict__', None) - clsdict.pop('__weakref__', None) - # clsdict.pop('__prepare__', None) - return clsdict, attrs - -def _get_typedict_abc(obj, _dict, attrs, postproc_list): - if hasattr(abc, '_get_dump'): - (registry, _, _, _) = abc._get_dump(obj) - register = obj.register - postproc_list.extend((register, (reg(),)) for reg in registry) - elif hasattr(obj, '_abc_registry'): - registry = obj._abc_registry - register = obj.register - postproc_list.extend((register, (reg,)) for reg in registry) - else: - raise PicklingError("Cannot find registry of ABC %s", obj) - - if '_abc_registry' in _dict: - _dict.pop('_abc_registry', None) - _dict.pop('_abc_cache', None) - _dict.pop('_abc_negative_cache', None) - # _dict.pop('_abc_negative_cache_version', None) - else: - _dict.pop('_abc_impl', None) - return _dict, attrs - -@register(TypeType) -def save_type(pickler, obj, postproc_list=None): - if obj in _typemap: - logger.trace(pickler, "T1: %s", obj) - # if obj in _incedental_types: - # warnings.warn('Type %r may only exist on this implementation of Python and cannot be unpickled in other implementations.' % (obj,), PicklingWarning) - pickler.save_reduce(_load_type, (_typemap[obj],), obj=obj) - logger.trace(pickler, "# T1") - elif obj.__bases__ == (tuple,) and all([hasattr(obj, attr) for attr in ('_fields','_asdict','_make','_replace')]): - # special case: namedtuples - logger.trace(pickler, "T6: %s", obj) - - obj_name = getattr(obj, '__qualname__', getattr(obj, '__name__', None)) - if obj.__name__ != obj_name: - if postproc_list is None: - postproc_list = [] - postproc_list.append((setattr, (obj, '__qualname__', obj_name))) - - if not obj._field_defaults: - _save_with_postproc(pickler, (_create_namedtuple, (obj.__name__, obj._fields, obj.__module__)), obj=obj, postproc_list=postproc_list) - else: - defaults = [obj._field_defaults[field] for field in obj._fields if field in obj._field_defaults] - _save_with_postproc(pickler, (_create_namedtuple, (obj.__name__, obj._fields, obj.__module__, defaults)), obj=obj, postproc_list=postproc_list) - logger.trace(pickler, "# T6") - return - - # special caes: NoneType, NotImplementedType, EllipsisType, EnumMeta, etc - elif obj is type(None): - logger.trace(pickler, "T7: %s", obj) - #XXX: pickler.save_reduce(type, (None,), obj=obj) - pickler.write(GLOBAL + b'__builtin__\nNoneType\n') - logger.trace(pickler, "# T7") - elif obj is NotImplementedType: - logger.trace(pickler, "T7: %s", obj) - pickler.save_reduce(type, (NotImplemented,), obj=obj) - logger.trace(pickler, "# T7") - elif obj is EllipsisType: - logger.trace(pickler, "T7: %s", obj) - pickler.save_reduce(type, (Ellipsis,), obj=obj) - logger.trace(pickler, "# T7") - elif obj is EnumMeta: - logger.trace(pickler, "T7: %s", obj) - pickler.write(GLOBAL + b'enum\nEnumMeta\n') - logger.trace(pickler, "# T7") - elif obj is ExceptHookArgsType: #NOTE: must be after NoneType for pypy - logger.trace(pickler, "T7: %s", obj) - pickler.write(GLOBAL + b'threading\nExceptHookArgs\n') - logger.trace(pickler, "# T7") - - else: - _byref = getattr(pickler, '_byref', None) - obj_recursive = id(obj) in getattr(pickler, '_postproc', ()) - incorrectly_named = not _locate_function(obj, pickler) - if not _byref and not obj_recursive and incorrectly_named: # not a function, but the name was held over - if postproc_list is None: - postproc_list = [] - - # thanks to Tom Stepleton pointing out pickler._session unneeded - logger.trace(pickler, "T2: %s", obj) - _dict, attrs = _get_typedict_type(obj, obj.__dict__.copy(), None, postproc_list) # copy dict proxy to a dict - - #print (_dict) - #print ("%s\n%s" % (type(obj), obj.__name__)) - #print ("%s\n%s" % (obj.__bases__, obj.__dict__)) - slots = _dict.get('__slots__', ()) - if type(slots) == str: - # __slots__ accepts a single string - slots = (slots,) - - for name in slots: - _dict.pop(name, None) - - if isinstance(obj, abc.ABCMeta): - logger.trace(pickler, "ABC: %s", obj) - _dict, attrs = _get_typedict_abc(obj, _dict, attrs, postproc_list) - logger.trace(pickler, "# ABC") - - qualname = getattr(obj, '__qualname__', None) - if attrs is not None: - for k, v in attrs.items(): - postproc_list.append((setattr, (obj, k, v))) - # TODO: Consider using the state argument to save_reduce? - if qualname is not None: - postproc_list.append((setattr, (obj, '__qualname__', qualname))) - - if not hasattr(obj, '__orig_bases__'): - _save_with_postproc(pickler, (_create_type, ( - type(obj), obj.__name__, obj.__bases__, _dict - )), obj=obj, postproc_list=postproc_list) - else: - # This case will always work, but might be overkill. - _metadict = { - 'metaclass': type(obj) - } - - if _dict: - _dict_update = PartialType(_setitems, source=_dict) - else: - _dict_update = None - - _save_with_postproc(pickler, (new_class, ( - obj.__name__, obj.__orig_bases__, _metadict, _dict_update - )), obj=obj, postproc_list=postproc_list) - logger.trace(pickler, "# T2") - else: - obj_name = getattr(obj, '__qualname__', getattr(obj, '__name__', None)) - logger.trace(pickler, "T4: %s", obj) - if incorrectly_named: - warnings.warn( - "Cannot locate reference to %r." % (obj,), - PicklingWarning, - stacklevel=3, - ) - if obj_recursive: - warnings.warn( - "Cannot pickle %r: %s.%s has recursive self-references that " - "trigger a RecursionError." % (obj, obj.__module__, obj_name), - PicklingWarning, - stacklevel=3, - ) - #print (obj.__dict__) - #print ("%s\n%s" % (type(obj), obj.__name__)) - #print ("%s\n%s" % (obj.__bases__, obj.__dict__)) - StockPickler.save_global(pickler, obj, name=obj_name) - logger.trace(pickler, "# T4") - return - -@register(property) -@register(abc.abstractproperty) -def save_property(pickler, obj): - logger.trace(pickler, "Pr: %s", obj) - pickler.save_reduce(type(obj), (obj.fget, obj.fset, obj.fdel, obj.__doc__), - obj=obj) - logger.trace(pickler, "# Pr") - -@register(staticmethod) -@register(classmethod) -@register(abc.abstractstaticmethod) -@register(abc.abstractclassmethod) -def save_classmethod(pickler, obj): - logger.trace(pickler, "Cm: %s", obj) - orig_func = obj.__func__ - - # if type(obj.__dict__) is dict: - # if obj.__dict__: - # state = obj.__dict__ - # else: - # state = None - # else: - # state = (None, {'__dict__', obj.__dict__}) - - pickler.save_reduce(type(obj), (orig_func,), obj=obj) - logger.trace(pickler, "# Cm") - -@register(FunctionType) -def save_function(pickler, obj): - if not _locate_function(obj, pickler): - if type(obj.__code__) is not CodeType: - # Some PyPy builtin functions have no module name, and thus are not - # able to be located - module_name = getattr(obj, '__module__', None) - if module_name is None: - module_name = __builtin__.__name__ - module = _import_module(module_name, safe=True) - _pypy_builtin = False - try: - found, _ = _getattribute(module, obj.__qualname__) - if getattr(found, '__func__', None) is obj: - _pypy_builtin = True - except AttributeError: - pass - - if _pypy_builtin: - logger.trace(pickler, "F3: %s", obj) - pickler.save_reduce(getattr, (found, '__func__'), obj=obj) - logger.trace(pickler, "# F3") - return - - logger.trace(pickler, "F1: %s", obj) - _recurse = getattr(pickler, '_recurse', None) - _postproc = getattr(pickler, '_postproc', None) - _main_modified = getattr(pickler, '_main_modified', None) - _original_main = getattr(pickler, '_original_main', __builtin__)#'None' - postproc_list = [] - if _recurse: - # recurse to get all globals referred to by obj - from .detect import globalvars - globs_copy = globalvars(obj, recurse=True, builtin=True) - - # Add the name of the module to the globs dictionary to prevent - # the duplication of the dictionary. Pickle the unpopulated - # globals dictionary and set the remaining items after the function - # is created to correctly handle recursion. - globs = {'__name__': obj.__module__} - else: - globs_copy = obj.__globals__ - - # If the globals is the __dict__ from the module being saved as a - # session, substitute it by the dictionary being actually saved. - if _main_modified and globs_copy is _original_main.__dict__: - globs_copy = getattr(pickler, '_main', _original_main).__dict__ - globs = globs_copy - # If the globals is a module __dict__, do not save it in the pickle. - elif globs_copy is not None and obj.__module__ is not None and \ - getattr(_import_module(obj.__module__, True), '__dict__', None) is globs_copy: - globs = globs_copy - else: - globs = {'__name__': obj.__module__} - - if globs_copy is not None and globs is not globs_copy: - # In the case that the globals are copied, we need to ensure that - # the globals dictionary is updated when all objects in the - # dictionary are already created. - glob_ids = {id(g) for g in globs_copy.values()} - for stack_element in _postproc: - if stack_element in glob_ids: - _postproc[stack_element].append((_setitems, (globs, globs_copy))) - break - else: - postproc_list.append((_setitems, (globs, globs_copy))) - - closure = obj.__closure__ - state_dict = {} - for fattrname in ('__doc__', '__kwdefaults__', '__annotations__'): - fattr = getattr(obj, fattrname, None) - if fattr is not None: - state_dict[fattrname] = fattr - if obj.__qualname__ != obj.__name__: - state_dict['__qualname__'] = obj.__qualname__ - if '__name__' not in globs or obj.__module__ != globs['__name__']: - state_dict['__module__'] = obj.__module__ - - state = obj.__dict__ - if type(state) is not dict: - state_dict['__dict__'] = state - state = None - if state_dict: - state = state, state_dict - - _save_with_postproc(pickler, (_create_function, ( - obj.__code__, globs, obj.__name__, obj.__defaults__, - closure - ), state), obj=obj, postproc_list=postproc_list) - - # Lift closure cell update to earliest function (#458) - if _postproc: - topmost_postproc = next(iter(_postproc.values()), None) - if closure and topmost_postproc: - for cell in closure: - possible_postproc = (setattr, (cell, 'cell_contents', obj)) - try: - topmost_postproc.remove(possible_postproc) - except ValueError: - continue - - # Change the value of the cell - pickler.save_reduce(*possible_postproc) - # pop None created by calling preprocessing step off stack - pickler.write(POP) - - logger.trace(pickler, "# F1") - else: - logger.trace(pickler, "F2: %s", obj) - name = getattr(obj, '__qualname__', getattr(obj, '__name__', None)) - StockPickler.save_global(pickler, obj, name=name) - logger.trace(pickler, "# F2") - return - -if HAS_CTYPES and hasattr(ctypes, 'pythonapi'): - _PyCapsule_New = ctypes.pythonapi.PyCapsule_New - _PyCapsule_New.argtypes = (ctypes.c_void_p, ctypes.c_char_p, ctypes.c_void_p) - _PyCapsule_New.restype = ctypes.py_object - _PyCapsule_GetPointer = ctypes.pythonapi.PyCapsule_GetPointer - _PyCapsule_GetPointer.argtypes = (ctypes.py_object, ctypes.c_char_p) - _PyCapsule_GetPointer.restype = ctypes.c_void_p - _PyCapsule_GetDestructor = ctypes.pythonapi.PyCapsule_GetDestructor - _PyCapsule_GetDestructor.argtypes = (ctypes.py_object,) - _PyCapsule_GetDestructor.restype = ctypes.c_void_p - _PyCapsule_GetContext = ctypes.pythonapi.PyCapsule_GetContext - _PyCapsule_GetContext.argtypes = (ctypes.py_object,) - _PyCapsule_GetContext.restype = ctypes.c_void_p - _PyCapsule_GetName = ctypes.pythonapi.PyCapsule_GetName - _PyCapsule_GetName.argtypes = (ctypes.py_object,) - _PyCapsule_GetName.restype = ctypes.c_char_p - _PyCapsule_IsValid = ctypes.pythonapi.PyCapsule_IsValid - _PyCapsule_IsValid.argtypes = (ctypes.py_object, ctypes.c_char_p) - _PyCapsule_IsValid.restype = ctypes.c_bool - _PyCapsule_SetContext = ctypes.pythonapi.PyCapsule_SetContext - _PyCapsule_SetContext.argtypes = (ctypes.py_object, ctypes.c_void_p) - _PyCapsule_SetDestructor = ctypes.pythonapi.PyCapsule_SetDestructor - _PyCapsule_SetDestructor.argtypes = (ctypes.py_object, ctypes.c_void_p) - _PyCapsule_SetName = ctypes.pythonapi.PyCapsule_SetName - _PyCapsule_SetName.argtypes = (ctypes.py_object, ctypes.c_char_p) - _PyCapsule_SetPointer = ctypes.pythonapi.PyCapsule_SetPointer - _PyCapsule_SetPointer.argtypes = (ctypes.py_object, ctypes.c_void_p) - #from _socket import CAPI as _testcapsule - _testcapsule_name = b'dill._dill._testcapsule' - _testcapsule = _PyCapsule_New( - ctypes.cast(_PyCapsule_New, ctypes.c_void_p), - ctypes.c_char_p(_testcapsule_name), - None - ) - PyCapsuleType = type(_testcapsule) - @register(PyCapsuleType) - def save_capsule(pickler, obj): - logger.trace(pickler, "Cap: %s", obj) - name = _PyCapsule_GetName(obj) - #warnings.warn('Pickling a PyCapsule (%s) does not pickle any C data structures and could cause segmentation faults or other memory errors when unpickling.' % (name,), PicklingWarning) - pointer = _PyCapsule_GetPointer(obj, name) - context = _PyCapsule_GetContext(obj) - destructor = _PyCapsule_GetDestructor(obj) - pickler.save_reduce(_create_capsule, (pointer, name, context, destructor), obj=obj) - logger.trace(pickler, "# Cap") - _incedental_reverse_typemap['PyCapsuleType'] = PyCapsuleType - _reverse_typemap['PyCapsuleType'] = PyCapsuleType - _incedental_types.add(PyCapsuleType) -else: - _testcapsule = None - -@register(ContextType) -def save_context(pickler, obj): - logger.trace(pickler, "Cx: %s", obj) - pickler.save_reduce(ContextType, tuple(obj.items()), obj=obj) - logger.trace(pickler, "# Cx") - - -############################# -# A quick fix for issue #500 -# This should be removed when a better solution is found. - -if hasattr(dataclasses, "_HAS_DEFAULT_FACTORY_CLASS"): - @register(dataclasses._HAS_DEFAULT_FACTORY_CLASS) - def save_dataclasses_HAS_DEFAULT_FACTORY_CLASS(pickler, obj): - logger.trace(pickler, "DcHDF: %s", obj) - pickler.write(GLOBAL + b"dataclasses\n_HAS_DEFAULT_FACTORY\n") - logger.trace(pickler, "# DcHDF") - -if hasattr(dataclasses, "MISSING"): - @register(type(dataclasses.MISSING)) - def save_dataclasses_MISSING_TYPE(pickler, obj): - logger.trace(pickler, "DcM: %s", obj) - pickler.write(GLOBAL + b"dataclasses\nMISSING\n") - logger.trace(pickler, "# DcM") - -if hasattr(dataclasses, "KW_ONLY"): - @register(type(dataclasses.KW_ONLY)) - def save_dataclasses_KW_ONLY_TYPE(pickler, obj): - logger.trace(pickler, "DcKWO: %s", obj) - pickler.write(GLOBAL + b"dataclasses\nKW_ONLY\n") - logger.trace(pickler, "# DcKWO") - -if hasattr(dataclasses, "_FIELD_BASE"): - @register(dataclasses._FIELD_BASE) - def save_dataclasses_FIELD_BASE(pickler, obj): - logger.trace(pickler, "DcFB: %s", obj) - pickler.write(GLOBAL + b"dataclasses\n" + obj.name.encode() + b"\n") - logger.trace(pickler, "# DcFB") - -############################# - -# quick sanity checking -def pickles(obj,exact=False,safe=False,**kwds): - """ - Quick check if object pickles with dill. - - If *exact=True* then an equality test is done to check if the reconstructed - object matches the original object. - - If *safe=True* then any exception will raised in copy signal that the - object is not picklable, otherwise only pickling errors will be trapped. - - Additional keyword arguments are as :func:`dumps` and :func:`loads`. - """ - if safe: exceptions = (Exception,) # RuntimeError, ValueError - else: - exceptions = (TypeError, AssertionError, NotImplementedError, PicklingError, UnpicklingError) - try: - pik = copy(obj, **kwds) - #FIXME: should check types match first, then check content if "exact" - try: - #FIXME: should be "(pik == obj).all()" for numpy comparison, though that'll fail if shapes differ - result = bool(pik.all() == obj.all()) - except (AttributeError, TypeError): - warnings.filterwarnings('ignore') #FIXME: be specific - result = pik == obj - if warnings.filters: del warnings.filters[0] - if hasattr(result, 'toarray'): # for unusual types like sparse matrix - result = result.toarray().all() - if result: return True - if not exact: - result = type(pik) == type(obj) - if result: return result - # class instances might have been dumped with byref=False - return repr(type(pik)) == repr(type(obj)) #XXX: InstanceType? - return False - except exceptions: - return False - -def check(obj, *args, **kwds): - """ - Check pickling of an object across another process. - - *python* is the path to the python interpreter (defaults to sys.executable) - - Set *verbose=True* to print the unpickled object in the other process. - - Additional keyword arguments are as :func:`dumps` and :func:`loads`. - """ - # == undocumented == - # python -- the string path or executable name of the selected python - # verbose -- if True, be verbose about printing warning messages - # all other args and kwds are passed to dill.dumps #FIXME: ignore on load - verbose = kwds.pop('verbose', False) - python = kwds.pop('python', None) - if python is None: - import sys - python = sys.executable - # type check - isinstance(python, str) - import subprocess - fail = True - try: - _obj = dumps(obj, *args, **kwds) - fail = False - finally: - if fail and verbose: - print("DUMP FAILED") - #FIXME: fails if python interpreter path contains spaces - # Use the following instead (which also processes the 'ignore' keyword): - # ignore = kwds.pop('ignore', None) - # unpickle = "dill.loads(%s, ignore=%s)"%(repr(_obj), repr(ignore)) - # cmd = [python, "-c", "import dill; print(%s)"%unpickle] - # msg = "SUCCESS" if not subprocess.call(cmd) else "LOAD FAILED" - msg = "%s -c import dill; print(dill.loads(%s))" % (python, repr(_obj)) - msg = "SUCCESS" if not subprocess.call(msg.split(None,2)) else "LOAD FAILED" - if verbose: - print(msg) - return - -# use to protect against missing attributes -def is_dill(pickler, child=None): - "check the dill-ness of your pickler" - if child is False or not hasattr(pickler.__class__, 'mro'): - return 'dill' in pickler.__module__ - return Pickler in pickler.__class__.mro() - -def _extend(): - """extend pickle with all of dill's registered types""" - # need to have pickle not choke on _main_module? use is_dill(pickler) - for t,func in Pickler.dispatch.items(): - try: - StockPickler.dispatch[t] = func - except Exception: #TypeError, PicklingError, UnpicklingError - logger.trace(pickler, "skip: %s", t) - return - -del diff, _use_diff, use_diff - -# EOF diff --git a/venv/lib/python3.12/site-packages/dill/_objects.py b/venv/lib/python3.12/site-packages/dill/_objects.py deleted file mode 100644 index 573fae8..0000000 --- a/venv/lib/python3.12/site-packages/dill/_objects.py +++ /dev/null @@ -1,545 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE -""" -all Python Standard Library objects (currently: CH 1-15 @ 2.7) -and some other common objects (i.e. numpy.ndarray) -""" - -__all__ = ['registered','failures','succeeds'] - -# helper imports -import warnings; warnings.filterwarnings("ignore", category=DeprecationWarning) -import sys -import queue as Queue -#import dbm as anydbm #XXX: delete foo -from io import BytesIO as StringIO -import re -import array -import collections -import codecs -import struct -import dataclasses -import datetime -import calendar -import weakref -import pprint -import decimal -import numbers -import functools -import itertools -import operator -import tempfile -import shelve -import zlib -import gzip -import zipfile -import tarfile -import csv -import hashlib -import hmac -import os -import logging -import logging.handlers -import optparse -#import __hello__ -import threading -import socket -import contextlib -import contextvars -try: - import bz2 - import sqlite3 - import dbm.ndbm as dbm - HAS_ALL = True -except ImportError: # Ubuntu - HAS_ALL = False -try: - #import curses - #from curses import textpad, panel - HAS_CURSES = True -except ImportError: # Windows - HAS_CURSES = False -try: - import ctypes - HAS_CTYPES = True - # if using `pypy`, pythonapi is not found - IS_PYPY = not hasattr(ctypes, 'pythonapi') -except ImportError: # MacPorts - HAS_CTYPES = False - IS_PYPY = False - -IS_PYODIDE = sys.platform == 'emscripten' - -# helper objects -class _class: - def _method(self): - pass -# @classmethod -# def _clsmethod(cls): #XXX: test me -# pass -# @staticmethod -# def _static(self): #XXX: test me -# pass -class _class2: - def __call__(self): - pass -_instance2 = _class2() -class _newclass(object): - def _method(self): - pass -# @classmethod -# def _clsmethod(cls): #XXX: test me -# pass -# @staticmethod -# def _static(self): #XXX: test me -# pass -class _newclass2(object): - __slots__ = ['descriptor'] -def _function(x): yield x -def _function2(): - try: raise - except Exception: - from sys import exc_info - e, er, tb = exc_info() - return er, tb -if HAS_CTYPES: - class _Struct(ctypes.Structure): - pass - _Struct._fields_ = [("_field", ctypes.c_int),("next", ctypes.POINTER(_Struct))] -_filedescrip, _tempfile = tempfile.mkstemp('r') # deleted in cleanup -if sys.hexversion < 0x30d00a1: - _tmpf = tempfile.TemporaryFile('w') # emits OSError 9 in python 3.13 -else: - _tmpf = tempfile.NamedTemporaryFile('w').file # for > python 3.9 - -# objects used by dill for type declaration -registered = d = {} -# objects dill fails to pickle -failures = x = {} -# all other type objects -succeeds = a = {} - -# types module (part of CH 8) -a['BooleanType'] = bool(1) -a['BuiltinFunctionType'] = len -a['BuiltinMethodType'] = a['BuiltinFunctionType'] -a['BytesType'] = _bytes = codecs.latin_1_encode('\x00')[0] # bytes(1) -a['ClassType'] = _class -a['ComplexType'] = complex(1) -a['DictType'] = _dict = {} -a['DictionaryType'] = a['DictType'] -a['FloatType'] = float(1) -a['FunctionType'] = _function -a['InstanceType'] = _instance = _class() -a['IntType'] = _int = int(1) -a['ListType'] = _list = [] -a['NoneType'] = None -a['ObjectType'] = object() -a['StringType'] = _str = str(1) -a['TupleType'] = _tuple = () -a['TypeType'] = type -a['LongType'] = _int -a['UnicodeType'] = _str -# built-in constants (CH 4) -a['CopyrightType'] = copyright -# built-in types (CH 5) -a['ClassObjectType'] = _newclass # -a['ClassInstanceType'] = _newclass() # -a['SetType'] = _set = set() -a['FrozenSetType'] = frozenset() -# built-in exceptions (CH 6) -a['ExceptionType'] = _exception = _function2()[0] -# string services (CH 7) -a['SREPatternType'] = _srepattern = re.compile('') -# data types (CH 8) -a['ArrayType'] = array.array("f") -a['DequeType'] = collections.deque([0]) -a['DefaultDictType'] = collections.defaultdict(_function, _dict) -a['TZInfoType'] = datetime.tzinfo() -a['DateTimeType'] = datetime.datetime.today() -a['CalendarType'] = calendar.Calendar() -# numeric and mathematical types (CH 9) -a['DecimalType'] = decimal.Decimal(1) -# data compression and archiving (CH 12) -a['TarInfoType'] = tarfile.TarInfo() -# generic operating system services (CH 15) -a['LoggerType'] = _logger = logging.getLogger() -a['FormatterType'] = logging.Formatter() # pickle ok -a['FilterType'] = logging.Filter() # pickle ok -a['LogRecordType'] = logging.makeLogRecord(_dict) # pickle ok -a['OptionParserType'] = _oparser = optparse.OptionParser() # pickle ok -a['OptionGroupType'] = optparse.OptionGroup(_oparser,"foo") # pickle ok -a['OptionType'] = optparse.Option('--foo') # pickle ok -if HAS_CTYPES: - z = x if (IS_PYPY and sys.hexversion < 0x30b0df0) else a - z['CCharType'] = _cchar = ctypes.c_char() - z['CWCharType'] = ctypes.c_wchar() # fail == 2.6 - z['CByteType'] = ctypes.c_byte() - z['CUByteType'] = ctypes.c_ubyte() - z['CShortType'] = ctypes.c_short() - z['CUShortType'] = ctypes.c_ushort() - z['CIntType'] = ctypes.c_int() - z['CUIntType'] = ctypes.c_uint() - z['CLongType'] = ctypes.c_long() - z['CULongType'] = ctypes.c_ulong() - z['CLongLongType'] = ctypes.c_longlong() - z['CULongLongType'] = ctypes.c_ulonglong() - z['CFloatType'] = ctypes.c_float() - z['CDoubleType'] = ctypes.c_double() - z['CSizeTType'] = ctypes.c_size_t() - del z - a['CLibraryLoaderType'] = ctypes.cdll - a['StructureType'] = _Struct - # if not IS_PYPY: - # a['BigEndianStructureType'] = ctypes.BigEndianStructure() -#NOTE: also LittleEndianStructureType and UnionType... abstract classes -#NOTE: remember for ctypesobj.contents creates a new python object -#NOTE: ctypes.c_int._objects is memberdescriptor for object's __dict__ -#NOTE: base class of all ctypes data types is non-public _CData - -import fractions -import io -from io import StringIO as TextIO -# built-in functions (CH 2) -a['ByteArrayType'] = bytearray([1]) -# numeric and mathematical types (CH 9) -a['FractionType'] = fractions.Fraction() -a['NumberType'] = numbers.Number() -# generic operating system services (CH 15) -a['IOBaseType'] = io.IOBase() -a['RawIOBaseType'] = io.RawIOBase() -a['TextIOBaseType'] = io.TextIOBase() -a['BufferedIOBaseType'] = io.BufferedIOBase() -a['UnicodeIOType'] = TextIO() # the new StringIO -a['LoggerAdapterType'] = logging.LoggerAdapter(_logger,_dict) # pickle ok -if HAS_CTYPES: - z = x if (IS_PYPY and sys.hexversion < 0x30b0df0) else a - z['CBoolType'] = ctypes.c_bool(1) - z['CLongDoubleType'] = ctypes.c_longdouble() - del z -import argparse -# data types (CH 8) -a['OrderedDictType'] = collections.OrderedDict(_dict) -a['CounterType'] = collections.Counter(_dict) -if HAS_CTYPES: - z = x if (IS_PYPY and sys.hexversion < 0x30b0df0) else a - z['CSSizeTType'] = ctypes.c_ssize_t() - del z -# generic operating system services (CH 15) -a['NullHandlerType'] = logging.NullHandler() # pickle ok # new 2.7 -a['ArgParseFileType'] = argparse.FileType() # pickle ok - -# -- pickle fails on all below here ----------------------------------------- -# types module (part of CH 8) -a['CodeType'] = compile('','','exec') -a['DictProxyType'] = type.__dict__ -a['DictProxyType2'] = _newclass.__dict__ -a['EllipsisType'] = Ellipsis -a['ClosedFileType'] = open(os.devnull, 'wb', buffering=0).close() -a['GetSetDescriptorType'] = array.array.typecode -a['LambdaType'] = _lambda = lambda x: lambda y: x #XXX: works when not imported! -a['MemberDescriptorType'] = _newclass2.descriptor -if not IS_PYPY: - a['MemberDescriptorType2'] = datetime.timedelta.days -a['MethodType'] = _method = _class()._method #XXX: works when not imported! -a['ModuleType'] = datetime -a['NotImplementedType'] = NotImplemented -a['SliceType'] = slice(1) -a['UnboundMethodType'] = _class._method #XXX: works when not imported! -from dill._dill import get_file_type as openfile -d['TextWrapperType'] = openfile('r', buffering=-1) # same as mode='w','w+','r+' -if not IS_PYODIDE: - d['BufferedRandomType'] = openfile('r+b', buffering=-1) # same as mode='w+b' -d['BufferedReaderType'] = openfile('rb', buffering=-1) # (default: buffering=-1) -d['BufferedWriterType'] = openfile('wb', buffering=-1) -try: # oddities: deprecated - from _pyio import open as _open - d['PyTextWrapperType'] = openfile('r', buffering=-1, open=_open) - if not IS_PYODIDE: - d['PyBufferedRandomType'] = openfile('r+b', buffering=-1, open=_open) - d['PyBufferedReaderType'] = openfile('rb', buffering=-1, open=_open) - d['PyBufferedWriterType'] = openfile('wb', buffering=-1, open=_open) -except ImportError: - pass -del openfile -# other (concrete) object types -z = d if sys.hexversion < 0x30800a2 else a -z['CellType'] = (_lambda)(0).__closure__[0] -del z -a['XRangeType'] = _xrange = range(1) -a['MethodDescriptorType'] = type.__dict__['mro'] -a['WrapperDescriptorType'] = type.__repr__ -#a['WrapperDescriptorType2'] = type.__dict__['__module__']#XXX: GetSetDescriptor -a['ClassMethodDescriptorType'] = type.__dict__['__prepare__'] -# built-in functions (CH 2) -_methodwrap = (1).__lt__ -a['MethodWrapperType'] = _methodwrap -a['StaticMethodType'] = staticmethod(_method) -a['ClassMethodType'] = classmethod(_method) -a['PropertyType'] = property() -d['SuperType'] = super(Exception, _exception) -# string services (CH 7) -_in = _bytes -a['InputType'] = _cstrI = StringIO(_in) -a['OutputType'] = _cstrO = StringIO() -# data types (CH 8) -a['WeakKeyDictionaryType'] = weakref.WeakKeyDictionary() -a['WeakValueDictionaryType'] = weakref.WeakValueDictionary() -a['ReferenceType'] = weakref.ref(_instance) -a['DeadReferenceType'] = weakref.ref(_class()) -a['ProxyType'] = weakref.proxy(_instance) -a['DeadProxyType'] = weakref.proxy(_class()) -a['CallableProxyType'] = weakref.proxy(_instance2) -a['DeadCallableProxyType'] = weakref.proxy(_class2()) -a['QueueType'] = Queue.Queue() -# numeric and mathematical types (CH 9) -d['PartialType'] = functools.partial(int,base=2) -a['IzipType'] = zip('0','1') -d['ItemGetterType'] = operator.itemgetter(0) -d['AttrGetterType'] = operator.attrgetter('__repr__') -# file and directory access (CH 10) -_fileW = _cstrO -# data persistence (CH 11) -if HAS_ALL: - x['ConnectionType'] = _conn = sqlite3.connect(':memory:') - x['CursorType'] = _conn.cursor() -a['ShelveType'] = shelve.Shelf({}) -# data compression and archiving (CH 12) -if HAS_ALL: - x['BZ2FileType'] = bz2.BZ2File(os.devnull) - x['BZ2CompressorType'] = bz2.BZ2Compressor() - x['BZ2DecompressorType'] = bz2.BZ2Decompressor() -#x['ZipFileType'] = _zip = zipfile.ZipFile(os.devnull,'w') -#_zip.write(_tempfile,'x') [causes annoying warning/error printed on import] -#a['ZipInfoType'] = _zip.getinfo('x') -a['TarFileType'] = tarfile.open(fileobj=_fileW,mode='w') -# file formats (CH 13) -x['DialectType'] = csv.get_dialect('excel') -if sys.hexversion < 0x30d00a1: - import xdrlib - a['PackerType'] = xdrlib.Packer() -# optional operating system services (CH 16) -a['LockType'] = threading.Lock() -a['RLockType'] = threading.RLock() -# generic operating system services (CH 15) # also closed/open and r/w/etc... -a['NamedLoggerType'] = _logger = logging.getLogger(__name__) -#a['FrozenModuleType'] = __hello__ #FIXME: prints "Hello world..." -# interprocess communication (CH 17) -x['SocketType'] = _socket = socket.socket() -x['SocketPairType'] = socket.socketpair()[0] -# python runtime services (CH 27) -a['GeneratorContextManagerType'] = contextlib.contextmanager(max)([1]) -#a['ContextType'] = contextvars.Context() #XXX: ContextVar - -try: # ipython - __IPYTHON__ is True # is ipython -except NameError: - # built-in constants (CH 4) - a['QuitterType'] = quit - d['ExitType'] = a['QuitterType'] -try: # numpy #FIXME: slow... 0.05 to 0.1 sec to import numpy - from numpy import ufunc as _numpy_ufunc - from numpy import array as _numpy_array - from numpy import int32 as _numpy_int32 - a['NumpyUfuncType'] = _numpy_ufunc - a['NumpyArrayType'] = _numpy_array - a['NumpyInt32Type'] = _numpy_int32 -except ImportError: - pass -# generic operating system services (CH 15) -a['FileHandlerType'] = logging.FileHandler(os.devnull) -a['RotatingFileHandlerType'] = logging.handlers.RotatingFileHandler(os.devnull) -a['SocketHandlerType'] = logging.handlers.SocketHandler('localhost',514) -a['MemoryHandlerType'] = logging.handlers.MemoryHandler(1) -# data types (CH 8) -a['WeakSetType'] = weakref.WeakSet() # 2.7 -# generic operating system services (CH 15) [errors when dill is imported] -#a['ArgumentParserType'] = _parser = argparse.ArgumentParser('PROG') -#a['NamespaceType'] = _parser.parse_args() # pickle ok -#a['SubParsersActionType'] = _parser.add_subparsers() -#a['MutuallyExclusiveGroupType'] = _parser.add_mutually_exclusive_group() -#a['ArgumentGroupType'] = _parser.add_argument_group() - -# -- dill fails in some versions below here --------------------------------- -# types module (part of CH 8) -d['FileType'] = open(os.devnull, 'rb', buffering=0) # same 'wb','wb+','rb+' -# built-in functions (CH 2) -# Iterators: -a['ListIteratorType'] = iter(_list) # empty vs non-empty -a['SetIteratorType'] = iter(_set) #XXX: empty vs non-empty #FIXME: list_iterator -a['TupleIteratorType']= iter(_tuple) # empty vs non-empty -a['XRangeIteratorType'] = iter(_xrange) # empty vs non-empty -a["BytesIteratorType"] = iter(b'') -a["BytearrayIteratorType"] = iter(bytearray(b'')) -z = x if IS_PYPY else a -z["CallableIteratorType"] = iter(iter, None) -del z -x["MemoryIteratorType"] = iter(memoryview(b'')) -a["ListReverseiteratorType"] = reversed([]) -X = a['OrderedDictType'] -d["OdictKeysType"] = X.keys() -d["OdictValuesType"] = X.values() -d["OdictItemsType"] = X.items() -a["OdictIteratorType"] = iter(X.keys()) #FIXME: list_iterator -del X -#FIXME: list_iterator -a['DictionaryItemIteratorType'] = iter(type.__dict__.items()) -a['DictionaryKeyIteratorType'] = iter(type.__dict__.keys()) -a['DictionaryValueIteratorType'] = iter(type.__dict__.values()) -if sys.hexversion >= 0x30800a0: - a["DictReversekeyiteratorType"] = reversed({}.keys()) - a["DictReversevalueiteratorType"] = reversed({}.values()) - a["DictReverseitemiteratorType"] = reversed({}.items()) - -try: - import symtable - #FIXME: fails to pickle - x["SymtableEntryType"] = symtable.symtable("", "string", "exec")._table -except ImportError: - pass - -if sys.hexversion >= 0x30a00a0 and not IS_PYPY: - x['LineIteratorType'] = compile('3', '', 'eval').co_lines() - -if sys.hexversion >= 0x30b00b0 and not IS_PYPY: - from types import GenericAlias - d["GenericAliasIteratorType"] = iter(GenericAlias(list, (int,))) - x['PositionsIteratorType'] = compile('3', '', 'eval').co_positions() - -# data types (CH 8) -a['PrettyPrinterType'] = pprint.PrettyPrinter() -# file and directory access (CH 10) -a['TemporaryFileType'] = _tmpf -# data compression and archiving (CH 12) -x['GzipFileType'] = gzip.GzipFile(fileobj=_fileW) -# generic operating system services (CH 15) -a['StreamHandlerType'] = logging.StreamHandler() -# numeric and mathematical types (CH 9) -z = a if sys.hexversion < 0x30e00a1 else x -z['CountType'] = itertools.count(0) #FIXME: __reduce__ removed in 3.14.0a1 -z['ChainType'] = itertools.chain('0','1') -z['ProductType'] = itertools.product('0','1') -z['CycleType'] = itertools.cycle('0') -z['PermutationsType'] = itertools.permutations('0') -z['CombinationsType'] = itertools.combinations('0',1) -z['RepeatType'] = itertools.repeat(0) -z['CompressType'] = itertools.compress('0',[1]) -del z -#XXX: ...and etc - -# -- dill fails on all below here ------------------------------------------- -# types module (part of CH 8) -x['GeneratorType'] = _generator = _function(1) #XXX: priority -x['FrameType'] = _generator.gi_frame #XXX: inspect.currentframe() -x['TracebackType'] = _function2()[1] #(see: inspect.getouterframes,getframeinfo) -# other (concrete) object types -# (also: Capsule / CObject ?) -# built-in functions (CH 2) -# built-in types (CH 5) -# string services (CH 7) -x['StructType'] = struct.Struct('c') -x['CallableIteratorType'] = _srepattern.finditer('') -x['SREMatchType'] = _srepattern.match('') -x['SREScannerType'] = _srepattern.scanner('') -x['StreamReader'] = codecs.StreamReader(_cstrI) #XXX: ... and etc -# python object persistence (CH 11) -# x['DbShelveType'] = shelve.open('foo','n')#,protocol=2) #XXX: delete foo -if HAS_ALL: - z = a if IS_PYPY else x - z['DbmType'] = dbm.open(_tempfile,'n') - del z -# x['DbCursorType'] = _dbcursor = anydbm.open('foo','n') #XXX: delete foo -# x['DbType'] = _dbcursor.db -# data compression and archiving (CH 12) -x['ZlibCompressType'] = zlib.compressobj() -x['ZlibDecompressType'] = zlib.decompressobj() -# file formats (CH 13) -x['CSVReaderType'] = csv.reader(_cstrI) -x['CSVWriterType'] = csv.writer(_cstrO) -x['CSVDictReaderType'] = csv.DictReader(_cstrI) -x['CSVDictWriterType'] = csv.DictWriter(_cstrO,{}) -# cryptographic services (CH 14) -x['HashType'] = hashlib.md5() -if (sys.hexversion < 0x30800a1): - x['HMACType'] = hmac.new(_in) -else: - x['HMACType'] = hmac.new(_in, digestmod='md5') -# generic operating system services (CH 15) -if HAS_CURSES: pass - #x['CursesWindowType'] = _curwin = curses.initscr() #FIXME: messes up tty - #x['CursesTextPadType'] = textpad.Textbox(_curwin) - #x['CursesPanelType'] = panel.new_panel(_curwin) -if HAS_CTYPES: - x['CCharPType'] = ctypes.c_char_p() - x['CWCharPType'] = ctypes.c_wchar_p() - x['CVoidPType'] = ctypes.c_void_p() - if sys.platform[:3] == 'win': - x['CDLLType'] = _cdll = ctypes.cdll.msvcrt - else: - x['CDLLType'] = _cdll = ctypes.CDLL(None) - if not IS_PYPY: - x['PyDLLType'] = _pydll = ctypes.pythonapi - x['FuncPtrType'] = _cdll._FuncPtr() - x['CCharArrayType'] = ctypes.create_string_buffer(1) - x['CWCharArrayType'] = ctypes.create_unicode_buffer(1) - x['CParamType'] = ctypes.byref(_cchar) - x['LPCCharType'] = ctypes.pointer(_cchar) - x['LPCCharObjType'] = _lpchar = ctypes.POINTER(ctypes.c_char) - x['NullPtrType'] = _lpchar() - x['NullPyObjectType'] = ctypes.py_object() - x['PyObjectType'] = ctypes.py_object(lambda :None) - z = a if IS_PYPY else x - z['FieldType'] = _field = _Struct._field - z['CFUNCTYPEType'] = _cfunc = ctypes.CFUNCTYPE(ctypes.c_char) - if sys.hexversion < 0x30c00b3: - x['CFunctionType'] = _cfunc(str) - del z -# numeric and mathematical types (CH 9) -a['MethodCallerType'] = operator.methodcaller('mro') # 2.6 -# built-in types (CH 5) -x['MemoryType'] = memoryview(_in) # 2.7 -x['MemoryType2'] = memoryview(bytearray(_in)) # 2.7 -d['DictItemsType'] = _dict.items() # 2.7 -d['DictKeysType'] = _dict.keys() # 2.7 -d['DictValuesType'] = _dict.values() # 2.7 -# generic operating system services (CH 15) -a['RawTextHelpFormatterType'] = argparse.RawTextHelpFormatter('PROG') -a['RawDescriptionHelpFormatterType'] = argparse.RawDescriptionHelpFormatter('PROG') -a['ArgDefaultsHelpFormatterType'] = argparse.ArgumentDefaultsHelpFormatter('PROG') -z = a if IS_PYPY else x -z['CmpKeyType'] = _cmpkey = functools.cmp_to_key(_methodwrap) # 2.7, >=3.2 -z['CmpKeyObjType'] = _cmpkey('0') #2.7, >=3.2 -del z -# oddities: removed, etc -x['BufferType'] = x['MemoryType'] - -from dill._dill import _testcapsule -if _testcapsule is not None: - d['PyCapsuleType'] = _testcapsule -del _testcapsule - -if hasattr(dataclasses, '_HAS_DEFAULT_FACTORY'): - a['DataclassesHasDefaultFactoryType'] = dataclasses._HAS_DEFAULT_FACTORY - -if hasattr(dataclasses, 'MISSING'): - a['DataclassesMissingType'] = dataclasses.MISSING - -if hasattr(dataclasses, 'KW_ONLY'): - a['DataclassesKWOnlyType'] = dataclasses.KW_ONLY - -if hasattr(dataclasses, '_FIELD_BASE'): - a['DataclassesFieldBaseType'] = dataclasses._FIELD - -# -- cleanup ---------------------------------------------------------------- -a.update(d) # registered also succeed -if sys.platform[:3] == 'win': - os.close(_filedescrip) # required on win32 -os.remove(_tempfile) - - -# EOF diff --git a/venv/lib/python3.12/site-packages/dill/_shims.py b/venv/lib/python3.12/site-packages/dill/_shims.py deleted file mode 100644 index a7a5bdf..0000000 --- a/venv/lib/python3.12/site-packages/dill/_shims.py +++ /dev/null @@ -1,193 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Author: Anirudh Vegesana (avegesan@cs.stanford.edu) -# Copyright (c) 2021-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE -""" -Provides shims for compatibility between versions of dill and Python. - -Compatibility shims should be provided in this file. Here are two simple example -use cases. - -Deprecation of constructor function: -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Assume that we were transitioning _import_module in _dill.py to -the builtin function importlib.import_module when present. - -@move_to(_dill) -def _import_module(import_name): - ... # code already in _dill.py - -_import_module = Getattr(importlib, 'import_module', Getattr(_dill, '_import_module', None)) - -The code will attempt to find import_module in the importlib module. If not -present, it will use the _import_module function in _dill. - -Emulate new Python behavior in older Python versions: -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -CellType.cell_contents behaves differently in Python 3.6 and 3.7. It is -read-only in Python 3.6 and writable and deletable in 3.7. - -if _dill.OLD37 and _dill.HAS_CTYPES and ...: - @move_to(_dill) - def _setattr(object, name, value): - if type(object) is _dill.CellType and name == 'cell_contents': - _PyCell_Set.argtypes = (ctypes.py_object, ctypes.py_object) - _PyCell_Set(object, value) - else: - setattr(object, name, value) -... # more cases below - -_setattr = Getattr(_dill, '_setattr', setattr) - -_dill._setattr will be used when present to emulate Python 3.7 functionality in -older versions of Python while defaulting to the standard setattr in 3.7+. - -See this PR for the discussion that lead to this system: -https://github.com/uqfoundation/dill/pull/443 -""" - -import inspect -import sys - -_dill = sys.modules['dill._dill'] - - -class Reduce(object): - """ - Reduce objects are wrappers used for compatibility enforcement during - unpickle-time. They should only be used in calls to pickler.save and - other Reduce objects. They are only evaluated within unpickler.load. - - Pickling a Reduce object makes the two implementations equivalent: - - pickler.save(Reduce(*reduction)) - - pickler.save_reduce(*reduction, obj=reduction) - """ - __slots__ = ['reduction'] - def __new__(cls, *reduction, **kwargs): - """ - Args: - *reduction: a tuple that matches the format given here: - https://docs.python.org/3/library/pickle.html#object.__reduce__ - is_callable: a bool to indicate that the object created by - unpickling `reduction` is callable. If true, the current Reduce - is allowed to be used as the function in further save_reduce calls - or Reduce objects. - """ - is_callable = kwargs.get('is_callable', False) # Pleases Py2. Can be removed later - if is_callable: - self = object.__new__(_CallableReduce) - else: - self = object.__new__(Reduce) - self.reduction = reduction - return self - def __repr__(self): - return 'Reduce%s' % (self.reduction,) - def __copy__(self): - return self # pragma: no cover - def __deepcopy__(self, memo): - return self # pragma: no cover - def __reduce__(self): - return self.reduction - def __reduce_ex__(self, protocol): - return self.__reduce__() - -class _CallableReduce(Reduce): - # A version of Reduce for functions. Used to trick pickler.save_reduce into - # thinking that Reduce objects of functions are themselves meaningful functions. - def __call__(self, *args, **kwargs): - reduction = self.__reduce__() - func = reduction[0] - f_args = reduction[1] - obj = func(*f_args) - return obj(*args, **kwargs) - -__NO_DEFAULT = _dill.Sentinel('Getattr.NO_DEFAULT') - -def Getattr(object, name, default=__NO_DEFAULT): - """ - A Reduce object that represents the getattr operation. When unpickled, the - Getattr will access an attribute 'name' of 'object' and return the value - stored there. If the attribute doesn't exist, the default value will be - returned if present. - - The following statements are equivalent: - - Getattr(collections, 'OrderedDict') - Getattr(collections, 'spam', None) - Getattr(*args) - - Reduce(getattr, (collections, 'OrderedDict')) - Reduce(getattr, (collections, 'spam', None)) - Reduce(getattr, args) - - During unpickling, the first two will result in collections.OrderedDict and - None respectively because the first attribute exists and the second one does - not, forcing it to use the default value given in the third argument. - """ - - if default is Getattr.NO_DEFAULT: - reduction = (getattr, (object, name)) - else: - reduction = (getattr, (object, name, default)) - - return Reduce(*reduction, is_callable=callable(default)) - -Getattr.NO_DEFAULT = __NO_DEFAULT -del __NO_DEFAULT - -def move_to(module, name=None): - def decorator(func): - if name is None: - fname = func.__name__ - else: - fname = name - module.__dict__[fname] = func - func.__module__ = module.__name__ - return func - return decorator - -def register_shim(name, default): - """ - A easier to understand and more compact way of "softly" defining a function. - These two pieces of code are equivalent: - - if _dill.OLD3X: - def _create_class(): - ... - _create_class = register_shim('_create_class', types.new_class) - - if _dill.OLD3X: - @move_to(_dill) - def _create_class(): - ... - _create_class = Getattr(_dill, '_create_class', types.new_class) - - Intuitively, it creates a function or object in the versions of dill/python - that require special reimplementations, and use a core library or default - implementation if that function or object does not exist. - """ - func = globals().get(name) - if func is not None: - _dill.__dict__[name] = func - func.__module__ = _dill.__name__ - - if default is Getattr.NO_DEFAULT: - reduction = (getattr, (_dill, name)) - else: - reduction = (getattr, (_dill, name, default)) - - return Reduce(*reduction, is_callable=callable(default)) - -###################### -## Compatibility Shims are defined below -###################### - -_CELL_EMPTY = register_shim('_CELL_EMPTY', None) - -_setattr = register_shim('_setattr', setattr) -_delattr = register_shim('_delattr', delattr) diff --git a/venv/lib/python3.12/site-packages/dill/detect.py b/venv/lib/python3.12/site-packages/dill/detect.py deleted file mode 100644 index cdd4287..0000000 --- a/venv/lib/python3.12/site-packages/dill/detect.py +++ /dev/null @@ -1,287 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE -""" -Methods for detecting objects leading to pickling failures. -""" - -import dis -from inspect import ismethod, isfunction, istraceback, isframe, iscode - -from .pointers import parent, reference, at, parents, children -from .logger import trace - -__all__ = ['baditems','badobjects','badtypes','code','errors','freevars', - 'getmodule','globalvars','nestedcode','nestedglobals','outermost', - 'referredglobals','referrednested','trace','varnames'] - -def getmodule(object, _filename=None, force=False): - """get the module of the object""" - from inspect import getmodule as getmod - module = getmod(object, _filename) - if module or not force: return module - import builtins - from .source import getname - name = getname(object, force=True) - return builtins if name in vars(builtins).keys() else None - -def outermost(func): # is analogous to getsource(func,enclosing=True) - """get outermost enclosing object (i.e. the outer function in a closure) - - NOTE: this is the object-equivalent of getsource(func, enclosing=True) - """ - if ismethod(func): - _globals = func.__func__.__globals__ or {} - elif isfunction(func): - _globals = func.__globals__ or {} - else: - return #XXX: or raise? no matches - _globals = _globals.items() - # get the enclosing source - from .source import getsourcelines - try: lines,lnum = getsourcelines(func, enclosing=True) - except Exception: #TypeError, IOError - lines,lnum = [],None - code = ''.join(lines) - # get all possible names,objects that are named in the enclosing source - _locals = ((name,obj) for (name,obj) in _globals if name in code) - # now only save the objects that generate the enclosing block - for name,obj in _locals: #XXX: don't really need 'name' - try: - if getsourcelines(obj) == (lines,lnum): return obj - except Exception: #TypeError, IOError - pass - return #XXX: or raise? no matches - -def nestedcode(func, recurse=True): #XXX: or return dict of {co_name: co} ? - """get the code objects for any nested functions (e.g. in a closure)""" - func = code(func) - if not iscode(func): return [] #XXX: or raise? no matches - nested = set() - for co in func.co_consts: - if co is None: continue - co = code(co) - if co: - nested.add(co) - if recurse: nested |= set(nestedcode(co, recurse=True)) - return list(nested) - -def code(func): - """get the code object for the given function or method - - NOTE: use dill.source.getsource(CODEOBJ) to get the source code - """ - if ismethod(func): func = func.__func__ - if isfunction(func): func = func.__code__ - if istraceback(func): func = func.tb_frame - if isframe(func): func = func.f_code - if iscode(func): return func - return - -#XXX: ugly: parse dis.dis for name after " len(referrednested(func)), try calling func(). - If possible, python builds code objects, but delays building functions - until func() is called. - """ - import gc - funcs = set() - # get the code objects, and try to track down by referrence - for co in nestedcode(func, recurse): - # look for function objects that refer to the code object - for obj in gc.get_referrers(co): - # get methods - _ = getattr(obj, '__func__', None) # ismethod - if getattr(_, '__code__', None) is co: funcs.add(obj) - # get functions - elif getattr(obj, '__code__', None) is co: funcs.add(obj) - # get frame objects - elif getattr(obj, 'f_code', None) is co: funcs.add(obj) - # get code objects - elif hasattr(obj, 'co_code') and obj is co: funcs.add(obj) -# frameobjs => func.__code__.co_varnames not in func.__code__.co_cellvars -# funcobjs => func.__code__.co_cellvars not in func.__code__.co_varnames -# frameobjs are not found, however funcobjs are... -# (see: test_mixins.quad ... and test_mixins.wtf) -# after execution, code objects get compiled, and then may be found by gc - return list(funcs) - - -def freevars(func): - """get objects defined in enclosing code that are referred to by func - - returns a dict of {name:object}""" - if ismethod(func): func = func.__func__ - if isfunction(func): - closures = func.__closure__ or () - func = func.__code__.co_freevars # get freevars - else: - return {} - - def get_cell_contents(): - for name, c in zip(func, closures): - try: - cell_contents = c.cell_contents - except ValueError: # cell is empty - continue - yield name, c.cell_contents - - return dict(get_cell_contents()) - -# thanks to Davies Liu for recursion of globals -def nestedglobals(func, recurse=True): - """get the names of any globals found within func""" - func = code(func) - if func is None: return list() - import sys - from .temp import capture - CAN_NULL = sys.hexversion >= 0x30b00a7 # NULL may be prepended >= 3.11a7 - names = set() - with capture('stdout') as out: - try: - dis.dis(func) #XXX: dis.dis(None) disassembles last traceback - except IndexError: - pass #FIXME: HACK for IS_PYPY (3.11) - for line in out.getvalue().splitlines(): - if '_GLOBAL' in line: - name = line.split('(')[-1].split(')')[0] - if CAN_NULL: - names.add(name.replace('NULL + ', '').replace(' + NULL', '')) - else: - names.add(name) - for co in getattr(func, 'co_consts', tuple()): - if co and recurse and iscode(co): - names.update(nestedglobals(co, recurse=True)) - return list(names) - -def referredglobals(func, recurse=True, builtin=False): - """get the names of objects in the global scope referred to by func""" - return globalvars(func, recurse, builtin).keys() - -def globalvars(func, recurse=True, builtin=False): - """get objects defined in global scope that are referred to by func - - return a dict of {name:object}""" - if ismethod(func): func = func.__func__ - if isfunction(func): - globs = vars(getmodule(sum)).copy() if builtin else {} - # get references from within closure - orig_func, func = func, set() - for obj in orig_func.__closure__ or {}: - try: - cell_contents = obj.cell_contents - except ValueError: # cell is empty - pass - else: - _vars = globalvars(cell_contents, recurse, builtin) or {} - func.update(_vars) #XXX: (above) be wary of infinte recursion? - globs.update(_vars) - # get globals - globs.update(orig_func.__globals__ or {}) - # get names of references - if not recurse: - func.update(orig_func.__code__.co_names) - else: - func.update(nestedglobals(orig_func.__code__)) - # find globals for all entries of func - for key in func.copy(): #XXX: unnecessary...? - nested_func = globs.get(key) - if nested_func is orig_func: - #func.remove(key) if key in func else None - continue #XXX: globalvars(func, False)? - func.update(globalvars(nested_func, True, builtin)) - elif iscode(func): - globs = vars(getmodule(sum)).copy() if builtin else {} - #globs.update(globals()) - if not recurse: - func = func.co_names # get names - else: - orig_func = func.co_name # to stop infinite recursion - func = set(nestedglobals(func)) - # find globals for all entries of func - for key in func.copy(): #XXX: unnecessary...? - if key is orig_func: - #func.remove(key) if key in func else None - continue #XXX: globalvars(func, False)? - nested_func = globs.get(key) - func.update(globalvars(nested_func, True, builtin)) - else: - return {} - #NOTE: if name not in __globals__, then we skip it... - return dict((name,globs[name]) for name in func if name in globs) - - -def varnames(func): - """get names of variables defined by func - - returns a tuple (local vars, local vars referrenced by nested functions)""" - func = code(func) - if not iscode(func): - return () #XXX: better ((),())? or None? - return func.co_varnames, func.co_cellvars - - -def baditems(obj, exact=False, safe=False): #XXX: obj=globals() ? - """get items in object that fail to pickle""" - if not hasattr(obj,'__iter__'): # is not iterable - return [j for j in (badobjects(obj,0,exact,safe),) if j is not None] - obj = obj.values() if getattr(obj,'values',None) else obj - _obj = [] # can't use a set, as items may be unhashable - [_obj.append(badobjects(i,0,exact,safe)) for i in obj if i not in _obj] - return [j for j in _obj if j is not None] - - -def badobjects(obj, depth=0, exact=False, safe=False): - """get objects that fail to pickle""" - from dill import pickles - if not depth: - if pickles(obj,exact,safe): return None - return obj - return dict(((attr, badobjects(getattr(obj,attr),depth-1,exact,safe)) \ - for attr in dir(obj) if not pickles(getattr(obj,attr),exact,safe))) - -def badtypes(obj, depth=0, exact=False, safe=False): - """get types for objects that fail to pickle""" - from dill import pickles - if not depth: - if pickles(obj,exact,safe): return None - return type(obj) - return dict(((attr, badtypes(getattr(obj,attr),depth-1,exact,safe)) \ - for attr in dir(obj) if not pickles(getattr(obj,attr),exact,safe))) - -def errors(obj, depth=0, exact=False, safe=False): - """get errors for objects that fail to pickle""" - from dill import pickles, copy - if not depth: - try: - pik = copy(obj) - if exact: - assert pik == obj, \ - "Unpickling produces %s instead of %s" % (pik,obj) - assert type(pik) == type(obj), \ - "Unpickling produces %s instead of %s" % (type(pik),type(obj)) - return None - except Exception: - import sys - return sys.exc_info()[1] - _dict = {} - for attr in dir(obj): - try: - _attr = getattr(obj,attr) - except Exception: - import sys - _dict[attr] = sys.exc_info()[1] - continue - if not pickles(_attr,exact,safe): - _dict[attr] = errors(_attr,depth-1,exact,safe) - return _dict - - -# EOF diff --git a/venv/lib/python3.12/site-packages/dill/logger.py b/venv/lib/python3.12/site-packages/dill/logger.py deleted file mode 100644 index a330112..0000000 --- a/venv/lib/python3.12/site-packages/dill/logger.py +++ /dev/null @@ -1,285 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Author: Leonardo Gama (@leogama) -# Copyright (c) 2022-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE -""" -Logging utilities for dill. - -The 'logger' object is dill's top-level logger. - -The 'adapter' object wraps the logger and implements a 'trace()' method that -generates a detailed tree-style trace for the pickling call at log level INFO. - -The 'trace()' function sets and resets dill's logger log level, enabling and -disabling the pickling trace. - -The trace shows a tree structure depicting the depth of each object serialized -*with dill save functions*, but not the ones that use save functions from -'pickle._Pickler.dispatch'. If the information is available, it also displays -the size in bytes that the object contributed to the pickle stream (including -its child objects). Sample trace output: - - >>> import dill, dill.tests - >>> dill.detect.trace(True) - >>> dill.dump_session(main=dill.tests) - ┬ M1: - ├┬ F2: - │└ # F2 [32 B] - ├┬ D2: - │├┬ T4: - ││└ # T4 [35 B] - │├┬ D2: - ││├┬ T4: - │││└ # T4 [50 B] - ││├┬ D2: - │││└ # D2 [84 B] - ││└ # D2 [413 B] - │└ # D2 [763 B] - └ # M1 [813 B] -""" - -__all__ = ['adapter', 'logger', 'trace'] - -import codecs -import contextlib -import locale -import logging -import math -import os -from functools import partial -from typing import TextIO, Union - -import dill - -# Tree drawing characters: Unicode to ASCII map. -ASCII_MAP = str.maketrans({"│": "|", "├": "|", "┬": "+", "└": "`"}) - -## Notes about the design choices ## - -# Here is some domumentation of the Standard Library's logging internals that -# can't be found completely in the official documentation. dill's logger is -# obtained by calling logging.getLogger('dill') and therefore is an instance of -# logging.getLoggerClass() at the call time. As this is controlled by the user, -# in order to add some functionality to it it's necessary to use a LoggerAdapter -# to wrap it, overriding some of the adapter's methods and creating new ones. -# -# Basic calling sequence -# ====================== -# -# Python's logging functionality can be conceptually divided into five steps: -# 0. Check logging level -> abort if call level is greater than logger level -# 1. Gather information -> construct a LogRecord from passed arguments and context -# 2. Filter (optional) -> discard message if the record matches a filter -# 3. Format -> format message with args, then format output string with message plus record -# 4. Handle -> write the formatted string to output as defined in the handler -# -# dill.logging.logger.log -> # or logger.info, etc. -# Logger.log -> \ -# Logger._log -> }- accept 'extra' parameter for custom record entries -# Logger.makeRecord -> / -# LogRecord.__init__ -# Logger.handle -> -# Logger.callHandlers -> -# Handler.handle -> -# Filterer.filter -> -# Filter.filter -# StreamHandler.emit -> -# Handler.format -> -# Formatter.format -> -# LogRecord.getMessage # does: record.message = msg % args -# Formatter.formatMessage -> -# PercentStyle.format # does: self._fmt % vars(record) -# -# NOTE: All methods from the second line on are from logging.__init__.py - -class TraceAdapter(logging.LoggerAdapter): - """ - Tracks object tree depth and calculates pickled object size. - - A single instance of this wraps the module's logger, as the logging API - doesn't allow setting it directly with a custom Logger subclass. The added - 'trace()' method receives a pickle instance as the first argument and - creates extra values to be added in the LogRecord from it, then calls - 'info()'. - - Usage of logger with 'trace()' method: - - >>> from dill.logger import adapter as logger #NOTE: not dill.logger.logger - >>> ... - >>> def save_atype(pickler, obj): - >>> logger.trace(pickler, "Message with %s and %r etc. placeholders", 'text', obj) - >>> ... - """ - def __init__(self, logger): - self.logger = logger - def addHandler(self, handler): - formatter = TraceFormatter("%(prefix)s%(message)s%(suffix)s", handler=handler) - handler.setFormatter(formatter) - self.logger.addHandler(handler) - def removeHandler(self, handler): - self.logger.removeHandler(handler) - def process(self, msg, kwargs): - # A no-op override, as we don't have self.extra. - return msg, kwargs - def trace_setup(self, pickler): - # Called by Pickler.dump(). - if not dill._dill.is_dill(pickler, child=False): - return - if self.isEnabledFor(logging.INFO): - pickler._trace_depth = 1 - pickler._size_stack = [] - else: - pickler._trace_depth = None - def trace(self, pickler, msg, *args, **kwargs): - if not hasattr(pickler, '_trace_depth'): - logger.info(msg, *args, **kwargs) - return - if pickler._trace_depth is None: - return - extra = kwargs.get('extra', {}) - pushed_obj = msg.startswith('#') - size = None - try: - # Streams are not required to be tellable. - size = pickler._file.tell() - frame = pickler.framer.current_frame - try: - size += frame.tell() - except AttributeError: - # PyPy may use a BytesBuilder as frame - size += len(frame) - except (AttributeError, TypeError): - pass - if size is not None: - if not pushed_obj: - pickler._size_stack.append(size) - else: - size -= pickler._size_stack.pop() - extra['size'] = size - if pushed_obj: - pickler._trace_depth -= 1 - extra['depth'] = pickler._trace_depth - kwargs['extra'] = extra - self.info(msg, *args, **kwargs) - if not pushed_obj: - pickler._trace_depth += 1 - -class TraceFormatter(logging.Formatter): - """ - Generates message prefix and suffix from record. - - This Formatter adds prefix and suffix strings to the log message in trace - mode (an also provides empty string defaults for normal logs). - """ - def __init__(self, *args, handler=None, **kwargs): - super().__init__(*args, **kwargs) - try: - encoding = handler.stream.encoding - if encoding is None: - raise AttributeError - except AttributeError: - encoding = locale.getpreferredencoding() - try: - encoding = codecs.lookup(encoding).name - except LookupError: - self.is_utf8 = False - else: - self.is_utf8 = (encoding == codecs.lookup('utf-8').name) - def format(self, record): - fields = {'prefix': "", 'suffix': ""} - if getattr(record, 'depth', 0) > 0: - if record.msg.startswith("#"): - prefix = (record.depth - 1)*"│" + "└" - elif record.depth == 1: - prefix = "┬" - else: - prefix = (record.depth - 2)*"│" + "├┬" - if not self.is_utf8: - prefix = prefix.translate(ASCII_MAP) + "-" - fields['prefix'] = prefix + " " - if hasattr(record, 'size') and record.size is not None and record.size >= 1: - # Show object size in human-readable form. - power = int(math.log(record.size, 2)) // 10 - size = record.size >> power*10 - fields['suffix'] = " [%d %sB]" % (size, "KMGTP"[power] + "i" if power else "") - vars(record).update(fields) - return super().format(record) - -logger = logging.getLogger('dill') -logger.propagate = False -adapter = TraceAdapter(logger) -stderr_handler = logging._StderrHandler() -adapter.addHandler(stderr_handler) - -def trace(arg: Union[bool, TextIO, str, os.PathLike] = None, *, mode: str = 'a') -> None: - """print a trace through the stack when pickling; useful for debugging - - With a single boolean argument, enable or disable the tracing. - - Example usage: - - >>> import dill - >>> dill.detect.trace(True) - >>> dill.dump_session() - - Alternatively, ``trace()`` can be used as a context manager. With no - arguments, it just takes care of restoring the tracing state on exit. - Either a file handle, or a file name and (optionally) a file mode may be - specitfied to redirect the tracing output in the ``with`` block context. A - log function is yielded by the manager so the user can write extra - information to the file. - - Example usage: - - >>> from dill import detect - >>> D = {'a': 42, 'b': {'x': None}} - >>> with detect.trace(): - >>> dumps(D) - ┬ D2: - ├┬ D2: - │└ # D2 [8 B] - └ # D2 [22 B] - >>> squared = lambda x: x**2 - >>> with detect.trace('output.txt', mode='w') as log: - >>> log("> D = %r", D) - >>> dumps(D) - >>> log("> squared = %r", squared) - >>> dumps(squared) - - Arguments: - arg: a boolean value, or an optional file-like or path-like object for the context manager - mode: mode string for ``open()`` if a file name is passed as the first argument - """ - if repr(arg) not in ('False', 'True'): - return TraceManager(file=arg, mode=mode) - logger.setLevel(logging.INFO if arg else logging.WARNING) - -class TraceManager(contextlib.AbstractContextManager): - """context manager version of trace(); can redirect the trace to a file""" - def __init__(self, file, mode): - self.file = file - self.mode = mode - self.redirect = file is not None - self.file_is_stream = hasattr(file, 'write') - def __enter__(self): - if self.redirect: - stderr_handler.flush() - if self.file_is_stream: - self.handler = logging.StreamHandler(self.file) - else: - self.handler = logging.FileHandler(self.file, self.mode) - adapter.removeHandler(stderr_handler) - adapter.addHandler(self.handler) - self.old_level = adapter.getEffectiveLevel() - adapter.setLevel(logging.INFO) - return adapter.info - def __exit__(self, *exc_info): - adapter.setLevel(self.old_level) - if self.redirect: - adapter.removeHandler(self.handler) - adapter.addHandler(stderr_handler) - if not self.file_is_stream: - self.handler.close() diff --git a/venv/lib/python3.12/site-packages/dill/objtypes.py b/venv/lib/python3.12/site-packages/dill/objtypes.py deleted file mode 100644 index bf88a47..0000000 --- a/venv/lib/python3.12/site-packages/dill/objtypes.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE -""" -all Python Standard Library object types (currently: CH 1-15 @ 2.7) -and some other common object types (i.e. numpy.ndarray) - -to load more objects and types, use dill.load_types() -""" - -# non-local import of dill.objects -from dill import objects -for _type in objects.keys(): - exec("%s = type(objects['%s'])" % (_type,_type)) - -del objects -try: - del _type -except NameError: - pass diff --git a/venv/lib/python3.12/site-packages/dill/pointers.py b/venv/lib/python3.12/site-packages/dill/pointers.py deleted file mode 100644 index d27745f..0000000 --- a/venv/lib/python3.12/site-packages/dill/pointers.py +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -__all__ = ['parent', 'reference', 'at', 'parents', 'children'] - -import gc -import sys - -from ._dill import _proxy_helper as reference -from ._dill import _locate_object as at - -def parent(obj, objtype, ignore=()): - """ ->>> listiter = iter([4,5,6,7]) ->>> obj = parent(listiter, list) ->>> obj == [4,5,6,7] # actually 'is', but don't have handle any longer -True - -NOTE: objtype can be a single type (e.g. int or list) or a tuple of types. - -WARNING: if obj is a sequence (e.g. list), may produce unexpected results. -Parent finds *one* parent (e.g. the last member of the sequence). - """ - depth = 1 #XXX: always looking for the parent (only, right?) - chain = parents(obj, objtype, depth, ignore) - parent = chain.pop() - if parent is obj: - return None - return parent - - -def parents(obj, objtype, depth=1, ignore=()): #XXX: objtype=object ? - """Find the chain of referents for obj. Chain will end with obj. - - objtype: an object type or tuple of types to search for - depth: search depth (e.g. depth=2 is 'grandparents') - ignore: an object or tuple of objects to ignore in the search - """ - edge_func = gc.get_referents # looking for refs, not back_refs - predicate = lambda x: isinstance(x, objtype) # looking for parent type - #if objtype is None: predicate = lambda x: True #XXX: in obj.mro() ? - ignore = (ignore,) if not hasattr(ignore, '__len__') else ignore - ignore = (id(obj) for obj in ignore) - chain = find_chain(obj, predicate, edge_func, depth)[::-1] - #XXX: should pop off obj... ? - return chain - - -def children(obj, objtype, depth=1, ignore=()): #XXX: objtype=object ? - """Find the chain of referrers for obj. Chain will start with obj. - - objtype: an object type or tuple of types to search for - depth: search depth (e.g. depth=2 is 'grandchildren') - ignore: an object or tuple of objects to ignore in the search - - NOTE: a common thing to ignore is all globals, 'ignore=(globals(),)' - - NOTE: repeated calls may yield different results, as python stores - the last value in the special variable '_'; thus, it is often good - to execute something to replace '_' (e.g. >>> 1+1). - """ - edge_func = gc.get_referrers # looking for back_refs, not refs - predicate = lambda x: isinstance(x, objtype) # looking for child type - #if objtype is None: predicate = lambda x: True #XXX: in obj.mro() ? - ignore = (ignore,) if not hasattr(ignore, '__len__') else ignore - ignore = (id(obj) for obj in ignore) - chain = find_chain(obj, predicate, edge_func, depth, ignore) - #XXX: should pop off obj... ? - return chain - - -# more generic helper function (cut-n-paste from objgraph) -# Source at http://mg.pov.lt/objgraph/ -# Copyright (c) 2008-2010 Marius Gedminas -# Copyright (c) 2010 Stefano Rivera -# Released under the MIT licence (see objgraph/objgrah.py) - -def find_chain(obj, predicate, edge_func, max_depth=20, extra_ignore=()): - queue = [obj] - depth = {id(obj): 0} - parent = {id(obj): None} - ignore = set(extra_ignore) - ignore.add(id(extra_ignore)) - ignore.add(id(queue)) - ignore.add(id(depth)) - ignore.add(id(parent)) - ignore.add(id(ignore)) - ignore.add(id(sys._getframe())) # this function - ignore.add(id(sys._getframe(1))) # find_chain/find_backref_chain, likely - gc.collect() - while queue: - target = queue.pop(0) - if predicate(target): - chain = [target] - while parent[id(target)] is not None: - target = parent[id(target)] - chain.append(target) - return chain - tdepth = depth[id(target)] - if tdepth < max_depth: - referrers = edge_func(target) - ignore.add(id(referrers)) - for source in referrers: - if id(source) in ignore: - continue - if id(source) not in depth: - depth[id(source)] = tdepth + 1 - parent[id(source)] = target - queue.append(source) - return [obj] # not found - - -# backward compatibility -refobject = at - - -# EOF diff --git a/venv/lib/python3.12/site-packages/dill/session.py b/venv/lib/python3.12/site-packages/dill/session.py deleted file mode 100644 index b5dd2ff..0000000 --- a/venv/lib/python3.12/site-packages/dill/session.py +++ /dev/null @@ -1,612 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Author: Leonardo Gama (@leogama) -# Copyright (c) 2008-2015 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE -""" -Pickle and restore the intepreter session. -""" - -__all__ = [ - 'dump_module', 'load_module', 'load_module_asdict', - 'dump_session', 'load_session' # backward compatibility -] - -import re -import os -import sys -import warnings -import pathlib -import tempfile - -TEMPDIR = pathlib.PurePath(tempfile.gettempdir()) - -# Type hints. -from typing import Optional, Union - -from dill import _dill, Pickler, Unpickler -from ._dill import ( - BuiltinMethodType, FunctionType, MethodType, ModuleType, TypeType, - _import_module, _is_builtin_module, _is_imported_module, _main_module, - _reverse_typemap, __builtin__, UnpicklingError, -) - -def _module_map(): - """get map of imported modules""" - from collections import defaultdict - from types import SimpleNamespace - modmap = SimpleNamespace( - by_name=defaultdict(list), - by_id=defaultdict(list), - top_level={}, - ) - for modname, module in sys.modules.items(): - if modname in ('__main__', '__mp_main__') or not isinstance(module, ModuleType): - continue - if '.' not in modname: - modmap.top_level[id(module)] = modname - for objname, modobj in module.__dict__.items(): - modmap.by_name[objname].append((modobj, modname)) - modmap.by_id[id(modobj)].append((modobj, objname, modname)) - return modmap - -IMPORTED_AS_TYPES = (ModuleType, TypeType, FunctionType, MethodType, BuiltinMethodType) -if 'PyCapsuleType' in _reverse_typemap: - IMPORTED_AS_TYPES += (_reverse_typemap['PyCapsuleType'],) -IMPORTED_AS_MODULES = ('ctypes', 'typing', 'subprocess', 'threading', - r'concurrent\.futures(\.\w+)?', r'multiprocessing(\.\w+)?') -IMPORTED_AS_MODULES = tuple(re.compile(x) for x in IMPORTED_AS_MODULES) - -def _lookup_module(modmap, name, obj, main_module): - """lookup name or id of obj if module is imported""" - for modobj, modname in modmap.by_name[name]: - if modobj is obj and sys.modules[modname] is not main_module: - return modname, name - __module__ = getattr(obj, '__module__', None) - if isinstance(obj, IMPORTED_AS_TYPES) or (__module__ is not None - and any(regex.fullmatch(__module__) for regex in IMPORTED_AS_MODULES)): - for modobj, objname, modname in modmap.by_id[id(obj)]: - if sys.modules[modname] is not main_module: - return modname, objname - return None, None - -def _stash_modules(main_module): - modmap = _module_map() - newmod = ModuleType(main_module.__name__) - - imported = [] - imported_as = [] - imported_top_level = [] # keep separated for backward compatibility - original = {} - for name, obj in main_module.__dict__.items(): - if obj is main_module: - original[name] = newmod # self-reference - elif obj is main_module.__dict__: - original[name] = newmod.__dict__ - # Avoid incorrectly matching a singleton value in another package (ex.: __doc__). - elif any(obj is singleton for singleton in (None, False, True)) \ - or isinstance(obj, ModuleType) and _is_builtin_module(obj): # always saved by ref - original[name] = obj - else: - source_module, objname = _lookup_module(modmap, name, obj, main_module) - if source_module is not None: - if objname == name: - imported.append((source_module, name)) - else: - imported_as.append((source_module, objname, name)) - else: - try: - imported_top_level.append((modmap.top_level[id(obj)], name)) - except KeyError: - original[name] = obj - - if len(original) < len(main_module.__dict__): - newmod.__dict__.update(original) - newmod.__dill_imported = imported - newmod.__dill_imported_as = imported_as - newmod.__dill_imported_top_level = imported_top_level - if getattr(newmod, '__loader__', None) is None and _is_imported_module(main_module): - # Trick _is_imported_module() to force saving as an imported module. - newmod.__loader__ = True # will be discarded by save_module() - return newmod - else: - return main_module - -def _restore_modules(unpickler, main_module): - try: - for modname, name in main_module.__dict__.pop('__dill_imported'): - main_module.__dict__[name] = unpickler.find_class(modname, name) - for modname, objname, name in main_module.__dict__.pop('__dill_imported_as'): - main_module.__dict__[name] = unpickler.find_class(modname, objname) - for modname, name in main_module.__dict__.pop('__dill_imported_top_level'): - main_module.__dict__[name] = __import__(modname) - except KeyError: - pass - -#NOTE: 06/03/15 renamed main_module to main -def dump_module( - filename: Union[str, os.PathLike] = None, - module: Optional[Union[ModuleType, str]] = None, - refimported: bool = False, - **kwds -) -> None: - """Pickle the current state of :py:mod:`__main__` or another module to a file. - - Save the contents of :py:mod:`__main__` (e.g. from an interactive - interpreter session), an imported module, or a module-type object (e.g. - built with :py:class:`~types.ModuleType`), to a file. The pickled - module can then be restored with the function :py:func:`load_module`. - - Args: - filename: a path-like object or a writable stream. If `None` - (the default), write to a named file in a temporary directory. - module: a module object or the name of an importable module. If `None` - (the default), :py:mod:`__main__` is saved. - refimported: if `True`, all objects identified as having been imported - into the module's namespace are saved by reference. *Note:* this is - similar but independent from ``dill.settings[`byref`]``, as - ``refimported`` refers to virtually all imported objects, while - ``byref`` only affects select objects. - **kwds: extra keyword arguments passed to :py:class:`Pickler()`. - - Raises: - :py:exc:`PicklingError`: if pickling fails. - - Examples: - - - Save current interpreter session state: - - >>> import dill - >>> squared = lambda x: x*x - >>> dill.dump_module() # save state of __main__ to /tmp/session.pkl - - - Save the state of an imported/importable module: - - >>> import dill - >>> import pox - >>> pox.plus_one = lambda x: x+1 - >>> dill.dump_module('pox_session.pkl', module=pox) - - - Save the state of a non-importable, module-type object: - - >>> import dill - >>> from types import ModuleType - >>> foo = ModuleType('foo') - >>> foo.values = [1,2,3] - >>> import math - >>> foo.sin = math.sin - >>> dill.dump_module('foo_session.pkl', module=foo, refimported=True) - - - Restore the state of the saved modules: - - >>> import dill - >>> dill.load_module() - >>> squared(2) - 4 - >>> pox = dill.load_module('pox_session.pkl') - >>> pox.plus_one(1) - 2 - >>> foo = dill.load_module('foo_session.pkl') - >>> [foo.sin(x) for x in foo.values] - [0.8414709848078965, 0.9092974268256817, 0.1411200080598672] - - - Use `refimported` to save imported objects by reference: - - >>> import dill - >>> from html.entities import html5 - >>> type(html5), len(html5) - (dict, 2231) - >>> import io - >>> buf = io.BytesIO() - >>> dill.dump_module(buf) # saves __main__, with html5 saved by value - >>> len(buf.getvalue()) # pickle size in bytes - 71665 - >>> buf = io.BytesIO() - >>> dill.dump_module(buf, refimported=True) # html5 saved by reference - >>> len(buf.getvalue()) - 438 - - *Changed in version 0.3.6:* Function ``dump_session()`` was renamed to - ``dump_module()``. Parameters ``main`` and ``byref`` were renamed to - ``module`` and ``refimported``, respectively. - - Note: - Currently, ``dill.settings['byref']`` and ``dill.settings['recurse']`` - don't apply to this function. - """ - for old_par, par in [('main', 'module'), ('byref', 'refimported')]: - if old_par in kwds: - message = "The argument %r has been renamed %r" % (old_par, par) - if old_par == 'byref': - message += " to distinguish it from dill.settings['byref']" - warnings.warn(message + ".", PendingDeprecationWarning) - if locals()[par]: # the defaults are None and False - raise TypeError("both %r and %r arguments were used" % (par, old_par)) - refimported = kwds.pop('byref', refimported) - module = kwds.pop('main', module) - - from .settings import settings - protocol = settings['protocol'] - main = module - if main is None: - main = _main_module - elif isinstance(main, str): - main = _import_module(main) - if not isinstance(main, ModuleType): - raise TypeError("%r is not a module" % main) - if hasattr(filename, 'write'): - file = filename - else: - if filename is None: - filename = str(TEMPDIR/'session.pkl') - file = open(filename, 'wb') - try: - pickler = Pickler(file, protocol, **kwds) - pickler._original_main = main - if refimported: - main = _stash_modules(main) - pickler._main = main #FIXME: dill.settings are disabled - pickler._byref = False # disable pickling by name reference - pickler._recurse = False # disable pickling recursion for globals - pickler._session = True # is best indicator of when pickling a session - pickler._first_pass = True - pickler._main_modified = main is not pickler._original_main - pickler.dump(main) - finally: - if file is not filename: # if newly opened file - file.close() - return - -# Backward compatibility. -def dump_session(filename=None, main=None, byref=False, **kwds): - warnings.warn("dump_session() has been renamed dump_module()", PendingDeprecationWarning) - dump_module(filename, module=main, refimported=byref, **kwds) -dump_session.__doc__ = dump_module.__doc__ - -class _PeekableReader: - """lightweight stream wrapper that implements peek()""" - def __init__(self, stream): - self.stream = stream - def read(self, n): - return self.stream.read(n) - def readline(self): - return self.stream.readline() - def tell(self): - return self.stream.tell() - def close(self): - return self.stream.close() - def peek(self, n): - stream = self.stream - try: - if hasattr(stream, 'flush'): stream.flush() - position = stream.tell() - stream.seek(position) # assert seek() works before reading - chunk = stream.read(n) - stream.seek(position) - return chunk - except (AttributeError, OSError): - raise NotImplementedError("stream is not peekable: %r", stream) from None - -def _make_peekable(stream): - """return stream as an object with a peek() method""" - import io - if hasattr(stream, 'peek'): - return stream - if not (hasattr(stream, 'tell') and hasattr(stream, 'seek')): - try: - return io.BufferedReader(stream) - except Exception: - pass - return _PeekableReader(stream) - -def _identify_module(file, main=None): - """identify the name of the module stored in the given file-type object""" - from pickletools import genops - UNICODE = {'UNICODE', 'BINUNICODE', 'SHORT_BINUNICODE'} - found_import = False - try: - for opcode, arg, pos in genops(file.peek(256)): - if not found_import: - if opcode.name in ('GLOBAL', 'SHORT_BINUNICODE') and \ - arg.endswith('_import_module'): - found_import = True - else: - if opcode.name in UNICODE: - return arg - else: - raise UnpicklingError("reached STOP without finding main module") - except (NotImplementedError, ValueError) as error: - # ValueError occours when the end of the chunk is reached (without a STOP). - if isinstance(error, NotImplementedError) and main is not None: - # file is not peekable, but we have main. - return None - raise UnpicklingError("unable to identify main module") from error - -def load_module( - filename: Union[str, os.PathLike] = None, - module: Optional[Union[ModuleType, str]] = None, - **kwds -) -> Optional[ModuleType]: - """Update the selected module (default is :py:mod:`__main__`) with - the state saved at ``filename``. - - Restore a module to the state saved with :py:func:`dump_module`. The - saved module can be :py:mod:`__main__` (e.g. an interpreter session), - an imported module, or a module-type object (e.g. created with - :py:class:`~types.ModuleType`). - - When restoring the state of a non-importable module-type object, the - current instance of this module may be passed as the argument ``main``. - Otherwise, a new instance is created with :py:class:`~types.ModuleType` - and returned. - - Args: - filename: a path-like object or a readable stream. If `None` - (the default), read from a named file in a temporary directory. - module: a module object or the name of an importable module; - the module name and kind (i.e. imported or non-imported) must - match the name and kind of the module stored at ``filename``. - **kwds: extra keyword arguments passed to :py:class:`Unpickler()`. - - Raises: - :py:exc:`UnpicklingError`: if unpickling fails. - :py:exc:`ValueError`: if the argument ``main`` and module saved - at ``filename`` are incompatible. - - Returns: - A module object, if the saved module is not :py:mod:`__main__` or - a module instance wasn't provided with the argument ``main``. - - Examples: - - - Save the state of some modules: - - >>> import dill - >>> squared = lambda x: x*x - >>> dill.dump_module() # save state of __main__ to /tmp/session.pkl - >>> - >>> import pox # an imported module - >>> pox.plus_one = lambda x: x+1 - >>> dill.dump_module('pox_session.pkl', module=pox) - >>> - >>> from types import ModuleType - >>> foo = ModuleType('foo') # a module-type object - >>> foo.values = [1,2,3] - >>> import math - >>> foo.sin = math.sin - >>> dill.dump_module('foo_session.pkl', module=foo, refimported=True) - - - Restore the state of the interpreter: - - >>> import dill - >>> dill.load_module() # updates __main__ from /tmp/session.pkl - >>> squared(2) - 4 - - - Load the saved state of an importable module: - - >>> import dill - >>> pox = dill.load_module('pox_session.pkl') - >>> pox.plus_one(1) - 2 - >>> import sys - >>> pox in sys.modules.values() - True - - - Load the saved state of a non-importable module-type object: - - >>> import dill - >>> foo = dill.load_module('foo_session.pkl') - >>> [foo.sin(x) for x in foo.values] - [0.8414709848078965, 0.9092974268256817, 0.1411200080598672] - >>> import math - >>> foo.sin is math.sin # foo.sin was saved by reference - True - >>> import sys - >>> foo in sys.modules.values() - False - - - Update the state of a non-importable module-type object: - - >>> import dill - >>> from types import ModuleType - >>> foo = ModuleType('foo') - >>> foo.values = ['a','b'] - >>> foo.sin = lambda x: x*x - >>> dill.load_module('foo_session.pkl', module=foo) - >>> [foo.sin(x) for x in foo.values] - [0.8414709848078965, 0.9092974268256817, 0.1411200080598672] - - *Changed in version 0.3.6:* Function ``load_session()`` was renamed to - ``load_module()``. Parameter ``main`` was renamed to ``module``. - - See also: - :py:func:`load_module_asdict` to load the contents of module saved - with :py:func:`dump_module` into a dictionary. - """ - if 'main' in kwds: - warnings.warn( - "The argument 'main' has been renamed 'module'.", - PendingDeprecationWarning - ) - if module is not None: - raise TypeError("both 'module' and 'main' arguments were used") - module = kwds.pop('main') - main = module - if hasattr(filename, 'read'): - file = filename - else: - if filename is None: - filename = str(TEMPDIR/'session.pkl') - file = open(filename, 'rb') - try: - file = _make_peekable(file) - #FIXME: dill.settings are disabled - unpickler = Unpickler(file, **kwds) - unpickler._session = True - - # Resolve unpickler._main - pickle_main = _identify_module(file, main) - if main is None and pickle_main is not None: - main = pickle_main - if isinstance(main, str): - if main.startswith('__runtime__.'): - # Create runtime module to load the session into. - main = ModuleType(main.partition('.')[-1]) - else: - main = _import_module(main) - if main is not None: - if not isinstance(main, ModuleType): - raise TypeError("%r is not a module" % main) - unpickler._main = main - else: - main = unpickler._main - - # Check against the pickle's main. - is_main_imported = _is_imported_module(main) - if pickle_main is not None: - is_runtime_mod = pickle_main.startswith('__runtime__.') - if is_runtime_mod: - pickle_main = pickle_main.partition('.')[-1] - error_msg = "can't update{} module{} %r with the saved state of{} module{} %r" - if is_runtime_mod and is_main_imported: - raise ValueError( - error_msg.format(" imported", "", "", "-type object") - % (main.__name__, pickle_main) - ) - if not is_runtime_mod and not is_main_imported: - raise ValueError( - error_msg.format("", "-type object", " imported", "") - % (pickle_main, main.__name__) - ) - if main.__name__ != pickle_main: - raise ValueError(error_msg.format("", "", "", "") % (main.__name__, pickle_main)) - - # This is for find_class() to be able to locate it. - if not is_main_imported: - runtime_main = '__runtime__.%s' % main.__name__ - sys.modules[runtime_main] = main - - loaded = unpickler.load() - finally: - if not hasattr(filename, 'read'): # if newly opened file - file.close() - try: - del sys.modules[runtime_main] - except (KeyError, NameError): - pass - assert loaded is main - _restore_modules(unpickler, main) - if main is _main_module or main is module: - return None - else: - return main - -# Backward compatibility. -def load_session(filename=None, main=None, **kwds): - warnings.warn("load_session() has been renamed load_module().", PendingDeprecationWarning) - load_module(filename, module=main, **kwds) -load_session.__doc__ = load_module.__doc__ - -def load_module_asdict( - filename: Union[str, os.PathLike] = None, - update: bool = False, - **kwds -) -> dict: - """ - Load the contents of a saved module into a dictionary. - - ``load_module_asdict()`` is the near-equivalent of:: - - lambda filename: vars(dill.load_module(filename)).copy() - - however, does not alter the original module. Also, the path of - the loaded module is stored in the ``__session__`` attribute. - - Args: - filename: a path-like object or a readable stream. If `None` - (the default), read from a named file in a temporary directory. - update: if `True`, initialize the dictionary with the current state - of the module prior to loading the state stored at filename. - **kwds: extra keyword arguments passed to :py:class:`Unpickler()` - - Raises: - :py:exc:`UnpicklingError`: if unpickling fails - - Returns: - A copy of the restored module's dictionary. - - Note: - If ``update`` is True, the corresponding module may first be imported - into the current namespace before the saved state is loaded from - filename to the dictionary. Note that any module that is imported into - the current namespace as a side-effect of using ``update`` will not be - modified by loading the saved module in filename to a dictionary. - - Example: - >>> import dill - >>> alist = [1, 2, 3] - >>> anum = 42 - >>> dill.dump_module() - >>> anum = 0 - >>> new_var = 'spam' - >>> main = dill.load_module_asdict() - >>> main['__name__'], main['__session__'] - ('__main__', '/tmp/session.pkl') - >>> main is globals() # loaded objects don't reference globals - False - >>> main['alist'] == alist - True - >>> main['alist'] is alist # was saved by value - False - >>> main['anum'] == anum # changed after the session was saved - False - >>> new_var in main # would be True if the option 'update' was set - False - """ - if 'module' in kwds: - raise TypeError("'module' is an invalid keyword argument for load_module_asdict()") - if hasattr(filename, 'read'): - file = filename - else: - if filename is None: - filename = str(TEMPDIR/'session.pkl') - file = open(filename, 'rb') - try: - file = _make_peekable(file) - main_name = _identify_module(file) - old_main = sys.modules.get(main_name) - main = ModuleType(main_name) - if update: - if old_main is None: - old_main = _import_module(main_name) - main.__dict__.update(old_main.__dict__) - else: - main.__builtins__ = __builtin__ - sys.modules[main_name] = main - load_module(file, **kwds) - finally: - if not hasattr(filename, 'read'): # if newly opened file - file.close() - try: - if old_main is None: - del sys.modules[main_name] - else: - sys.modules[main_name] = old_main - except NameError: # failed before setting old_main - pass - main.__session__ = str(filename) - return main.__dict__ - - -# Internal exports for backward compatibility with dill v0.3.5.1 -# Can't be placed in dill._dill because of circular import problems. -for name in ( - '_lookup_module', '_module_map', '_restore_modules', '_stash_modules', - 'dump_session', 'load_session' # backward compatibility functions -): - setattr(_dill, name, globals()[name]) -del name diff --git a/venv/lib/python3.12/site-packages/dill/settings.py b/venv/lib/python3.12/site-packages/dill/settings.py deleted file mode 100644 index eb07fef..0000000 --- a/venv/lib/python3.12/site-packages/dill/settings.py +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE -""" -global settings for Pickler -""" - -from pickle import DEFAULT_PROTOCOL - -settings = { - #'main' : None, - 'protocol' : DEFAULT_PROTOCOL, - 'byref' : False, - #'strictio' : False, - 'fmode' : 0, #HANDLE_FMODE - 'recurse' : False, - 'ignore' : False, -} - -del DEFAULT_PROTOCOL - diff --git a/venv/lib/python3.12/site-packages/dill/source.py b/venv/lib/python3.12/site-packages/dill/source.py deleted file mode 100644 index b77d9fb..0000000 --- a/venv/lib/python3.12/site-packages/dill/source.py +++ /dev/null @@ -1,1025 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE -# -# inspired by inspect.py from Python-2.7.6 -# inspect.py author: 'Ka-Ping Yee ' -# inspect.py merged into original dill.source by Mike McKerns 4/13/14 -""" -Extensions to python's 'inspect' module, which can be used -to retrieve information from live python objects. The methods -defined in this module are augmented to facilitate access to -source code of interactively defined functions and classes, -as well as provide access to source code for objects defined -in a file. -""" - -__all__ = ['findsource', 'getsourcelines', 'getsource', 'indent', 'outdent', \ - '_wrap', 'dumpsource', 'getname', '_namespace', 'getimport', \ - '_importable', 'importable','isdynamic', 'isfrommain'] - -import linecache -import re -from inspect import (getblock, getfile, getmodule, getsourcefile, indentsize, - isbuiltin, isclass, iscode, isframe, isfunction, ismethod, - ismodule, istraceback) -from tokenize import TokenError - -from ._dill import IS_IPYTHON - - -def isfrommain(obj): - "check if object was built in __main__" - module = getmodule(obj) - if module and module.__name__ == '__main__': - return True - return False - - -def isdynamic(obj): - "check if object was built in the interpreter" - try: file = getfile(obj) - except TypeError: file = None - if file == '' and isfrommain(obj): - return True - return False - - -def _matchlambda(func, line): - """check if lambda object 'func' matches raw line of code 'line'""" - from .detect import code as getcode - from .detect import freevars, globalvars, varnames - dummy = lambda : '__this_is_a_big_dummy_function__' - # process the line (removing leading whitespace, etc) - lhs,rhs = line.split('lambda ',1)[-1].split(":", 1) #FIXME: if !1 inputs - try: #FIXME: unsafe - _ = eval("lambda %s : %s" % (lhs,rhs), globals(),locals()) - except Exception: _ = dummy - # get code objects, for comparison - _, code = getcode(_).co_code, getcode(func).co_code - # check if func is in closure - _f = [line.count(i) for i in freevars(func).keys()] - if not _f: # not in closure - # check if code matches - if _ == code: return True - return False - # weak check on freevars - if not all(_f): return False #XXX: VERY WEAK - # weak check on varnames and globalvars - _f = varnames(func) - _f = [line.count(i) for i in _f[0]+_f[1]] - if _f and not all(_f): return False #XXX: VERY WEAK - _f = [line.count(i) for i in globalvars(func).keys()] - if _f and not all(_f): return False #XXX: VERY WEAK - # check if func is a double lambda - if (line.count('lambda ') > 1) and (lhs in freevars(func).keys()): - _lhs,_rhs = rhs.split('lambda ',1)[-1].split(":",1) #FIXME: if !1 inputs - try: #FIXME: unsafe - _f = eval("lambda %s : %s" % (_lhs,_rhs), globals(),locals()) - except Exception: _f = dummy - # get code objects, for comparison - _, code = getcode(_f).co_code, getcode(func).co_code - if len(_) != len(code): return False - #NOTE: should be same code same order, but except for 't' and '\x88' - _ = set((i,j) for (i,j) in zip(_,code) if i != j) - if len(_) != 1: return False #('t','\x88') - return True - # check indentsize - if not indentsize(line): return False #FIXME: is this a good check??? - # check if code 'pattern' matches - #XXX: or pattern match against dis.dis(code)? (or use uncompyle2?) - _ = _.split(_[0]) # 't' #XXX: remove matching values if starts the same? - _f = code.split(code[0]) # '\x88' - #NOTE: should be same code different order, with different first element - _ = dict(re.match(r'([\W\D\S])(.*)', _[i]).groups() for i in range(1,len(_))) - _f = dict(re.match(r'([\W\D\S])(.*)', _f[i]).groups() for i in range(1,len(_f))) - if (_.keys() == _f.keys()) and (sorted(_.values()) == sorted(_f.values())): - return True - return False - - -def findsource(object): - """Return the entire source file and starting line number for an object. - For interactively-defined objects, the 'file' is the interpreter's history. - - The argument may be a module, class, method, function, traceback, frame, - or code object. The source code is returned as a list of all the lines - in the file and the line number indexes a line in that list. An IOError - is raised if the source code cannot be retrieved, while a TypeError is - raised for objects where the source code is unavailable (e.g. builtins).""" - - module = getmodule(object) - try: file = getfile(module) - except TypeError: file = None - is_module_main = (module and module.__name__ == '__main__' and not file) - if IS_IPYTHON and is_module_main: - #FIXME: quick fix for functions and classes in IPython interpreter - try: - file = getfile(object) - sourcefile = getsourcefile(object) - except TypeError: - if isclass(object): - for object_method in filter(isfunction, object.__dict__.values()): - # look for a method of the class - file_candidate = getfile(object_method) - if not file_candidate.startswith('': pat1 = r'(.*(?': - pat1 = r'(.*(?' - if stdin: - lnum = len(lines) - 1 # can't get lnum easily, so leverage pat - if not pat1: pat1 = r'^(\s*def\s)|(.*(? 0: #XXX: won't find decorators in ? - line = lines[lnum] - if pat1.match(line): - if not stdin: break # co_firstlineno does the job - if name == '': # hackery needed to confirm a match - if _matchlambda(obj, line): break - else: # not a lambda, just look for the name - if name in line: # need to check for decorator... - hats = 0 - for _lnum in range(lnum-1,-1,-1): - if pat2.match(lines[_lnum]): hats += 1 - else: break - lnum = lnum - hats - break - lnum = lnum - 1 - return lines, lnum - - try: # turn instances into classes - if not isclass(object) and isclass(type(object)): # __class__ - object = object.__class__ #XXX: sometimes type(class) is better? - #XXX: we don't find how the instance was built - except AttributeError: pass - if isclass(object): - name = object.__name__ - pat = re.compile(r'^(\s*)class\s*' + name + r'\b') - # make some effort to find the best matching class definition: - # use the one with the least indentation, which is the one - # that's most probably not inside a function definition. - candidates = [] - for i in range(len(lines)-1,-1,-1): - match = pat.match(lines[i]) - if match: - # if it's at toplevel, it's already the best one - if lines[i][0] == 'c': - return lines, i - # else add whitespace to candidate list - candidates.append((match.group(1), i)) - if candidates: - # this will sort by whitespace, and by line number, - # less whitespace first #XXX: should sort high lnum before low - candidates.sort() - return lines, candidates[0][1] - else: - raise IOError('could not find class definition') - raise IOError('could not find code object') - - -def getblocks(object, lstrip=False, enclosing=False, locate=False): - """Return a list of source lines and starting line number for an object. - Interactively-defined objects refer to lines in the interpreter's history. - - If enclosing=True, then also return any enclosing code. - If lstrip=True, ensure there is no indentation in the first line of code. - If locate=True, then also return the line number for the block of code. - - DEPRECATED: use 'getsourcelines' instead - """ - lines, lnum = findsource(object) - - if ismodule(object): - if lstrip: lines = _outdent(lines) - return ([lines], [0]) if locate is True else [lines] - - #XXX: 'enclosing' means: closures only? or classes and files? - indent = indentsize(lines[lnum]) - block = getblock(lines[lnum:]) #XXX: catch any TokenError here? - - if not enclosing or not indent: - if lstrip: block = _outdent(block) - return ([block], [lnum]) if locate is True else [block] - - pat1 = r'^(\s*def\s)|(.*(? indent: #XXX: should be >= ? - line += len(code) - skip - elif target in ''.join(code): - blocks.append(code) # save code block as the potential winner - _lnum.append(line - skip) # save the line number for the match - line += len(code) - skip - else: - line += 1 - skip = 0 - # find skip: the number of consecutive decorators - elif pat2.match(lines[line]): - try: code = getblock(lines[line:]) - except TokenError: code = [lines[line]] - skip = 1 - for _line in code[1:]: # skip lines that are decorators - if not pat2.match(_line): break - skip += 1 - line += skip - # no match: reset skip and go to the next line - else: - line +=1 - skip = 0 - - if not blocks: - blocks = [block] - _lnum = [lnum] - if lstrip: blocks = [_outdent(block) for block in blocks] - # return last match - return (blocks, _lnum) if locate is True else blocks - - -def getsourcelines(object, lstrip=False, enclosing=False): - """Return a list of source lines and starting line number for an object. - Interactively-defined objects refer to lines in the interpreter's history. - - The argument may be a module, class, method, function, traceback, frame, - or code object. The source code is returned as a list of the lines - corresponding to the object and the line number indicates where in the - original source file the first line of code was found. An IOError is - raised if the source code cannot be retrieved, while a TypeError is - raised for objects where the source code is unavailable (e.g. builtins). - - If lstrip=True, ensure there is no indentation in the first line of code. - If enclosing=True, then also return any enclosing code.""" - code, n = getblocks(object, lstrip=lstrip, enclosing=enclosing, locate=True) - return code[-1], n[-1] - - -#NOTE: broke backward compatibility 4/16/14 (was lstrip=True, force=True) -def getsource(object, alias='', lstrip=False, enclosing=False, \ - force=False, builtin=False): - """Return the text of the source code for an object. The source code for - interactively-defined objects are extracted from the interpreter's history. - - The argument may be a module, class, method, function, traceback, frame, - or code object. The source code is returned as a single string. An - IOError is raised if the source code cannot be retrieved, while a - TypeError is raised for objects where the source code is unavailable - (e.g. builtins). - - If alias is provided, then add a line of code that renames the object. - If lstrip=True, ensure there is no indentation in the first line of code. - If enclosing=True, then also return any enclosing code. - If force=True, catch (TypeError,IOError) and try to use import hooks. - If builtin=True, force an import for any builtins - """ - # hascode denotes a callable - hascode = _hascode(object) - # is a class instance type (and not in builtins) - instance = _isinstance(object) - - # get source lines; if fail, try to 'force' an import - try: # fails for builtins, and other assorted object types - lines, lnum = getsourcelines(object, enclosing=enclosing) - except (TypeError, IOError): # failed to get source, resort to import hooks - if not force: # don't try to get types that findsource can't get - raise - if not getmodule(object): # get things like 'None' and '1' - if not instance: return getimport(object, alias, builtin=builtin) - # special handling (numpy arrays, ...) - _import = getimport(object, builtin=builtin) - name = getname(object, force=True) - _alias = "%s = " % alias if alias else "" - if alias == name: _alias = "" - return _import+_alias+"%s\n" % name - else: #FIXME: could use a good bit of cleanup, since using getimport... - if not instance: return getimport(object, alias, builtin=builtin) - # now we are dealing with an instance... - name = object.__class__.__name__ - module = object.__module__ - if not name.isidentifier() or not all(i.isidentifier() for i in module.split('.')): #XXX: does exclusing malicious code exclude valid use? - raise SyntaxError('invalid syntax') - if module in ['builtins','__builtin__']: - return getimport(object, alias, builtin=builtin) - else: #FIXME: leverage getimport? use 'from module import name'? - lines, lnum = ["%s = __import__('%s', fromlist=['%s']).%s\n" % (name,module,name,name)], 0 - obj = eval(lines[0].lstrip(name + ' = ')) - lines, lnum = getsourcelines(obj, enclosing=enclosing) - - # strip leading indent (helps ensure can be imported) - if lstrip or alias: - lines = _outdent(lines) - - # instantiate, if there's a nice repr #XXX: BAD IDEA??? - if instance: #and force: #XXX: move into findsource or getsourcelines ? - if '(' in repr(object): lines.append('%r\n' % object) - #else: #XXX: better to somehow to leverage __reduce__ ? - # reconstructor,args = object.__reduce__() - # _ = reconstructor(*args) - else: # fall back to serialization #XXX: bad idea? - #XXX: better not duplicate work? #XXX: better new/enclose=True? - lines = dumpsource(object, alias='', new=force, enclose=False) - lines, lnum = [line+'\n' for line in lines.split('\n')][:-1], 0 - #else: object.__code__ # raise AttributeError - - # add an alias to the source code - if alias: - if hascode: - skip = 0 - for line in lines: # skip lines that are decorators - if not line.startswith('@'): break - skip += 1 - #XXX: use regex from findsource / getsourcelines ? - if lines[skip].lstrip().startswith('def '): # we have a function - if alias != object.__name__: - lines.append('\n%s = %s\n' % (alias, object.__name__)) - elif 'lambda ' in lines[skip]: # we have a lambda - if alias != lines[skip].split('=')[0].strip(): - lines[skip] = '%s = %s' % (alias, lines[skip]) - else: # ...try to use the object's name - if alias != object.__name__: - lines.append('\n%s = %s\n' % (alias, object.__name__)) - else: # class or class instance - if instance: - if alias != lines[-1].split('=')[0].strip(): - lines[-1] = ('%s = ' % alias) + lines[-1] - else: - name = getname(object, force=True) or object.__name__ - if alias != name: - lines.append('\n%s = %s\n' % (alias, name)) - return ''.join(lines) - - -def _hascode(object): - '''True if object has an attribute that stores it's __code__''' - return getattr(object,'__code__',None) or getattr(object,'func_code',None) - -def _isinstance(object): - '''True if object is a class instance type (and is not a builtin)''' - if _hascode(object) or isclass(object) or ismodule(object): - return False - if istraceback(object) or isframe(object) or iscode(object): - return False - # special handling (numpy arrays, ...) - if not getmodule(object) and getmodule(type(object)).__name__ in ['numpy']: - return True -# # check if is instance of a builtin -# if not getmodule(object) and getmodule(type(object)).__name__ in ['__builtin__','builtins']: -# return False - _types = ('") - if not repr(type(object)).startswith(_types): #FIXME: weak hack - return False - if not getmodule(object) or object.__module__ in ['builtins','__builtin__'] or getname(object, force=True) in ['array']: - return False - return True # by process of elimination... it's what we want - - -def _intypes(object): - '''check if object is in the 'types' module''' - import types - # allow user to pass in object or object.__name__ - if type(object) is not type(''): - object = getname(object, force=True) - if object == 'ellipsis': object = 'EllipsisType' - return True if hasattr(types, object) else False - - -def _isstring(object): #XXX: isstringlike better? - '''check if object is a string-like type''' - return isinstance(object, (str, bytes)) - - -def indent(code, spaces=4): - '''indent a block of code with whitespace (default is 4 spaces)''' - indent = indentsize(code) - from numbers import Integral - if isinstance(spaces, Integral): spaces = ' '*spaces - # if '\t' is provided, will indent with a tab - nspaces = indentsize(spaces) - # blank lines (etc) need to be ignored - lines = code.split('\n') -## stq = "'''"; dtq = '"""' -## in_stq = in_dtq = False - for i in range(len(lines)): - #FIXME: works... but shouldn't indent 2nd+ lines of multiline doc - _indent = indentsize(lines[i]) - if indent > _indent: continue - lines[i] = spaces+lines[i] -## #FIXME: may fail when stq and dtq in same line (depends on ordering) -## nstq, ndtq = lines[i].count(stq), lines[i].count(dtq) -## if not in_dtq and not in_stq: -## lines[i] = spaces+lines[i] # we indent -## # entering a comment block -## if nstq%2: in_stq = not in_stq -## if ndtq%2: in_dtq = not in_dtq -## # leaving a comment block -## elif in_dtq and ndtq%2: in_dtq = not in_dtq -## elif in_stq and nstq%2: in_stq = not in_stq -## else: pass - if lines[-1].strip() == '': lines[-1] = '' - return '\n'.join(lines) - - -def _outdent(lines, spaces=None, all=True): - '''outdent lines of code, accounting for docs and line continuations''' - indent = indentsize(lines[0]) - if spaces is None or spaces > indent or spaces < 0: spaces = indent - for i in range(len(lines) if all else 1): - #FIXME: works... but shouldn't outdent 2nd+ lines of multiline doc - _indent = indentsize(lines[i]) - if spaces > _indent: _spaces = _indent - else: _spaces = spaces - lines[i] = lines[i][_spaces:] - return lines - -def outdent(code, spaces=None, all=True): - '''outdent a block of code (default is to strip all leading whitespace)''' - indent = indentsize(code) - if spaces is None or spaces > indent or spaces < 0: spaces = indent - #XXX: will this delete '\n' in some cases? - if not all: return code[spaces:] - return '\n'.join(_outdent(code.split('\n'), spaces=spaces, all=all)) - - -# _wrap provides an wrapper to correctly exec and load into locals -__globals__ = globals() -__locals__ = locals() -def _wrap(f): - """ encapsulate a function and it's __import__ """ - def func(*args, **kwds): - try: - # _ = eval(getsource(f, force=True)) #XXX: safer but less robust - exec(getimportable(f, alias='_'), __globals__, __locals__) - except Exception: - raise ImportError('cannot import name ' + f.__name__) - return _(*args, **kwds) - func.__name__ = f.__name__ - func.__doc__ = f.__doc__ - return func - - -def _enclose(object, alias=''): #FIXME: needs alias to hold returned object - """create a function enclosure around the source of some object""" - #XXX: dummy and stub should append a random string - dummy = '__this_is_a_big_dummy_enclosing_function__' - stub = '__this_is_a_stub_variable__' - code = 'def %s():\n' % dummy - code += indent(getsource(object, alias=stub, lstrip=True, force=True)) - code += indent('return %s\n' % stub) - if alias: code += '%s = ' % alias - code += '%s(); del %s\n' % (dummy, dummy) - #code += "globals().pop('%s',lambda :None)()\n" % dummy - return code - - -def dumpsource(object, alias='', new=False, enclose=True): - """'dump to source', where the code includes a pickled object. - - If new=True and object is a class instance, then create a new - instance using the unpacked class source code. If enclose, then - create the object inside a function enclosure (thus minimizing - any global namespace pollution). - """ - from dill import dumps - pik = repr(dumps(object)) - code = 'import dill\n' - if enclose: - stub = '__this_is_a_stub_variable__' #XXX: *must* be same _enclose.stub - pre = '%s = ' % stub - new = False #FIXME: new=True doesn't work with enclose=True - else: - stub = alias - pre = '%s = ' % stub if alias else alias - - # if a 'new' instance is not needed, then just dump and load - if not new or not _isinstance(object): - code += pre + 'dill.loads(%s)\n' % pik - else: #XXX: other cases where source code is needed??? - code += getsource(object.__class__, alias='', lstrip=True, force=True) - mod = repr(object.__module__) # should have a module (no builtins here) - code += pre + 'dill.loads(%s.replace(b%s,bytes(__name__,"UTF-8")))\n' % (pik,mod) - #code += 'del %s' % object.__class__.__name__ #NOTE: kills any existing! - - if enclose: - # generation of the 'enclosure' - dummy = '__this_is_a_big_dummy_object__' - dummy = _enclose(dummy, alias=alias) - # hack to replace the 'dummy' with the 'real' code - dummy = dummy.split('\n') - code = dummy[0]+'\n' + indent(code) + '\n'.join(dummy[-3:]) - - return code #XXX: better 'dumpsourcelines', returning list of lines? - - -def getname(obj, force=False, fqn=False): #XXX: throw(?) to raise error on fail? - """get the name of the object. for lambdas, get the name of the pointer """ - if fqn: return '.'.join(_namespace(obj)) #NOTE: returns 'type' - module = getmodule(obj) - if not module: # things like "None" and "1" - if not force: return None #NOTE: returns 'instance' NOT 'type' #FIXME? - # handle some special cases - if hasattr(obj, 'dtype') and not obj.shape: - return getname(obj.__class__) + "(" + repr(obj.tolist()) + ")" - return repr(obj) - try: - #XXX: 'wrong' for decorators and curried functions ? - # if obj.func_closure: ...use logic from getimportable, etc ? - name = obj.__name__ - if name == '': - return getsource(obj).split('=',1)[0].strip() - # handle some special cases - if module.__name__ in ['builtins','__builtin__']: - if name == 'ellipsis': name = 'EllipsisType' - return name - except AttributeError: #XXX: better to just throw AttributeError ? - if not force: return None - name = repr(obj) - if name.startswith('<'): # or name.split('('): - return None - return name - - -def _namespace(obj): - """_namespace(obj); return namespace hierarchy (as a list of names) - for the given object. For an instance, find the class hierarchy. - - For example: - - >>> from functools import partial - >>> p = partial(int, base=2) - >>> _namespace(p) - [\'functools\', \'partial\'] - """ - # mostly for functions and modules and such - #FIXME: 'wrong' for decorators and curried functions - try: #XXX: needs some work and testing on different types - module = qual = str(getmodule(obj)).split()[1].strip('>').strip('"').strip("'") - qual = qual.split('.') - if ismodule(obj): - return qual - # get name of a lambda, function, etc - name = getname(obj) or obj.__name__ # failing, raise AttributeError - # check special cases (NoneType, ...) - if module in ['builtins','__builtin__']: # BuiltinFunctionType - if _intypes(name): return ['types'] + [name] - return qual + [name] #XXX: can be wrong for some aliased objects - except Exception: pass - # special case: numpy.inf and numpy.nan (we don't want them as floats) - if str(obj) in ['inf','nan','Inf','NaN']: # is more, but are they needed? - return ['numpy'] + [str(obj)] - # mostly for classes and class instances and such - module = getattr(obj.__class__, '__module__', None) - qual = str(obj.__class__) - try: qual = qual[qual.index("'")+1:-2] - except ValueError: pass # str(obj.__class__) made the 'try' unnecessary - qual = qual.split(".") - if module in ['builtins','__builtin__']: - # check special cases (NoneType, Ellipsis, ...) - if qual[-1] == 'ellipsis': qual[-1] = 'EllipsisType' - if _intypes(qual[-1]): module = 'types' #XXX: BuiltinFunctionType - qual = [module] + qual - return qual - - -#NOTE: 05/25/14 broke backward compatibility: added 'alias' as 3rd argument -def _getimport(head, tail, alias='', verify=True, builtin=False): - """helper to build a likely import string from head and tail of namespace. - ('head','tail') are used in the following context: "from head import tail" - - If verify=True, then test the import string before returning it. - If builtin=True, then force an import for builtins where possible. - If alias is provided, then rename the object on import. - """ - # special handling for a few common types - if tail in ['Ellipsis', 'NotImplemented'] and head in ['types']: - head = len.__module__ - elif tail in ['None'] and head in ['types']: - _alias = '%s = ' % alias if alias else '' - if alias == tail: _alias = '' - return _alias+'%s\n' % tail - # we don't need to import from builtins, so return '' -# elif tail in ['NoneType','int','float','long','complex']: return '' #XXX: ? - if head in ['builtins','__builtin__']: - # special cases (NoneType, Ellipsis, ...) #XXX: BuiltinFunctionType - if tail == 'ellipsis': tail = 'EllipsisType' - if _intypes(tail): head = 'types' - elif not builtin: - _alias = '%s = ' % alias if alias else '' - if alias == tail: _alias = '' - return _alias+'%s\n' % tail - else: pass # handle builtins below - # get likely import string - if not head: _str = "import %s" % tail - else: _str = "from %s import %s" % (head, tail) - _alias = " as %s\n" % alias if alias else "\n" - if alias == tail: _alias = "\n" - _str += _alias - # FIXME: fails on most decorators, currying, and such... - # (could look for magic __wrapped__ or __func__ attr) - # (could fix in 'namespace' to check obj for closure) - if verify and not head.startswith('dill.'):# weird behavior for dill - #print(_str) - try: exec(_str) #XXX: check if == obj? (name collision) - except ImportError: #XXX: better top-down or bottom-up recursion? - _head = head.rsplit(".",1)[0] #(or get all, then compare == obj?) - if not _head: raise - if _head != head: - _str = _getimport(_head, tail, alias, verify) - return _str - - -#XXX: rename builtin to force? vice versa? verify to force? (as in getsource) -#NOTE: 05/25/14 broke backward compatibility: added 'alias' as 2nd argument -def getimport(obj, alias='', verify=True, builtin=False, enclosing=False): - """get the likely import string for the given object - - obj is the object to inspect - If verify=True, then test the import string before returning it. - If builtin=True, then force an import for builtins where possible. - If enclosing=True, get the import for the outermost enclosing callable. - If alias is provided, then rename the object on import. - """ - if enclosing: - from .detect import outermost - _obj = outermost(obj) - obj = _obj if _obj else obj - # get the namespace - qual = _namespace(obj) - head = '.'.join(qual[:-1]) - tail = qual[-1] - # for named things... with a nice repr #XXX: move into _namespace? - try: # look for '<...>' and be mindful it might be in lists, dicts, etc... - name = repr(obj).split('<',1)[1].split('>',1)[1] - name = None # we have a 'object'-style repr - except Exception: # it's probably something 'importable' - if head in ['builtins','__builtin__']: - name = repr(obj) #XXX: catch [1,2], (1,2), set([1,2])... others? - elif _isinstance(obj): - name = getname(obj, force=True).split('(')[0] - else: - name = repr(obj).split('(')[0] - #if not repr(obj).startswith('<'): name = repr(obj).split('(')[0] - #else: name = None - if name: # try using name instead of tail - try: return _getimport(head, name, alias, verify, builtin) - except ImportError: pass - except SyntaxError: - if head in ['builtins','__builtin__']: - _alias = '%s = ' % alias if alias else '' - if alias == name: _alias = '' - return _alias+'%s\n' % name - else: pass - try: - #if type(obj) is type(abs): _builtin = builtin # BuiltinFunctionType - #else: _builtin = False - return _getimport(head, tail, alias, verify, builtin) - except ImportError: - raise # could do some checking against obj - except SyntaxError: - if head in ['builtins','__builtin__']: - _alias = '%s = ' % alias if alias else '' - if alias == tail: _alias = '' - return _alias+'%s\n' % tail - raise # could do some checking against obj - - -def _importable(obj, alias='', source=None, enclosing=False, force=True, \ - builtin=True, lstrip=True): - """get an import string (or the source code) for the given object - - This function will attempt to discover the name of the object, or the repr - of the object, or the source code for the object. To attempt to force - discovery of the source code, use source=True, to attempt to force the - use of an import, use source=False; otherwise an import will be sought - for objects not defined in __main__. The intent is to build a string - that can be imported from a python file. obj is the object to inspect. - If alias is provided, then rename the object with the given alias. - - If source=True, use these options: - If enclosing=True, then also return any enclosing code. - If force=True, catch (TypeError,IOError) and try to use import hooks. - If lstrip=True, ensure there is no indentation in the first line of code. - - If source=False, use these options: - If enclosing=True, get the import for the outermost enclosing callable. - If force=True, then don't test the import string before returning it. - If builtin=True, then force an import for builtins where possible. - """ - if source is None: - source = True if isfrommain(obj) else False - if source: # first try to get the source - try: - return getsource(obj, alias, enclosing=enclosing, \ - force=force, lstrip=lstrip, builtin=builtin) - except Exception: pass - try: - if not _isinstance(obj): - return getimport(obj, alias, enclosing=enclosing, \ - verify=(not force), builtin=builtin) - # first 'get the import', then 'get the instance' - _import = getimport(obj, enclosing=enclosing, \ - verify=(not force), builtin=builtin) - name = getname(obj, force=True) - if not name: - raise AttributeError("object has no atribute '__name__'") - _alias = "%s = " % alias if alias else "" - if alias == name: _alias = "" - return _import+_alias+"%s\n" % name - - except Exception: pass - if not source: # try getsource, only if it hasn't been tried yet - try: - return getsource(obj, alias, enclosing=enclosing, \ - force=force, lstrip=lstrip, builtin=builtin) - except Exception: pass - # get the name (of functions, lambdas, and classes) - # or hope that obj can be built from the __repr__ - #XXX: what to do about class instances and such? - obj = getname(obj, force=force) - # we either have __repr__ or __name__ (or None) - if not obj or obj.startswith('<'): - raise AttributeError("object has no atribute '__name__'") - _alias = '%s = ' % alias if alias else '' - if alias == obj: _alias = '' - return _alias+'%s\n' % obj - #XXX: possible failsafe... (for example, for instances when source=False) - # "import dill; result = dill.loads(); # repr()" - -def _closuredimport(func, alias='', builtin=False): - """get import for closured objects; return a dict of 'name' and 'import'""" - import re - from .detect import freevars, outermost - free_vars = freevars(func) - func_vars = {} - # split into 'funcs' and 'non-funcs' - for name,obj in list(free_vars.items()): - if not isfunction(obj): continue - # get import for 'funcs' - fobj = free_vars.pop(name) - src = getsource(fobj) - if src.lstrip().startswith('@'): # we have a decorator - src = getimport(fobj, alias=alias, builtin=builtin) - else: # we have to "hack" a bit... and maybe be lucky - encl = outermost(func) - # pattern: 'func = enclosing(fobj' - pat = r'.*[\w\s]=\s*'+getname(encl)+r'\('+getname(fobj) - mod = getname(getmodule(encl)) - #HACK: get file containing 'outer' function; is func there? - lines,_ = findsource(encl) - candidate = [line for line in lines if getname(encl) in line and \ - re.match(pat, line)] - if not candidate: - mod = getname(getmodule(fobj)) - #HACK: get file containing 'inner' function; is func there? - lines,_ = findsource(fobj) - candidate = [line for line in lines \ - if getname(fobj) in line and re.match(pat, line)] - if not len(candidate): raise TypeError('import could not be found') - candidate = candidate[-1] - name = candidate.split('=',1)[0].split()[-1].strip() - src = _getimport(mod, name, alias=alias, builtin=builtin) - func_vars[name] = src - if not func_vars: - name = outermost(func) - mod = getname(getmodule(name)) - if not mod or name is func: # then it can be handled by getimport - name = getname(func, force=True) #XXX: better key? - src = getimport(func, alias=alias, builtin=builtin) - else: - lines,_ = findsource(name) - # pattern: 'func = enclosing(' - candidate = [line for line in lines if getname(name) in line and \ - re.match(r'.*[\w\s]=\s*'+getname(name)+r'\(', line)] - if not len(candidate): raise TypeError('import could not be found') - candidate = candidate[-1] - name = candidate.split('=',1)[0].split()[-1].strip() - src = _getimport(mod, name, alias=alias, builtin=builtin) - func_vars[name] = src - return func_vars - -#XXX: should be able to use __qualname__ -def _closuredsource(func, alias=''): - """get source code for closured objects; return a dict of 'name' - and 'code blocks'""" - #FIXME: this entire function is a messy messy HACK - # - pollutes global namespace - # - fails if name of freevars are reused - # - can unnecessarily duplicate function code - from .detect import freevars - free_vars = freevars(func) - func_vars = {} - # split into 'funcs' and 'non-funcs' - for name,obj in list(free_vars.items()): - if not isfunction(obj): - # get source for 'non-funcs' - free_vars[name] = getsource(obj, force=True, alias=name) - continue - # get source for 'funcs' - fobj = free_vars.pop(name) - src = getsource(fobj, alias) # DO NOT include dependencies - # if source doesn't start with '@', use name as the alias - if not src.lstrip().startswith('@'): #FIXME: 'enclose' in dummy; - src = importable(fobj,alias=name)# wrong ref 'name' - org = getsource(func, alias, enclosing=False, lstrip=True) - src = (src, org) # undecorated first, then target - else: #NOTE: reproduces the code! - org = getsource(func, enclosing=True, lstrip=False) - src = importable(fobj, alias, source=True) # include dependencies - src = (org, src) # target first, then decorated - func_vars[name] = src - src = ''.join(free_vars.values()) - if not func_vars: #FIXME: 'enclose' in dummy; wrong ref 'name' - org = getsource(func, alias, force=True, enclosing=False, lstrip=True) - src = (src, org) # variables first, then target - else: - src = (src, None) # just variables (better '' instead of None?) - func_vars[None] = src - # FIXME: remove duplicates (however, order is important...) - return func_vars - -def importable(obj, alias='', source=None, builtin=True): - """get an importable string (i.e. source code or the import string) - for the given object, including any required objects from the enclosing - and global scope - - This function will attempt to discover the name of the object, or the repr - of the object, or the source code for the object. To attempt to force - discovery of the source code, use source=True, to attempt to force the - use of an import, use source=False; otherwise an import will be sought - for objects not defined in __main__. The intent is to build a string - that can be imported from a python file. - - obj is the object to inspect. If alias is provided, then rename the - object with the given alias. If builtin=True, then force an import for - builtins where possible. - """ - #NOTE: we always 'force', and 'lstrip' as necessary - #NOTE: for 'enclosing', use importable(outermost(obj)) - if source is None: - source = True if isfrommain(obj) else False - elif builtin and isbuiltin(obj): - source = False - tried_source = tried_import = False - while True: - if not source: # we want an import - try: - if _isinstance(obj): # for instances, punt to _importable - return _importable(obj, alias, source=False, builtin=builtin) - src = _closuredimport(obj, alias=alias, builtin=builtin) - if len(src) == 0: - raise NotImplementedError('not implemented') - if len(src) > 1: - raise NotImplementedError('not implemented') - return list(src.values())[0] - except Exception: - if tried_source: raise - tried_import = True - # we want the source - try: - src = _closuredsource(obj, alias=alias) - if len(src) == 0: - raise NotImplementedError('not implemented') - # groan... an inline code stitcher - def _code_stitcher(block): - "stitch together the strings in tuple 'block'" - if block[0] and block[-1]: block = '\n'.join(block) - elif block[0]: block = block[0] - elif block[-1]: block = block[-1] - else: block = '' - return block - # get free_vars first - _src = _code_stitcher(src.pop(None)) - _src = [_src] if _src else [] - # get func_vars - for xxx in src.values(): - xxx = _code_stitcher(xxx) - if xxx: _src.append(xxx) - # make a single source string - if not len(_src): - src = '' - elif len(_src) == 1: - src = _src[0] - else: - src = '\n'.join(_src) - # get source code of objects referred to by obj in global scope - from .detect import globalvars - obj = globalvars(obj) #XXX: don't worry about alias? recurse? etc? - obj = list(getsource(_obj,name,force=True) for (name,_obj) in obj.items() if not isbuiltin(_obj)) - obj = '\n'.join(obj) if obj else '' - # combine all referred-to source (global then enclosing) - if not obj: return src - if not src: return obj - return obj + src - except Exception: - if tried_import: raise - tried_source = True - source = not source - # should never get here - return - - -# backward compatibility -def getimportable(obj, alias='', byname=True, explicit=False): - return importable(obj,alias,source=(not byname),builtin=explicit) - #return outdent(_importable(obj,alias,source=(not byname),builtin=explicit)) -def likely_import(obj, passive=False, explicit=False): - return getimport(obj, verify=(not passive), builtin=explicit) -def _likely_import(first, last, passive=False, explicit=True): - return _getimport(first, last, verify=(not passive), builtin=explicit) -_get_name = getname -getblocks_from_history = getblocks - - - -# EOF diff --git a/venv/lib/python3.12/site-packages/dill/temp.py b/venv/lib/python3.12/site-packages/dill/temp.py deleted file mode 100644 index 4b9f4e0..0000000 --- a/venv/lib/python3.12/site-packages/dill/temp.py +++ /dev/null @@ -1,252 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE -""" -Methods for serialized objects (or source code) stored in temporary files -and file-like objects. -""" -#XXX: better instead to have functions write to any given file-like object ? -#XXX: currently, all file-like objects are created by the function... - -__all__ = ['dump_source', 'dump', 'dumpIO_source', 'dumpIO',\ - 'load_source', 'load', 'loadIO_source', 'loadIO',\ - 'capture'] - -import contextlib - - -@contextlib.contextmanager -def capture(stream='stdout'): - """builds a context that temporarily replaces the given stream name - - >>> with capture('stdout') as out: - ... print ("foo!") - ... - >>> print (out.getvalue()) - foo! - - """ - import sys - from io import StringIO - orig = getattr(sys, stream) - setattr(sys, stream, StringIO()) - try: - yield getattr(sys, stream) - finally: - setattr(sys, stream, orig) - - -def b(x): # deal with b'foo' versus 'foo' - import codecs - return codecs.latin_1_encode(x)[0] - -def load_source(file, **kwds): - """load an object that was stored with dill.temp.dump_source - - file: filehandle - alias: string name of stored object - mode: mode to open the file, one of: {'r', 'rb'} - - >>> f = lambda x: x**2 - >>> pyfile = dill.temp.dump_source(f, alias='_f') - >>> _f = dill.temp.load_source(pyfile) - >>> _f(4) - 16 - """ - alias = kwds.pop('alias', None) - mode = kwds.pop('mode', 'r') - fname = getattr(file, 'name', file) # fname=file.name or fname=file (if str) - source = open(fname, mode=mode, **kwds).read() - if not alias: - tag = source.strip().splitlines()[-1].split() - if tag[0] != '#NAME:': - stub = source.splitlines()[0] - raise IOError("unknown name for code: %s" % stub) - alias = tag[-1] - local = {} - exec(source, local) - _ = eval("%s" % alias, local) - return _ - -def dump_source(object, **kwds): - """write object source to a NamedTemporaryFile (instead of dill.dump) -Loads with "import" or "dill.temp.load_source". Returns the filehandle. - - >>> f = lambda x: x**2 - >>> pyfile = dill.temp.dump_source(f, alias='_f') - >>> _f = dill.temp.load_source(pyfile) - >>> _f(4) - 16 - - >>> f = lambda x: x**2 - >>> pyfile = dill.temp.dump_source(f, dir='.') - >>> modulename = os.path.basename(pyfile.name).split('.py')[0] - >>> exec('from %s import f as _f' % modulename) - >>> _f(4) - 16 - -Optional kwds: - If 'alias' is specified, the object will be renamed to the given string. - - If 'prefix' is specified, the file name will begin with that prefix, - otherwise a default prefix is used. - - If 'dir' is specified, the file will be created in that directory, - otherwise a default directory is used. - - If 'text' is specified and true, the file is opened in text - mode. Else (the default) the file is opened in binary mode. On - some operating systems, this makes no difference. - -NOTE: Keep the return value for as long as you want your file to exist ! - """ #XXX: write a "load_source"? - from .source import importable, getname - import tempfile - kwds.setdefault('delete', True) - kwds.pop('suffix', '') # this is *always* '.py' - alias = kwds.pop('alias', '') #XXX: include an alias so a name is known - name = str(alias) or getname(object) - name = "\n#NAME: %s\n" % name - #XXX: assumes kwds['dir'] is writable and on $PYTHONPATH - file = tempfile.NamedTemporaryFile(suffix='.py', **kwds) - file.write(b(''.join([importable(object, alias=alias),name]))) - file.flush() - return file - -def load(file, **kwds): - """load an object that was stored with dill.temp.dump - - file: filehandle - mode: mode to open the file, one of: {'r', 'rb'} - - >>> dumpfile = dill.temp.dump([1, 2, 3, 4, 5]) - >>> dill.temp.load(dumpfile) - [1, 2, 3, 4, 5] - """ - import dill as pickle - mode = kwds.pop('mode', 'rb') - name = getattr(file, 'name', file) # name=file.name or name=file (if str) - return pickle.load(open(name, mode=mode, **kwds)) - -def dump(object, **kwds): - """dill.dump of object to a NamedTemporaryFile. -Loads with "dill.temp.load". Returns the filehandle. - - >>> dumpfile = dill.temp.dump([1, 2, 3, 4, 5]) - >>> dill.temp.load(dumpfile) - [1, 2, 3, 4, 5] - -Optional kwds: - If 'suffix' is specified, the file name will end with that suffix, - otherwise there will be no suffix. - - If 'prefix' is specified, the file name will begin with that prefix, - otherwise a default prefix is used. - - If 'dir' is specified, the file will be created in that directory, - otherwise a default directory is used. - - If 'text' is specified and true, the file is opened in text - mode. Else (the default) the file is opened in binary mode. On - some operating systems, this makes no difference. - -NOTE: Keep the return value for as long as you want your file to exist ! - """ - import dill as pickle - import tempfile - kwds.setdefault('delete', True) - file = tempfile.NamedTemporaryFile(**kwds) - pickle.dump(object, file) - file.flush() - return file - -def loadIO(buffer, **kwds): - """load an object that was stored with dill.temp.dumpIO - - buffer: buffer object - - >>> dumpfile = dill.temp.dumpIO([1, 2, 3, 4, 5]) - >>> dill.temp.loadIO(dumpfile) - [1, 2, 3, 4, 5] - """ - import dill as pickle - from io import BytesIO as StringIO - value = getattr(buffer, 'getvalue', buffer) # value or buffer.getvalue - if value != buffer: value = value() # buffer.getvalue() - return pickle.load(StringIO(value)) - -def dumpIO(object, **kwds): - """dill.dump of object to a buffer. -Loads with "dill.temp.loadIO". Returns the buffer object. - - >>> dumpfile = dill.temp.dumpIO([1, 2, 3, 4, 5]) - >>> dill.temp.loadIO(dumpfile) - [1, 2, 3, 4, 5] - """ - import dill as pickle - from io import BytesIO as StringIO - file = StringIO() - pickle.dump(object, file) - file.flush() - return file - -def loadIO_source(buffer, **kwds): - """load an object that was stored with dill.temp.dumpIO_source - - buffer: buffer object - alias: string name of stored object - - >>> f = lambda x:x**2 - >>> pyfile = dill.temp.dumpIO_source(f, alias='_f') - >>> _f = dill.temp.loadIO_source(pyfile) - >>> _f(4) - 16 - """ - alias = kwds.pop('alias', None) - source = getattr(buffer, 'getvalue', buffer) # source or buffer.getvalue - if source != buffer: source = source() # buffer.getvalue() - source = source.decode() # buffer to string - if not alias: - tag = source.strip().splitlines()[-1].split() - if tag[0] != '#NAME:': - stub = source.splitlines()[0] - raise IOError("unknown name for code: %s" % stub) - alias = tag[-1] - local = {} - exec(source, local) - _ = eval("%s" % alias, local) - return _ - -def dumpIO_source(object, **kwds): - """write object source to a buffer (instead of dill.dump) -Loads by with dill.temp.loadIO_source. Returns the buffer object. - - >>> f = lambda x:x**2 - >>> pyfile = dill.temp.dumpIO_source(f, alias='_f') - >>> _f = dill.temp.loadIO_source(pyfile) - >>> _f(4) - 16 - -Optional kwds: - If 'alias' is specified, the object will be renamed to the given string. - """ - from .source import importable, getname - from io import BytesIO as StringIO - alias = kwds.pop('alias', '') #XXX: include an alias so a name is known - name = str(alias) or getname(object) - name = "\n#NAME: %s\n" % name - #XXX: assumes kwds['dir'] is writable and on $PYTHONPATH - file = StringIO() - file.write(b(''.join([importable(object, alias=alias),name]))) - file.flush() - return file - - -del contextlib - - -# EOF diff --git a/venv/lib/python3.12/site-packages/dill/tests/__init__.py b/venv/lib/python3.12/site-packages/dill/tests/__init__.py deleted file mode 100644 index f97361a..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2018-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE -""" -to run this test suite, first build and install `dill`. - - $ python -m pip install ../.. - - -then run the tests with: - - $ python -m dill.tests - - -or, if `nose` is installed: - - $ nosetests - -""" diff --git a/venv/lib/python3.12/site-packages/dill/tests/__main__.py b/venv/lib/python3.12/site-packages/dill/tests/__main__.py deleted file mode 100644 index 0c0f968..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/__main__.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2018-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -import glob -import os -import sys -import subprocess as sp -python = sys.executable -try: - import pox - python = pox.which_python(version=True) or python -except ImportError: - pass -shell = sys.platform[:3] == 'win' - -suite = os.path.dirname(__file__) or os.path.curdir -tests = glob.glob(suite + os.path.sep + 'test_*.py') - - -if __name__ == '__main__': - - failed = 0 - for test in tests: - p = sp.Popen([python, test], shell=shell).wait() - if p: - print('F', end='', flush=True) - failed = 1 - else: - print('.', end='', flush=True) - print('') - exit(failed) diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index c32e546..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/__main__.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/__main__.cpython-312.pyc deleted file mode 100644 index 6cec8eb..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/__main__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_abc.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_abc.cpython-312.pyc deleted file mode 100644 index 8892d0f..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_abc.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_check.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_check.cpython-312.pyc deleted file mode 100644 index 977accc..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_check.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_classdef.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_classdef.cpython-312.pyc deleted file mode 100644 index 04c3e33..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_classdef.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_dataclasses.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_dataclasses.cpython-312.pyc deleted file mode 100644 index 997f15f..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_dataclasses.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_detect.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_detect.cpython-312.pyc deleted file mode 100644 index 4bf76db..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_detect.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_dictviews.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_dictviews.cpython-312.pyc deleted file mode 100644 index 7a3ad22..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_dictviews.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_diff.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_diff.cpython-312.pyc deleted file mode 100644 index fdb9255..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_diff.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_extendpickle.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_extendpickle.cpython-312.pyc deleted file mode 100644 index e1d410a..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_extendpickle.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_fglobals.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_fglobals.cpython-312.pyc deleted file mode 100644 index e723847..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_fglobals.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_file.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_file.cpython-312.pyc deleted file mode 100644 index 1da64a3..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_file.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_functions.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_functions.cpython-312.pyc deleted file mode 100644 index e539e64..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_functions.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_functors.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_functors.cpython-312.pyc deleted file mode 100644 index 3daa9da..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_functors.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_logger.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_logger.cpython-312.pyc deleted file mode 100644 index 84a6b6a..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_logger.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_mixins.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_mixins.cpython-312.pyc deleted file mode 100644 index 68a9f74..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_mixins.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_module.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_module.cpython-312.pyc deleted file mode 100644 index 3e548b2..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_module.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_moduledict.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_moduledict.cpython-312.pyc deleted file mode 100644 index 7e9e358..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_moduledict.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_nested.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_nested.cpython-312.pyc deleted file mode 100644 index 8ee1ad6..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_nested.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_objects.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_objects.cpython-312.pyc deleted file mode 100644 index 699df5c..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_objects.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_properties.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_properties.cpython-312.pyc deleted file mode 100644 index a1233f1..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_properties.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_pycapsule.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_pycapsule.cpython-312.pyc deleted file mode 100644 index 8129856..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_pycapsule.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_recursive.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_recursive.cpython-312.pyc deleted file mode 100644 index e92f954..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_recursive.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_registered.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_registered.cpython-312.pyc deleted file mode 100644 index 6907a66..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_registered.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_restricted.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_restricted.cpython-312.pyc deleted file mode 100644 index c22b0b8..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_restricted.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_selected.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_selected.cpython-312.pyc deleted file mode 100644 index 0ff2797..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_selected.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_session.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_session.cpython-312.pyc deleted file mode 100644 index 6d8c644..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_session.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_source.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_source.cpython-312.pyc deleted file mode 100644 index e131364..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_source.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_sources.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_sources.cpython-312.pyc deleted file mode 100644 index a572da5..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_sources.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_temp.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_temp.cpython-312.pyc deleted file mode 100644 index d19de34..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_temp.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_threads.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_threads.cpython-312.pyc deleted file mode 100644 index 0d89cce..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_threads.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_weakref.cpython-312.pyc b/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_weakref.cpython-312.pyc deleted file mode 100644 index 07f650a..0000000 Binary files a/venv/lib/python3.12/site-packages/dill/tests/__pycache__/test_weakref.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_abc.py b/venv/lib/python3.12/site-packages/dill/tests/test_abc.py deleted file mode 100644 index 70678fe..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_abc.py +++ /dev/null @@ -1,169 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2023-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE -""" -test dill's ability to pickle abstract base class objects -""" -import dill -import abc -from abc import ABC -import warnings - -from types import FunctionType - -dill.settings['recurse'] = True - -class OneTwoThree(ABC): - @abc.abstractmethod - def foo(self): - """A method""" - pass - - @property - @abc.abstractmethod - def bar(self): - """Property getter""" - pass - - @bar.setter - @abc.abstractmethod - def bar(self, value): - """Property setter""" - pass - - @classmethod - @abc.abstractmethod - def cfoo(cls): - """Class method""" - pass - - @staticmethod - @abc.abstractmethod - def sfoo(): - """Static method""" - pass - -class EasyAsAbc(OneTwoThree): - def __init__(self): - self._bar = None - - def foo(self): - return "Instance Method FOO" - - @property - def bar(self): - return self._bar - - @bar.setter - def bar(self, value): - self._bar = value - - @classmethod - def cfoo(cls): - return "Class Method CFOO" - - @staticmethod - def sfoo(): - return "Static Method SFOO" - -def test_abc_non_local(): - assert dill.copy(OneTwoThree) is not OneTwoThree - assert dill.copy(EasyAsAbc) is not EasyAsAbc - - with warnings.catch_warnings(): - warnings.simplefilter("ignore", dill.PicklingWarning) - assert dill.copy(OneTwoThree, byref=True) is OneTwoThree - assert dill.copy(EasyAsAbc, byref=True) is EasyAsAbc - - instance = EasyAsAbc() - # Set a property that StockPickle can't preserve - instance.bar = lambda x: x**2 - depickled = dill.copy(instance) - assert type(depickled) is type(instance) #NOTE: issue #612, test_abc_local - #NOTE: dill.copy of local (or non-local) classes should (not) be the same? - assert type(depickled.bar) is FunctionType - assert depickled.bar(3) == 9 - assert depickled.sfoo() == "Static Method SFOO" - assert depickled.cfoo() == "Class Method CFOO" - assert depickled.foo() == "Instance Method FOO" - -def test_abc_local(): - """ - Test using locally scoped ABC class - """ - class LocalABC(ABC): - @abc.abstractmethod - def foo(self): - pass - - def baz(self): - return repr(self) - - labc = dill.copy(LocalABC) - assert labc is not LocalABC - assert type(labc) is type(LocalABC) - #NOTE: dill.copy of local (or non-local) classes should (not) be the same? - # - # .LocalABC'> - - class Real(labc): - def foo(self): - return "True!" - - def baz(self): - return "My " + super(Real, self).baz() - - real = Real() - assert real.foo() == "True!" - - try: - labc() - except TypeError as e: - # Expected error - pass - else: - print('Failed to raise type error') - assert False - - labc2, pik = dill.copy((labc, Real())) - assert 'Real' == type(pik).__name__ - assert '.Real' in type(pik).__qualname__ - assert type(pik) is not Real - assert labc2 is not LocalABC - assert labc2 is not labc - assert isinstance(pik, labc2) - assert not isinstance(pik, labc) - assert not isinstance(pik, LocalABC) - assert pik.baz() == "My " + repr(pik) - -def test_meta_local_no_cache(): - """ - Test calling metaclass and cache registration - """ - LocalMetaABC = abc.ABCMeta('LocalMetaABC', (), {}) - - class ClassyClass: - pass - - class KlassyClass: - pass - - LocalMetaABC.register(ClassyClass) - - assert not issubclass(KlassyClass, LocalMetaABC) - assert issubclass(ClassyClass, LocalMetaABC) - - res = dill.dumps((LocalMetaABC, ClassyClass, KlassyClass)) - - lmabc, cc, kc = dill.loads(res) - assert type(lmabc) == type(LocalMetaABC) - assert not issubclass(kc, lmabc) - assert issubclass(cc, lmabc) - -if __name__ == '__main__': - test_abc_non_local() - test_abc_local() - test_meta_local_no_cache() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_check.py b/venv/lib/python3.12/site-packages/dill/tests/test_check.py deleted file mode 100644 index f052f83..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_check.py +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -from dill import check -import sys - -from dill.temp import capture - - -#FIXME: this doesn't catch output... it's from the internal call -def raise_check(func, **kwds): - try: - with capture('stdout') as out: - check(func, **kwds) - except Exception: - e = sys.exc_info()[1] - raise AssertionError(str(e)) - else: - assert 'Traceback' not in out.getvalue() - finally: - out.close() - - -f = lambda x:x**2 - - -def test_simple(verbose=None): - raise_check(f, verbose=verbose) - - -def test_recurse(verbose=None): - raise_check(f, recurse=True, verbose=verbose) - - -def test_byref(verbose=None): - raise_check(f, byref=True, verbose=verbose) - - -def test_protocol(verbose=None): - raise_check(f, protocol=True, verbose=verbose) - - -def test_python(verbose=None): - raise_check(f, python=None, verbose=verbose) - - -#TODO: test incompatible versions -#TODO: test dump failure -#TODO: test load failure - - -if __name__ == '__main__': - test_simple() - test_recurse() - test_byref() - test_protocol() - test_python() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_classdef.py b/venv/lib/python3.12/site-packages/dill/tests/test_classdef.py deleted file mode 100644 index ec7f268..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_classdef.py +++ /dev/null @@ -1,340 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -import dill -from enum import EnumMeta -import sys -dill.settings['recurse'] = True - -# test classdefs -class _class: - def _method(self): - pass - def ok(self): - return True - -class _class2: - def __call__(self): - pass - def ok(self): - return True - -class _newclass(object): - def _method(self): - pass - def ok(self): - return True - -class _newclass2(object): - def __call__(self): - pass - def ok(self): - return True - -class _meta(type): - pass - -def __call__(self): - pass -def ok(self): - return True - -_mclass = _meta("_mclass", (object,), {"__call__": __call__, "ok": ok}) - -del __call__ -del ok - -o = _class() -oc = _class2() -n = _newclass() -nc = _newclass2() -m = _mclass() - -if sys.hexversion < 0x03090000: - import typing - class customIntList(typing.List[int]): - pass -else: - class customIntList(list[int]): - pass - -# test pickles for class instances -def test_class_instances(): - assert dill.pickles(o) - assert dill.pickles(oc) - assert dill.pickles(n) - assert dill.pickles(nc) - assert dill.pickles(m) - -def test_class_objects(): - clslist = [_class,_class2,_newclass,_newclass2,_mclass] - objlist = [o,oc,n,nc,m] - _clslist = [dill.dumps(obj) for obj in clslist] - _objlist = [dill.dumps(obj) for obj in objlist] - - for obj in clslist: - globals().pop(obj.__name__) - del clslist - for obj in ['o','oc','n','nc']: - globals().pop(obj) - del objlist - del obj - - for obj,cls in zip(_objlist,_clslist): - _cls = dill.loads(cls) - _obj = dill.loads(obj) - assert _obj.ok() - assert _cls.ok(_cls()) - if _cls.__name__ == "_mclass": - assert type(_cls).__name__ == "_meta" - -# test NoneType -def test_specialtypes(): - assert dill.pickles(type(None)) - assert dill.pickles(type(NotImplemented)) - assert dill.pickles(type(Ellipsis)) - assert dill.pickles(type(EnumMeta)) - -from collections import namedtuple -Z = namedtuple("Z", ['a','b']) -Zi = Z(0,1) -X = namedtuple("Y", ['a','b']) -X.__name__ = "X" -X.__qualname__ = "X" #XXX: name must 'match' or fails to pickle -Xi = X(0,1) -Bad = namedtuple("FakeName", ['a','b']) -Badi = Bad(0,1) -Defaults = namedtuple('Defaults', ['x', 'y'], defaults=[1]) -Defaultsi = Defaults(2) - -# test namedtuple -def test_namedtuple(): - assert Z is dill.loads(dill.dumps(Z)) - assert Zi == dill.loads(dill.dumps(Zi)) - assert X is dill.loads(dill.dumps(X)) - assert Xi == dill.loads(dill.dumps(Xi)) - assert Defaults is dill.loads(dill.dumps(Defaults)) - assert Defaultsi == dill.loads(dill.dumps(Defaultsi)) - assert Bad is not dill.loads(dill.dumps(Bad)) - assert Bad._fields == dill.loads(dill.dumps(Bad))._fields - assert tuple(Badi) == tuple(dill.loads(dill.dumps(Badi))) - - class A: - class B(namedtuple("C", ["one", "two"])): - '''docstring''' - B.__module__ = 'testing' - - a = A() - assert dill.copy(a) - - assert dill.copy(A.B).__name__ == 'B' - assert dill.copy(A.B).__qualname__.endswith('..A.B') - assert dill.copy(A.B).__doc__ == 'docstring' - assert dill.copy(A.B).__module__ == 'testing' - - from typing import NamedTuple - - def A(): - class B(NamedTuple): - x: int - return B - - assert type(dill.copy(A()(8))).__qualname__ == type(A()(8)).__qualname__ - -def test_dtype(): - try: - import numpy as np - - dti = np.dtype('int') - assert np.dtype == dill.copy(np.dtype) - assert dti == dill.copy(dti) - except ImportError: pass - - -def test_array_nested(): - try: - import numpy as np - - x = np.array([1]) - y = (x,) - assert y == dill.copy(y) - - except ImportError: pass - - -def test_array_subclass(): - try: - import numpy as np - - class TestArray(np.ndarray): - def __new__(cls, input_array, color): - obj = np.asarray(input_array).view(cls) - obj.color = color - return obj - def __array_finalize__(self, obj): - if obj is None: - return - if isinstance(obj, type(self)): - self.color = obj.color - def __getnewargs__(self): - return np.asarray(self), self.color - - a1 = TestArray(np.zeros(100), color='green') - if not dill._dill.IS_PYPY: - assert dill.pickles(a1) - assert a1.__dict__ == dill.copy(a1).__dict__ - - a2 = a1[0:9] - if not dill._dill.IS_PYPY: - assert dill.pickles(a2) - assert a2.__dict__ == dill.copy(a2).__dict__ - - class TestArray2(np.ndarray): - color = 'blue' - - a3 = TestArray2([1,2,3,4,5]) - a3.color = 'green' - if not dill._dill.IS_PYPY: - assert dill.pickles(a3) - assert a3.__dict__ == dill.copy(a3).__dict__ - - except ImportError: pass - - -def test_method_decorator(): - class A(object): - @classmethod - def test(cls): - pass - - a = A() - - res = dill.dumps(a) - new_obj = dill.loads(res) - new_obj.__class__.test() - -# test slots -class Y(object): - __slots__ = ('y', '__weakref__') - def __init__(self, y): - self.y = y - -value = 123 -y = Y(value) - -class Y2(object): - __slots__ = 'y' - def __init__(self, y): - self.y = y - -def test_slots(): - assert dill.pickles(Y) - assert dill.pickles(y) - assert dill.pickles(Y.y) - assert dill.copy(y).y == value - assert dill.copy(Y2(value)).y == value - -def test_origbases(): - assert dill.copy(customIntList).__orig_bases__ == customIntList.__orig_bases__ - -def test_attr(): - import attr - @attr.s - class A: - a = attr.ib() - - v = A(1) - assert dill.copy(v) == v - -def test_metaclass(): - class metaclass_with_new(type): - def __new__(mcls, name, bases, ns, **kwds): - cls = super().__new__(mcls, name, bases, ns, **kwds) - assert mcls is not None - assert cls.method(mcls) - return cls - def method(cls, mcls): - return isinstance(cls, mcls) - - l = locals() - exec("""class subclass_with_new(metaclass=metaclass_with_new): - def __new__(cls): - self = super().__new__(cls) - return self""", None, l) - subclass_with_new = l['subclass_with_new'] - - assert dill.copy(subclass_with_new()) - -def test_enummeta(): - from http import HTTPStatus - import enum - assert dill.copy(HTTPStatus.OK) is HTTPStatus.OK - assert dill.copy(enum.EnumMeta) is enum.EnumMeta - -def test_inherit(): #NOTE: see issue #612 - class Foo: - w = 0 - x = 1 - y = 1.1 - a = () - b = (1,) - n = None - - class Bar(Foo): - w = 2 - x = 1 - y = 1.1 - z = 0.2 - a = () - b = (1,) - c = (2,) - n = None - - Baz = dill.copy(Bar) - - import platform - is_pypy = platform.python_implementation() == 'PyPy' - assert Bar.__dict__ == Baz.__dict__ - # ints - assert 'w' in Bar.__dict__ and 'w' in Baz.__dict__ - assert Bar.__dict__['w'] is Baz.__dict__['w'] - assert 'x' in Bar.__dict__ and 'x' in Baz.__dict__ - assert Bar.__dict__['x'] is Baz.__dict__['x'] - # floats - assert 'y' in Bar.__dict__ and 'y' in Baz.__dict__ - same = Bar.__dict__['y'] is Baz.__dict__['y'] - assert same if is_pypy else not same - assert 'z' in Bar.__dict__ and 'z' in Baz.__dict__ - same = Bar.__dict__['z'] is Baz.__dict__['z'] - assert same if is_pypy else not same - # tuples - assert 'a' in Bar.__dict__ and 'a' in Baz.__dict__ - assert Bar.__dict__['a'] is Baz.__dict__['a'] - assert 'b' in Bar.__dict__ and 'b' in Baz.__dict__ - assert Bar.__dict__['b'] is not Baz.__dict__['b'] - assert 'c' in Bar.__dict__ and 'c' in Baz.__dict__ - assert Bar.__dict__['c'] is not Baz.__dict__['c'] - # None - assert 'n' in Bar.__dict__ and 'n' in Baz.__dict__ - assert Bar.__dict__['n'] is Baz.__dict__['n'] - - -if __name__ == '__main__': - test_class_instances() - test_class_objects() - test_specialtypes() - test_namedtuple() - test_dtype() - test_array_nested() - test_array_subclass() - test_method_decorator() - test_slots() - test_origbases() - test_metaclass() - test_enummeta() - test_inherit() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_dataclasses.py b/venv/lib/python3.12/site-packages/dill/tests/test_dataclasses.py deleted file mode 100644 index 5b2af2d..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_dataclasses.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Author: Anirudh Vegesana (avegesan@cs.stanford.edu) -# Copyright (c) 2022-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE -""" -test pickling a dataclass -""" - -import dill -import dataclasses - -def test_dataclasses(): - # Issue #500 - @dataclasses.dataclass - class A: - x: int - y: str - - @dataclasses.dataclass - class B: - a: A - - a = A(1, "test") - before = B(a) - save = dill.dumps(before) - after = dill.loads(save) - assert before != after # classes don't match - assert before == B(A(**dataclasses.asdict(after.a))) - assert dataclasses.asdict(before) == dataclasses.asdict(after) - -if __name__ == '__main__': - test_dataclasses() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_detect.py b/venv/lib/python3.12/site-packages/dill/tests/test_detect.py deleted file mode 100644 index b232b6a..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_detect.py +++ /dev/null @@ -1,163 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -from dill.detect import baditems, badobjects, badtypes, errors, parent, at, globalvars -from dill import settings -from dill._dill import IS_PYPY -from pickle import PicklingError - -import inspect -import sys -import os - -def test_bad_things(): - f = inspect.currentframe() - assert baditems(f) == [f] - #assert baditems(globals()) == [f] #XXX - assert badobjects(f) is f - assert badtypes(f) == type(f) - assert type(errors(f)) is TypeError - d = badtypes(f, 1) - assert isinstance(d, dict) - assert list(badobjects(f, 1).keys()) == list(d.keys()) - assert list(errors(f, 1).keys()) == list(d.keys()) - s = set([(err.__class__.__name__,err.args[0]) for err in list(errors(f, 1).values())]) - a = dict(s) - if not os.environ.get('COVERAGE'): #XXX: travis-ci - proxy = 0 if type(f.f_locals) is dict else 1 - assert len(s) == len(a) + proxy # TypeError (and possibly PicklingError) - n = 2 - assert len(a) is n if 'PicklingError' in a.keys() else n-1 - -def test_parent(): - x = [4,5,6,7] - listiter = iter(x) - obj = parent(listiter, list) - assert obj is x - - if IS_PYPY: assert parent(obj, int) is None - else: assert parent(obj, int) is x[-1] # python oddly? finds last int - assert at(id(at)) is at - -a, b, c = 1, 2, 3 - -def squared(x): - return a+x**2 - -def foo(x): - def bar(y): - return squared(x)+y - return bar - -class _class: - def _method(self): - pass - def ok(self): - return True - -def test_globals(): - def f(): - a - def g(): - b - def h(): - c - assert globalvars(f) == dict(a=1, b=2, c=3) - - res = globalvars(foo, recurse=True) - assert set(res) == set(['squared', 'a']) - res = globalvars(foo, recurse=False) - assert res == {} - zap = foo(2) - res = globalvars(zap, recurse=True) - assert set(res) == set(['squared', 'a']) - res = globalvars(zap, recurse=False) - assert set(res) == set(['squared']) - del zap - res = globalvars(squared) - assert set(res) == set(['a']) - # FIXME: should find referenced __builtins__ - #res = globalvars(_class, recurse=True) - #assert set(res) == set(['True']) - #res = globalvars(_class, recurse=False) - #assert res == {} - #res = globalvars(_class.ok, recurse=True) - #assert set(res) == set(['True']) - #res = globalvars(_class.ok, recurse=False) - #assert set(res) == set(['True']) - - -#98 dill ignores __getstate__ in interactive lambdas -bar = [0] - -class Foo(object): - def __init__(self): - pass - def __getstate__(self): - bar[0] = bar[0]+1 - return {} - def __setstate__(self, data): - pass - -f = Foo() - -def test_getstate(): - from dill import dumps, loads - dumps(f) - b = bar[0] - dumps(lambda: f, recurse=False) # doesn't call __getstate__ - assert bar[0] == b - dumps(lambda: f, recurse=True) # calls __getstate__ - assert bar[0] == b + 1 - -#97 serialize lambdas in test files -def test_deleted(): - global sin - from dill import dumps, loads - from math import sin, pi - - def sinc(x): - return sin(x)/x - - settings['recurse'] = True - _sinc = dumps(sinc) - sin = globals().pop('sin') - sin = 1 - del sin - sinc_ = loads(_sinc) # no NameError... pickling preserves 'sin' - res = sinc_(1) - from math import sin - assert sinc(1) == res - - -def test_lambdify(): - try: - from sympy import symbols, lambdify - from numpy import __version__ as numversion - if numversion < '2.4.0' and sys.hexversion == 0x30f00a3: - return #NOTE: numpy Segfaults for the above combination - except ImportError: - return - settings['recurse'] = True - x = symbols("x") - y = x**2 - f = lambdify([x], y) - z = min - d = globals() - globalvars(f, recurse=True, builtin=True) - assert z is min - assert d is globals() - - -if __name__ == '__main__': - test_bad_things() - test_parent() - test_globals() - test_getstate() - test_deleted() - test_lambdify() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_dictviews.py b/venv/lib/python3.12/site-packages/dill/tests/test_dictviews.py deleted file mode 100644 index d544415..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_dictviews.py +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Author: Anirudh Vegesana (avegesan@cs.stanford.edu) -# Copyright (c) 2021-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -import dill -from dill._dill import OLD310, MAPPING_PROXY_TRICK, DictProxyType - -def test_dictproxy(): - assert dill.copy(DictProxyType({'a': 2})) - -def test_dictviews(): - x = {'a': 1} - assert dill.copy(x.keys()) - assert dill.copy(x.values()) - assert dill.copy(x.items()) - -def test_dictproxy_trick(): - if not OLD310 and MAPPING_PROXY_TRICK: - x = {'a': 1} - all_views = (x.values(), x.items(), x.keys(), x) - seperate_views = dill.copy(all_views) - new_x = seperate_views[-1] - new_x['b'] = 2 - new_x['c'] = 1 - assert len(new_x) == 3 and len(x) == 1 - assert len(seperate_views[0]) == 3 and len(all_views[0]) == 1 - assert len(seperate_views[1]) == 3 and len(all_views[1]) == 1 - assert len(seperate_views[2]) == 3 and len(all_views[2]) == 1 - assert dict(all_views[1]) == x - assert dict(seperate_views[1]) == new_x - -if __name__ == '__main__': - test_dictproxy() - test_dictviews() - test_dictproxy_trick() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_diff.py b/venv/lib/python3.12/site-packages/dill/tests/test_diff.py deleted file mode 100644 index bb8874c..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_diff.py +++ /dev/null @@ -1,107 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -from dill import __diff as diff - -import sys -IS_PYPY = not hasattr(sys, 'getrefcount') - -class A: - pass - -def test_diff(): - a = A() - b = A() - c = A() - a.a = b - b.a = c - diff.memorise(a) - assert not diff.has_changed(a) - c.a = 1 - assert diff.has_changed(a) - diff.memorise(c, force=True) - assert not diff.has_changed(a) - c.a = 2 - assert diff.has_changed(a) - changed = diff.whats_changed(a) - assert list(changed[0].keys()) == ["a"] - assert not changed[1] - - a2 = [] - b2 = [a2] - c2 = [b2] - diff.memorise(c2) - assert not diff.has_changed(c2) - a2.append(1) - assert diff.has_changed(c2) - changed = diff.whats_changed(c2) - assert changed[0] == {} - assert changed[1] - - a3 = {} - b3 = {1: a3} - c3 = {1: b3} - diff.memorise(c3) - assert not diff.has_changed(c3) - a3[1] = 1 - assert diff.has_changed(c3) - changed = diff.whats_changed(c3) - assert changed[0] == {} - assert changed[1] - - if not IS_PYPY: - import abc - # make sure the "_abc_invaldation_counter" doesn't make test fail - diff.memorise(abc.ABCMeta, force=True) - assert not diff.has_changed(abc) - abc.ABCMeta.zzz = 1 - assert diff.has_changed(abc) - changed = diff.whats_changed(abc) - assert list(changed[0].keys()) == ["ABCMeta"] - assert not changed[1] - - ''' - import Queue - diff.memorise(Queue, force=True) - assert not diff.has_changed(Queue) - Queue.Queue.zzz = 1 - assert diff.has_changed(Queue) - changed = diff.whats_changed(Queue) - assert list(changed[0].keys()) == ["Queue"] - assert not changed[1] - - import math - diff.memorise(math, force=True) - assert not diff.has_changed(math) - math.zzz = 1 - assert diff.has_changed(math) - changed = diff.whats_changed(math) - assert list(changed[0].keys()) == ["zzz"] - assert not changed[1] - ''' - - a = A() - b = A() - c = A() - a.a = b - b.a = c - diff.memorise(a) - assert not diff.has_changed(a) - c.a = 1 - assert diff.has_changed(a) - diff.memorise(c, force=True) - assert not diff.has_changed(a) - del c.a - assert diff.has_changed(a) - changed = diff.whats_changed(a) - assert list(changed[0].keys()) == ["a"] - assert not changed[1] - - -if __name__ == '__main__': - test_diff() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_extendpickle.py b/venv/lib/python3.12/site-packages/dill/tests/test_extendpickle.py deleted file mode 100644 index f86e44a..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_extendpickle.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -import dill as pickle -from io import BytesIO as StringIO - - -def my_fn(x): - return x * 17 - - -def test_extend(): - obj = lambda : my_fn(34) - assert obj() == 578 - - obj_io = StringIO() - pickler = pickle.Pickler(obj_io) - pickler.dump(obj) - - obj_str = obj_io.getvalue() - - obj2_io = StringIO(obj_str) - unpickler = pickle.Unpickler(obj2_io) - obj2 = unpickler.load() - - assert obj2() == 578 - - -def test_isdill(): - obj_io = StringIO() - pickler = pickle.Pickler(obj_io) - assert pickle._dill.is_dill(pickler) is True - - pickler = pickle._dill.StockPickler(obj_io) - assert pickle._dill.is_dill(pickler) is False - - try: - import multiprocess as mp - pickler = mp.reduction.ForkingPickler(obj_io) - assert pickle._dill.is_dill(pickler, child=True) is True - assert pickle._dill.is_dill(pickler, child=False) is False - except Exception: - pass - - -if __name__ == '__main__': - test_extend() - test_isdill() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_fglobals.py b/venv/lib/python3.12/site-packages/dill/tests/test_fglobals.py deleted file mode 100644 index aa93850..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_fglobals.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2021-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -import dill -dill.settings['recurse'] = True - -def get_fun_with_strftime(): - def fun_with_strftime(): - import datetime - return datetime.datetime.strptime("04-01-1943", "%d-%m-%Y").strftime( - "%Y-%m-%d %H:%M:%S" - ) - return fun_with_strftime - - -def get_fun_with_strftime2(): - import datetime - return datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') - - -def test_doc_dill_issue_219(): - back_fn = dill.loads(dill.dumps(get_fun_with_strftime())) - assert back_fn() == "1943-01-04 00:00:00" - dupl = dill.loads(dill.dumps(get_fun_with_strftime2)) - assert dupl() == get_fun_with_strftime2() - - -def get_fun_with_internal_import(): - def fun_with_import(): - import re - return re.compile("$") - return fun_with_import - - -def test_method_with_internal_import_should_work(): - import re - back_fn = dill.loads(dill.dumps(get_fun_with_internal_import())) - import inspect - if hasattr(inspect, 'getclosurevars'): - vars = inspect.getclosurevars(back_fn) - assert vars.globals == {} - assert vars.nonlocals == {} - assert back_fn() == re.compile("$") - assert "__builtins__" in back_fn.__globals__ - - -if __name__ == "__main__": - import sys - if (sys.version_info[:3] != (3,10,0) or sys.version_info[3] != 'alpha'): - test_doc_dill_issue_219() - test_method_with_internal_import_should_work() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_file.py b/venv/lib/python3.12/site-packages/dill/tests/test_file.py deleted file mode 100644 index 6d2b256..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_file.py +++ /dev/null @@ -1,500 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -import os -import sys -import string -import random - -import dill - - -dill.settings['recurse'] = True - -fname = "_test_file.txt" -rand_chars = list(string.ascii_letters) + ["\n"] * 40 # bias newline - -buffer_error = ValueError("invalid buffer size") -dne_error = FileNotFoundError("[Errno 2] No such file or directory: '%s'" % fname) - - -def write_randomness(number=200): - f = open(fname, "w") - for i in range(number): - f.write(random.choice(rand_chars)) - f.close() - f = open(fname, "r") - contents = f.read() - f.close() - return contents - - -def trunc_file(): - open(fname, "w").close() - - -def throws(op, args, exc): - try: - op(*args) - except type(exc): - return sys.exc_info()[1].args == exc.args - else: - return False - - -def teardown_module(): - if os.path.exists(fname): - os.remove(fname) - - -def bench(strictio, fmode, skippypy): - import platform - if skippypy and platform.python_implementation() == 'PyPy': - # Skip for PyPy... - return - - # file exists, with same contents - # read - - write_randomness() - - f = open(fname, "r") - _f = dill.loads(dill.dumps(f, fmode=fmode))#, strictio=strictio)) - assert _f.mode == f.mode - assert _f.tell() == f.tell() - assert _f.read() == f.read() - f.close() - _f.close() - - # write - - f = open(fname, "w") - f.write("hello") - f_dumped = dill.dumps(f, fmode=fmode)#, strictio=strictio) - f1mode = f.mode - ftell = f.tell() - f.close() - f2 = dill.loads(f_dumped) #FIXME: fails due to pypy/issues/1233 - # TypeError: expected py_object instance instead of str - f2mode = f2.mode - f2tell = f2.tell() - f2name = f2.name - f2.write(" world!") - f2.close() - - if fmode == dill.HANDLE_FMODE: - assert open(fname).read() == " world!" - assert f2mode == f1mode - assert f2tell == 0 - elif fmode == dill.CONTENTS_FMODE: - assert open(fname).read() == "hello world!" - assert f2mode == f1mode - assert f2tell == ftell - assert f2name == fname - elif fmode == dill.FILE_FMODE: - assert open(fname).read() == "hello world!" - assert f2mode == f1mode - assert f2tell == ftell - else: - raise RuntimeError("Unknown file mode '%s'" % fmode) - - # append - - trunc_file() - - f = open(fname, "a") - f.write("hello") - f_dumped = dill.dumps(f, fmode=fmode)#, strictio=strictio) - f1mode = f.mode - ftell = f.tell() - f.close() - f2 = dill.loads(f_dumped) - f2mode = f2.mode - f2tell = f2.tell() - f2.write(" world!") - f2.close() - - assert f2mode == f1mode - if fmode == dill.CONTENTS_FMODE: - assert open(fname).read() == "hello world!" - assert f2tell == ftell - elif fmode == dill.HANDLE_FMODE: - assert open(fname).read() == "hello world!" - assert f2tell == ftell - elif fmode == dill.FILE_FMODE: - assert open(fname).read() == "hello world!" - assert f2tell == ftell - else: - raise RuntimeError("Unknown file mode '%s'" % fmode) - - # file exists, with different contents (smaller size) - # read - - write_randomness() - - f = open(fname, "r") - fstr = f.read() - f_dumped = dill.dumps(f, fmode=fmode)#, strictio=strictio) - f1mode = f.mode - ftell = f.tell() - f.close() - _flen = 150 - _fstr = write_randomness(number=_flen) - - if strictio: # throw error if ftell > EOF - assert throws(dill.loads, (f_dumped,), buffer_error) - else: - f2 = dill.loads(f_dumped) - assert f2.mode == f1mode - if fmode == dill.CONTENTS_FMODE: - assert f2.tell() == _flen - assert f2.read() == "" - f2.seek(0) - assert f2.read() == _fstr - assert f2.tell() == _flen # 150 - elif fmode == dill.HANDLE_FMODE: - assert f2.tell() == 0 - assert f2.read() == _fstr - assert f2.tell() == _flen # 150 - elif fmode == dill.FILE_FMODE: - assert f2.tell() == ftell # 200 - assert f2.read() == "" - f2.seek(0) - assert f2.read() == fstr - assert f2.tell() == ftell # 200 - else: - raise RuntimeError("Unknown file mode '%s'" % fmode) - f2.close() - - # write - - write_randomness() - - f = open(fname, "w") - f.write("hello") - f_dumped = dill.dumps(f, fmode=fmode)#, strictio=strictio) - f1mode = f.mode - ftell = f.tell() - f.close() - fstr = open(fname).read() - - f = open(fname, "w") - f.write("h") - _ftell = f.tell() - f.close() - - if strictio: # throw error if ftell > EOF - assert throws(dill.loads, (f_dumped,), buffer_error) - else: - f2 = dill.loads(f_dumped) - f2mode = f2.mode - f2tell = f2.tell() - f2.write(" world!") - f2.close() - if fmode == dill.CONTENTS_FMODE: - assert open(fname).read() == "h world!" - assert f2mode == f1mode - assert f2tell == _ftell - elif fmode == dill.HANDLE_FMODE: - assert open(fname).read() == " world!" - assert f2mode == f1mode - assert f2tell == 0 - elif fmode == dill.FILE_FMODE: - assert open(fname).read() == "hello world!" - assert f2mode == f1mode - assert f2tell == ftell - else: - raise RuntimeError("Unknown file mode '%s'" % fmode) - f2.close() - - # append - - trunc_file() - - f = open(fname, "a") - f.write("hello") - f_dumped = dill.dumps(f, fmode=fmode)#, strictio=strictio) - f1mode = f.mode - ftell = f.tell() - f.close() - fstr = open(fname).read() - - f = open(fname, "w") - f.write("h") - _ftell = f.tell() - f.close() - - if strictio: # throw error if ftell > EOF - assert throws(dill.loads, (f_dumped,), buffer_error) - else: - f2 = dill.loads(f_dumped) - f2mode = f2.mode - f2tell = f2.tell() - f2.write(" world!") - f2.close() - assert f2mode == f1mode - if fmode == dill.CONTENTS_FMODE: - # position of writes cannot be changed on some OSs - assert open(fname).read() == "h world!" - assert f2tell == _ftell - elif fmode == dill.HANDLE_FMODE: - assert open(fname).read() == "h world!" - assert f2tell == _ftell - elif fmode == dill.FILE_FMODE: - assert open(fname).read() == "hello world!" - assert f2tell == ftell - else: - raise RuntimeError("Unknown file mode '%s'" % fmode) - f2.close() - - # file does not exist - # read - - write_randomness() - - f = open(fname, "r") - fstr = f.read() - f_dumped = dill.dumps(f, fmode=fmode)#, strictio=strictio) - f1mode = f.mode - ftell = f.tell() - f.close() - - os.remove(fname) - - if strictio: # throw error if file DNE - assert throws(dill.loads, (f_dumped,), dne_error) - else: - f2 = dill.loads(f_dumped) - assert f2.mode == f1mode - if fmode == dill.CONTENTS_FMODE: - # FIXME: this fails on systems where f2.tell() always returns 0 - # assert f2.tell() == ftell # 200 - assert f2.read() == "" - f2.seek(0) - assert f2.read() == "" - assert f2.tell() == 0 - elif fmode == dill.FILE_FMODE: - assert f2.tell() == ftell # 200 - assert f2.read() == "" - f2.seek(0) - assert f2.read() == fstr - assert f2.tell() == ftell # 200 - elif fmode == dill.HANDLE_FMODE: - assert f2.tell() == 0 - assert f2.read() == "" - assert f2.tell() == 0 - else: - raise RuntimeError("Unknown file mode '%s'" % fmode) - f2.close() - - # write - - write_randomness() - - f = open(fname, "w+") - f.write("hello") - f_dumped = dill.dumps(f, fmode=fmode)#, strictio=strictio) - ftell = f.tell() - f1mode = f.mode - f.close() - - os.remove(fname) - - if strictio: # throw error if file DNE - assert throws(dill.loads, (f_dumped,), dne_error) - else: - f2 = dill.loads(f_dumped) - f2mode = f2.mode - f2tell = f2.tell() - f2.write(" world!") - f2.close() - if fmode == dill.CONTENTS_FMODE: - assert open(fname).read() == " world!" - assert f2mode == 'w+' - assert f2tell == 0 - elif fmode == dill.HANDLE_FMODE: - assert open(fname).read() == " world!" - assert f2mode == f1mode - assert f2tell == 0 - elif fmode == dill.FILE_FMODE: - assert open(fname).read() == "hello world!" - assert f2mode == f1mode - assert f2tell == ftell - else: - raise RuntimeError("Unknown file mode '%s'" % fmode) - - # append - - trunc_file() - - f = open(fname, "a") - f.write("hello") - f_dumped = dill.dumps(f, fmode=fmode)#, strictio=strictio) - ftell = f.tell() - f1mode = f.mode - f.close() - - os.remove(fname) - - if strictio: # throw error if file DNE - assert throws(dill.loads, (f_dumped,), dne_error) - else: - f2 = dill.loads(f_dumped) - f2mode = f2.mode - f2tell = f2.tell() - f2.write(" world!") - f2.close() - assert f2mode == f1mode - if fmode == dill.CONTENTS_FMODE: - assert open(fname).read() == " world!" - assert f2tell == 0 - elif fmode == dill.HANDLE_FMODE: - assert open(fname).read() == " world!" - assert f2tell == 0 - elif fmode == dill.FILE_FMODE: - assert open(fname).read() == "hello world!" - assert f2tell == ftell - else: - raise RuntimeError("Unknown file mode '%s'" % fmode) - - # file exists, with different contents (larger size) - # read - - write_randomness() - - f = open(fname, "r") - fstr = f.read() - f_dumped = dill.dumps(f, fmode=fmode)#, strictio=strictio) - f1mode = f.mode - ftell = f.tell() - f.close() - _flen = 250 - _fstr = write_randomness(number=_flen) - - # XXX: no safe_file: no way to be 'safe'? - - f2 = dill.loads(f_dumped) - assert f2.mode == f1mode - if fmode == dill.CONTENTS_FMODE: - assert f2.tell() == ftell # 200 - assert f2.read() == _fstr[ftell:] - f2.seek(0) - assert f2.read() == _fstr - assert f2.tell() == _flen # 250 - elif fmode == dill.HANDLE_FMODE: - assert f2.tell() == 0 - assert f2.read() == _fstr - assert f2.tell() == _flen # 250 - elif fmode == dill.FILE_FMODE: - assert f2.tell() == ftell # 200 - assert f2.read() == "" - f2.seek(0) - assert f2.read() == fstr - assert f2.tell() == ftell # 200 - else: - raise RuntimeError("Unknown file mode '%s'" % fmode) - f2.close() # XXX: other alternatives? - - # write - - f = open(fname, "w") - f.write("hello") - f_dumped = dill.dumps(f, fmode=fmode)#, strictio=strictio) - f1mode = f.mode - ftell = f.tell() - - fstr = open(fname).read() - - f.write(" and goodbye!") - _ftell = f.tell() - f.close() - - # XXX: no safe_file: no way to be 'safe'? - - f2 = dill.loads(f_dumped) - f2mode = f2.mode - f2tell = f2.tell() - f2.write(" world!") - f2.close() - if fmode == dill.CONTENTS_FMODE: - assert open(fname).read() == "hello world!odbye!" - assert f2mode == f1mode - assert f2tell == ftell - elif fmode == dill.HANDLE_FMODE: - assert open(fname).read() == " world!" - assert f2mode == f1mode - assert f2tell == 0 - elif fmode == dill.FILE_FMODE: - assert open(fname).read() == "hello world!" - assert f2mode == f1mode - assert f2tell == ftell - else: - raise RuntimeError("Unknown file mode '%s'" % fmode) - f2.close() - - # append - - trunc_file() - - f = open(fname, "a") - f.write("hello") - f_dumped = dill.dumps(f, fmode=fmode)#, strictio=strictio) - f1mode = f.mode - ftell = f.tell() - fstr = open(fname).read() - - f.write(" and goodbye!") - _ftell = f.tell() - f.close() - - # XXX: no safe_file: no way to be 'safe'? - - f2 = dill.loads(f_dumped) - f2mode = f2.mode - f2tell = f2.tell() - f2.write(" world!") - f2.close() - assert f2mode == f1mode - if fmode == dill.CONTENTS_FMODE: - assert open(fname).read() == "hello and goodbye! world!" - assert f2tell == ftell - elif fmode == dill.HANDLE_FMODE: - assert open(fname).read() == "hello and goodbye! world!" - assert f2tell == _ftell - elif fmode == dill.FILE_FMODE: - assert open(fname).read() == "hello world!" - assert f2tell == ftell - else: - raise RuntimeError("Unknown file mode '%s'" % fmode) - f2.close() - - -def test_nostrictio_handlefmode(): - bench(False, dill.HANDLE_FMODE, False) - teardown_module() - - -def test_nostrictio_filefmode(): - bench(False, dill.FILE_FMODE, False) - teardown_module() - - -def test_nostrictio_contentsfmode(): - bench(False, dill.CONTENTS_FMODE, True) - teardown_module() - - -#bench(True, dill.HANDLE_FMODE, False) -#bench(True, dill.FILE_FMODE, False) -#bench(True, dill.CONTENTS_FMODE, True) - - -if __name__ == '__main__': - test_nostrictio_handlefmode() - test_nostrictio_filefmode() - test_nostrictio_contentsfmode() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_functions.py b/venv/lib/python3.12/site-packages/dill/tests/test_functions.py deleted file mode 100644 index f3db1a4..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_functions.py +++ /dev/null @@ -1,141 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2019-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -import functools -import dill -import sys -dill.settings['recurse'] = True - - -def function_a(a): - return a - - -def function_b(b, b1): - return b + b1 - - -def function_c(c, c1=1): - return c + c1 - - -def function_d(d, d1, d2=1): - """doc string""" - return d + d1 + d2 - -function_d.__module__ = 'a module' - - -exec(''' -def function_e(e, *e1, e2=1, e3=2): - return e + sum(e1) + e2 + e3''') - -globalvar = 0 - -@functools.lru_cache(None) -def function_with_cache(x): - global globalvar - globalvar += x - return globalvar - - -def function_with_unassigned_variable(): - if False: - value = None - return (lambda: value) - - -def test_issue_510(): - # A very bizzare use of functions and methods that pickle doesn't get - # correctly for odd reasons. - class Foo: - def __init__(self): - def f2(self): - return self - self.f2 = f2.__get__(self) - - import dill, pickletools - f = Foo() - f1 = dill.copy(f) - assert f1.f2() is f1 - - -def test_functions(): - dumped_func_a = dill.dumps(function_a) - assert dill.loads(dumped_func_a)(0) == 0 - - dumped_func_b = dill.dumps(function_b) - assert dill.loads(dumped_func_b)(1,2) == 3 - - dumped_func_c = dill.dumps(function_c) - assert dill.loads(dumped_func_c)(1) == 2 - assert dill.loads(dumped_func_c)(1, 2) == 3 - - dumped_func_d = dill.dumps(function_d) - assert dill.loads(dumped_func_d).__doc__ == function_d.__doc__ - assert dill.loads(dumped_func_d).__module__ == function_d.__module__ - assert dill.loads(dumped_func_d)(1, 2) == 4 - assert dill.loads(dumped_func_d)(1, 2, 3) == 6 - assert dill.loads(dumped_func_d)(1, 2, d2=3) == 6 - - function_with_cache(1) - globalvar = 0 - dumped_func_cache = dill.dumps(function_with_cache) - assert function_with_cache(2) == 3 - assert function_with_cache(1) == 1 - assert function_with_cache(3) == 6 - assert function_with_cache(2) == 3 - - empty_cell = function_with_unassigned_variable() - cell_copy = dill.loads(dill.dumps(empty_cell)) - assert 'empty' in str(cell_copy.__closure__[0]) - try: - cell_copy() - except Exception: - # this is good - pass - else: - raise AssertionError('cell_copy() did not read an empty cell') - - exec(''' -dumped_func_e = dill.dumps(function_e) -assert dill.loads(dumped_func_e)(1, 2) == 6 -assert dill.loads(dumped_func_e)(1, 2, 3) == 9 -assert dill.loads(dumped_func_e)(1, 2, e2=3) == 8 -assert dill.loads(dumped_func_e)(1, 2, e2=3, e3=4) == 10 -assert dill.loads(dumped_func_e)(1, 2, 3, e2=4) == 12 -assert dill.loads(dumped_func_e)(1, 2, 3, e2=4, e3=5) == 15''') - -def test_code_object(): - import warnings - from dill._dill import ALL_CODE_PARAMS, CODE_PARAMS, CODE_VERSION, _create_code - code = function_c.__code__ - warnings.filterwarnings('ignore', category=DeprecationWarning) # issue 597 - LNOTAB = getattr(code, 'co_lnotab', b'') - if warnings.filters: del warnings.filters[0] - fields = {f: getattr(code, 'co_'+f) for f in CODE_PARAMS} - fields.setdefault('posonlyargcount', 0) # python >= 3.8 - fields.setdefault('lnotab', LNOTAB) # python <= 3.9 - fields.setdefault('linetable', b'') # python >= 3.10 - fields.setdefault('qualname', fields['name']) # python >= 3.11 - fields.setdefault('exceptiontable', b'') # python >= 3.11 - fields.setdefault('endlinetable', None) # python == 3.11a - fields.setdefault('columntable', None) # python == 3.11a - - for version, _, params in ALL_CODE_PARAMS: - args = tuple(fields[p] for p in params.split()) - try: - _create_code(*args) - if version >= (3,10): - _create_code(fields['lnotab'], *args) - except Exception as error: - raise Exception("failed to construct code object with format version {}".format(version)) from error - -if __name__ == '__main__': - test_functions() - test_issue_510() - test_code_object() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_functors.py b/venv/lib/python3.12/site-packages/dill/tests/test_functors.py deleted file mode 100644 index 882d24d..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_functors.py +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -import functools -import dill -dill.settings['recurse'] = True - - -def f(a, b, c): # without keywords - pass - - -def g(a, b, c=2): # with keywords - pass - - -def h(a=1, b=2, c=3): # without args - pass - - -def test_functools(): - fp = functools.partial(f, 1, 2) - gp = functools.partial(g, 1, c=2) - hp = functools.partial(h, 1, c=2) - bp = functools.partial(int, base=2) - - assert dill.pickles(fp, safe=True) - assert dill.pickles(gp, safe=True) - assert dill.pickles(hp, safe=True) - assert dill.pickles(bp, safe=True) - - -if __name__ == '__main__': - test_functools() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_logger.py b/venv/lib/python3.12/site-packages/dill/tests/test_logger.py deleted file mode 100644 index ec1d5e6..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_logger.py +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env python - -# Author: Leonardo Gama (@leogama) -# Copyright (c) 2022-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -import logging -import re -import tempfile - -import dill -from dill import detect -from dill.logger import stderr_handler, adapter as logger - -try: - from StringIO import StringIO -except ImportError: - from io import StringIO - -test_obj = {'a': (1, 2), 'b': object(), 'f': lambda x: x**2, 'big': list(range(10))} - -def test_logging(should_trace): - buffer = StringIO() - handler = logging.StreamHandler(buffer) - logger.addHandler(handler) - try: - dill.dumps(test_obj) - if should_trace: - regex = re.compile(r'(\S*┬ \w.*[^)]' # begin pickling object - r'|│*└ # \w.* \[\d+ (\wi)?B])' # object written (with size) - ) - for line in buffer.getvalue().splitlines(): - assert regex.fullmatch(line) - return buffer.getvalue() - else: - assert buffer.getvalue() == "" - finally: - logger.removeHandler(handler) - buffer.close() - -def test_trace_to_file(stream_trace): - file = tempfile.NamedTemporaryFile(mode='r') - with detect.trace(file.name, mode='w'): - dill.dumps(test_obj) - file_trace = file.read() - file.close() - # Apparently, objects can change location in memory... - reghex = re.compile(r'0x[0-9A-Za-z]+') - file_trace, stream_trace = reghex.sub('0x', file_trace), reghex.sub('0x', stream_trace) - # PyPy prints dictionary contents with repr(dict)... - regdict = re.compile(r'(dict\.__repr__ of ).*') - file_trace, stream_trace = regdict.sub(r'\1{}>', file_trace), regdict.sub(r'\1{}>', stream_trace) - assert file_trace == stream_trace - -if __name__ == '__main__': - logger.removeHandler(stderr_handler) - test_logging(should_trace=False) - detect.trace(True) - test_logging(should_trace=True) - detect.trace(False) - test_logging(should_trace=False) - - loglevel = logging.ERROR - logger.setLevel(loglevel) - with detect.trace(): - stream_trace = test_logging(should_trace=True) - test_logging(should_trace=False) - assert logger.getEffectiveLevel() == loglevel - test_trace_to_file(stream_trace) diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_mixins.py b/venv/lib/python3.12/site-packages/dill/tests/test_mixins.py deleted file mode 100644 index 447811d..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_mixins.py +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -import dill -dill.settings['recurse'] = True - - -def wtf(x,y,z): - def zzz(): - return x - def yyy(): - return y - def xxx(): - return z - return zzz,yyy - - -def quad(a=1, b=1, c=0): - inverted = [False] - def invert(): - inverted[0] = not inverted[0] - def dec(f): - def func(*args, **kwds): - x = f(*args, **kwds) - if inverted[0]: x = -x - return a*x**2 + b*x + c - func.__wrapped__ = f - func.invert = invert - func.inverted = inverted - return func - return dec - - -@quad(a=0,b=2) -def double_add(*args): - return sum(args) - - -fx = sum([1,2,3]) - - -### to make it interesting... -def quad_factory(a=1,b=1,c=0): - def dec(f): - def func(*args,**kwds): - fx = f(*args,**kwds) - return a*fx**2 + b*fx + c - return func - return dec - - -@quad_factory(a=0,b=4,c=0) -def quadish(x): - return x+1 - - -quadratic = quad_factory() - - -def doubler(f): - def inner(*args, **kwds): - fx = f(*args, **kwds) - return 2*fx - return inner - - -@doubler -def quadruple(x): - return 2*x - - -def test_mixins(): - # test mixins - assert double_add(1,2,3) == 2*fx - double_add.invert() - assert double_add(1,2,3) == -2*fx - - _d = dill.copy(double_add) - assert _d(1,2,3) == -2*fx - #_d.invert() #FIXME: fails seemingly randomly - #assert _d(1,2,3) == 2*fx - - assert _d.__wrapped__(1,2,3) == fx - - # XXX: issue or feature? in python3.4, inverted is linked through copy - if not double_add.inverted[0]: - double_add.invert() - - # test some stuff from source and pointers - ds = dill.source - dd = dill.detect - assert ds.getsource(dd.freevars(quadish)['f']) == '@quad_factory(a=0,b=4,c=0)\ndef quadish(x):\n return x+1\n' - assert ds.getsource(dd.freevars(quadruple)['f']) == '@doubler\ndef quadruple(x):\n return 2*x\n' - assert ds.importable(quadish, source=False) == 'from %s import quadish\n' % __name__ - assert ds.importable(quadruple, source=False) == 'from %s import quadruple\n' % __name__ - assert ds.importable(quadratic, source=False) == 'from %s import quadratic\n' % __name__ - assert ds.importable(double_add, source=False) == 'from %s import double_add\n' % __name__ - assert ds.importable(quadruple, source=True) == 'def doubler(f):\n def inner(*args, **kwds):\n fx = f(*args, **kwds)\n return 2*fx\n return inner\n\n@doubler\ndef quadruple(x):\n return 2*x\n' - #***** #FIXME: this needs work - result = ds.importable(quadish, source=True) - a,b,c,_,result = result.split('\n',4) - assert result == 'def quad_factory(a=1,b=1,c=0):\n def dec(f):\n def func(*args,**kwds):\n fx = f(*args,**kwds)\n return a*fx**2 + b*fx + c\n return func\n return dec\n\n@quad_factory(a=0,b=4,c=0)\ndef quadish(x):\n return x+1\n' - assert set([a,b,c]) == set(['a = 0', 'c = 0', 'b = 4']) - result = ds.importable(quadratic, source=True) - a,b,c,result = result.split('\n',3) - assert result == '\ndef dec(f):\n def func(*args,**kwds):\n fx = f(*args,**kwds)\n return a*fx**2 + b*fx + c\n return func\n' - assert set([a,b,c]) == set(['a = 1', 'c = 0', 'b = 1']) - result = ds.importable(double_add, source=True) - a,b,c,d,_,result = result.split('\n',5) - assert result == 'def quad(a=1, b=1, c=0):\n inverted = [False]\n def invert():\n inverted[0] = not inverted[0]\n def dec(f):\n def func(*args, **kwds):\n x = f(*args, **kwds)\n if inverted[0]: x = -x\n return a*x**2 + b*x + c\n func.__wrapped__ = f\n func.invert = invert\n func.inverted = inverted\n return func\n return dec\n\n@quad(a=0,b=2)\ndef double_add(*args):\n return sum(args)\n' - assert set([a,b,c,d]) == set(['a = 0', 'c = 0', 'b = 2', 'inverted = [True]']) - #***** - - -if __name__ == '__main__': - test_mixins() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_module.py b/venv/lib/python3.12/site-packages/dill/tests/test_module.py deleted file mode 100644 index bc0e18e..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_module.py +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -import sys -import dill -import test_mixins as module -from importlib import reload -dill.settings['recurse'] = True - -cached = (module.__cached__ if hasattr(module, "__cached__") - else module.__file__.split(".", 1)[0] + ".pyc") - -module.a = 1234 - -pik_mod = dill.dumps(module) - -module.a = 0 - -# remove module -del sys.modules[module.__name__] -del module - -module = dill.loads(pik_mod) -def test_attributes(): - #assert hasattr(module, "a") and module.a == 1234 #FIXME: -m dill.tests - assert module.double_add(1, 2, 3) == 2 * module.fx - -# Restart, and test use_diff - -reload(module) - -try: - dill.use_diff() - - module.a = 1234 - - pik_mod = dill.dumps(module) - - module.a = 0 - - # remove module - del sys.modules[module.__name__] - del module - - module = dill.loads(pik_mod) - def test_diff_attributes(): - assert hasattr(module, "a") and module.a == 1234 - assert module.double_add(1, 2, 3) == 2 * module.fx - -except AttributeError: - def test_diff_attributes(): - pass - -# clean up -import os -if os.path.exists(cached): - os.remove(cached) -pycache = os.path.join(os.path.dirname(module.__file__), "__pycache__") -if os.path.exists(pycache) and not os.listdir(pycache): - os.removedirs(pycache) - - -# test when module is None -import math - -def get_lambda(str, **kwarg): - return eval(str, kwarg, None) - -obj = get_lambda('lambda x: math.exp(x)', math=math) - -def test_module_is_none(): - assert obj.__module__ is None - assert dill.copy(obj)(3) == obj(3) - - -if __name__ == '__main__': - test_attributes() - test_diff_attributes() - test_module_is_none() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_moduledict.py b/venv/lib/python3.12/site-packages/dill/tests/test_moduledict.py deleted file mode 100644 index 7c93921..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_moduledict.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -import dill -dill.settings['recurse'] = True - -def f(func): - def w(*args): - return f(*args) - return w - -@f -def f2(): pass - -# check when __main__ and on import -def test_decorated(): - assert dill.pickles(f2) - - -import doctest -import logging -logging.basicConfig(level=logging.DEBUG) - -class SomeUnreferencedUnpicklableClass(object): - def __reduce__(self): - raise Exception - -unpicklable = SomeUnreferencedUnpicklableClass() - -# This works fine outside of Doctest: -def test_normal(): - serialized = dill.dumps(lambda x: x) - -# should not try to pickle unpicklable object in __globals__ -def tests(): - """ - >>> serialized = dill.dumps(lambda x: x) - """ - return - -#print("\n\nRunning Doctest:") -def test_doctest(): - doctest.testmod() - - -if __name__ == '__main__': - test_decorated() - test_normal() - test_doctest() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_nested.py b/venv/lib/python3.12/site-packages/dill/tests/test_nested.py deleted file mode 100644 index 0e863ab..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_nested.py +++ /dev/null @@ -1,135 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE -""" -test dill's ability to handle nested functions -""" - -import os -import math - -import dill as pickle -pickle.settings['recurse'] = True - - -# the nested function: pickle should fail here, but dill is ok. -def adder(augend): - zero = [0] - - def inner(addend): - return addend + augend + zero[0] - return inner - - -# rewrite the nested function using a class: standard pickle should work here. -class cadder(object): - def __init__(self, augend): - self.augend = augend - self.zero = [0] - - def __call__(self, addend): - return addend + self.augend + self.zero[0] - - -# rewrite again, but as an old-style class -class c2adder: - def __init__(self, augend): - self.augend = augend - self.zero = [0] - - def __call__(self, addend): - return addend + self.augend + self.zero[0] - - -# some basic class stuff -class basic(object): - pass - - -class basic2: - pass - - -x = 5 -y = 1 - - -def test_basic(): - a = [0, 1, 2] - pa = pickle.dumps(a) - pmath = pickle.dumps(math) #XXX: FAILS in pickle - pmap = pickle.dumps(map) - # ... - la = pickle.loads(pa) - lmath = pickle.loads(pmath) - lmap = pickle.loads(pmap) - assert list(map(math.sin, a)) == list(lmap(lmath.sin, la)) - - -def test_basic_class(): - pbasic2 = pickle.dumps(basic2) - _pbasic2 = pickle.loads(pbasic2)() - pbasic = pickle.dumps(basic) - _pbasic = pickle.loads(pbasic)() - - -def test_c2adder(): - pc2adder = pickle.dumps(c2adder) - pc2add5 = pickle.loads(pc2adder)(x) - assert pc2add5(y) == x+y - - -def test_pickled_cadder(): - pcadder = pickle.dumps(cadder) - pcadd5 = pickle.loads(pcadder)(x) - assert pcadd5(y) == x+y - - -def test_raw_adder_and_inner(): - add5 = adder(x) - assert add5(y) == x+y - - -def test_pickled_adder(): - padder = pickle.dumps(adder) - padd5 = pickle.loads(padder)(x) - assert padd5(y) == x+y - - -def test_pickled_inner(): - add5 = adder(x) - pinner = pickle.dumps(add5) #XXX: FAILS in pickle - p5add = pickle.loads(pinner) - assert p5add(y) == x+y - - -def test_moduledict_where_not_main(): - try: - from . import test_moduledict - except ImportError: - import test_moduledict - name = 'test_moduledict.py' - if os.path.exists(name) and os.path.exists(name+'c'): - os.remove(name+'c') - - if os.path.exists(name) and hasattr(test_moduledict, "__cached__") \ - and os.path.exists(test_moduledict.__cached__): - os.remove(getattr(test_moduledict, "__cached__")) - - if os.path.exists("__pycache__") and not os.listdir("__pycache__"): - os.removedirs("__pycache__") - - -if __name__ == '__main__': - test_basic() - test_basic_class() - test_c2adder() - test_pickled_cadder() - test_raw_adder_and_inner() - test_pickled_adder() - test_pickled_inner() - test_moduledict_where_not_main() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_objects.py b/venv/lib/python3.12/site-packages/dill/tests/test_objects.py deleted file mode 100644 index 0828cf9..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_objects.py +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE -""" -demonstrate dill's ability to pickle different python types -test pickling of all Python Standard Library objects (currently: CH 1-14 @ 2.7) -""" - -import dill as pickle -pickle.settings['recurse'] = True -#pickle.detect.trace(True) -#import pickle - -# get all objects for testing -from dill import load_types, objects, extend -load_types(pickleable=True,unpickleable=False) - -# uncomment the next two lines to test cloudpickle -#extend(False) -#import cloudpickle as pickle - -# helper objects -class _class: - def _method(self): - pass - -# objects that *fail* if imported -special = {} -special['LambdaType'] = _lambda = lambda x: lambda y: x -special['MethodType'] = _method = _class()._method -special['UnboundMethodType'] = _class._method -objects.update(special) - -def pickles(name, exact=False, verbose=True): - """quick check if object pickles with dill""" - obj = objects[name] - try: - pik = pickle.loads(pickle.dumps(obj)) - if exact: - try: - assert pik == obj - except AssertionError: - assert type(obj) == type(pik) - if verbose: print ("weak: %s %s" % (name, type(obj))) - else: - assert type(obj) == type(pik) - except Exception: - if verbose: print ("fails: %s %s" % (name, type(obj))) - - -def test_objects(verbose=True): - for member in objects.keys(): - #pickles(member, exact=True, verbose=verbose) - pickles(member, exact=False, verbose=verbose) - -if __name__ == '__main__': - import warnings - warnings.simplefilter('ignore') - test_objects(verbose=False) diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_properties.py b/venv/lib/python3.12/site-packages/dill/tests/test_properties.py deleted file mode 100644 index 2b55b39..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_properties.py +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -import sys - -import dill -dill.settings['recurse'] = True - - -class Foo(object): - def __init__(self): - self._data = 1 - - def _get_data(self): - return self._data - - def _set_data(self, x): - self._data = x - - data = property(_get_data, _set_data) - - -def test_data_not_none(): - FooS = dill.copy(Foo) - assert FooS.data.fget is not None - assert FooS.data.fset is not None - assert FooS.data.fdel is None - - -def test_data_unchanged(): - FooS = dill.copy(Foo) - try: - res = FooS().data - except Exception: - e = sys.exc_info()[1] - raise AssertionError(str(e)) - else: - assert res == 1 - - -def test_data_changed(): - FooS = dill.copy(Foo) - try: - f = FooS() - f.data = 1024 - res = f.data - except Exception: - e = sys.exc_info()[1] - raise AssertionError(str(e)) - else: - assert res == 1024 - - -if __name__ == '__main__': - test_data_not_none() - test_data_unchanged() - test_data_changed() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_pycapsule.py b/venv/lib/python3.12/site-packages/dill/tests/test_pycapsule.py deleted file mode 100644 index 735801a..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_pycapsule.py +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Author: Anirudh Vegesana (avegesan@cs.stanford.edu) -# Copyright (c) 2022-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE -""" -test pickling a PyCapsule object -""" - -import dill -import warnings - -test_pycapsule = None - -if dill._dill._testcapsule is not None: - import ctypes - def test_pycapsule(): - name = ctypes.create_string_buffer(b'dill._testcapsule') - capsule = dill._dill._PyCapsule_New( - ctypes.cast(dill._dill._PyCapsule_New, ctypes.c_void_p), - name, - None - ) - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - dill.copy(capsule) - dill._testcapsule = capsule - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - dill.copy(capsule) - dill._testcapsule = None - try: - with warnings.catch_warnings(): - warnings.simplefilter("ignore", dill.PicklingWarning) - dill.copy(capsule) - except dill.UnpicklingError: - pass - else: - raise AssertionError("Expected a different error") - -if __name__ == '__main__': - if test_pycapsule is not None: - test_pycapsule() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_recursive.py b/venv/lib/python3.12/site-packages/dill/tests/test_recursive.py deleted file mode 100644 index 5237f68..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_recursive.py +++ /dev/null @@ -1,177 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2019-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -import dill -from functools import partial -import warnings - - -def copy(obj, byref=False, recurse=False): - if byref: - try: - return dill.copy(obj, byref=byref, recurse=recurse) - except Exception: - pass - else: - raise AssertionError('Copy of %s with byref=True should have given a warning!' % (obj,)) - - warnings.simplefilter('ignore') - val = dill.copy(obj, byref=byref, recurse=recurse) - warnings.simplefilter('error') - return val - else: - return dill.copy(obj, byref=byref, recurse=recurse) - - -class obj1(object): - def __init__(self): - super(obj1, self).__init__() - -class obj2(object): - def __init__(self): - super(obj2, self).__init__() - -class obj3(object): - super_ = super - def __init__(self): - obj3.super_(obj3, self).__init__() - - -def test_super(): - assert copy(obj1(), byref=True) - assert copy(obj1(), byref=True, recurse=True) - assert copy(obj1(), recurse=True) - assert copy(obj1()) - - assert copy(obj2(), byref=True) - assert copy(obj2(), byref=True, recurse=True) - assert copy(obj2(), recurse=True) - assert copy(obj2()) - - assert copy(obj3(), byref=True) - assert copy(obj3(), byref=True, recurse=True) - assert copy(obj3(), recurse=True) - assert copy(obj3()) - - -def get_trigger(model): - pass - -class Machine(object): - def __init__(self): - self.child = Model() - self.trigger = partial(get_trigger, self) - self.child.trigger = partial(get_trigger, self.child) - -class Model(object): - pass - - - -def test_partial(): - assert copy(Machine(), byref=True) - assert copy(Machine(), byref=True, recurse=True) - assert copy(Machine(), recurse=True) - assert copy(Machine()) - - -class Machine2(object): - def __init__(self): - self.go = partial(self.member, self) - def member(self, model): - pass - - -class SubMachine(Machine2): - def __init__(self): - super(SubMachine, self).__init__() - - -def test_partials(): - assert copy(SubMachine(), byref=True) - assert copy(SubMachine(), byref=True, recurse=True) - assert copy(SubMachine(), recurse=True) - assert copy(SubMachine()) - - -class obj4(object): - def __init__(self): - super(obj4, self).__init__() - a = self - class obj5(object): - def __init__(self): - super(obj5, self).__init__() - self.a = a - self.b = obj5() - - -def test_circular_reference(): - assert copy(obj4()) - obj4_copy = dill.loads(dill.dumps(obj4())) - assert type(obj4_copy) is type(obj4_copy).__init__.__closure__[0].cell_contents - assert type(obj4_copy.b) is type(obj4_copy.b).__init__.__closure__[0].cell_contents - - -def f(): - def g(): - return g - return g - - -def test_function_cells(): - assert copy(f()) - - -def fib(n): - assert n >= 0 - if n <= 1: - return n - else: - return fib(n-1) + fib(n-2) - - -def test_recursive_function(): - global fib - fib2 = copy(fib, recurse=True) - fib3 = copy(fib) - fib4 = fib - del fib - assert fib2(5) == 5 - for _fib in (fib3, fib4): - try: - _fib(5) - except Exception: - # This is expected to fail because fib no longer exists - pass - else: - raise AssertionError("Function fib shouldn't have been found") - fib = fib4 - - -def collection_function_recursion(): - d = {} - def g(): - return d - d['g'] = g - return g - - -def test_collection_function_recursion(): - g = copy(collection_function_recursion()) - assert g()['g'] is g - - -if __name__ == '__main__': - with warnings.catch_warnings(): - warnings.simplefilter('error') - test_super() - test_partial() - test_partials() - test_circular_reference() - test_function_cells() - test_recursive_function() - test_collection_function_recursion() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_registered.py b/venv/lib/python3.12/site-packages/dill/tests/test_registered.py deleted file mode 100644 index 5c57d8a..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_registered.py +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2022-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE -""" -test pickling registered objects -""" - -import dill -from dill._objects import failures, registered, succeeds -import warnings -warnings.filterwarnings('ignore') - -def check(d, ok=True): - res = [] - for k,v in d.items(): - try: - z = dill.copy(v) - if ok: res.append(k) - except: - if not ok: res.append(k) - return res - -fails = check(failures) -try: - assert not bool(fails) -except AssertionError as e: - print("FAILS: %s" % fails) - raise e from None - -register = check(registered, ok=False) -try: - assert not bool(register) -except AssertionError as e: - print("REGISTER: %s" % register) - raise e from None - -success = check(succeeds, ok=False) -try: - assert not bool(success) -except AssertionError as e: - print("SUCCESS: %s" % success) - raise e from None - -import builtins -import types -q = dill._dill._reverse_typemap -p = {k:v for k,v in q.items() if k not in vars(builtins) and k not in vars(types)} - -diff = set(p.keys()).difference(registered.keys()) -try: - assert not bool(diff) -except AssertionError as e: - print("DIFF: %s" % diff) - raise e from None - -miss = set(registered.keys()).difference(p.keys()) -try: - assert not bool(miss) -except AssertionError as e: - print("MISS: %s" % miss) - raise e from None diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_restricted.py b/venv/lib/python3.12/site-packages/dill/tests/test_restricted.py deleted file mode 100644 index 45bba91..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_restricted.py +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env python -# -# Author: Kirill Makhonin (@kirillmakhonin) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -import dill - -class RestrictedType: - def __bool__(*args, **kwargs): - raise Exception('Restricted function') - - __eq__ = __lt__ = __le__ = __ne__ = __gt__ = __ge__ = __hash__ = __bool__ - -glob_obj = RestrictedType() - -def restricted_func(): - a = glob_obj - -def test_function_with_restricted_object(): - deserialized = dill.loads(dill.dumps(restricted_func, recurse=True)) - - -if __name__ == '__main__': - test_function_with_restricted_object() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_selected.py b/venv/lib/python3.12/site-packages/dill/tests/test_selected.py deleted file mode 100644 index b4edb34..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_selected.py +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE -""" -testing some selected object types -""" - -import dill -dill.settings['recurse'] = True - -verbose = False - -def test_dict_contents(): - c = type.__dict__ - for i,j in c.items(): - #try: - ok = dill.pickles(j) - #except Exception: - # print ("FAIL: %s with %s" % (i, dill.detect.errors(j))) - if verbose: print ("%s: %s, %s" % (ok, type(j), j)) - assert ok - if verbose: print ("") - -def _g(x): yield x; - -def _f(): - try: raise - except Exception: - from sys import exc_info - e, er, tb = exc_info() - return er, tb - -class _d(object): - def _method(self): - pass - -from dill import objects -from dill import load_types -load_types(pickleable=True,unpickleable=False) -_newclass = objects['ClassObjectType'] -# some clean-up #FIXME: should happen internal to dill -objects['TemporaryFileType'].close() -objects['FileType'].close() -del objects - -# getset_descriptor for new-style classes (fails on '_method', if not __main__) -def test_class_descriptors(): - d = _d.__dict__ - for i in d.values(): - ok = dill.pickles(i) - if verbose: print ("%s: %s, %s" % (ok, type(i), i)) - assert ok - if verbose: print ("") - od = _newclass.__dict__ - for i in od.values(): - ok = dill.pickles(i) - if verbose: print ("%s: %s, %s" % (ok, type(i), i)) - assert ok - if verbose: print ("") - -# (__main__) class instance for new-style classes -def test_class(): - o = _d() - oo = _newclass() - ok = dill.pickles(o) - if verbose: print ("%s: %s, %s" % (ok, type(o), o)) - assert ok - ok = dill.pickles(oo) - if verbose: print ("%s: %s, %s" % (ok, type(oo), oo)) - assert ok - if verbose: print ("") - -# frames, generators, and tracebacks (all depend on frame) -def test_frame_related(): - g = _g(1) - f = g.gi_frame - e,t = _f() - _is = lambda ok: ok - ok = dill.pickles(f) - if verbose: print ("%s: %s, %s" % (ok, type(f), f)) - assert not ok - ok = dill.pickles(g) - if verbose: print ("%s: %s, %s" % (ok, type(g), g)) - assert _is(not ok) #XXX: dill fails - ok = dill.pickles(t) - if verbose: print ("%s: %s, %s" % (ok, type(t), t)) - assert not ok #XXX: dill fails - ok = dill.pickles(e) - if verbose: print ("%s: %s, %s" % (ok, type(e), e)) - assert ok - if verbose: print ("") - -def test_typing(): - import typing - x = typing.Any - assert x == dill.copy(x) - x = typing.Dict[int, str] - assert x == dill.copy(x) - x = typing.List[int] - assert x == dill.copy(x) - x = typing.Tuple[int, str] - assert x == dill.copy(x) - x = typing.Tuple[int] - assert x == dill.copy(x) - x = typing.Tuple[()] - assert x == dill.copy(x) - x = typing.Tuple[()].copy_with(()) - assert x == dill.copy(x) - return - - -if __name__ == '__main__': - test_frame_related() - test_dict_contents() - test_class() - test_class_descriptors() - test_typing() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_session.py b/venv/lib/python3.12/site-packages/dill/tests/test_session.py deleted file mode 100644 index 0ec6bb5..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_session.py +++ /dev/null @@ -1,280 +0,0 @@ -#!/usr/bin/env python - -# Author: Leonardo Gama (@leogama) -# Copyright (c) 2022-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -import atexit -import os -import sys -import __main__ -from contextlib import suppress -from io import BytesIO - -import dill - -session_file = os.path.join(os.path.dirname(__file__), 'session-refimported-%s.pkl') - -################### -# Child process # -################### - -def _error_line(error, obj, refimported): - import traceback - line = traceback.format_exc().splitlines()[-2].replace('[obj]', '['+repr(obj)+']') - return "while testing (with refimported=%s): %s" % (refimported, line.lstrip()) - -if __name__ == '__main__' and len(sys.argv) >= 3 and sys.argv[1] == '--child': - # Test session loading in a fresh interpreter session. - refimported = (sys.argv[2] == 'True') - dill.load_module(session_file % refimported, module='__main__') - - def test_modules(refimported): - # FIXME: In this test setting with CPython 3.7, 'calendar' is not included - # in sys.modules, independent of the value of refimported. Tried to - # run garbage collection just before loading the session with no luck. It - # fails even when preceding them with 'import calendar'. Needed to run - # these kinds of tests in a supbrocess. Failing test sample: - # assert globals()['day_name'] is sys.modules['calendar'].__dict__['day_name'] - try: - for obj in ('json', 'url', 'local_mod', 'sax', 'dom'): - assert globals()[obj].__name__ in sys.modules - assert 'calendar' in sys.modules and 'cmath' in sys.modules - import calendar, cmath - - for obj in ('Calendar', 'isleap'): - assert globals()[obj] is sys.modules['calendar'].__dict__[obj] - assert __main__.day_name.__module__ == 'calendar' - if refimported: - assert __main__.day_name is calendar.day_name - - assert __main__.complex_log is cmath.log - - except AssertionError as error: - error.args = (_error_line(error, obj, refimported),) - raise - - test_modules(refimported) - sys.exit() - -#################### -# Parent process # -#################### - -# Create various kinds of objects to test different internal logics. - -## Modules. -import json # top-level module -import urllib as url # top-level module under alias -from xml import sax # submodule -import xml.dom.minidom as dom # submodule under alias -import test_dictviews as local_mod # non-builtin top-level module - -## Imported objects. -from calendar import Calendar, isleap, day_name # class, function, other object -from cmath import log as complex_log # imported with alias - -## Local objects. -x = 17 -empty = None -names = ['Alice', 'Bob', 'Carol'] -def squared(x): return x**2 -cubed = lambda x: x**3 -class Person: - def __init__(self, name, age): - self.name = name - self.age = age -person = Person(names[0], x) -class CalendarSubclass(Calendar): - def weekdays(self): - return [day_name[i] for i in self.iterweekdays()] -cal = CalendarSubclass() -selfref = __main__ - -# Setup global namespace for session saving tests. -class TestNamespace: - test_globals = globals().copy() - def __init__(self, **extra): - self.extra = extra - def __enter__(self): - self.backup = globals().copy() - globals().clear() - globals().update(self.test_globals) - globals().update(self.extra) - return self - def __exit__(self, *exc_info): - globals().clear() - globals().update(self.backup) - -def _clean_up_cache(module): - cached = module.__file__.split('.', 1)[0] + '.pyc' - cached = module.__cached__ if hasattr(module, '__cached__') else cached - pycache = os.path.join(os.path.dirname(module.__file__), '__pycache__') - for remove, file in [(os.remove, cached), (os.removedirs, pycache)]: - with suppress(OSError): - remove(file) - -atexit.register(_clean_up_cache, local_mod) - -def _test_objects(main, globals_copy, refimported): - try: - main_dict = __main__.__dict__ - global Person, person, Calendar, CalendarSubclass, cal, selfref - - for obj in ('json', 'url', 'local_mod', 'sax', 'dom'): - assert globals()[obj].__name__ == globals_copy[obj].__name__ - - for obj in ('x', 'empty', 'names'): - assert main_dict[obj] == globals_copy[obj] - - for obj in ['squared', 'cubed']: - assert main_dict[obj].__globals__ is main_dict - assert main_dict[obj](3) == globals_copy[obj](3) - - assert Person.__module__ == __main__.__name__ - assert isinstance(person, Person) - assert person.age == globals_copy['person'].age - - assert issubclass(CalendarSubclass, Calendar) - assert isinstance(cal, CalendarSubclass) - assert cal.weekdays() == globals_copy['cal'].weekdays() - - assert selfref is __main__ - - except AssertionError as error: - error.args = (_error_line(error, obj, refimported),) - raise - -def test_session_main(refimported): - """test dump/load_module() for __main__, both in this process and in a subprocess""" - extra_objects = {} - if refimported: - # Test unpickleable imported object in main. - from sys import flags - extra_objects['flags'] = flags - - with TestNamespace(**extra_objects) as ns: - try: - # Test session loading in a new session. - dill.dump_module(session_file % refimported, refimported=refimported) - from dill.tests.__main__ import python, shell, sp - error = sp.call([python, __file__, '--child', str(refimported)], shell=shell) - if error: sys.exit(error) - finally: - with suppress(OSError): - os.remove(session_file % refimported) - - # Test session loading in the same session. - session_buffer = BytesIO() - dill.dump_module(session_buffer, refimported=refimported) - session_buffer.seek(0) - dill.load_module(session_buffer, module='__main__') - ns.backup['_test_objects'](__main__, ns.backup, refimported) - -def test_session_other(): - """test dump/load_module() for a module other than __main__""" - import test_classdef as module - atexit.register(_clean_up_cache, module) - module.selfref = module - dict_objects = [obj for obj in module.__dict__.keys() if not obj.startswith('__')] - - session_buffer = BytesIO() - dill.dump_module(session_buffer, module) - - for obj in dict_objects: - del module.__dict__[obj] - - session_buffer.seek(0) - dill.load_module(session_buffer, module) - - assert all(obj in module.__dict__ for obj in dict_objects) - assert module.selfref is module - -def test_runtime_module(): - from types import ModuleType - modname = '__runtime__' - runtime = ModuleType(modname) - runtime.x = 42 - - mod = dill.session._stash_modules(runtime) - if mod is not runtime: - print("There are objects to save by referenece that shouldn't be:", - mod.__dill_imported, mod.__dill_imported_as, mod.__dill_imported_top_level, - file=sys.stderr) - - # This is also for code coverage, tests the use case of dump_module(refimported=True) - # without imported objects in the namespace. It's a contrived example because - # even dill can't be in it. This should work after fixing #462. - session_buffer = BytesIO() - dill.dump_module(session_buffer, module=runtime, refimported=True) - session_dump = session_buffer.getvalue() - - # Pass a new runtime created module with the same name. - runtime = ModuleType(modname) # empty - return_val = dill.load_module(BytesIO(session_dump), module=runtime) - assert return_val is None - assert runtime.__name__ == modname - assert runtime.x == 42 - assert runtime not in sys.modules.values() - - # Pass nothing as main. load_module() must create it. - session_buffer.seek(0) - runtime = dill.load_module(BytesIO(session_dump)) - assert runtime.__name__ == modname - assert runtime.x == 42 - assert runtime not in sys.modules.values() - -def test_refimported_imported_as(): - import collections - import concurrent.futures - import types - import typing - mod = sys.modules['__test__'] = types.ModuleType('__test__') - dill.executor = concurrent.futures.ThreadPoolExecutor(max_workers=1) - mod.Dict = collections.UserDict # select by type - mod.AsyncCM = typing.AsyncContextManager # select by __module__ - mod.thread_exec = dill.executor # select by __module__ with regex - - session_buffer = BytesIO() - dill.dump_module(session_buffer, mod, refimported=True) - session_buffer.seek(0) - mod = dill.load(session_buffer) - del sys.modules['__test__'] - - assert set(mod.__dill_imported_as) == { - ('collections', 'UserDict', 'Dict'), - ('typing', 'AsyncContextManager', 'AsyncCM'), - ('dill', 'executor', 'thread_exec'), - } - -def test_load_module_asdict(): - with TestNamespace(): - session_buffer = BytesIO() - dill.dump_module(session_buffer) - - global empty, names, x, y - x = y = 0 # change x and create y - del empty - globals_state = globals().copy() - - session_buffer.seek(0) - main_vars = dill.load_module_asdict(session_buffer) - - assert main_vars is not globals() - assert globals() == globals_state - - assert main_vars['__name__'] == '__main__' - assert main_vars['names'] == names - assert main_vars['names'] is not names - assert main_vars['x'] != x - assert 'y' not in main_vars - assert 'empty' in main_vars - -if __name__ == '__main__': - test_session_main(refimported=False) - test_session_main(refimported=True) - test_session_other() - test_runtime_module() - test_refimported_imported_as() - test_load_module_asdict() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_source.py b/venv/lib/python3.12/site-packages/dill/tests/test_source.py deleted file mode 100644 index 260ce6a..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_source.py +++ /dev/null @@ -1,186 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -from dill.source import getsource, getname, _wrap, getimport -from dill.source import importable -from dill._dill import IS_PYPY - -import sys -PY310b = 0x30a00b1 - -f = lambda x: x**2 -def g(x): return f(x) - x - -def h(x): - def g(x): return x - return g(x) - x - -class Foo(object): - def bar(self, x): - return x*x+x -_foo = Foo() - -def add(x,y): - return x+y - -# yes, same as 'f', but things are tricky when it comes to pointers -squared = lambda x:x**2 - -class Bar: - pass -_bar = Bar() - - # inspect.getsourcelines # dill.source.getblocks -def test_getsource(): - assert getsource(f) == 'f = lambda x: x**2\n' - assert getsource(g) == 'def g(x): return f(x) - x\n' - assert getsource(h) == 'def h(x):\n def g(x): return x\n return g(x) - x\n' - assert getname(f) == 'f' - assert getname(g) == 'g' - assert getname(h) == 'h' - assert _wrap(f)(4) == 16 - assert _wrap(g)(4) == 12 - assert _wrap(h)(4) == 0 - - assert getname(Foo) == 'Foo' - assert getname(Bar) == 'Bar' - assert getsource(Bar) == 'class Bar:\n pass\n' - assert getsource(Foo) == 'class Foo(object):\n def bar(self, x):\n return x*x+x\n' - #XXX: add getsource for _foo, _bar - -# test itself -def test_itself(): - assert getimport(getimport)=='from dill.source import getimport\n' - -# builtin functions and objects -def test_builtin(): - assert getimport(pow) == 'pow\n' - assert getimport(100) == '100\n' - assert getimport(True) == 'True\n' - assert getimport(pow, builtin=True) == 'from builtins import pow\n' - assert getimport(100, builtin=True) == '100\n' - assert getimport(True, builtin=True) == 'True\n' - # this is kinda BS... you can't import a None - assert getimport(None) == 'None\n' - assert getimport(None, builtin=True) == 'None\n' - - -# other imported functions -def test_imported(): - from math import sin - assert getimport(sin) == 'from math import sin\n' - -# interactively defined functions -def test_dynamic(): - assert getimport(add) == 'from %s import add\n' % __name__ - # interactive lambdas - assert getimport(squared) == 'from %s import squared\n' % __name__ - -# classes and class instances -def test_classes(): - from io import BytesIO as StringIO - y = "from _io import BytesIO\n" - x = y if (IS_PYPY or sys.hexversion >= PY310b) else "from io import BytesIO\n" - s = StringIO() - - assert getimport(StringIO) == x - assert getimport(s) == y - # interactively defined classes and class instances - assert getimport(Foo) == 'from %s import Foo\n' % __name__ - assert getimport(_foo) == 'from %s import Foo\n' % __name__ - - -# test importable -def test_importable(): - assert importable(add, source=False) == 'from %s import add\n' % __name__ - assert importable(squared, source=False) == 'from %s import squared\n' % __name__ - assert importable(Foo, source=False) == 'from %s import Foo\n' % __name__ - assert importable(Foo.bar, source=False) == 'from %s import bar\n' % __name__ - assert importable(_foo.bar, source=False) == 'from %s import bar\n' % __name__ - assert importable(None, source=False) == 'None\n' - assert importable(100, source=False) == '100\n' - - assert importable(add, source=True) == 'def add(x,y):\n return x+y\n' - assert importable(squared, source=True) == 'squared = lambda x:x**2\n' - assert importable(None, source=True) == 'None\n' - assert importable(Bar, source=True) == 'class Bar:\n pass\n' - assert importable(Foo, source=True) == 'class Foo(object):\n def bar(self, x):\n return x*x+x\n' - assert importable(Foo.bar, source=True) == 'def bar(self, x):\n return x*x+x\n' - assert importable(Foo.bar, source=False) == 'from %s import bar\n' % __name__ - assert importable(Foo.bar, alias='memo', source=False) == 'from %s import bar as memo\n' % __name__ - assert importable(Foo, alias='memo', source=False) == 'from %s import Foo as memo\n' % __name__ - assert importable(squared, alias='memo', source=False) == 'from %s import squared as memo\n' % __name__ - assert importable(squared, alias='memo', source=True) == 'memo = squared = lambda x:x**2\n' - assert importable(add, alias='memo', source=True) == 'def add(x,y):\n return x+y\n\nmemo = add\n' - assert importable(None, alias='memo', source=True) == 'memo = None\n' - assert importable(100, alias='memo', source=True) == 'memo = 100\n' - assert importable(add, builtin=True, source=False) == 'from %s import add\n' % __name__ - assert importable(squared, builtin=True, source=False) == 'from %s import squared\n' % __name__ - assert importable(Foo, builtin=True, source=False) == 'from %s import Foo\n' % __name__ - assert importable(Foo.bar, builtin=True, source=False) == 'from %s import bar\n' % __name__ - assert importable(_foo.bar, builtin=True, source=False) == 'from %s import bar\n' % __name__ - assert importable(None, builtin=True, source=False) == 'None\n' - assert importable(100, builtin=True, source=False) == '100\n' - - -def test_numpy(): - try: - import numpy as np - y = np.array - x = y([1,2,3]) - assert importable(x, source=False) == 'from numpy import array\narray([1, 2, 3])\n' - assert importable(y, source=False) == 'from %s import array\n' % y.__module__ - assert importable(x, source=True) == 'from numpy import array\narray([1, 2, 3])\n' - assert importable(y, source=True) == 'from %s import array\n' % y.__module__ - y = np.int64 - x = y(0) - assert importable(x, source=False) == 'from numpy import int64\nint64(0)\n' - assert importable(y, source=False) == 'from %s import int64\n' % y.__module__ - assert importable(x, source=True) == 'from numpy import int64\nint64(0)\n' - assert importable(y, source=True) == 'from %s import int64\n' % y.__module__ - y = np.bool_ - x = y(0) - import warnings - with warnings.catch_warnings(): - warnings.filterwarnings('ignore', category=FutureWarning) - warnings.filterwarnings('ignore', category=DeprecationWarning) - if hasattr(np, 'bool'): b = 'bool_' if np.bool is bool else 'bool' - else: b = 'bool_' - assert importable(x, source=False) == 'from numpy import %s\n%s(False)\n' % (b,b) - assert importable(y, source=False) == 'from %s import %s\n' % (y.__module__,b) - assert importable(x, source=True) == 'from numpy import %s\n%s(False)\n' % (b,b) - assert importable(y, source=True) == 'from %s import %s\n' % (y.__module__,b) - except ImportError: pass - -#NOTE: if before getimport(pow), will cause pow to throw AssertionError -def test_foo(): - assert importable(_foo, source=True).startswith("import dill\nclass Foo(object):\n def bar(self, x):\n return x*x+x\ndill.loads(") - -def test_safe(): - import abc - obj = abc.ABC() - obj.__class__.__name__ = "(abc' + print('foo')]) # " - try: - source = getsource(obj, force=True) - assert False - except TypeError: - assert False - except SyntaxError: - pass - -if __name__ == '__main__': - test_getsource() - test_itself() - test_builtin() - test_imported() - test_dynamic() - test_classes() - test_importable() - test_numpy() - test_foo() - test_safe() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_sources.py b/venv/lib/python3.12/site-packages/dill/tests/test_sources.py deleted file mode 100644 index 2e978dc..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_sources.py +++ /dev/null @@ -1,190 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @uqfoundation) -# Copyright (c) 2024-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE -""" -check that dill.source performs as expected with changes to locals in 3.13.0b1 -see: https://github.com/python/cpython/issues/118888 -""" -# repeat functions from test_source.py -f = lambda x: x**2 -def g(x): return f(x) - x - -def h(x): - def g(x): return x - return g(x) - x - -class Foo(object): - def bar(self, x): - return x*x+x -_foo = Foo() - -def add(x,y): - return x+y - -squared = lambda x:x**2 - -class Bar: - pass -_bar = Bar() - -# repeat, but from test_source.py -import test_source as ts - -# test objects created in other test modules -import test_mixins as tm - -import dill.source as ds - - -def test_isfrommain(): - assert ds.isfrommain(add) == True - assert ds.isfrommain(squared) == True - assert ds.isfrommain(Bar) == True - assert ds.isfrommain(_bar) == True - assert ds.isfrommain(ts.add) == False - assert ds.isfrommain(ts.squared) == False - assert ds.isfrommain(ts.Bar) == False - assert ds.isfrommain(ts._bar) == False - assert ds.isfrommain(tm.quad) == False - assert ds.isfrommain(tm.double_add) == False - assert ds.isfrommain(tm.quadratic) == False - assert ds.isdynamic(add) == False - assert ds.isdynamic(squared) == False - assert ds.isdynamic(ts.add) == False - assert ds.isdynamic(ts.squared) == False - assert ds.isdynamic(tm.double_add) == False - assert ds.isdynamic(tm.quadratic) == False - - -def test_matchlambda(): - assert ds._matchlambda(f, 'f = lambda x: x**2\n') - assert ds._matchlambda(squared, 'squared = lambda x:x**2\n') - assert ds._matchlambda(ts.f, 'f = lambda x: x**2\n') - assert ds._matchlambda(ts.squared, 'squared = lambda x:x**2\n') - - -def test_findsource(): - lines, lineno = ds.findsource(add) - assert lines[lineno] == 'def add(x,y):\n' - lines, lineno = ds.findsource(ts.add) - assert lines[lineno] == 'def add(x,y):\n' - lines, lineno = ds.findsource(squared) - assert lines[lineno] == 'squared = lambda x:x**2\n' - lines, lineno = ds.findsource(ts.squared) - assert lines[lineno] == 'squared = lambda x:x**2\n' - lines, lineno = ds.findsource(Bar) - assert lines[lineno] == 'class Bar:\n' - lines, lineno = ds.findsource(ts.Bar) - assert lines[lineno] == 'class Bar:\n' - lines, lineno = ds.findsource(_bar) - assert lines[lineno] == 'class Bar:\n' - lines, lineno = ds.findsource(ts._bar) - assert lines[lineno] == 'class Bar:\n' - lines, lineno = ds.findsource(tm.quad) - assert lines[lineno] == 'def quad(a=1, b=1, c=0):\n' - lines, lineno = ds.findsource(tm.double_add) - assert lines[lineno] == ' def func(*args, **kwds):\n' - lines, lineno = ds.findsource(tm.quadratic) - assert lines[lineno] == ' def dec(f):\n' - - -def test_getsourcelines(): - assert ''.join(ds.getsourcelines(add)[0]) == 'def add(x,y):\n return x+y\n' - assert ''.join(ds.getsourcelines(ts.add)[0]) == 'def add(x,y):\n return x+y\n' - assert ''.join(ds.getsourcelines(squared)[0]) == 'squared = lambda x:x**2\n' - assert ''.join(ds.getsourcelines(ts.squared)[0]) == 'squared = lambda x:x**2\n' - assert ''.join(ds.getsourcelines(Bar)[0]) == 'class Bar:\n pass\n' - assert ''.join(ds.getsourcelines(ts.Bar)[0]) == 'class Bar:\n pass\n' - assert ''.join(ds.getsourcelines(_bar)[0]) == 'class Bar:\n pass\n' #XXX: ? - assert ''.join(ds.getsourcelines(ts._bar)[0]) == 'class Bar:\n pass\n' #XXX: ? - assert ''.join(ds.getsourcelines(tm.quad)[0]) == 'def quad(a=1, b=1, c=0):\n inverted = [False]\n def invert():\n inverted[0] = not inverted[0]\n def dec(f):\n def func(*args, **kwds):\n x = f(*args, **kwds)\n if inverted[0]: x = -x\n return a*x**2 + b*x + c\n func.__wrapped__ = f\n func.invert = invert\n func.inverted = inverted\n return func\n return dec\n' - assert ''.join(ds.getsourcelines(tm.quadratic)[0]) == ' def dec(f):\n def func(*args,**kwds):\n fx = f(*args,**kwds)\n return a*fx**2 + b*fx + c\n return func\n' - assert ''.join(ds.getsourcelines(tm.quadratic, lstrip=True)[0]) == 'def dec(f):\n def func(*args,**kwds):\n fx = f(*args,**kwds)\n return a*fx**2 + b*fx + c\n return func\n' - assert ''.join(ds.getsourcelines(tm.quadratic, enclosing=True)[0]) == 'def quad_factory(a=1,b=1,c=0):\n def dec(f):\n def func(*args,**kwds):\n fx = f(*args,**kwds)\n return a*fx**2 + b*fx + c\n return func\n return dec\n' - assert ''.join(ds.getsourcelines(tm.double_add)[0]) == ' def func(*args, **kwds):\n x = f(*args, **kwds)\n if inverted[0]: x = -x\n return a*x**2 + b*x + c\n' - assert ''.join(ds.getsourcelines(tm.double_add, enclosing=True)[0]) == 'def quad(a=1, b=1, c=0):\n inverted = [False]\n def invert():\n inverted[0] = not inverted[0]\n def dec(f):\n def func(*args, **kwds):\n x = f(*args, **kwds)\n if inverted[0]: x = -x\n return a*x**2 + b*x + c\n func.__wrapped__ = f\n func.invert = invert\n func.inverted = inverted\n return func\n return dec\n' - - -def test_indent(): - assert ds.outdent(''.join(ds.getsourcelines(tm.quadratic)[0])) == ''.join(ds.getsourcelines(tm.quadratic, lstrip=True)[0]) - assert ds.indent(''.join(ds.getsourcelines(tm.quadratic, lstrip=True)[0]), 2) == ''.join(ds.getsourcelines(tm.quadratic)[0]) - - -def test_dumpsource(): - local = {} - exec(ds.dumpsource(add, alias='raw'), {}, local) - exec(ds.dumpsource(ts.add, alias='mod'), {}, local) - assert local['raw'](1,2) == local['mod'](1,2) - exec(ds.dumpsource(squared, alias='raw'), {}, local) - exec(ds.dumpsource(ts.squared, alias='mod'), {}, local) - assert local['raw'](3) == local['mod'](3) - assert ds._wrap(add)(1,2) == ds._wrap(ts.add)(1,2) - assert ds._wrap(squared)(3) == ds._wrap(ts.squared)(3) - - -def test_name(): - assert ds._namespace(add) == ds.getname(add, fqn=True).split('.') - assert ds._namespace(ts.add) == ds.getname(ts.add, fqn=True).split('.') - assert ds._namespace(squared) == ds.getname(squared, fqn=True).split('.') - assert ds._namespace(ts.squared) == ds.getname(ts.squared, fqn=True).split('.') - assert ds._namespace(Bar) == ds.getname(Bar, fqn=True).split('.') - assert ds._namespace(ts.Bar) == ds.getname(ts.Bar, fqn=True).split('.') - assert ds._namespace(tm.quad) == ds.getname(tm.quad, fqn=True).split('.') - #XXX: the following also works, however behavior may be wrong for nested functions - #assert ds._namespace(tm.double_add) == ds.getname(tm.double_add, fqn=True).split('.') - #assert ds._namespace(tm.quadratic) == ds.getname(tm.quadratic, fqn=True).split('.') - assert ds.getname(add) == 'add' - assert ds.getname(ts.add) == 'add' - assert ds.getname(squared) == 'squared' - assert ds.getname(ts.squared) == 'squared' - assert ds.getname(Bar) == 'Bar' - assert ds.getname(ts.Bar) == 'Bar' - assert ds.getname(tm.quad) == 'quad' - assert ds.getname(tm.double_add) == 'func' #XXX: ? - assert ds.getname(tm.quadratic) == 'dec' #XXX: ? - - -def test_getimport(): - local = {} - exec(ds.getimport(add, alias='raw'), {}, local) - exec(ds.getimport(ts.add, alias='mod'), {}, local) - assert local['raw'](1,2) == local['mod'](1,2) - exec(ds.getimport(squared, alias='raw'), {}, local) - exec(ds.getimport(ts.squared, alias='mod'), {}, local) - assert local['raw'](3) == local['mod'](3) - exec(ds.getimport(Bar, alias='raw'), {}, local) - exec(ds.getimport(ts.Bar, alias='mod'), {}, local) - assert ds.getname(local['raw']) == ds.getname(local['mod']) - exec(ds.getimport(tm.quad, alias='mod'), {}, local) - assert local['mod']()(sum)([1,2,3]) == tm.quad()(sum)([1,2,3]) - #FIXME: wrong results for nested functions (e.g. tm.double_add, tm.quadratic) - - -def test_importable(): - assert ds.importable(add, source=False) == ds.getimport(add) - assert ds.importable(add) == ds.getsource(add) - assert ds.importable(squared, source=False) == ds.getimport(squared) - assert ds.importable(squared) == ds.getsource(squared) - assert ds.importable(Bar, source=False) == ds.getimport(Bar) - assert ds.importable(Bar) == ds.getsource(Bar) - assert ds.importable(ts.add) == ds.getimport(ts.add) - assert ds.importable(ts.add, source=True) == ds.getsource(ts.add) - assert ds.importable(ts.squared) == ds.getimport(ts.squared) - assert ds.importable(ts.squared, source=True) == ds.getsource(ts.squared) - assert ds.importable(ts.Bar) == ds.getimport(ts.Bar) - assert ds.importable(ts.Bar, source=True) == ds.getsource(ts.Bar) - - -if __name__ == '__main__': - test_isfrommain() - test_matchlambda() - test_findsource() - test_getsourcelines() - test_indent() - test_dumpsource() - test_name() - test_getimport() - test_importable() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_temp.py b/venv/lib/python3.12/site-packages/dill/tests/test_temp.py deleted file mode 100644 index 6de1995..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_temp.py +++ /dev/null @@ -1,103 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -import sys -from dill.temp import dump, dump_source, dumpIO, dumpIO_source -from dill.temp import load, load_source, loadIO, loadIO_source -WINDOWS = sys.platform[:3] == 'win' - - -f = lambda x: x**2 -x = [1,2,3,4,5] - -# source code to tempfile -def test_code_to_tempfile(): - if not WINDOWS: #see: https://bugs.python.org/issue14243 - pyfile = dump_source(f, alias='_f') - _f = load_source(pyfile) - assert _f(4) == f(4) - -# source code to stream -def test_code_to_stream(): - pyfile = dumpIO_source(f, alias='_f') - _f = loadIO_source(pyfile) - assert _f(4) == f(4) - -# pickle to tempfile -def test_pickle_to_tempfile(): - if not WINDOWS: #see: https://bugs.python.org/issue14243 - dumpfile = dump(x) - _x = load(dumpfile) - assert _x == x - -# pickle to stream -def test_pickle_to_stream(): - dumpfile = dumpIO(x) - _x = loadIO(dumpfile) - assert _x == x - -### now testing the objects ### -f = lambda x: x**2 -def g(x): return f(x) - x - -def h(x): - def g(x): return x - return g(x) - x - -class Foo(object): - def bar(self, x): - return x*x+x -_foo = Foo() - -def add(x,y): - return x+y - -# yes, same as 'f', but things are tricky when it comes to pointers -squared = lambda x:x**2 - -class Bar: - pass -_bar = Bar() - - -# test function-type objects that take 2 args -def test_two_arg_functions(): - for obj in [add]: - pyfile = dumpIO_source(obj, alias='_obj') - _obj = loadIO_source(pyfile) - assert _obj(4,2) == obj(4,2) - -# test function-type objects that take 1 arg -def test_one_arg_functions(): - for obj in [g, h, squared]: - pyfile = dumpIO_source(obj, alias='_obj') - _obj = loadIO_source(pyfile) - assert _obj(4) == obj(4) - -# test instance-type objects -#for obj in [_bar, _foo]: -# pyfile = dumpIO_source(obj, alias='_obj') -# _obj = loadIO_source(pyfile) -# assert type(_obj) == type(obj) - -# test the rest of the objects -def test_the_rest(): - for obj in [Bar, Foo, Foo.bar, _foo.bar]: - pyfile = dumpIO_source(obj, alias='_obj') - _obj = loadIO_source(pyfile) - assert _obj.__name__ == obj.__name__ - - -if __name__ == '__main__': - test_code_to_tempfile() - test_code_to_stream() - test_pickle_to_tempfile() - test_pickle_to_stream() - test_two_arg_functions() - test_one_arg_functions() - test_the_rest() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_threads.py b/venv/lib/python3.12/site-packages/dill/tests/test_threads.py deleted file mode 100644 index c8843d9..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_threads.py +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2024-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -import dill -dill.settings['recurse'] = True - - -def test_new_thread(): - import threading - t = threading.Thread() - t_ = dill.copy(t) - assert t.is_alive() == t_.is_alive() - for i in ['daemon','name','ident','native_id']: - if hasattr(t, i): - assert getattr(t, i) == getattr(t_, i) - -def test_run_thread(): - import threading - t = threading.Thread() - t.start() - t_ = dill.copy(t) - assert t.is_alive() == t_.is_alive() - for i in ['daemon','name','ident','native_id']: - if hasattr(t, i): - assert getattr(t, i) == getattr(t_, i) - -def test_join_thread(): - import threading - t = threading.Thread() - t.start() - t.join() - t_ = dill.copy(t) - assert t.is_alive() == t_.is_alive() - for i in ['daemon','name','ident','native_id']: - if hasattr(t, i): - assert getattr(t, i) == getattr(t_, i) - - -if __name__ == '__main__': - test_new_thread() - test_run_thread() - test_join_thread() diff --git a/venv/lib/python3.12/site-packages/dill/tests/test_weakref.py b/venv/lib/python3.12/site-packages/dill/tests/test_weakref.py deleted file mode 100644 index 5962de5..0000000 --- a/venv/lib/python3.12/site-packages/dill/tests/test_weakref.py +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env python -# -# Author: Mike McKerns (mmckerns @caltech and @uqfoundation) -# Copyright (c) 2008-2016 California Institute of Technology. -# Copyright (c) 2016-2026 The Uncertainty Quantification Foundation. -# License: 3-clause BSD. The full license text is available at: -# - https://github.com/uqfoundation/dill/blob/master/LICENSE - -import dill -dill.settings['recurse'] = True -import weakref - -class _class: - def _method(self): - pass - -class _callable_class: - def __call__(self): - pass - -def _function(): - pass - - -def test_weakref(): - o = _class() - oc = _callable_class() - f = _function - x = _class - - # ReferenceType - r = weakref.ref(o) - d_r = weakref.ref(_class()) - fr = weakref.ref(f) - xr = weakref.ref(x) - - # ProxyType - p = weakref.proxy(o) - d_p = weakref.proxy(_class()) - - # CallableProxyType - cp = weakref.proxy(oc) - d_cp = weakref.proxy(_callable_class()) - fp = weakref.proxy(f) - xp = weakref.proxy(x) - - objlist = [r,d_r,fr,xr, p,d_p, cp,d_cp,fp,xp] - #dill.detect.trace(True) - - for obj in objlist: - res = dill.detect.errors(obj) - if res: - print ("%r:\n %s" % (obj, res)) - # else: - # print ("PASS: %s" % obj) - assert not res - -def test_dictproxy(): - from dill._dill import DictProxyType - try: - m = DictProxyType({"foo": "bar"}) - except Exception: - m = type.__dict__ - mp = dill.copy(m) - assert mp.items() == m.items() - - -if __name__ == '__main__': - test_weakref() - from dill._dill import IS_PYPY - if not IS_PYPY: - test_dictproxy() diff --git a/venv/lib/python3.12/site-packages/distutils-precedence.pth b/venv/lib/python3.12/site-packages/distutils-precedence.pth deleted file mode 100644 index 7f009fe..0000000 --- a/venv/lib/python3.12/site-packages/distutils-precedence.pth +++ /dev/null @@ -1 +0,0 @@ -import os; var = 'SETUPTOOLS_USE_DISTUTILS'; enabled = os.environ.get(var, 'local') == 'local'; enabled and __import__('_distutils_hack').add_shim(); diff --git a/venv/lib/python3.12/site-packages/docstring_to_markdown-0.17.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/docstring_to_markdown-0.17.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.12/site-packages/docstring_to_markdown-0.17.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.12/site-packages/docstring_to_markdown-0.17.dist-info/METADATA b/venv/lib/python3.12/site-packages/docstring_to_markdown-0.17.dist-info/METADATA deleted file mode 100644 index 8972652..0000000 --- a/venv/lib/python3.12/site-packages/docstring_to_markdown-0.17.dist-info/METADATA +++ /dev/null @@ -1,70 +0,0 @@ -Metadata-Version: 2.4 -Name: docstring-to-markdown -Version: 0.17 -Summary: On the fly conversion of Python docstrings to markdown -Author: Michał Krassowski -Author-email: krassowski.michal+pypi@gmail.com -License: LGPL-2.1-or-later -Project-URL: Bug Tracker, https://github.com/python-lsp/docstring-to-markdown/issues -Project-URL: Source Code, https://github.com/python-lsp/docstring-to-markdown -Keywords: Docstring,conversion,markdown -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+) -Classifier: Programming Language :: Python -Classifier: Topic :: Text Processing :: Markup -Classifier: Topic :: Documentation :: Sphinx -Requires-Python: >=3.7 -Description-Content-Type: text/markdown -License-File: LICENSE -Requires-Dist: importlib-metadata>=3.6 -Requires-Dist: typing_extensions>=4.6 -Dynamic: license-file - -# docstring-to-markdown - -[![tests](https://github.com/python-lsp/docstring-to-markdown/workflows/tests/badge.svg)](https://github.com/python-lsp/docstring-to-markdown/actions?query=workflow%3A%22tests%22) -![CodeQL](https://github.com/python-lsp/docstring-to-markdown/workflows/CodeQL/badge.svg) -[![pypi-version](https://img.shields.io/pypi/v/docstring-to-markdown.svg)](https://python.org/pypi/docstring-to-markdown) - -On the fly conversion of Python docstrings to markdown - -- Python 3.7+ (tested on 3.8 up to 3.13) -- can recognise reStructuredText and convert multiple of its features to Markdown -- since v0.13 includes initial support for Google-formatted docstrings - -### Installation - -```bash -pip install docstring-to-markdown -``` - -### Example - -Convert reStructuredText: - -```python ->>> import docstring_to_markdown ->>> docstring_to_markdown.convert(':math:`\\sum`') -'$\\sum$' -``` - -When given the format cannot be recognised an exception will be raised: - -```python ->>> docstring_to_markdown.convert('\\sum') -Traceback (most recent call last): - raise UnknownFormatError() -docstring_to_markdown.UnknownFormatError -``` - -### Extensibility - -`docstring_to_markdown` entry point group allows to add custom converters which follow the `Converter` protocol. -The built-in converters can be customized by providing entry point with matching name. - -### Development - -```bash -pip install -e . -pytest -``` diff --git a/venv/lib/python3.12/site-packages/docstring_to_markdown-0.17.dist-info/RECORD b/venv/lib/python3.12/site-packages/docstring_to_markdown-0.17.dist-info/RECORD deleted file mode 100644 index 8fabf64..0000000 --- a/venv/lib/python3.12/site-packages/docstring_to_markdown-0.17.dist-info/RECORD +++ /dev/null @@ -1,22 +0,0 @@ -docstring_to_markdown-0.17.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -docstring_to_markdown-0.17.dist-info/METADATA,sha256=ZB0VE0VZPLs5HNIMyIEWMqOUWkqTI2SyKFUeMXwpFbw,2285 -docstring_to_markdown-0.17.dist-info/RECORD,, -docstring_to_markdown-0.17.dist-info/WHEEL,sha256=wXxTzcEDnjrTwFYjLPcsW_7_XihufBwmpiBeiXNBGEA,91 -docstring_to_markdown-0.17.dist-info/entry_points.txt,sha256=u8Hio9Aa7XIVC_nPAI1F5KFEIVbtn0lUa-0HBMXIRXw,248 -docstring_to_markdown-0.17.dist-info/licenses/LICENSE,sha256=IMF9i4xIpgCADf0U-V1cuf9HBmqWQd3qtI3FSuyW4zE,26526 -docstring_to_markdown-0.17.dist-info/top_level.txt,sha256=_af5482lGo-DbcT_gtcbEzVnIH6VqsMvN7O2CgBvYNA,22 -docstring_to_markdown/__init__.py,sha256=y7QBXwufv76MPmX6zEqrmTHg13-2YEoHgFcJ0Khrcgk,1448 -docstring_to_markdown/__pycache__/__init__.cpython-312.pyc,, -docstring_to_markdown/__pycache__/_utils.cpython-312.pyc,, -docstring_to_markdown/__pycache__/cpython.cpython-312.pyc,, -docstring_to_markdown/__pycache__/google.cpython-312.pyc,, -docstring_to_markdown/__pycache__/plain.cpython-312.pyc,, -docstring_to_markdown/__pycache__/rst.cpython-312.pyc,, -docstring_to_markdown/__pycache__/types.cpython-312.pyc,, -docstring_to_markdown/_utils.py,sha256=u6box71CFBEs-bsXL8-dbFVHPhKV1Ki5nNp3ZeJjnpE,107 -docstring_to_markdown/cpython.py,sha256=vVHVYD7i82FK1xLO3FB8Wxq3j9EIO_JPqlE1s_c3Zh4,1744 -docstring_to_markdown/google.py,sha256=ieFlsv-n2da2g1ftb_oY_H_oyEyr9sqbfF9xvhhr384,4884 -docstring_to_markdown/plain.py,sha256=CC3WO3tCakgHZ0PbPATXO2pnUK2lrOI5l_kmU6PsT3M,1417 -docstring_to_markdown/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -docstring_to_markdown/rst.py,sha256=yiXEDS7VgRP7vX80mgRL_fIk1h23mWIkgUDPhAWYNUI,26686 -docstring_to_markdown/types.py,sha256=Sub4EBxqbwyz4v5JO2cxXp0boBNJhNd39hr4GMpk4_4,403 diff --git a/venv/lib/python3.12/site-packages/docstring_to_markdown-0.17.dist-info/WHEEL b/venv/lib/python3.12/site-packages/docstring_to_markdown-0.17.dist-info/WHEEL deleted file mode 100644 index 8b9e2d3..0000000 --- a/venv/lib/python3.12/site-packages/docstring_to_markdown-0.17.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (80.1.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv/lib/python3.12/site-packages/docstring_to_markdown-0.17.dist-info/entry_points.txt b/venv/lib/python3.12/site-packages/docstring_to_markdown-0.17.dist-info/entry_points.txt deleted file mode 100644 index 76ccbba..0000000 --- a/venv/lib/python3.12/site-packages/docstring_to_markdown-0.17.dist-info/entry_points.txt +++ /dev/null @@ -1,5 +0,0 @@ -[docstring_to_markdown] -cpython = docstring_to_markdown.cpython:CPythonConverter -google = docstring_to_markdown.google:GoogleConverter -plain = docstring_to_markdown.plain:PlainTextConverter -rst = docstring_to_markdown.rst:ReStructuredTextConverter diff --git a/venv/lib/python3.12/site-packages/docstring_to_markdown-0.17.dist-info/licenses/LICENSE b/venv/lib/python3.12/site-packages/docstring_to_markdown-0.17.dist-info/licenses/LICENSE deleted file mode 100644 index 8000a6f..0000000 --- a/venv/lib/python3.12/site-packages/docstring_to_markdown-0.17.dist-info/licenses/LICENSE +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 - USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random - Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! diff --git a/venv/lib/python3.12/site-packages/docstring_to_markdown-0.17.dist-info/top_level.txt b/venv/lib/python3.12/site-packages/docstring_to_markdown-0.17.dist-info/top_level.txt deleted file mode 100644 index f41a06f..0000000 --- a/venv/lib/python3.12/site-packages/docstring_to_markdown-0.17.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -docstring_to_markdown diff --git a/venv/lib/python3.12/site-packages/docstring_to_markdown/__init__.py b/venv/lib/python3.12/site-packages/docstring_to_markdown/__init__.py deleted file mode 100644 index a70ed84..0000000 --- a/venv/lib/python3.12/site-packages/docstring_to_markdown/__init__.py +++ /dev/null @@ -1,59 +0,0 @@ -from importlib_metadata import entry_points -from typing import List, TYPE_CHECKING - -from .types import Converter - -if TYPE_CHECKING: - from importlib_metadata import EntryPoint - -__version__ = "0.17" - - -class UnknownFormatError(Exception): - pass - - -def _entry_points_sort_key(entry_point: 'EntryPoint'): - if entry_point.dist is None: - return 1 - if entry_point.dist.name == "docstring-to-markdown": - return 0 - return 1 - - -def _load_converters() -> List[Converter]: - converter_entry_points = entry_points( - group="docstring_to_markdown" - ) - # sort so that the default ones can be overridden - sorted_entry_points = sorted( - converter_entry_points, - key=_entry_points_sort_key - ) - # de-duplicate - unique_entry_points = {} - for entry_point in sorted_entry_points: - unique_entry_points[entry_point.name] = entry_point - - converters = [] - for entry_point in unique_entry_points.values(): - converter_class = entry_point.load() - converters.append(converter_class()) - - converters.sort(key=lambda converter: -converter.priority) - - return converters - - -_CONVERTERS = None - - -def convert(docstring: str) -> str: - global _CONVERTERS - if _CONVERTERS is None: - _CONVERTERS = _load_converters() - for converter in _CONVERTERS: - if converter.can_convert(docstring): - return converter.convert(docstring) - - raise UnknownFormatError() diff --git a/venv/lib/python3.12/site-packages/docstring_to_markdown/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/docstring_to_markdown/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 41b7dec..0000000 Binary files a/venv/lib/python3.12/site-packages/docstring_to_markdown/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/docstring_to_markdown/__pycache__/_utils.cpython-312.pyc b/venv/lib/python3.12/site-packages/docstring_to_markdown/__pycache__/_utils.cpython-312.pyc deleted file mode 100644 index 009c0a3..0000000 Binary files a/venv/lib/python3.12/site-packages/docstring_to_markdown/__pycache__/_utils.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/docstring_to_markdown/__pycache__/cpython.cpython-312.pyc b/venv/lib/python3.12/site-packages/docstring_to_markdown/__pycache__/cpython.cpython-312.pyc deleted file mode 100644 index 956fbd5..0000000 Binary files a/venv/lib/python3.12/site-packages/docstring_to_markdown/__pycache__/cpython.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/docstring_to_markdown/__pycache__/google.cpython-312.pyc b/venv/lib/python3.12/site-packages/docstring_to_markdown/__pycache__/google.cpython-312.pyc deleted file mode 100644 index 46e325c..0000000 Binary files a/venv/lib/python3.12/site-packages/docstring_to_markdown/__pycache__/google.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/docstring_to_markdown/__pycache__/plain.cpython-312.pyc b/venv/lib/python3.12/site-packages/docstring_to_markdown/__pycache__/plain.cpython-312.pyc deleted file mode 100644 index e0a4d3d..0000000 Binary files a/venv/lib/python3.12/site-packages/docstring_to_markdown/__pycache__/plain.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/docstring_to_markdown/__pycache__/rst.cpython-312.pyc b/venv/lib/python3.12/site-packages/docstring_to_markdown/__pycache__/rst.cpython-312.pyc deleted file mode 100644 index 8d49c86..0000000 Binary files a/venv/lib/python3.12/site-packages/docstring_to_markdown/__pycache__/rst.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/docstring_to_markdown/__pycache__/types.cpython-312.pyc b/venv/lib/python3.12/site-packages/docstring_to_markdown/__pycache__/types.cpython-312.pyc deleted file mode 100644 index c39e622..0000000 Binary files a/venv/lib/python3.12/site-packages/docstring_to_markdown/__pycache__/types.cpython-312.pyc and /dev/null differ diff --git a/venv/lib/python3.12/site-packages/docstring_to_markdown/_utils.py b/venv/lib/python3.12/site-packages/docstring_to_markdown/_utils.py deleted file mode 100644 index 847c699..0000000 --- a/venv/lib/python3.12/site-packages/docstring_to_markdown/_utils.py +++ /dev/null @@ -1,5 +0,0 @@ -from re import sub - - -def escape_markdown(text: str) -> str: - return sub(r'([\\#*_[\]])', r'\\\1', text) diff --git a/venv/lib/python3.12/site-packages/docstring_to_markdown/cpython.py b/venv/lib/python3.12/site-packages/docstring_to_markdown/cpython.py deleted file mode 100644 index 974ea60..0000000 --- a/venv/lib/python3.12/site-packages/docstring_to_markdown/cpython.py +++ /dev/null @@ -1,60 +0,0 @@ -from typing import Union, List -from re import fullmatch - -from .types import Converter -from ._utils import escape_markdown - - -def _is_cpython_signature_line(line: str) -> bool: - """CPython uses signature lines in the following format: - - str(bytes_or_buffer[, encoding[, errors]]) -> str - """ - return fullmatch(r'\w+\(\S*(, \S+)*(\[, \S+\])*\)\s--?>\s.+', line) is not None - - -def cpython_to_markdown(text: str) -> Union[str, None]: - signature_lines: List[str] = [] - other_lines: List[str] = [] - for line in text.splitlines(): - if not other_lines and _is_cpython_signature_line(line): - signature_lines.append(line) - elif not signature_lines: - return None - elif line.startswith(' '): - signature_lines.append(line) - else: - other_lines.append(line) - return '\n'.join([ - '```', - '\n'.join(signature_lines), - '```', - escape_markdown('\n'.join(other_lines)) - ]) - - -def looks_like_cpython(text: str) -> bool: - return cpython_to_markdown(text) is not None - - -class CPythonConverter(Converter): - - priority = 10 - - def __init__(self) -> None: - self._last_docstring: Union[str, None] = None - self._converted: Union[str, None] = None - - def can_convert(self, docstring): - self._last_docstring = docstring - self._converted = cpython_to_markdown(docstring) - return self._converted is not None - - def convert(self, docstring): - if docstring != self._last_docstring: - self._last_docstring = docstring - self._converted = cpython_to_markdown(docstring) - return self._converted - - -__all__ = ['looks_like_cpython', 'cpython_to_markdown', 'CPythonConverter'] diff --git a/venv/lib/python3.12/site-packages/docstring_to_markdown/google.py b/venv/lib/python3.12/site-packages/docstring_to_markdown/google.py deleted file mode 100644 index 156f3da..0000000 --- a/venv/lib/python3.12/site-packages/docstring_to_markdown/google.py +++ /dev/null @@ -1,185 +0,0 @@ -import re -from textwrap import dedent -from typing import List - -from .types import Converter - - -# All possible sections in Google style docstrings -SECTION_HEADERS: List[str] = [ - "Args", - "Returns", - "Raises", - "Yields", - "Example", - "Examples", - "Attributes", - "Note", - "Todo", -] - -# These sections will not be parsed as a list of arguments/return values/etc -PLAIN_TEXT_SECTIONS: List[str] = [ - "Examples", - "Example", - "Note", - "Todo", -] - -ESCAPE_RULES = { - # Avoid Markdown in magic methods or filenames like __init__.py - r"__(?P\S+)__": r"\_\_\g\_\_", -} - - -class Section: - def __init__(self, name: str, content: str) -> None: - self.name = name - self.content = "" - - self._parse(content) - - def _parse(self, content: str) -> None: - content = content.rstrip("\n") - - if self.name in PLAIN_TEXT_SECTIONS: - self.content = dedent(content) - return - - parts = [] - cur_part = [] - - for line in content.split("\n"): - line = line.replace(" ", "", 1) - - if line.startswith(" "): - # Continuation from a multiline description - cur_part.append(line) - continue - - if cur_part: - # Leaving multiline description - parts.append(cur_part) - cur_part = [line] - else: - # Entering new description part - cur_part.append(line) - - # Last part - parts.append(cur_part) - - # Format section - for part in parts: - indentation = "" - skip_first = False - - if ":" in part[0]: - spl = part[0].split(":") - - arg = spl[0] - description = ":".join(spl[1:]).lstrip() - indentation = (len(arg) + 6) * " " - - if description: - self.content += "- `{}`: {}\n".format(arg, description) - else: - skip_first = True - self.content += "- `{}`: ".format(arg) - else: - self.content += "- {}\n".format(part[0]) - - for n, line in enumerate(part[1:]): - if skip_first and n == 0: - # This ensures that indented args get moved to the - # previous line - self.content += "{}\n".format(line.lstrip()) - continue - - self.content += "{}{}\n".format(indentation, line.lstrip()) - - self.content = self.content.rstrip("\n") - - def as_markdown(self) -> str: - return "#### {}\n\n{}\n\n".format(self.name, self.content) - - -class GoogleDocstring: - def __init__(self, docstring: str) -> None: - self.sections: List[Section] = [] - self.description: str = "" - - self._parse(docstring) - - def _parse(self, docstring: str) -> None: - self.sections = [] - self.description = "" - - buf = "" - cur_section = "" - - for line in docstring.split("\n"): - if is_section(line): - # Entering new section - if cur_section: - # Leaving previous section, save it and reset buffer - self.sections.append(Section(cur_section, buf)) - buf = "" - - # Remember currently parsed section - cur_section = line.rstrip(":") - continue - - # Parse section content - if cur_section: - buf += line + "\n" - else: - # Before setting cur_section, we're parsing the function description - self.description += line + "\n" - - # Last section - self.sections.append(Section(cur_section, buf)) - - def as_markdown(self) -> str: - text = self.description - - for section in self.sections: - text += section.as_markdown() - - return text.rstrip("\n") + "\n" # Only keep one last newline - - -def is_section(line: str) -> bool: - for section in SECTION_HEADERS: - if re.search(r"{}:".format(section), line): - return True - - return False - - -def looks_like_google(value: str) -> bool: - for section in SECTION_HEADERS: - if re.search(r"{}:\n".format(section), value): - return True - - return False - - -def google_to_markdown(text: str, extract_signature: bool = True) -> str: - # Escape parts we don't want to render - for pattern, replacement in ESCAPE_RULES.items(): - text = re.sub(pattern, replacement, text) - - docstring = GoogleDocstring(text) - - return docstring.as_markdown() - - -class GoogleConverter(Converter): - - priority = 75 - - def can_convert(self, docstring): - return looks_like_google(docstring) - - def convert(self, docstring): - return google_to_markdown(docstring) diff --git a/venv/lib/python3.12/site-packages/docstring_to_markdown/plain.py b/venv/lib/python3.12/site-packages/docstring_to_markdown/plain.py deleted file mode 100644 index 3c42253..0000000 --- a/venv/lib/python3.12/site-packages/docstring_to_markdown/plain.py +++ /dev/null @@ -1,40 +0,0 @@ -from re import fullmatch -from .types import Converter -from ._utils import escape_markdown - - -def looks_like_plain_text(value: str) -> bool: - """Check if given string has plain text following English syntax without need for escaping. - - Accepts: - - words without numbers - - full stop, bangs and question marks at the end of a word if followed by a space or end of string - - commas, colons and semicolons if after a word and followed by a space - - dashes between words (like in `e-mail`) - - double and single quotes if proceeded with a space and followed by a word, or if proceeded by a word and followed by a space (or end of string); single quotes are also allowed in between two words - - parentheses if opening preceded by space and closing followed by space or end - - Does not accept: - - square brackets (used in markdown a lot) - """ - if '_' in value: - return False - return fullmatch(r"((\w[\.!\?\)'\"](\s|$))|(\w[,:;]\s)|(\w[-']\w)|(\w\s['\"\(])|\w|\s)+", value) is not None - - -def plain_text_to_markdown(text: str) -> str: - return escape_markdown(text) - - -class PlainTextConverter(Converter): - - priority = 50 - - def can_convert(self, docstring): - return looks_like_plain_text(docstring) - - def convert(self, docstring): - return plain_text_to_markdown(docstring) - - -__all__ = ['looks_like_plain_text', 'plain_text_to_markdown', 'PlainTextConverter'] diff --git a/venv/lib/python3.12/site-packages/docstring_to_markdown/py.typed b/venv/lib/python3.12/site-packages/docstring_to_markdown/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.12/site-packages/docstring_to_markdown/rst.py b/venv/lib/python3.12/site-packages/docstring_to_markdown/rst.py deleted file mode 100644 index 040b26d..0000000 --- a/venv/lib/python3.12/site-packages/docstring_to_markdown/rst.py +++ /dev/null @@ -1,871 +0,0 @@ -from abc import ABC, abstractmethod -from enum import IntEnum, auto -from textwrap import dedent -from types import SimpleNamespace -from typing import Callable, Match, Union, List, Dict -import re - -from .types import Converter - - -class Directive: - def __init__( - self, pattern: str, replacement: Union[str, Callable[[Match], str]], - name: Union[str, None] = None, - flags: int = 0 - ): - self.pattern = pattern - self.replacement = replacement - self.name = name - self.flags = flags - - -# https://www.sphinx-doc.org/en/master/usage/restructuredtext/domains.html#cross-referencing-python-objects -SPHINX_CROSS_REF_PYTHON = ( - 'mod', - 'func', - 'data', - 'const', - 'class', - 'meth', - 'attr', - 'exc', - 'obj' -) - -# https://www.sphinx-doc.org/en/master/usage/restructuredtext/domains.html#cross-referencing-c-constructs -SPHINX_CROSS_REF_C = ( - 'member', - 'data', - 'func', - 'macro', - 'struct', - 'union', - 'enum', - 'enumerator', - 'type' -) - -# https://www.sphinx-doc.org/en/master/usage/restructuredtext/domains.html#cross-referencing -SPHINX_CROSS_REF_CPP = ( - 'any', - 'class', - 'struct', - 'func', - 'member', - 'var', - 'type', - 'concept', - 'enum', - 'enumerator' -) - -# https://www.sphinx-doc.org/en/master/usage/restructuredtext/domains.html#the-javascript-domain -SPHINX_CROSS_REF_JS = ( - 'mod', - 'func', - 'meth', - 'class', - 'data', - 'attr' -) - -# https://www.sphinx-doc.org/en/master/usage/restructuredtext/domains.html#the-restructuredtext-domain -SPHINX_CROSS_REF_RST = ( - 'dir', - 'role' -) - -# https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html -SPHINX_CROSS_REF_OTHER = ( - 'any', - # https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#cross-referencing-other-items-of-interest - 'envvar', - 'token', - 'keyword', - 'option', - 'term', -) - -SPHINX_PARAM = ( - 'param', - 'parameter', - 'arg', - 'argument', - 'key', - 'keyword' -) - -SPHINX_RULES: List[Directive] = [ - Directive( - pattern=r':c:({}):`\.?(?P[^`]+?)`'.format('|'.join(SPHINX_CROSS_REF_C)), - replacement=r'`\g`' - ), - Directive( - pattern=r':cpp:({}):`\.?(?P[^`]+?)`'.format('|'.join(SPHINX_CROSS_REF_CPP)), - replacement=r'`\g`' - ), - Directive( - pattern=r':js:({}):`\.?(?P[^`]+?)`'.format('|'.join(SPHINX_CROSS_REF_JS)), - replacement=r'`\g`' - ), - Directive( - pattern=r'(:py)?:({}):`\.?(?P[^`]+?)`'.format('|'.join(SPHINX_CROSS_REF_PYTHON)), - replacement=r'`\g`' - ), - Directive( - pattern=r'(:rst)?:({}):`\.?(?P[^`]+?)`'.format('|'.join(SPHINX_CROSS_REF_RST)), - replacement=r'`\g`' - ), - Directive( - pattern=r':({}):`\.?(?P[^`]+?)`'.format('|'.join(SPHINX_CROSS_REF_OTHER)), - replacement=r'`\g`' - ), - Directive( - pattern=r'^\s*:({}) (?P\S+) (?P\S+):'.format('|'.join(SPHINX_PARAM)), - replacement=r'- `\g` (`\g`):', - flags=re.MULTILINE - ), - Directive( - pattern=r'^\s*:({}) (?P\S+): (?P.*)(\n|\r\n?):type \2: (?P.*)$'.format('|'.join(SPHINX_PARAM)), - replacement=r'- `\g` (\g): \g', - flags=re.MULTILINE - ), - Directive( - pattern=r'^\s*:({}) (?P\S+):'.format('|'.join(SPHINX_PARAM)), - replacement=r'- `\g`:', - flags=re.MULTILINE - ), - Directive( - pattern=r'^\s*:type (?P\S+):', - replacement=r' . Type: `\g`:', - flags=re.MULTILINE - ), - Directive( - pattern=r'^\s*:(return|returns):', - replacement=r'- returns:', - flags=re.MULTILINE - ), - Directive( - pattern=r'^\s*:rtype: (?P\S+)', - replacement=r'- return type: `\g`', - flags=re.MULTILINE - ), - Directive( - pattern=r'^\s*:(raises|raise|except|exception) (?P\S+):', - replacement=r'- raises `\g`:', - flags=re.MULTILINE - ), -] - - -class Admonition: - def __init__(self, name: str, label: str, icon: str = ''): - self.name = name - self.label = label - self.icon = icon - - @property - def block_markdown(self): - return f'{self.icon} **{self.label}**' - - @property - def inline_markdown(self): - return self.block_markdown + ':' - - -ADMONITIONS = [ - Admonition( - name='caution', - label='Caution', - icon='⚠️ ' - ), - Admonition( - name='attention', - label='Attention', - icon='⚠️ ' - ), - Admonition( - name='danger', - label='Danger', - icon='⚠️ ' - ), - Admonition( - name='hint', - label='Hint', - icon='🛈' - ), - Admonition( - name='important', - label='Important', - icon='⚠️ ' - ), - Admonition( - name='note', - label='Note', - icon='🛈' - ), - Admonition( - name='tip', - label='Tip', - icon='🛈' - ), - Admonition( - name='warning', - label='Warning', - icon='⚠️ ' - ) -] - - -ADMONITION_DIRECTIVES: List[Directive] = [ - # https://docutils.sourceforge.io/docs/ref/rst/directives.html#admonitions - Directive( - pattern=rf'\.\. {admonition.name}::', - replacement=admonition.inline_markdown - ) - for admonition in ADMONITIONS -] - - -RST_DIRECTIVES: List[Directive] = [ - Directive( - pattern=r'\.\. versionchanged:: (?P\S+)(?P$|\n)', - replacement=r'*Changed in \g*\g' - ), - Directive( - pattern=r'\.\. versionadded:: (?P\S+)(?P$|\n)', - replacement=r'*Added in \g*\g' - ), - Directive( - pattern=r'\.\. deprecated:: (?P\S+)(?P$|\n)', - replacement=r'*Deprecated since \g*\g' - ), - *ADMONITION_DIRECTIVES, - Directive( - pattern=r'\.\. seealso::(?P.*)(?P$|\n)', - replacement=r'*See also*\g\g' - ), - Directive( - pattern=r':ref:`(?P