# ------------------------------------------------------------------ # 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']