xplia 1.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- venv/Lib/site-packages/_distutils_hack/__init__.py +222 -0
- venv/Lib/site-packages/_distutils_hack/override.py +1 -0
- venv/Lib/site-packages/pip/__init__.py +13 -0
- venv/Lib/site-packages/pip/__main__.py +24 -0
- venv/Lib/site-packages/pip/__pip-runner__.py +50 -0
- venv/Lib/site-packages/pip/_internal/__init__.py +19 -0
- venv/Lib/site-packages/pip/_internal/build_env.py +311 -0
- venv/Lib/site-packages/pip/_internal/cache.py +292 -0
- venv/Lib/site-packages/pip/_internal/cli/__init__.py +4 -0
- venv/Lib/site-packages/pip/_internal/cli/autocompletion.py +171 -0
- venv/Lib/site-packages/pip/_internal/cli/base_command.py +236 -0
- venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py +1074 -0
- venv/Lib/site-packages/pip/_internal/cli/command_context.py +27 -0
- venv/Lib/site-packages/pip/_internal/cli/main.py +79 -0
- venv/Lib/site-packages/pip/_internal/cli/main_parser.py +134 -0
- venv/Lib/site-packages/pip/_internal/cli/parser.py +294 -0
- venv/Lib/site-packages/pip/_internal/cli/progress_bars.py +68 -0
- venv/Lib/site-packages/pip/_internal/cli/req_command.py +508 -0
- venv/Lib/site-packages/pip/_internal/cli/spinners.py +159 -0
- venv/Lib/site-packages/pip/_internal/cli/status_codes.py +6 -0
- venv/Lib/site-packages/pip/_internal/commands/__init__.py +132 -0
- venv/Lib/site-packages/pip/_internal/commands/cache.py +222 -0
- venv/Lib/site-packages/pip/_internal/commands/check.py +54 -0
- venv/Lib/site-packages/pip/_internal/commands/completion.py +121 -0
- venv/Lib/site-packages/pip/_internal/commands/configuration.py +282 -0
- venv/Lib/site-packages/pip/_internal/commands/debug.py +199 -0
- venv/Lib/site-packages/pip/_internal/commands/download.py +147 -0
- venv/Lib/site-packages/pip/_internal/commands/freeze.py +108 -0
- venv/Lib/site-packages/pip/_internal/commands/hash.py +59 -0
- venv/Lib/site-packages/pip/_internal/commands/help.py +41 -0
- venv/Lib/site-packages/pip/_internal/commands/index.py +139 -0
- venv/Lib/site-packages/pip/_internal/commands/inspect.py +92 -0
- venv/Lib/site-packages/pip/_internal/commands/install.py +778 -0
- venv/Lib/site-packages/pip/_internal/commands/list.py +368 -0
- venv/Lib/site-packages/pip/_internal/commands/search.py +174 -0
- venv/Lib/site-packages/pip/_internal/commands/show.py +189 -0
- venv/Lib/site-packages/pip/_internal/commands/uninstall.py +113 -0
- venv/Lib/site-packages/pip/_internal/commands/wheel.py +183 -0
- venv/Lib/site-packages/pip/_internal/configuration.py +381 -0
- venv/Lib/site-packages/pip/_internal/distributions/__init__.py +21 -0
- venv/Lib/site-packages/pip/_internal/distributions/base.py +39 -0
- venv/Lib/site-packages/pip/_internal/distributions/installed.py +23 -0
- venv/Lib/site-packages/pip/_internal/distributions/sdist.py +150 -0
- venv/Lib/site-packages/pip/_internal/distributions/wheel.py +34 -0
- venv/Lib/site-packages/pip/_internal/exceptions.py +733 -0
- venv/Lib/site-packages/pip/_internal/index/__init__.py +2 -0
- venv/Lib/site-packages/pip/_internal/index/collector.py +505 -0
- venv/Lib/site-packages/pip/_internal/index/package_finder.py +1029 -0
- venv/Lib/site-packages/pip/_internal/index/sources.py +223 -0
- venv/Lib/site-packages/pip/_internal/locations/__init__.py +467 -0
- venv/Lib/site-packages/pip/_internal/locations/_distutils.py +173 -0
- venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py +213 -0
- venv/Lib/site-packages/pip/_internal/locations/base.py +81 -0
- venv/Lib/site-packages/pip/_internal/main.py +12 -0
- venv/Lib/site-packages/pip/_internal/metadata/__init__.py +127 -0
- venv/Lib/site-packages/pip/_internal/metadata/_json.py +84 -0
- venv/Lib/site-packages/pip/_internal/metadata/base.py +688 -0
- venv/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py +4 -0
- venv/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py +55 -0
- venv/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py +224 -0
- venv/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py +188 -0
- venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py +270 -0
- venv/Lib/site-packages/pip/_internal/models/__init__.py +2 -0
- venv/Lib/site-packages/pip/_internal/models/candidate.py +34 -0
- venv/Lib/site-packages/pip/_internal/models/direct_url.py +237 -0
- venv/Lib/site-packages/pip/_internal/models/format_control.py +80 -0
- venv/Lib/site-packages/pip/_internal/models/index.py +28 -0
- venv/Lib/site-packages/pip/_internal/models/installation_report.py +53 -0
- venv/Lib/site-packages/pip/_internal/models/link.py +581 -0
- venv/Lib/site-packages/pip/_internal/models/scheme.py +31 -0
- venv/Lib/site-packages/pip/_internal/models/search_scope.py +132 -0
- venv/Lib/site-packages/pip/_internal/models/selection_prefs.py +51 -0
- venv/Lib/site-packages/pip/_internal/models/target_python.py +110 -0
- venv/Lib/site-packages/pip/_internal/models/wheel.py +92 -0
- venv/Lib/site-packages/pip/_internal/network/__init__.py +2 -0
- venv/Lib/site-packages/pip/_internal/network/auth.py +561 -0
- venv/Lib/site-packages/pip/_internal/network/cache.py +69 -0
- venv/Lib/site-packages/pip/_internal/network/download.py +186 -0
- venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py +210 -0
- venv/Lib/site-packages/pip/_internal/network/session.py +519 -0
- venv/Lib/site-packages/pip/_internal/network/utils.py +96 -0
- venv/Lib/site-packages/pip/_internal/network/xmlrpc.py +60 -0
- venv/Lib/site-packages/pip/_internal/operations/__init__.py +0 -0
- venv/Lib/site-packages/pip/_internal/operations/build/__init__.py +0 -0
- venv/Lib/site-packages/pip/_internal/operations/build/build_tracker.py +124 -0
- venv/Lib/site-packages/pip/_internal/operations/build/metadata.py +39 -0
- venv/Lib/site-packages/pip/_internal/operations/build/metadata_editable.py +41 -0
- venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py +74 -0
- venv/Lib/site-packages/pip/_internal/operations/build/wheel.py +37 -0
- venv/Lib/site-packages/pip/_internal/operations/build/wheel_editable.py +46 -0
- venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py +102 -0
- venv/Lib/site-packages/pip/_internal/operations/check.py +187 -0
- venv/Lib/site-packages/pip/_internal/operations/freeze.py +255 -0
- venv/Lib/site-packages/pip/_internal/operations/install/__init__.py +2 -0
- venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py +46 -0
- venv/Lib/site-packages/pip/_internal/operations/install/wheel.py +740 -0
- venv/Lib/site-packages/pip/_internal/operations/prepare.py +743 -0
- venv/Lib/site-packages/pip/_internal/pyproject.py +179 -0
- venv/Lib/site-packages/pip/_internal/req/__init__.py +92 -0
- venv/Lib/site-packages/pip/_internal/req/constructors.py +506 -0
- venv/Lib/site-packages/pip/_internal/req/req_file.py +552 -0
- venv/Lib/site-packages/pip/_internal/req/req_install.py +874 -0
- venv/Lib/site-packages/pip/_internal/req/req_set.py +119 -0
- venv/Lib/site-packages/pip/_internal/req/req_uninstall.py +650 -0
- venv/Lib/site-packages/pip/_internal/resolution/__init__.py +0 -0
- venv/Lib/site-packages/pip/_internal/resolution/base.py +20 -0
- venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py +0 -0
- venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py +600 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py +0 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py +141 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py +555 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py +730 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py +155 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py +255 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py +80 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py +165 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py +299 -0
- venv/Lib/site-packages/pip/_internal/self_outdated_check.py +242 -0
- venv/Lib/site-packages/pip/_internal/utils/__init__.py +0 -0
- venv/Lib/site-packages/pip/_internal/utils/_jaraco_text.py +109 -0
- venv/Lib/site-packages/pip/_internal/utils/_log.py +38 -0
- venv/Lib/site-packages/pip/_internal/utils/appdirs.py +52 -0
- venv/Lib/site-packages/pip/_internal/utils/compat.py +63 -0
- venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py +165 -0
- venv/Lib/site-packages/pip/_internal/utils/datetime.py +11 -0
- venv/Lib/site-packages/pip/_internal/utils/deprecation.py +120 -0
- venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py +87 -0
- venv/Lib/site-packages/pip/_internal/utils/egg_link.py +72 -0
- venv/Lib/site-packages/pip/_internal/utils/encoding.py +36 -0
- venv/Lib/site-packages/pip/_internal/utils/entrypoints.py +84 -0
- venv/Lib/site-packages/pip/_internal/utils/filesystem.py +153 -0
- venv/Lib/site-packages/pip/_internal/utils/filetypes.py +27 -0
- venv/Lib/site-packages/pip/_internal/utils/glibc.py +88 -0
- venv/Lib/site-packages/pip/_internal/utils/hashes.py +151 -0
- venv/Lib/site-packages/pip/_internal/utils/inject_securetransport.py +35 -0
- venv/Lib/site-packages/pip/_internal/utils/logging.py +348 -0
- venv/Lib/site-packages/pip/_internal/utils/misc.py +735 -0
- venv/Lib/site-packages/pip/_internal/utils/models.py +39 -0
- venv/Lib/site-packages/pip/_internal/utils/packaging.py +57 -0
- venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py +146 -0
- venv/Lib/site-packages/pip/_internal/utils/subprocess.py +260 -0
- venv/Lib/site-packages/pip/_internal/utils/temp_dir.py +246 -0
- venv/Lib/site-packages/pip/_internal/utils/unpacking.py +257 -0
- venv/Lib/site-packages/pip/_internal/utils/urls.py +62 -0
- venv/Lib/site-packages/pip/_internal/utils/virtualenv.py +104 -0
- venv/Lib/site-packages/pip/_internal/utils/wheel.py +136 -0
- venv/Lib/site-packages/pip/_internal/vcs/__init__.py +15 -0
- venv/Lib/site-packages/pip/_internal/vcs/bazaar.py +112 -0
- venv/Lib/site-packages/pip/_internal/vcs/git.py +526 -0
- venv/Lib/site-packages/pip/_internal/vcs/mercurial.py +163 -0
- venv/Lib/site-packages/pip/_internal/vcs/subversion.py +324 -0
- venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py +705 -0
- venv/Lib/site-packages/pip/_internal/wheel_builder.py +355 -0
- venv/Lib/site-packages/pip/_vendor/__init__.py +120 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py +18 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py +61 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py +137 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py +65 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py +9 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py +188 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py +39 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py +32 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py +439 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py +111 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py +139 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py +190 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py +33 -0
- venv/Lib/site-packages/pip/_vendor/certifi/__init__.py +4 -0
- venv/Lib/site-packages/pip/_vendor/certifi/__main__.py +12 -0
- venv/Lib/site-packages/pip/_vendor/certifi/core.py +108 -0
- venv/Lib/site-packages/pip/_vendor/chardet/__init__.py +115 -0
- venv/Lib/site-packages/pip/_vendor/chardet/big5freq.py +386 -0
- venv/Lib/site-packages/pip/_vendor/chardet/big5prober.py +47 -0
- venv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py +261 -0
- venv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py +106 -0
- venv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py +147 -0
- venv/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py +0 -0
- venv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py +112 -0
- venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py +90 -0
- venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachinedict.py +19 -0
- venv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py +49 -0
- venv/Lib/site-packages/pip/_vendor/chardet/enums.py +85 -0
- venv/Lib/site-packages/pip/_vendor/chardet/escprober.py +102 -0
- venv/Lib/site-packages/pip/_vendor/chardet/escsm.py +261 -0
- venv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py +102 -0
- venv/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py +196 -0
- venv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py +47 -0
- venv/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py +388 -0
- venv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py +47 -0
- venv/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py +284 -0
- venv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py +47 -0
- venv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py +316 -0
- venv/Lib/site-packages/pip/_vendor/chardet/jisfreq.py +325 -0
- venv/Lib/site-packages/pip/_vendor/chardet/johabfreq.py +2382 -0
- venv/Lib/site-packages/pip/_vendor/chardet/johabprober.py +47 -0
- venv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py +238 -0
- venv/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py +4649 -0
- venv/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py +4397 -0
- venv/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py +4380 -0
- venv/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py +4649 -0
- venv/Lib/site-packages/pip/_vendor/chardet/langrussianmodel.py +5725 -0
- venv/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py +4380 -0
- venv/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py +4380 -0
- venv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py +147 -0
- venv/Lib/site-packages/pip/_vendor/chardet/macromanprober.py +162 -0
- venv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py +95 -0
- venv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py +57 -0
- venv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py +661 -0
- venv/Lib/site-packages/pip/_vendor/chardet/metadata/__init__.py +0 -0
- venv/Lib/site-packages/pip/_vendor/chardet/metadata/languages.py +352 -0
- venv/Lib/site-packages/pip/_vendor/chardet/resultdict.py +16 -0
- venv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py +162 -0
- venv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py +88 -0
- venv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py +105 -0
- venv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py +362 -0
- venv/Lib/site-packages/pip/_vendor/chardet/utf1632prober.py +225 -0
- venv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py +82 -0
- venv/Lib/site-packages/pip/_vendor/chardet/version.py +9 -0
- venv/Lib/site-packages/pip/_vendor/colorama/__init__.py +7 -0
- venv/Lib/site-packages/pip/_vendor/colorama/ansi.py +102 -0
- venv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py +277 -0
- venv/Lib/site-packages/pip/_vendor/colorama/initialise.py +121 -0
- venv/Lib/site-packages/pip/_vendor/colorama/tests/__init__.py +1 -0
- venv/Lib/site-packages/pip/_vendor/colorama/tests/ansi_test.py +76 -0
- venv/Lib/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py +294 -0
- venv/Lib/site-packages/pip/_vendor/colorama/tests/initialise_test.py +189 -0
- venv/Lib/site-packages/pip/_vendor/colorama/tests/isatty_test.py +57 -0
- venv/Lib/site-packages/pip/_vendor/colorama/tests/utils.py +49 -0
- venv/Lib/site-packages/pip/_vendor/colorama/tests/winterm_test.py +131 -0
- venv/Lib/site-packages/pip/_vendor/colorama/win32.py +180 -0
- venv/Lib/site-packages/pip/_vendor/colorama/winterm.py +195 -0
- venv/Lib/site-packages/pip/_vendor/distlib/__init__.py +23 -0
- venv/Lib/site-packages/pip/_vendor/distlib/compat.py +1116 -0
- venv/Lib/site-packages/pip/_vendor/distlib/database.py +1350 -0
- venv/Lib/site-packages/pip/_vendor/distlib/index.py +508 -0
- venv/Lib/site-packages/pip/_vendor/distlib/locators.py +1300 -0
- venv/Lib/site-packages/pip/_vendor/distlib/manifest.py +393 -0
- venv/Lib/site-packages/pip/_vendor/distlib/markers.py +152 -0
- venv/Lib/site-packages/pip/_vendor/distlib/metadata.py +1076 -0
- venv/Lib/site-packages/pip/_vendor/distlib/resources.py +358 -0
- venv/Lib/site-packages/pip/_vendor/distlib/scripts.py +437 -0
- venv/Lib/site-packages/pip/_vendor/distlib/util.py +1932 -0
- venv/Lib/site-packages/pip/_vendor/distlib/version.py +739 -0
- venv/Lib/site-packages/pip/_vendor/distlib/wheel.py +1082 -0
- venv/Lib/site-packages/pip/_vendor/distro/__init__.py +54 -0
- venv/Lib/site-packages/pip/_vendor/distro/__main__.py +4 -0
- venv/Lib/site-packages/pip/_vendor/distro/distro.py +1399 -0
- venv/Lib/site-packages/pip/_vendor/idna/__init__.py +44 -0
- venv/Lib/site-packages/pip/_vendor/idna/codec.py +112 -0
- venv/Lib/site-packages/pip/_vendor/idna/compat.py +13 -0
- venv/Lib/site-packages/pip/_vendor/idna/core.py +400 -0
- venv/Lib/site-packages/pip/_vendor/idna/idnadata.py +2151 -0
- venv/Lib/site-packages/pip/_vendor/idna/intranges.py +54 -0
- venv/Lib/site-packages/pip/_vendor/idna/package_data.py +2 -0
- venv/Lib/site-packages/pip/_vendor/idna/uts46data.py +8600 -0
- venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py +57 -0
- venv/Lib/site-packages/pip/_vendor/msgpack/exceptions.py +48 -0
- venv/Lib/site-packages/pip/_vendor/msgpack/ext.py +193 -0
- venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py +1010 -0
- venv/Lib/site-packages/pip/_vendor/packaging/__about__.py +26 -0
- venv/Lib/site-packages/pip/_vendor/packaging/__init__.py +25 -0
- venv/Lib/site-packages/pip/_vendor/packaging/_manylinux.py +301 -0
- venv/Lib/site-packages/pip/_vendor/packaging/_musllinux.py +136 -0
- venv/Lib/site-packages/pip/_vendor/packaging/_structures.py +61 -0
- venv/Lib/site-packages/pip/_vendor/packaging/markers.py +304 -0
- venv/Lib/site-packages/pip/_vendor/packaging/requirements.py +146 -0
- venv/Lib/site-packages/pip/_vendor/packaging/specifiers.py +802 -0
- venv/Lib/site-packages/pip/_vendor/packaging/tags.py +487 -0
- venv/Lib/site-packages/pip/_vendor/packaging/utils.py +136 -0
- venv/Lib/site-packages/pip/_vendor/packaging/version.py +504 -0
- venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py +3361 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/__init__.py +566 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/__main__.py +53 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/android.py +210 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/api.py +223 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/macos.py +91 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/unix.py +223 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/version.py +4 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/windows.py +255 -0
- venv/Lib/site-packages/pip/_vendor/pygments/__init__.py +82 -0
- venv/Lib/site-packages/pip/_vendor/pygments/__main__.py +17 -0
- venv/Lib/site-packages/pip/_vendor/pygments/cmdline.py +668 -0
- venv/Lib/site-packages/pip/_vendor/pygments/console.py +70 -0
- venv/Lib/site-packages/pip/_vendor/pygments/filter.py +71 -0
- venv/Lib/site-packages/pip/_vendor/pygments/filters/__init__.py +940 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatter.py +124 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py +158 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/_mapping.py +23 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/bbcode.py +108 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/groff.py +170 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/html.py +989 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/img.py +645 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/irc.py +154 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/latex.py +521 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/other.py +161 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py +83 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/rtf.py +146 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/svg.py +188 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/terminal.py +127 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/terminal256.py +338 -0
- venv/Lib/site-packages/pip/_vendor/pygments/lexer.py +943 -0
- venv/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py +362 -0
- venv/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py +559 -0
- venv/Lib/site-packages/pip/_vendor/pygments/lexers/python.py +1198 -0
- venv/Lib/site-packages/pip/_vendor/pygments/modeline.py +43 -0
- venv/Lib/site-packages/pip/_vendor/pygments/plugin.py +88 -0
- venv/Lib/site-packages/pip/_vendor/pygments/regexopt.py +91 -0
- venv/Lib/site-packages/pip/_vendor/pygments/scanner.py +104 -0
- venv/Lib/site-packages/pip/_vendor/pygments/sphinxext.py +217 -0
- venv/Lib/site-packages/pip/_vendor/pygments/style.py +197 -0
- venv/Lib/site-packages/pip/_vendor/pygments/styles/__init__.py +103 -0
- venv/Lib/site-packages/pip/_vendor/pygments/token.py +213 -0
- venv/Lib/site-packages/pip/_vendor/pygments/unistring.py +153 -0
- venv/Lib/site-packages/pip/_vendor/pygments/util.py +330 -0
- venv/Lib/site-packages/pip/_vendor/pyparsing/__init__.py +322 -0
- venv/Lib/site-packages/pip/_vendor/pyparsing/actions.py +217 -0
- venv/Lib/site-packages/pip/_vendor/pyparsing/common.py +432 -0
- venv/Lib/site-packages/pip/_vendor/pyparsing/core.py +6115 -0
- venv/Lib/site-packages/pip/_vendor/pyparsing/diagram/__init__.py +656 -0
- venv/Lib/site-packages/pip/_vendor/pyparsing/exceptions.py +299 -0
- venv/Lib/site-packages/pip/_vendor/pyparsing/helpers.py +1100 -0
- venv/Lib/site-packages/pip/_vendor/pyparsing/results.py +796 -0
- venv/Lib/site-packages/pip/_vendor/pyparsing/testing.py +331 -0
- venv/Lib/site-packages/pip/_vendor/pyparsing/unicode.py +361 -0
- venv/Lib/site-packages/pip/_vendor/pyparsing/util.py +284 -0
- venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__init__.py +23 -0
- venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_compat.py +8 -0
- venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_impl.py +330 -0
- venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py +18 -0
- venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py +353 -0
- venv/Lib/site-packages/pip/_vendor/requests/__init__.py +182 -0
- venv/Lib/site-packages/pip/_vendor/requests/__version__.py +14 -0
- venv/Lib/site-packages/pip/_vendor/requests/_internal_utils.py +50 -0
- venv/Lib/site-packages/pip/_vendor/requests/adapters.py +538 -0
- venv/Lib/site-packages/pip/_vendor/requests/api.py +157 -0
- venv/Lib/site-packages/pip/_vendor/requests/auth.py +315 -0
- venv/Lib/site-packages/pip/_vendor/requests/certs.py +24 -0
- venv/Lib/site-packages/pip/_vendor/requests/compat.py +67 -0
- venv/Lib/site-packages/pip/_vendor/requests/cookies.py +561 -0
- venv/Lib/site-packages/pip/_vendor/requests/exceptions.py +141 -0
- venv/Lib/site-packages/pip/_vendor/requests/help.py +131 -0
- venv/Lib/site-packages/pip/_vendor/requests/hooks.py +33 -0
- venv/Lib/site-packages/pip/_vendor/requests/models.py +1034 -0
- venv/Lib/site-packages/pip/_vendor/requests/packages.py +16 -0
- venv/Lib/site-packages/pip/_vendor/requests/sessions.py +833 -0
- venv/Lib/site-packages/pip/_vendor/requests/status_codes.py +128 -0
- venv/Lib/site-packages/pip/_vendor/requests/structures.py +99 -0
- venv/Lib/site-packages/pip/_vendor/requests/utils.py +1094 -0
- venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py +26 -0
- venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__init__.py +0 -0
- venv/Lib/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py +6 -0
- venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py +133 -0
- venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py +43 -0
- venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py +547 -0
- venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py +170 -0
- venv/Lib/site-packages/pip/_vendor/rich/__init__.py +177 -0
- venv/Lib/site-packages/pip/_vendor/rich/__main__.py +274 -0
- venv/Lib/site-packages/pip/_vendor/rich/_cell_widths.py +451 -0
- venv/Lib/site-packages/pip/_vendor/rich/_emoji_codes.py +3610 -0
- venv/Lib/site-packages/pip/_vendor/rich/_emoji_replace.py +32 -0
- venv/Lib/site-packages/pip/_vendor/rich/_export_format.py +76 -0
- venv/Lib/site-packages/pip/_vendor/rich/_extension.py +10 -0
- venv/Lib/site-packages/pip/_vendor/rich/_fileno.py +24 -0
- venv/Lib/site-packages/pip/_vendor/rich/_inspect.py +270 -0
- venv/Lib/site-packages/pip/_vendor/rich/_log_render.py +94 -0
- venv/Lib/site-packages/pip/_vendor/rich/_loop.py +43 -0
- venv/Lib/site-packages/pip/_vendor/rich/_null_file.py +69 -0
- venv/Lib/site-packages/pip/_vendor/rich/_palettes.py +309 -0
- venv/Lib/site-packages/pip/_vendor/rich/_pick.py +17 -0
- venv/Lib/site-packages/pip/_vendor/rich/_ratio.py +160 -0
- venv/Lib/site-packages/pip/_vendor/rich/_spinners.py +482 -0
- venv/Lib/site-packages/pip/_vendor/rich/_stack.py +16 -0
- venv/Lib/site-packages/pip/_vendor/rich/_timer.py +19 -0
- venv/Lib/site-packages/pip/_vendor/rich/_win32_console.py +662 -0
- venv/Lib/site-packages/pip/_vendor/rich/_windows.py +72 -0
- venv/Lib/site-packages/pip/_vendor/rich/_windows_renderer.py +56 -0
- venv/Lib/site-packages/pip/_vendor/rich/_wrap.py +56 -0
- venv/Lib/site-packages/pip/_vendor/rich/abc.py +33 -0
- venv/Lib/site-packages/pip/_vendor/rich/align.py +311 -0
- venv/Lib/site-packages/pip/_vendor/rich/ansi.py +240 -0
- venv/Lib/site-packages/pip/_vendor/rich/bar.py +94 -0
- venv/Lib/site-packages/pip/_vendor/rich/box.py +517 -0
- venv/Lib/site-packages/pip/_vendor/rich/cells.py +154 -0
- venv/Lib/site-packages/pip/_vendor/rich/color.py +622 -0
- venv/Lib/site-packages/pip/_vendor/rich/color_triplet.py +38 -0
- venv/Lib/site-packages/pip/_vendor/rich/columns.py +187 -0
- venv/Lib/site-packages/pip/_vendor/rich/console.py +2633 -0
- venv/Lib/site-packages/pip/_vendor/rich/constrain.py +37 -0
- venv/Lib/site-packages/pip/_vendor/rich/containers.py +167 -0
- venv/Lib/site-packages/pip/_vendor/rich/control.py +225 -0
- venv/Lib/site-packages/pip/_vendor/rich/default_styles.py +190 -0
- venv/Lib/site-packages/pip/_vendor/rich/diagnose.py +37 -0
- venv/Lib/site-packages/pip/_vendor/rich/emoji.py +96 -0
- venv/Lib/site-packages/pip/_vendor/rich/errors.py +34 -0
- venv/Lib/site-packages/pip/_vendor/rich/file_proxy.py +57 -0
- venv/Lib/site-packages/pip/_vendor/rich/filesize.py +89 -0
- venv/Lib/site-packages/pip/_vendor/rich/highlighter.py +232 -0
- venv/Lib/site-packages/pip/_vendor/rich/json.py +140 -0
- venv/Lib/site-packages/pip/_vendor/rich/jupyter.py +101 -0
- venv/Lib/site-packages/pip/_vendor/rich/layout.py +443 -0
- venv/Lib/site-packages/pip/_vendor/rich/live.py +375 -0
- venv/Lib/site-packages/pip/_vendor/rich/live_render.py +113 -0
- venv/Lib/site-packages/pip/_vendor/rich/logging.py +289 -0
- venv/Lib/site-packages/pip/_vendor/rich/markup.py +246 -0
- venv/Lib/site-packages/pip/_vendor/rich/measure.py +151 -0
- venv/Lib/site-packages/pip/_vendor/rich/padding.py +141 -0
- venv/Lib/site-packages/pip/_vendor/rich/pager.py +34 -0
- venv/Lib/site-packages/pip/_vendor/rich/palette.py +100 -0
- venv/Lib/site-packages/pip/_vendor/rich/panel.py +308 -0
- venv/Lib/site-packages/pip/_vendor/rich/pretty.py +994 -0
- venv/Lib/site-packages/pip/_vendor/rich/progress.py +1702 -0
- venv/Lib/site-packages/pip/_vendor/rich/progress_bar.py +224 -0
- venv/Lib/site-packages/pip/_vendor/rich/prompt.py +376 -0
- venv/Lib/site-packages/pip/_vendor/rich/protocol.py +42 -0
- venv/Lib/site-packages/pip/_vendor/rich/region.py +10 -0
- venv/Lib/site-packages/pip/_vendor/rich/repr.py +149 -0
- venv/Lib/site-packages/pip/_vendor/rich/rule.py +130 -0
- venv/Lib/site-packages/pip/_vendor/rich/scope.py +86 -0
- venv/Lib/site-packages/pip/_vendor/rich/screen.py +54 -0
- venv/Lib/site-packages/pip/_vendor/rich/segment.py +739 -0
- venv/Lib/site-packages/pip/_vendor/rich/spinner.py +137 -0
- venv/Lib/site-packages/pip/_vendor/rich/status.py +132 -0
- venv/Lib/site-packages/pip/_vendor/rich/style.py +796 -0
- venv/Lib/site-packages/pip/_vendor/rich/styled.py +42 -0
- venv/Lib/site-packages/pip/_vendor/rich/syntax.py +948 -0
- venv/Lib/site-packages/pip/_vendor/rich/table.py +1002 -0
- venv/Lib/site-packages/pip/_vendor/rich/terminal_theme.py +153 -0
- venv/Lib/site-packages/pip/_vendor/rich/text.py +1307 -0
- venv/Lib/site-packages/pip/_vendor/rich/theme.py +115 -0
- venv/Lib/site-packages/pip/_vendor/rich/themes.py +5 -0
- venv/Lib/site-packages/pip/_vendor/rich/traceback.py +756 -0
- venv/Lib/site-packages/pip/_vendor/rich/tree.py +251 -0
- venv/Lib/site-packages/pip/_vendor/six.py +998 -0
- venv/Lib/site-packages/pip/_vendor/tenacity/__init__.py +608 -0
- venv/Lib/site-packages/pip/_vendor/tenacity/_asyncio.py +94 -0
- venv/Lib/site-packages/pip/_vendor/tenacity/_utils.py +76 -0
- venv/Lib/site-packages/pip/_vendor/tenacity/after.py +51 -0
- venv/Lib/site-packages/pip/_vendor/tenacity/before.py +46 -0
- venv/Lib/site-packages/pip/_vendor/tenacity/before_sleep.py +71 -0
- venv/Lib/site-packages/pip/_vendor/tenacity/nap.py +43 -0
- venv/Lib/site-packages/pip/_vendor/tenacity/retry.py +272 -0
- venv/Lib/site-packages/pip/_vendor/tenacity/stop.py +103 -0
- venv/Lib/site-packages/pip/_vendor/tenacity/tornadoweb.py +59 -0
- venv/Lib/site-packages/pip/_vendor/tenacity/wait.py +228 -0
- venv/Lib/site-packages/pip/_vendor/tomli/__init__.py +11 -0
- venv/Lib/site-packages/pip/_vendor/tomli/_parser.py +691 -0
- venv/Lib/site-packages/pip/_vendor/tomli/_re.py +107 -0
- venv/Lib/site-packages/pip/_vendor/tomli/_types.py +10 -0
- venv/Lib/site-packages/pip/_vendor/typing_extensions.py +3072 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/__init__.py +102 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/_collections.py +337 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/_version.py +2 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/connection.py +572 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py +1132 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py +0 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py +36 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py +0 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py +519 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py +397 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py +314 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py +130 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py +518 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py +921 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py +216 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py +323 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/fields.py +274 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/filepost.py +98 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py +0 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py +0 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py +51 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py +155 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/packages/six.py +1076 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py +537 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/request.py +170 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/response.py +879 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py +49 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py +149 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/proxy.py +57 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py +22 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/request.py +137 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/response.py +107 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py +620 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py +495 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py +159 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/ssltransport.py +221 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py +271 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py +435 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/wait.py +152 -0
- venv/Lib/site-packages/pip/_vendor/webencodings/__init__.py +342 -0
- venv/Lib/site-packages/pip/_vendor/webencodings/labels.py +231 -0
- venv/Lib/site-packages/pip/_vendor/webencodings/mklabels.py +59 -0
- venv/Lib/site-packages/pip/_vendor/webencodings/tests.py +153 -0
- venv/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py +325 -0
- venv/Lib/site-packages/pip/py.typed +4 -0
- venv/Lib/site-packages/pkg_resources/__init__.py +3296 -0
- venv/Lib/site-packages/pkg_resources/_vendor/__init__.py +0 -0
- venv/Lib/site-packages/pkg_resources/_vendor/appdirs.py +608 -0
- venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__init__.py +36 -0
- venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_adapters.py +170 -0
- venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_common.py +104 -0
- venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_compat.py +98 -0
- venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_itertools.py +35 -0
- venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_legacy.py +121 -0
- venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/abc.py +137 -0
- venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/readers.py +122 -0
- venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/simple.py +116 -0
- venv/Lib/site-packages/pkg_resources/_vendor/jaraco/__init__.py +0 -0
- venv/Lib/site-packages/pkg_resources/_vendor/jaraco/context.py +213 -0
- venv/Lib/site-packages/pkg_resources/_vendor/jaraco/functools.py +525 -0
- venv/Lib/site-packages/pkg_resources/_vendor/jaraco/text/__init__.py +599 -0
- venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/__init__.py +4 -0
- venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/more.py +4316 -0
- venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/recipes.py +698 -0
- venv/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py +26 -0
- venv/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py +25 -0
- venv/Lib/site-packages/pkg_resources/_vendor/packaging/_manylinux.py +301 -0
- venv/Lib/site-packages/pkg_resources/_vendor/packaging/_musllinux.py +136 -0
- venv/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py +61 -0
- venv/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py +304 -0
- venv/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py +146 -0
- venv/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py +802 -0
- venv/Lib/site-packages/pkg_resources/_vendor/packaging/tags.py +487 -0
- venv/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py +136 -0
- venv/Lib/site-packages/pkg_resources/_vendor/packaging/version.py +504 -0
- venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__init__.py +331 -0
- venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/actions.py +207 -0
- venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/common.py +424 -0
- venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/core.py +5814 -0
- venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/diagram/__init__.py +642 -0
- venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/exceptions.py +267 -0
- venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/helpers.py +1088 -0
- venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/results.py +760 -0
- venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/testing.py +331 -0
- venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/unicode.py +352 -0
- venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/util.py +235 -0
- venv/Lib/site-packages/pkg_resources/_vendor/zipp.py +329 -0
- venv/Lib/site-packages/pkg_resources/extern/__init__.py +76 -0
- venv/Lib/site-packages/setuptools/__init__.py +247 -0
- venv/Lib/site-packages/setuptools/_deprecation_warning.py +7 -0
- venv/Lib/site-packages/setuptools/_distutils/__init__.py +24 -0
- venv/Lib/site-packages/setuptools/_distutils/_collections.py +56 -0
- venv/Lib/site-packages/setuptools/_distutils/_functools.py +20 -0
- venv/Lib/site-packages/setuptools/_distutils/_macos_compat.py +12 -0
- venv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py +572 -0
- venv/Lib/site-packages/setuptools/_distutils/archive_util.py +280 -0
- venv/Lib/site-packages/setuptools/_distutils/bcppcompiler.py +408 -0
- venv/Lib/site-packages/setuptools/_distutils/ccompiler.py +1220 -0
- venv/Lib/site-packages/setuptools/_distutils/cmd.py +436 -0
- venv/Lib/site-packages/setuptools/_distutils/command/__init__.py +25 -0
- venv/Lib/site-packages/setuptools/_distutils/command/_framework_compat.py +55 -0
- venv/Lib/site-packages/setuptools/_distutils/command/bdist.py +157 -0
- venv/Lib/site-packages/setuptools/_distutils/command/bdist_dumb.py +144 -0
- venv/Lib/site-packages/setuptools/_distutils/command/bdist_rpm.py +615 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build.py +153 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build_clib.py +208 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build_ext.py +787 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build_py.py +407 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build_scripts.py +173 -0
- venv/Lib/site-packages/setuptools/_distutils/command/check.py +151 -0
- venv/Lib/site-packages/setuptools/_distutils/command/clean.py +76 -0
- venv/Lib/site-packages/setuptools/_distutils/command/config.py +377 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install.py +814 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_data.py +84 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_egg_info.py +91 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_headers.py +45 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_lib.py +238 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_scripts.py +61 -0
- venv/Lib/site-packages/setuptools/_distutils/command/py37compat.py +31 -0
- venv/Lib/site-packages/setuptools/_distutils/command/register.py +319 -0
- venv/Lib/site-packages/setuptools/_distutils/command/sdist.py +531 -0
- venv/Lib/site-packages/setuptools/_distutils/command/upload.py +205 -0
- venv/Lib/site-packages/setuptools/_distutils/config.py +139 -0
- venv/Lib/site-packages/setuptools/_distutils/core.py +291 -0
- venv/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py +364 -0
- venv/Lib/site-packages/setuptools/_distutils/debug.py +5 -0
- venv/Lib/site-packages/setuptools/_distutils/dep_util.py +96 -0
- venv/Lib/site-packages/setuptools/_distutils/dir_util.py +243 -0
- venv/Lib/site-packages/setuptools/_distutils/dist.py +1286 -0
- venv/Lib/site-packages/setuptools/_distutils/errors.py +127 -0
- venv/Lib/site-packages/setuptools/_distutils/extension.py +248 -0
- venv/Lib/site-packages/setuptools/_distutils/fancy_getopt.py +470 -0
- venv/Lib/site-packages/setuptools/_distutils/file_util.py +249 -0
- venv/Lib/site-packages/setuptools/_distutils/filelist.py +371 -0
- venv/Lib/site-packages/setuptools/_distutils/log.py +80 -0
- venv/Lib/site-packages/setuptools/_distutils/msvc9compiler.py +832 -0
- venv/Lib/site-packages/setuptools/_distutils/msvccompiler.py +695 -0
- venv/Lib/site-packages/setuptools/_distutils/py38compat.py +8 -0
- venv/Lib/site-packages/setuptools/_distutils/py39compat.py +22 -0
- venv/Lib/site-packages/setuptools/_distutils/spawn.py +109 -0
- venv/Lib/site-packages/setuptools/_distutils/sysconfig.py +558 -0
- venv/Lib/site-packages/setuptools/_distutils/text_file.py +287 -0
- venv/Lib/site-packages/setuptools/_distutils/unixccompiler.py +401 -0
- venv/Lib/site-packages/setuptools/_distutils/util.py +513 -0
- venv/Lib/site-packages/setuptools/_distutils/version.py +358 -0
- venv/Lib/site-packages/setuptools/_distutils/versionpredicate.py +175 -0
- venv/Lib/site-packages/setuptools/_entry_points.py +86 -0
- venv/Lib/site-packages/setuptools/_imp.py +82 -0
- venv/Lib/site-packages/setuptools/_importlib.py +47 -0
- venv/Lib/site-packages/setuptools/_itertools.py +23 -0
- venv/Lib/site-packages/setuptools/_path.py +29 -0
- venv/Lib/site-packages/setuptools/_reqs.py +19 -0
- venv/Lib/site-packages/setuptools/_vendor/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__init__.py +1047 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py +68 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_collections.py +30 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_compat.py +71 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_functools.py +104 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py +73 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_meta.py +48 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_text.py +99 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__init__.py +36 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_adapters.py +170 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_common.py +104 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_compat.py +98 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_itertools.py +35 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_legacy.py +121 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_resources/abc.py +137 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_resources/readers.py +122 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_resources/simple.py +116 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/context.py +213 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/functools.py +525 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/text/__init__.py +599 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/__init__.py +4 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/more.py +3824 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/recipes.py +620 -0
- venv/Lib/site-packages/setuptools/_vendor/ordered_set.py +488 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/__about__.py +26 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/__init__.py +25 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/_manylinux.py +301 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/_musllinux.py +136 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/_structures.py +61 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/markers.py +304 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/requirements.py +146 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py +802 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/tags.py +487 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/utils.py +136 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/version.py +504 -0
- venv/Lib/site-packages/setuptools/_vendor/pyparsing/__init__.py +331 -0
- venv/Lib/site-packages/setuptools/_vendor/pyparsing/actions.py +207 -0
- venv/Lib/site-packages/setuptools/_vendor/pyparsing/common.py +424 -0
- venv/Lib/site-packages/setuptools/_vendor/pyparsing/core.py +5814 -0
- venv/Lib/site-packages/setuptools/_vendor/pyparsing/diagram/__init__.py +642 -0
- venv/Lib/site-packages/setuptools/_vendor/pyparsing/exceptions.py +267 -0
- venv/Lib/site-packages/setuptools/_vendor/pyparsing/helpers.py +1088 -0
- venv/Lib/site-packages/setuptools/_vendor/pyparsing/results.py +760 -0
- venv/Lib/site-packages/setuptools/_vendor/pyparsing/testing.py +331 -0
- venv/Lib/site-packages/setuptools/_vendor/pyparsing/unicode.py +352 -0
- venv/Lib/site-packages/setuptools/_vendor/pyparsing/util.py +235 -0
- venv/Lib/site-packages/setuptools/_vendor/tomli/__init__.py +11 -0
- venv/Lib/site-packages/setuptools/_vendor/tomli/_parser.py +691 -0
- venv/Lib/site-packages/setuptools/_vendor/tomli/_re.py +107 -0
- venv/Lib/site-packages/setuptools/_vendor/tomli/_types.py +10 -0
- venv/Lib/site-packages/setuptools/_vendor/typing_extensions.py +2296 -0
- venv/Lib/site-packages/setuptools/_vendor/zipp.py +329 -0
- venv/Lib/site-packages/setuptools/archive_util.py +213 -0
- venv/Lib/site-packages/setuptools/build_meta.py +511 -0
- venv/Lib/site-packages/setuptools/command/__init__.py +12 -0
- venv/Lib/site-packages/setuptools/command/alias.py +78 -0
- venv/Lib/site-packages/setuptools/command/bdist_egg.py +457 -0
- venv/Lib/site-packages/setuptools/command/bdist_rpm.py +40 -0
- venv/Lib/site-packages/setuptools/command/build.py +146 -0
- venv/Lib/site-packages/setuptools/command/build_clib.py +101 -0
- venv/Lib/site-packages/setuptools/command/build_ext.py +383 -0
- venv/Lib/site-packages/setuptools/command/build_py.py +368 -0
- venv/Lib/site-packages/setuptools/command/develop.py +193 -0
- venv/Lib/site-packages/setuptools/command/dist_info.py +142 -0
- venv/Lib/site-packages/setuptools/command/easy_install.py +2312 -0
- venv/Lib/site-packages/setuptools/command/editable_wheel.py +844 -0
- venv/Lib/site-packages/setuptools/command/egg_info.py +763 -0
- venv/Lib/site-packages/setuptools/command/install.py +139 -0
- venv/Lib/site-packages/setuptools/command/install_egg_info.py +63 -0
- venv/Lib/site-packages/setuptools/command/install_lib.py +122 -0
- venv/Lib/site-packages/setuptools/command/install_scripts.py +70 -0
- venv/Lib/site-packages/setuptools/command/py36compat.py +134 -0
- venv/Lib/site-packages/setuptools/command/register.py +18 -0
- venv/Lib/site-packages/setuptools/command/rotate.py +64 -0
- venv/Lib/site-packages/setuptools/command/saveopts.py +22 -0
- venv/Lib/site-packages/setuptools/command/sdist.py +210 -0
- venv/Lib/site-packages/setuptools/command/setopt.py +149 -0
- venv/Lib/site-packages/setuptools/command/test.py +251 -0
- venv/Lib/site-packages/setuptools/command/upload.py +17 -0
- venv/Lib/site-packages/setuptools/command/upload_docs.py +213 -0
- venv/Lib/site-packages/setuptools/config/__init__.py +35 -0
- venv/Lib/site-packages/setuptools/config/_apply_pyprojecttoml.py +377 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/__init__.py +34 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/error_reporting.py +318 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/extra_validations.py +36 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py +51 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py +1035 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/formats.py +259 -0
- venv/Lib/site-packages/setuptools/config/expand.py +462 -0
- venv/Lib/site-packages/setuptools/config/pyprojecttoml.py +493 -0
- venv/Lib/site-packages/setuptools/config/setupcfg.py +762 -0
- venv/Lib/site-packages/setuptools/dep_util.py +25 -0
- venv/Lib/site-packages/setuptools/depends.py +176 -0
- venv/Lib/site-packages/setuptools/discovery.py +600 -0
- venv/Lib/site-packages/setuptools/dist.py +1222 -0
- venv/Lib/site-packages/setuptools/errors.py +58 -0
- venv/Lib/site-packages/setuptools/extension.py +148 -0
- venv/Lib/site-packages/setuptools/extern/__init__.py +76 -0
- venv/Lib/site-packages/setuptools/glob.py +167 -0
- venv/Lib/site-packages/setuptools/installer.py +104 -0
- venv/Lib/site-packages/setuptools/launch.py +36 -0
- venv/Lib/site-packages/setuptools/logging.py +36 -0
- venv/Lib/site-packages/setuptools/monkey.py +165 -0
- venv/Lib/site-packages/setuptools/msvc.py +1703 -0
- venv/Lib/site-packages/setuptools/namespaces.py +107 -0
- venv/Lib/site-packages/setuptools/package_index.py +1126 -0
- venv/Lib/site-packages/setuptools/py34compat.py +13 -0
- venv/Lib/site-packages/setuptools/sandbox.py +530 -0
- venv/Lib/site-packages/setuptools/unicode_utils.py +42 -0
- venv/Lib/site-packages/setuptools/version.py +6 -0
- venv/Lib/site-packages/setuptools/wheel.py +222 -0
- venv/Lib/site-packages/setuptools/windows_support.py +29 -0
- xplia/__init__.py +72 -0
- xplia/api/__init__.py +432 -0
- xplia/api/fastapi_app.py +453 -0
- xplia/cli.py +321 -0
- xplia/compliance/__init__.py +39 -0
- xplia/compliance/ai_act.py +538 -0
- xplia/compliance/compliance_checker.py +511 -0
- xplia/compliance/compliance_report.py +236 -0
- xplia/compliance/expert_review/__init__.py +18 -0
- xplia/compliance/expert_review/evaluation_criteria.py +209 -0
- xplia/compliance/expert_review/integration.py +270 -0
- xplia/compliance/expert_review/trust_expert_evaluator.py +379 -0
- xplia/compliance/explanation_rights.py +45 -0
- xplia/compliance/formatters/__init__.py +35 -0
- xplia/compliance/formatters/csv_formatter.py +179 -0
- xplia/compliance/formatters/html_formatter.py +689 -0
- xplia/compliance/formatters/html_trust_formatter.py +147 -0
- xplia/compliance/formatters/json_formatter.py +107 -0
- xplia/compliance/formatters/pdf_formatter.py +641 -0
- xplia/compliance/formatters/pdf_trust_formatter.py +309 -0
- xplia/compliance/formatters/trust_formatter_mixin.py +267 -0
- xplia/compliance/formatters/xml_formatter.py +173 -0
- xplia/compliance/gdpr.py +803 -0
- xplia/compliance/hipaa.py +134 -0
- xplia/compliance/report_base.py +205 -0
- xplia/compliance/report_generator.py +820 -0
- xplia/compliance/translations.py +299 -0
- xplia/core/__init__.py +98 -0
- xplia/core/base.py +391 -0
- xplia/core/config.py +297 -0
- xplia/core/factory.py +416 -0
- xplia/core/model_adapters/__init__.py +47 -0
- xplia/core/model_adapters/base.py +160 -0
- xplia/core/model_adapters/pytorch_adapter.py +339 -0
- xplia/core/model_adapters/sklearn_adapter.py +215 -0
- xplia/core/model_adapters/tensorflow_adapter.py +280 -0
- xplia/core/model_adapters/xgboost_adapter.py +295 -0
- xplia/core/optimizations.py +322 -0
- xplia/core/performance/__init__.py +57 -0
- xplia/core/performance/cache_manager.py +502 -0
- xplia/core/performance/memory_optimizer.py +465 -0
- xplia/core/performance/parallel_executor.py +327 -0
- xplia/core/registry.py +1234 -0
- xplia/explainers/__init__.py +70 -0
- xplia/explainers/__init__updated.py +62 -0
- xplia/explainers/adaptive/__init__.py +24 -0
- xplia/explainers/adaptive/explainer_selector.py +405 -0
- xplia/explainers/adaptive/explanation_quality.py +395 -0
- xplia/explainers/adaptive/fusion_strategies.py +297 -0
- xplia/explainers/adaptive/meta_explainer.py +320 -0
- xplia/explainers/adversarial/__init__.py +21 -0
- xplia/explainers/adversarial/adversarial_xai.py +678 -0
- xplia/explainers/anchor_explainer.py +1769 -0
- xplia/explainers/attention_explainer.py +996 -0
- xplia/explainers/bayesian/__init__.py +8 -0
- xplia/explainers/bayesian/bayesian_explainer.py +127 -0
- xplia/explainers/bias/__init__.py +17 -0
- xplia/explainers/bias/advanced_bias_detection.py +934 -0
- xplia/explainers/calibration/__init__.py +26 -0
- xplia/explainers/calibration/audience_adapter.py +376 -0
- xplia/explainers/calibration/audience_profiles.py +372 -0
- xplia/explainers/calibration/calibration_metrics.py +299 -0
- xplia/explainers/calibration/explanation_calibrator.py +460 -0
- xplia/explainers/causal/__init__.py +19 -0
- xplia/explainers/causal/causal_inference.py +669 -0
- xplia/explainers/certified/__init__.py +21 -0
- xplia/explainers/certified/certified_explanations.py +619 -0
- xplia/explainers/continual/__init__.py +8 -0
- xplia/explainers/continual/continual_explainer.py +102 -0
- xplia/explainers/counterfactual_explainer.py +804 -0
- xplia/explainers/counterfactuals/__init__.py +17 -0
- xplia/explainers/counterfactuals/advanced_counterfactuals.py +259 -0
- xplia/explainers/expert_evaluator.py +538 -0
- xplia/explainers/feature_importance_explainer.py +376 -0
- xplia/explainers/federated/__init__.py +17 -0
- xplia/explainers/federated/federated_xai.py +664 -0
- xplia/explainers/generative/__init__.py +15 -0
- xplia/explainers/generative/generative_explainer.py +243 -0
- xplia/explainers/gradient_explainer.py +3590 -0
- xplia/explainers/graph/__init__.py +26 -0
- xplia/explainers/graph/gnn_explainer.py +638 -0
- xplia/explainers/graph/molecular_explainer.py +438 -0
- xplia/explainers/lime_explainer.py +1580 -0
- xplia/explainers/llm/__init__.py +23 -0
- xplia/explainers/llm/llm_explainability.py +737 -0
- xplia/explainers/metalearning/__init__.py +15 -0
- xplia/explainers/metalearning/metalearning_explainer.py +276 -0
- xplia/explainers/moe/__init__.py +8 -0
- xplia/explainers/moe/moe_explainer.py +108 -0
- xplia/explainers/multimodal/__init__.py +30 -0
- xplia/explainers/multimodal/base.py +262 -0
- xplia/explainers/multimodal/diffusion_explainer.py +608 -0
- xplia/explainers/multimodal/foundation_model_explainer.py +323 -0
- xplia/explainers/multimodal/registry.py +139 -0
- xplia/explainers/multimodal/text_image_explainer.py +381 -0
- xplia/explainers/multimodal/vision_language_explainer.py +608 -0
- xplia/explainers/nas/__init__.py +5 -0
- xplia/explainers/nas/nas_explainer.py +65 -0
- xplia/explainers/neuralodes/__init__.py +5 -0
- xplia/explainers/neuralodes/neuralode_explainer.py +64 -0
- xplia/explainers/neurosymbolic/__init__.py +8 -0
- xplia/explainers/neurosymbolic/neurosymbolic_explainer.py +97 -0
- xplia/explainers/partial_dependence_explainer.py +509 -0
- xplia/explainers/privacy/__init__.py +21 -0
- xplia/explainers/privacy/differential_privacy_xai.py +624 -0
- xplia/explainers/quantum/__init__.py +5 -0
- xplia/explainers/quantum/quantum_explainer.py +79 -0
- xplia/explainers/recommender/__init__.py +8 -0
- xplia/explainers/recommender/recsys_explainer.py +124 -0
- xplia/explainers/reinforcement/__init__.py +15 -0
- xplia/explainers/reinforcement/rl_explainer.py +173 -0
- xplia/explainers/shap_explainer.py +2238 -0
- xplia/explainers/streaming/__init__.py +19 -0
- xplia/explainers/streaming/streaming_xai.py +703 -0
- xplia/explainers/timeseries/__init__.py +15 -0
- xplia/explainers/timeseries/timeseries_explainer.py +252 -0
- xplia/explainers/trust/__init__.py +24 -0
- xplia/explainers/trust/confidence_report.py +368 -0
- xplia/explainers/trust/fairwashing.py +489 -0
- xplia/explainers/trust/uncertainty.py +453 -0
- xplia/explainers/unified_explainer.py +566 -0
- xplia/explainers/unified_explainer_utils.py +309 -0
- xplia/integrations/__init__.py +3 -0
- xplia/integrations/mlflow_integration.py +331 -0
- xplia/integrations/wandb_integration.py +375 -0
- xplia/plugins/__init__.py +36 -0
- xplia/plugins/example_visualizer.py +11 -0
- xplia/utils/__init__.py +18 -0
- xplia/utils/performance.py +119 -0
- xplia/utils/validation.py +109 -0
- xplia/visualizations/__init__.py +31 -0
- xplia/visualizations/base.py +256 -0
- xplia/visualizations/boxplot_chart.py +224 -0
- xplia/visualizations/charts_impl.py +65 -0
- xplia/visualizations/gauge_chart.py +211 -0
- xplia/visualizations/gradient_viz.py +117 -0
- xplia/visualizations/heatmap_chart.py +173 -0
- xplia/visualizations/histogram_chart.py +176 -0
- xplia/visualizations/line_chart.py +100 -0
- xplia/visualizations/pie_chart.py +134 -0
- xplia/visualizations/radar_chart.py +154 -0
- xplia/visualizations/registry.py +76 -0
- xplia/visualizations/sankey_chart.py +190 -0
- xplia/visualizations/scatter_chart.py +252 -0
- xplia/visualizations/table_chart.py +263 -0
- xplia/visualizations/treemap_chart.py +216 -0
- xplia/visualizations.py +535 -0
- xplia/visualizers/__init__.py +87 -0
- xplia/visualizers/base_visualizer.py +294 -0
- xplia-1.0.1.dist-info/METADATA +685 -0
- xplia-1.0.1.dist-info/RECORD +870 -0
- xplia-1.0.1.dist-info/WHEEL +5 -0
- xplia-1.0.1.dist-info/entry_points.txt +2 -0
- xplia-1.0.1.dist-info/licenses/LICENSE +21 -0
- xplia-1.0.1.dist-info/top_level.txt +2 -0
xplia/core/registry.py
ADDED
|
@@ -0,0 +1,1234 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Système avancé de registre pour XPLIA
|
|
3
|
+
==================================
|
|
4
|
+
|
|
5
|
+
Ce module implémente un système de registre hautement extensible permettant
|
|
6
|
+
d'enregistrer et de découvrir dynamiquement les explainers, visualiseurs et autres
|
|
7
|
+
composants de la librairie XPLIA.
|
|
8
|
+
|
|
9
|
+
Fonctionnalités avancées:
|
|
10
|
+
- Enregistrement transparent et automatique des composants
|
|
11
|
+
- Support pour métadonnées riches et annotations
|
|
12
|
+
- Gestion des dépendances et des incompatibilités entre composants
|
|
13
|
+
- Recherche sémantique et filtrage avancé des composants
|
|
14
|
+
- Versionning et compatibilité entre composants du framework
|
|
15
|
+
- Audit automatique et surveillance des performances
|
|
16
|
+
- Intégration fluide avec les systèmes d'observabilité
|
|
17
|
+
- Support pour la découverte à chaud de nouveaux plugins
|
|
18
|
+
- Mécanisme de substitution conditionnelle des composants
|
|
19
|
+
- Documentation automatique des interfaces et capacités
|
|
20
|
+
|
|
21
|
+
Ce système de registre forme la colonne vertébrale architecturale du framework XPLIA,
|
|
22
|
+
permettant son évolution et son extensibilité sans compromettre la stabilité
|
|
23
|
+
ou la cohérence de l'ensemble du système.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
import inspect
|
|
27
|
+
import sys
|
|
28
|
+
import logging
|
|
29
|
+
import importlib
|
|
30
|
+
import json
|
|
31
|
+
import threading
|
|
32
|
+
import time
|
|
33
|
+
import datetime
|
|
34
|
+
from functools import wraps, lru_cache
|
|
35
|
+
from dataclasses import dataclass, field
|
|
36
|
+
from enum import Enum
|
|
37
|
+
from typing import Any, Callable, Dict, List, Optional, Set, Type, TypeVar, Union, Tuple, NamedTuple, Protocol
|
|
38
|
+
import pkg_resources
|
|
39
|
+
|
|
40
|
+
# Logger dédié au système de registre
|
|
41
|
+
logger = logging.getLogger(__name__)
|
|
42
|
+
|
|
43
|
+
# Type générique pour nos décorateurs
|
|
44
|
+
T = TypeVar('T')
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
# Classe pour représenter la version des composants
|
|
48
|
+
class Version:
|
|
49
|
+
"""Gestion sémantique des versions pour les composants XPLIA."""
|
|
50
|
+
|
|
51
|
+
def __init__(self, version_str: str):
|
|
52
|
+
parts = version_str.split('.')
|
|
53
|
+
self.major = int(parts[0]) if len(parts) > 0 else 0
|
|
54
|
+
self.minor = int(parts[1]) if len(parts) > 1 else 0
|
|
55
|
+
self.patch = int(parts[2]) if len(parts) > 2 else 0
|
|
56
|
+
|
|
57
|
+
def __str__(self):
|
|
58
|
+
return f"{self.major}.{self.minor}.{self.patch}"
|
|
59
|
+
|
|
60
|
+
def __eq__(self, other):
|
|
61
|
+
if not isinstance(other, Version):
|
|
62
|
+
return False
|
|
63
|
+
return (self.major, self.minor, self.patch) == (other.major, other.minor, other.patch)
|
|
64
|
+
|
|
65
|
+
def __lt__(self, other):
|
|
66
|
+
if not isinstance(other, Version):
|
|
67
|
+
return NotImplemented
|
|
68
|
+
return (self.major, self.minor, self.patch) < (other.major, other.minor, other.patch)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
# Types de composants disponibles dans XPLIA
|
|
72
|
+
class ComponentType(Enum):
|
|
73
|
+
EXPLAINER = "explainer"
|
|
74
|
+
VISUALIZER = "visualizer"
|
|
75
|
+
MODEL_ADAPTER = "model_adapter"
|
|
76
|
+
COMPLIANCE_CHECKER = "compliance_checker"
|
|
77
|
+
FEATURE_EXTRACTOR = "feature_extractor"
|
|
78
|
+
REPORT_GENERATOR = "report_generator"
|
|
79
|
+
DATA_CONNECTOR = "data_connector"
|
|
80
|
+
PLUGIN = "plugin"
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
@dataclass
|
|
84
|
+
class ComponentMetadata:
|
|
85
|
+
"""Métadonnées riches pour les composants du registre."""
|
|
86
|
+
name: str
|
|
87
|
+
component_type: ComponentType
|
|
88
|
+
version: Version
|
|
89
|
+
description: str = ""
|
|
90
|
+
author: str = ""
|
|
91
|
+
created_at: datetime.datetime = field(default_factory=datetime.datetime.now)
|
|
92
|
+
updated_at: datetime.datetime = field(default_factory=datetime.datetime.now)
|
|
93
|
+
dependencies: Dict[str, Version] = field(default_factory=dict)
|
|
94
|
+
incompatibilities: List[str] = field(default_factory=list)
|
|
95
|
+
tags: List[str] = field(default_factory=list)
|
|
96
|
+
capabilities: Dict[str, Any] = field(default_factory=dict)
|
|
97
|
+
examples: List[str] = field(default_factory=list)
|
|
98
|
+
performance_metrics: Dict[str, Any] = field(default_factory=dict)
|
|
99
|
+
configuration_schema: Dict[str, Any] = field(default_factory=dict)
|
|
100
|
+
enabled: bool = True
|
|
101
|
+
is_deprecated: bool = False
|
|
102
|
+
replacement: Optional[str] = None
|
|
103
|
+
priority: int = 0 # Priorité pour la résolution des conflits
|
|
104
|
+
extra_data: Dict[str, Any] = field(default_factory=dict)
|
|
105
|
+
|
|
106
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
107
|
+
"""Convertit les métadonnées en dictionnaire."""
|
|
108
|
+
result = {
|
|
109
|
+
"name": self.name,
|
|
110
|
+
"component_type": self.component_type.value,
|
|
111
|
+
"version": str(self.version),
|
|
112
|
+
"description": self.description,
|
|
113
|
+
"author": self.author,
|
|
114
|
+
"created_at": self.created_at.isoformat(),
|
|
115
|
+
"updated_at": self.updated_at.isoformat(),
|
|
116
|
+
"dependencies": {k: str(v) for k, v in self.dependencies.items()},
|
|
117
|
+
"incompatibilities": self.incompatibilities,
|
|
118
|
+
"tags": self.tags,
|
|
119
|
+
"enabled": self.enabled,
|
|
120
|
+
"is_deprecated": self.is_deprecated,
|
|
121
|
+
"priority": self.priority
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
# Inclure les champs non vides optionnels
|
|
125
|
+
if self.capabilities:
|
|
126
|
+
result["capabilities"] = self.capabilities
|
|
127
|
+
if self.examples:
|
|
128
|
+
result["examples"] = self.examples
|
|
129
|
+
if self.performance_metrics:
|
|
130
|
+
result["performance_metrics"] = self.performance_metrics
|
|
131
|
+
if self.configuration_schema:
|
|
132
|
+
result["configuration_schema"] = self.configuration_schema
|
|
133
|
+
if self.replacement:
|
|
134
|
+
result["replacement"] = self.replacement
|
|
135
|
+
if self.extra_data:
|
|
136
|
+
result["extra_data"] = self.extra_data
|
|
137
|
+
|
|
138
|
+
return result
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
@dataclass
|
|
142
|
+
class ComponentRegistry:
|
|
143
|
+
"""Registre avancé pour un type spécifique de composants."""
|
|
144
|
+
component_type: ComponentType
|
|
145
|
+
components: Dict[str, Tuple[Type, ComponentMetadata]] = field(default_factory=dict)
|
|
146
|
+
_lock: threading.RLock = field(default_factory=threading.RLock)
|
|
147
|
+
|
|
148
|
+
def register(self, component_class: Type, metadata: ComponentMetadata) -> None:
|
|
149
|
+
"""Enregistre un composant avec ses métadonnées."""
|
|
150
|
+
with self._lock:
|
|
151
|
+
self.components[metadata.name] = (component_class, metadata)
|
|
152
|
+
self._update_dependency_graph()
|
|
153
|
+
logger.debug(f"Component registered: {metadata.name} ({metadata.component_type.value})")
|
|
154
|
+
|
|
155
|
+
def unregister(self, name: str) -> bool:
|
|
156
|
+
"""Désenregistre un composant par son nom."""
|
|
157
|
+
with self._lock:
|
|
158
|
+
if name in self.components:
|
|
159
|
+
del self.components[name]
|
|
160
|
+
self._update_dependency_graph()
|
|
161
|
+
logger.debug(f"Component unregistered: {name}")
|
|
162
|
+
return True
|
|
163
|
+
return False
|
|
164
|
+
|
|
165
|
+
def get(self, name: str) -> Optional[Tuple[Type, ComponentMetadata]]:
|
|
166
|
+
"""Récupère un composant par son nom."""
|
|
167
|
+
with self._lock:
|
|
168
|
+
return self.components.get(name)
|
|
169
|
+
|
|
170
|
+
def get_all(self) -> List[Tuple[Type, ComponentMetadata]]:
|
|
171
|
+
"""Récupère tous les composants enregistrés."""
|
|
172
|
+
with self._lock:
|
|
173
|
+
return list(self.components.values())
|
|
174
|
+
|
|
175
|
+
def find(self, **criteria) -> List[Tuple[Type, ComponentMetadata]]:
|
|
176
|
+
"""Recherche des composants selon des critères spécifiques."""
|
|
177
|
+
results = []
|
|
178
|
+
with self._lock:
|
|
179
|
+
for component_class, metadata in self.components.values():
|
|
180
|
+
match = True
|
|
181
|
+
for key, value in criteria.items():
|
|
182
|
+
# Vérification spéciale pour les tags (liste)
|
|
183
|
+
if key == "tags" and isinstance(value, list):
|
|
184
|
+
if not all(tag in metadata.tags for tag in value):
|
|
185
|
+
match = False
|
|
186
|
+
break
|
|
187
|
+
# Vérification spéciale pour les capacités (dict)
|
|
188
|
+
elif key == "capabilities" and isinstance(value, dict):
|
|
189
|
+
for cap_key, cap_value in value.items():
|
|
190
|
+
if cap_key not in metadata.capabilities or metadata.capabilities[cap_key] != cap_value:
|
|
191
|
+
match = False
|
|
192
|
+
break
|
|
193
|
+
# Vérification standard pour les autres attributs
|
|
194
|
+
elif not hasattr(metadata, key) or getattr(metadata, key) != value:
|
|
195
|
+
match = False
|
|
196
|
+
break
|
|
197
|
+
if match:
|
|
198
|
+
results.append((component_class, metadata))
|
|
199
|
+
return results
|
|
200
|
+
|
|
201
|
+
def _update_dependency_graph(self) -> None:
|
|
202
|
+
"""Met à jour le graphe des dépendances entre composants."""
|
|
203
|
+
# Cette méthode serait implémentée pour gérer les relations complexes
|
|
204
|
+
# entre les composants et vérifier les conflits potentiels
|
|
205
|
+
pass
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
# Structure de registre global avec typage fort
|
|
209
|
+
_REGISTRY = {
|
|
210
|
+
ComponentType.EXPLAINER: ComponentRegistry(ComponentType.EXPLAINER),
|
|
211
|
+
ComponentType.VISUALIZER: ComponentRegistry(ComponentType.VISUALIZER),
|
|
212
|
+
ComponentType.MODEL_ADAPTER: ComponentRegistry(ComponentType.MODEL_ADAPTER),
|
|
213
|
+
ComponentType.COMPLIANCE_CHECKER: ComponentRegistry(ComponentType.COMPLIANCE_CHECKER),
|
|
214
|
+
ComponentType.FEATURE_EXTRACTOR: ComponentRegistry(ComponentType.FEATURE_EXTRACTOR),
|
|
215
|
+
ComponentType.REPORT_GENERATOR: ComponentRegistry(ComponentType.REPORT_GENERATOR),
|
|
216
|
+
ComponentType.DATA_CONNECTOR: ComponentRegistry(ComponentType.DATA_CONNECTOR),
|
|
217
|
+
ComponentType.PLUGIN: ComponentRegistry(ComponentType.PLUGIN),
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
# Pour la compatibilité avec le code existant
|
|
222
|
+
_EXPLAINER_REGISTRY: Set[Type] = set()
|
|
223
|
+
_VISUALIZER_REGISTRY: Set[Type] = set()
|
|
224
|
+
_MODEL_ADAPTER_REGISTRY: Set[Type] = set()
|
|
225
|
+
_COMPLIANCE_CHECKER_REGISTRY: Set[Type] = set()
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
def register_explainer(cls: Optional[Type] = None, *, version: str = "1.0.0", description: str = "",
|
|
229
|
+
author: str = "", tags: List[str] = None, capabilities: Dict[str, Any] = None,
|
|
230
|
+
dependencies: Dict[str, str] = None, examples: List[str] = None,
|
|
231
|
+
priority: int = 0, configuration_schema: Dict[str, Any] = None):
|
|
232
|
+
"""
|
|
233
|
+
Décorateur avancé pour enregistrer une classe d'explainer avec métadonnées enrichies.
|
|
234
|
+
|
|
235
|
+
Peut être utilisé comme:
|
|
236
|
+
@register_explainer
|
|
237
|
+
class MyExplainer(ExplainerBase):
|
|
238
|
+
...
|
|
239
|
+
|
|
240
|
+
Ou avec des métadonnées détaillées:
|
|
241
|
+
@register_explainer(
|
|
242
|
+
version="1.2.0",
|
|
243
|
+
description="Un explainer spécialisé pour les modèles de traduction",
|
|
244
|
+
author="Equipe XPLIA",
|
|
245
|
+
tags=["nlp", "translation", "transformer"],
|
|
246
|
+
capabilities={"multilingual": True, "batch_processing": True},
|
|
247
|
+
dependencies={"transformers": "4.0.0"},
|
|
248
|
+
examples=["examples/translation_explanation.py"],
|
|
249
|
+
priority=10
|
|
250
|
+
)
|
|
251
|
+
class TranslationExplainer(ExplainerBase):
|
|
252
|
+
...
|
|
253
|
+
|
|
254
|
+
Args:
|
|
255
|
+
cls: Classe à enregistrer (optionnel)
|
|
256
|
+
version: Version sémantique du composant
|
|
257
|
+
description: Description détaillée du composant
|
|
258
|
+
author: Auteur ou équipe responsable
|
|
259
|
+
tags: Mots-clés pour la catégorisation et la recherche
|
|
260
|
+
capabilities: Capacités spécifiques offertes par ce composant
|
|
261
|
+
dependencies: Dépendances requises avec versions minimales
|
|
262
|
+
examples: Liste des exemples d'utilisation
|
|
263
|
+
priority: Priorité pour la résolution de conflits (plus élevé = plus prioritaire)
|
|
264
|
+
configuration_schema: Schéma JSON des options de configuration
|
|
265
|
+
|
|
266
|
+
Returns:
|
|
267
|
+
Union[Type, Callable]: Classe enregistrée ou décorateur
|
|
268
|
+
"""
|
|
269
|
+
# Initialisation des valeurs par défaut
|
|
270
|
+
tags = tags or []
|
|
271
|
+
capabilities = capabilities or {}
|
|
272
|
+
dependencies = dependencies or {}
|
|
273
|
+
examples = examples or []
|
|
274
|
+
configuration_schema = configuration_schema or {}
|
|
275
|
+
|
|
276
|
+
def _register(cls_inner):
|
|
277
|
+
# Conservation de la compatibilité avec l'ancien système
|
|
278
|
+
if cls_inner not in _EXPLAINER_REGISTRY:
|
|
279
|
+
_EXPLAINER_REGISTRY.add(cls_inner)
|
|
280
|
+
|
|
281
|
+
# Extraction du nom du composant
|
|
282
|
+
component_name = getattr(cls_inner, "__name__", str(cls_inner))
|
|
283
|
+
|
|
284
|
+
# Préparation des métadonnées
|
|
285
|
+
metadata = ComponentMetadata(
|
|
286
|
+
name=component_name,
|
|
287
|
+
component_type=ComponentType.EXPLAINER,
|
|
288
|
+
version=Version(version),
|
|
289
|
+
description=description,
|
|
290
|
+
author=author,
|
|
291
|
+
tags=tags,
|
|
292
|
+
capabilities=capabilities,
|
|
293
|
+
dependencies={k: Version(v) for k, v in dependencies.items()},
|
|
294
|
+
examples=examples,
|
|
295
|
+
priority=priority,
|
|
296
|
+
configuration_schema=configuration_schema
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
# Enregistrement dans le nouveau système de registre
|
|
300
|
+
_REGISTRY[ComponentType.EXPLAINER].register(cls_inner, metadata)
|
|
301
|
+
|
|
302
|
+
return cls_inner
|
|
303
|
+
|
|
304
|
+
# Utilisé sans paramètres
|
|
305
|
+
if cls is not None:
|
|
306
|
+
return _register(cls)
|
|
307
|
+
|
|
308
|
+
# Utilisé avec paramètres
|
|
309
|
+
return _register
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
def register_visualizer(cls: Optional[Type] = None, *, version: str = "1.0.0", description: str = "",
|
|
313
|
+
author: str = "", tags: List[str] = None, capabilities: Dict[str, Any] = None,
|
|
314
|
+
dependencies: Dict[str, str] = None, examples: List[str] = None,
|
|
315
|
+
priority: int = 0, configuration_schema: Dict[str, Any] = None,
|
|
316
|
+
supported_formats: List[str] = None):
|
|
317
|
+
"""
|
|
318
|
+
Décorateur avancé pour enregistrer une classe de visualiseur avec métadonnées enrichies.
|
|
319
|
+
|
|
320
|
+
Peut être utilisé comme:
|
|
321
|
+
@register_visualizer
|
|
322
|
+
class MyVisualizer(VisualizerBase):
|
|
323
|
+
...
|
|
324
|
+
|
|
325
|
+
Ou avec des métadonnées détaillées:
|
|
326
|
+
@register_visualizer(
|
|
327
|
+
version="1.2.0",
|
|
328
|
+
description="Visualiseur interactif de graphes",
|
|
329
|
+
author="Equipe XPLIA",
|
|
330
|
+
tags=["graph", "interactive", "network"],
|
|
331
|
+
capabilities={"interactive": True, "export_svg": True},
|
|
332
|
+
supported_formats=["html", "svg", "png"],
|
|
333
|
+
priority=10
|
|
334
|
+
)
|
|
335
|
+
class GraphVisualizer(VisualizerBase):
|
|
336
|
+
...
|
|
337
|
+
|
|
338
|
+
Args:
|
|
339
|
+
cls: Classe à enregistrer (optionnel)
|
|
340
|
+
version: Version sémantique du composant
|
|
341
|
+
description: Description détaillée du composant
|
|
342
|
+
author: Auteur ou équipe responsable
|
|
343
|
+
tags: Mots-clés pour la catégorisation et la recherche
|
|
344
|
+
capabilities: Capacités spécifiques offertes par ce visualiseur
|
|
345
|
+
dependencies: Dépendances requises avec versions minimales
|
|
346
|
+
examples: Liste des exemples d'utilisation
|
|
347
|
+
priority: Priorité pour la résolution de conflits
|
|
348
|
+
configuration_schema: Schéma JSON des options de configuration
|
|
349
|
+
supported_formats: Formats d'export supportés par ce visualiseur
|
|
350
|
+
|
|
351
|
+
Returns:
|
|
352
|
+
Union[Type, Callable]: Classe enregistrée ou décorateur
|
|
353
|
+
"""
|
|
354
|
+
# Initialisation des valeurs par défaut
|
|
355
|
+
tags = tags or []
|
|
356
|
+
capabilities = capabilities or {}
|
|
357
|
+
dependencies = dependencies or {}
|
|
358
|
+
examples = examples or []
|
|
359
|
+
configuration_schema = configuration_schema or {}
|
|
360
|
+
supported_formats = supported_formats or ["html"]
|
|
361
|
+
|
|
362
|
+
# Ajout des formats supportés aux capacités
|
|
363
|
+
if supported_formats:
|
|
364
|
+
capabilities["supported_formats"] = supported_formats
|
|
365
|
+
|
|
366
|
+
def _register(cls_inner):
|
|
367
|
+
# Conservation de la compatibilité avec l'ancien système
|
|
368
|
+
if cls_inner not in _VISUALIZER_REGISTRY:
|
|
369
|
+
_VISUALIZER_REGISTRY.add(cls_inner)
|
|
370
|
+
|
|
371
|
+
# Extraction du nom du composant
|
|
372
|
+
component_name = getattr(cls_inner, "__name__", str(cls_inner))
|
|
373
|
+
|
|
374
|
+
# Préparation des métadonnées
|
|
375
|
+
metadata = ComponentMetadata(
|
|
376
|
+
name=component_name,
|
|
377
|
+
component_type=ComponentType.VISUALIZER,
|
|
378
|
+
version=Version(version),
|
|
379
|
+
description=description,
|
|
380
|
+
author=author,
|
|
381
|
+
tags=tags,
|
|
382
|
+
capabilities=capabilities,
|
|
383
|
+
dependencies={k: Version(v) for k, v in dependencies.items()},
|
|
384
|
+
examples=examples,
|
|
385
|
+
priority=priority,
|
|
386
|
+
configuration_schema=configuration_schema
|
|
387
|
+
)
|
|
388
|
+
|
|
389
|
+
# Enregistrement dans le nouveau système de registre
|
|
390
|
+
_REGISTRY[ComponentType.VISUALIZER].register(cls_inner, metadata)
|
|
391
|
+
|
|
392
|
+
return cls_inner
|
|
393
|
+
|
|
394
|
+
# Utilisé sans paramètres
|
|
395
|
+
if cls is not None:
|
|
396
|
+
return _register(cls)
|
|
397
|
+
|
|
398
|
+
# Utilisé avec paramètres
|
|
399
|
+
return _register
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
def register_model_adapter(cls: Optional[Type] = None, *, version: str = "1.0.0", description: str = "",
|
|
403
|
+
author: str = "", tags: List[str] = None, capabilities: Dict[str, Any] = None,
|
|
404
|
+
dependencies: Dict[str, str] = None, examples: List[str] = None,
|
|
405
|
+
priority: int = 0, configuration_schema: Dict[str, Any] = None,
|
|
406
|
+
supported_frameworks: List[str] = None, model_types: List[str] = None):
|
|
407
|
+
"""
|
|
408
|
+
Décorateur avancé pour enregistrer un adaptateur de modèle avec métadonnées enrichies.
|
|
409
|
+
|
|
410
|
+
Peut être utilisé comme:
|
|
411
|
+
@register_model_adapter
|
|
412
|
+
class MyModelAdapter(ModelAdapterBase):
|
|
413
|
+
...
|
|
414
|
+
|
|
415
|
+
Ou avec des métadonnées détaillées:
|
|
416
|
+
@register_model_adapter(
|
|
417
|
+
version="1.2.0",
|
|
418
|
+
description="Adaptateur pour modèles PyTorch",
|
|
419
|
+
author="Equipe XPLIA",
|
|
420
|
+
tags=["pytorch", "deep-learning"],
|
|
421
|
+
supported_frameworks=["pytorch"],
|
|
422
|
+
model_types=["cnn", "transformer", "rnn"],
|
|
423
|
+
capabilities={"gradient_extraction": True, "feature_visualization": True},
|
|
424
|
+
priority=10
|
|
425
|
+
)
|
|
426
|
+
class PyTorchAdapter(ModelAdapterBase):
|
|
427
|
+
...
|
|
428
|
+
|
|
429
|
+
Args:
|
|
430
|
+
cls: Classe à enregistrer (optionnel)
|
|
431
|
+
version: Version sémantique du composant
|
|
432
|
+
description: Description détaillée du composant
|
|
433
|
+
author: Auteur ou équipe responsable
|
|
434
|
+
tags: Mots-clés pour la catégorisation et la recherche
|
|
435
|
+
capabilities: Capacités spécifiques offertes par cet adaptateur
|
|
436
|
+
dependencies: Dépendances requises avec versions minimales
|
|
437
|
+
examples: Liste des exemples d'utilisation
|
|
438
|
+
priority: Priorité pour la résolution de conflits
|
|
439
|
+
configuration_schema: Schéma JSON des options de configuration
|
|
440
|
+
supported_frameworks: Frameworks ML/DL supportés ("pytorch", "tensorflow", etc.)
|
|
441
|
+
model_types: Types de modèles supportés ("cnn", "rnn", etc.)
|
|
442
|
+
|
|
443
|
+
Returns:
|
|
444
|
+
Union[Type, Callable]: Classe enregistrée ou décorateur
|
|
445
|
+
"""
|
|
446
|
+
# Initialisation des valeurs par défaut
|
|
447
|
+
tags = tags or []
|
|
448
|
+
capabilities = capabilities or {}
|
|
449
|
+
dependencies = dependencies or {}
|
|
450
|
+
examples = examples or []
|
|
451
|
+
configuration_schema = configuration_schema or {}
|
|
452
|
+
supported_frameworks = supported_frameworks or []
|
|
453
|
+
model_types = model_types or []
|
|
454
|
+
|
|
455
|
+
# Enrichissement des capacités
|
|
456
|
+
if supported_frameworks:
|
|
457
|
+
capabilities["supported_frameworks"] = supported_frameworks
|
|
458
|
+
if model_types:
|
|
459
|
+
capabilities["model_types"] = model_types
|
|
460
|
+
|
|
461
|
+
def _register(cls_inner):
|
|
462
|
+
# Conservation de la compatibilité avec l'ancien système
|
|
463
|
+
if cls_inner not in _MODEL_ADAPTER_REGISTRY:
|
|
464
|
+
_MODEL_ADAPTER_REGISTRY.add(cls_inner)
|
|
465
|
+
|
|
466
|
+
# Extraction du nom du composant
|
|
467
|
+
component_name = getattr(cls_inner, "__name__", str(cls_inner))
|
|
468
|
+
|
|
469
|
+
# Préparation des métadonnées
|
|
470
|
+
metadata = ComponentMetadata(
|
|
471
|
+
name=component_name,
|
|
472
|
+
component_type=ComponentType.MODEL_ADAPTER,
|
|
473
|
+
version=Version(version),
|
|
474
|
+
description=description,
|
|
475
|
+
author=author,
|
|
476
|
+
tags=tags,
|
|
477
|
+
capabilities=capabilities,
|
|
478
|
+
dependencies={k: Version(v) for k, v in dependencies.items()},
|
|
479
|
+
examples=examples,
|
|
480
|
+
priority=priority,
|
|
481
|
+
configuration_schema=configuration_schema
|
|
482
|
+
)
|
|
483
|
+
|
|
484
|
+
# Enregistrement dans le nouveau système de registre
|
|
485
|
+
_REGISTRY[ComponentType.MODEL_ADAPTER].register(cls_inner, metadata)
|
|
486
|
+
|
|
487
|
+
return cls_inner
|
|
488
|
+
|
|
489
|
+
if cls is not None:
|
|
490
|
+
return _register(cls)
|
|
491
|
+
|
|
492
|
+
return _register
|
|
493
|
+
|
|
494
|
+
|
|
495
|
+
def register_compliance_checker(cls: Optional[Type] = None, *, version: str = "1.0.0", description: str = "",
|
|
496
|
+
author: str = "", tags: List[str] = None, capabilities: Dict[str, Any] = None,
|
|
497
|
+
dependencies: Dict[str, str] = None, examples: List[str] = None,
|
|
498
|
+
priority: int = 0, configuration_schema: Dict[str, Any] = None,
|
|
499
|
+
supported_regulations: List[str] = None, certification_level: str = None):
|
|
500
|
+
"""
|
|
501
|
+
Décorateur avancé pour enregistrer un vérificateur de conformité avec métadonnées enrichies.
|
|
502
|
+
|
|
503
|
+
Peut être utilisé comme:
|
|
504
|
+
@register_compliance_checker
|
|
505
|
+
class MyComplianceChecker(ComplianceCheckerBase):
|
|
506
|
+
...
|
|
507
|
+
|
|
508
|
+
Ou avec des métadonnées détaillées:
|
|
509
|
+
@register_compliance_checker(
|
|
510
|
+
version="2.0.0",
|
|
511
|
+
description="Vérificateur de conformité pour l'AI Act européen",
|
|
512
|
+
author="Equipe XPLIA",
|
|
513
|
+
tags=["ai_act", "europe", "certification"],
|
|
514
|
+
supported_regulations=["ai_act", "gdpr"],
|
|
515
|
+
certification_level="official",
|
|
516
|
+
capabilities={"audit_trail": True, "compliance_reporting": True},
|
|
517
|
+
priority=90
|
|
518
|
+
)
|
|
519
|
+
class AIActComplianceChecker(ComplianceCheckerBase):
|
|
520
|
+
...
|
|
521
|
+
|
|
522
|
+
Args:
|
|
523
|
+
cls: Classe à enregistrer (optionnel)
|
|
524
|
+
version: Version sémantique du composant
|
|
525
|
+
description: Description détaillée du composant
|
|
526
|
+
author: Auteur ou équipe responsable
|
|
527
|
+
tags: Mots-clés pour la catégorisation et la recherche
|
|
528
|
+
capabilities: Capacités spécifiques offertes par ce vérificateur
|
|
529
|
+
dependencies: Dépendances requises avec versions minimales
|
|
530
|
+
examples: Liste des exemples d'utilisation
|
|
531
|
+
priority: Priorité pour la résolution de conflits (important pour les certifications)
|
|
532
|
+
configuration_schema: Schéma JSON des options de configuration
|
|
533
|
+
supported_regulations: Réglementations prises en charge ("gdpr", "ai_act", "hipaa", etc.)
|
|
534
|
+
certification_level: Niveau de certification ("self_assessed", "third_party", "official")
|
|
535
|
+
|
|
536
|
+
Returns:
|
|
537
|
+
Union[Type, Callable]: Classe enregistrée ou décorateur
|
|
538
|
+
"""
|
|
539
|
+
# Initialisation des valeurs par défaut
|
|
540
|
+
tags = tags or []
|
|
541
|
+
capabilities = capabilities or {}
|
|
542
|
+
dependencies = dependencies or {}
|
|
543
|
+
examples = examples or []
|
|
544
|
+
configuration_schema = configuration_schema or {}
|
|
545
|
+
supported_regulations = supported_regulations or []
|
|
546
|
+
|
|
547
|
+
# Enrichissement des capacités
|
|
548
|
+
if supported_regulations:
|
|
549
|
+
capabilities["supported_regulations"] = supported_regulations
|
|
550
|
+
if certification_level:
|
|
551
|
+
capabilities["certification_level"] = certification_level
|
|
552
|
+
|
|
553
|
+
def _register(cls_inner):
|
|
554
|
+
# Conservation de la compatibilité avec l'ancien système
|
|
555
|
+
if cls_inner not in _COMPLIANCE_CHECKER_REGISTRY:
|
|
556
|
+
_COMPLIANCE_CHECKER_REGISTRY.add(cls_inner)
|
|
557
|
+
|
|
558
|
+
# Extraction du nom du composant
|
|
559
|
+
component_name = getattr(cls_inner, "__name__", str(cls_inner))
|
|
560
|
+
|
|
561
|
+
# Préparation des métadonnées
|
|
562
|
+
metadata = ComponentMetadata(
|
|
563
|
+
name=component_name,
|
|
564
|
+
component_type=ComponentType.COMPLIANCE_CHECKER,
|
|
565
|
+
version=Version(version),
|
|
566
|
+
description=description,
|
|
567
|
+
author=author,
|
|
568
|
+
tags=tags,
|
|
569
|
+
capabilities=capabilities,
|
|
570
|
+
dependencies={k: Version(v) for k, v in dependencies.items()},
|
|
571
|
+
examples=examples,
|
|
572
|
+
priority=priority,
|
|
573
|
+
configuration_schema=configuration_schema
|
|
574
|
+
)
|
|
575
|
+
|
|
576
|
+
# Enregistrement dans le nouveau système de registre
|
|
577
|
+
_REGISTRY[ComponentType.COMPLIANCE_CHECKER].register(cls_inner, metadata)
|
|
578
|
+
|
|
579
|
+
return cls_inner
|
|
580
|
+
|
|
581
|
+
if cls is not None:
|
|
582
|
+
return _register(cls)
|
|
583
|
+
|
|
584
|
+
return _register
|
|
585
|
+
|
|
586
|
+
|
|
587
|
+
def get_registered_explainers(tags: List[str] = None, capability: str = None,
|
|
588
|
+
include_metadata: bool = False) -> List[Union[Type, Tuple[Type, ComponentMetadata]]]:
|
|
589
|
+
"""
|
|
590
|
+
Récupère tous les explainers enregistrés avec filtrage avancé.
|
|
591
|
+
|
|
592
|
+
Args:
|
|
593
|
+
tags: Liste de tags pour filtrer les explainers (optionnel)
|
|
594
|
+
capability: Capacité spécifique requise (optionnel)
|
|
595
|
+
include_metadata: Si True, retourne aussi les métadonnées associées
|
|
596
|
+
|
|
597
|
+
Returns:
|
|
598
|
+
Si include_metadata=False:
|
|
599
|
+
List[Type]: Liste des classes d'explainers enregistrées
|
|
600
|
+
Sinon:
|
|
601
|
+
List[Tuple[Type, ComponentMetadata]]: Liste des classes avec leurs métadonnées
|
|
602
|
+
"""
|
|
603
|
+
# Conservation de la compatibilité avec l'ancien code
|
|
604
|
+
if not tags and not capability and not include_metadata:
|
|
605
|
+
return list(_EXPLAINER_REGISTRY)
|
|
606
|
+
|
|
607
|
+
# Utilisation du nouveau système de registre avec filtrage
|
|
608
|
+
registry = _REGISTRY[ComponentType.EXPLAINER]
|
|
609
|
+
|
|
610
|
+
# Préparation des critères de filtrage
|
|
611
|
+
criteria = {}
|
|
612
|
+
if tags:
|
|
613
|
+
criteria["tags"] = tags
|
|
614
|
+
if capability:
|
|
615
|
+
criteria["capabilities"] = {capability: True}
|
|
616
|
+
|
|
617
|
+
# Récupération des résultats
|
|
618
|
+
if criteria:
|
|
619
|
+
results = registry.find(**criteria)
|
|
620
|
+
else:
|
|
621
|
+
results = registry.get_all()
|
|
622
|
+
|
|
623
|
+
# Format de retour selon include_metadata
|
|
624
|
+
if include_metadata:
|
|
625
|
+
return [result for result in results if result[0] not in _EXPLAINER_REGISTRY.difference(result[0] for result, _ in results)]
|
|
626
|
+
else:
|
|
627
|
+
return [cls for cls, _ in results if cls not in _EXPLAINER_REGISTRY.difference(cls for cls, _ in results)]
|
|
628
|
+
|
|
629
|
+
|
|
630
|
+
def get_registered_visualizers(tags: List[str] = None, capability: str = None,
|
|
631
|
+
supported_format: str = None, include_metadata: bool = False) -> List[Union[Type, Tuple[Type, ComponentMetadata]]]:
|
|
632
|
+
"""
|
|
633
|
+
Récupère tous les visualiseurs enregistrés avec filtrage avancé.
|
|
634
|
+
|
|
635
|
+
Args:
|
|
636
|
+
tags: Liste de tags pour filtrer les visualiseurs (optionnel)
|
|
637
|
+
capability: Capacité spécifique requise (optionnel)
|
|
638
|
+
supported_format: Format d'export spécifique requis ("html", "svg", etc.)
|
|
639
|
+
include_metadata: Si True, retourne aussi les métadonnées associées
|
|
640
|
+
|
|
641
|
+
Returns:
|
|
642
|
+
Si include_metadata=False:
|
|
643
|
+
List[Type]: Liste des classes de visualiseurs enregistrées
|
|
644
|
+
Sinon:
|
|
645
|
+
List[Tuple[Type, ComponentMetadata]]: Liste des classes avec leurs métadonnées
|
|
646
|
+
"""
|
|
647
|
+
# Conservation de la compatibilité avec l'ancien code
|
|
648
|
+
if not any([tags, capability, supported_format, include_metadata]):
|
|
649
|
+
return list(_VISUALIZER_REGISTRY)
|
|
650
|
+
|
|
651
|
+
# Utilisation du nouveau système de registre avec filtrage
|
|
652
|
+
registry = _REGISTRY[ComponentType.VISUALIZER]
|
|
653
|
+
|
|
654
|
+
# Préparation des critères de filtrage
|
|
655
|
+
criteria = {}
|
|
656
|
+
if tags:
|
|
657
|
+
criteria["tags"] = tags
|
|
658
|
+
if capability:
|
|
659
|
+
criteria["capabilities"] = {capability: True}
|
|
660
|
+
|
|
661
|
+
# Récupération des résultats
|
|
662
|
+
results = registry.find(**criteria) if criteria else registry.get_all()
|
|
663
|
+
|
|
664
|
+
# Filtrage supplémentaire par format si demandé
|
|
665
|
+
if supported_format and results:
|
|
666
|
+
filtered_results = []
|
|
667
|
+
for cls, metadata in results:
|
|
668
|
+
if ("capabilities" in metadata.__dict__ and
|
|
669
|
+
"supported_formats" in metadata.capabilities and
|
|
670
|
+
supported_format in metadata.capabilities["supported_formats"]):
|
|
671
|
+
filtered_results.append((cls, metadata))
|
|
672
|
+
results = filtered_results
|
|
673
|
+
|
|
674
|
+
# Format de retour selon include_metadata
|
|
675
|
+
if include_metadata:
|
|
676
|
+
return results
|
|
677
|
+
else:
|
|
678
|
+
return [cls for cls, _ in results]
|
|
679
|
+
|
|
680
|
+
|
|
681
|
+
def get_registered_model_adapters(tags: List[str] = None, capability: str = None,
|
|
682
|
+
framework: str = None, model_type: str = None,
|
|
683
|
+
include_metadata: bool = False) -> List[Union[Type, Tuple[Type, ComponentMetadata]]]:
|
|
684
|
+
"""
|
|
685
|
+
Récupère tous les adaptateurs de modèles enregistrés avec filtrage avancé.
|
|
686
|
+
|
|
687
|
+
Args:
|
|
688
|
+
tags: Liste de tags pour filtrer les adaptateurs (optionnel)
|
|
689
|
+
capability: Capacité spécifique requise (optionnel)
|
|
690
|
+
framework: Framework spécifique requis ("pytorch", "tensorflow", etc.)
|
|
691
|
+
model_type: Type de modèle spécifique requis ("cnn", "rnn", etc.)
|
|
692
|
+
include_metadata: Si True, retourne aussi les métadonnées associées
|
|
693
|
+
|
|
694
|
+
Returns:
|
|
695
|
+
Si include_metadata=False:
|
|
696
|
+
List[Type]: Liste des classes d'adaptateurs enregistrées
|
|
697
|
+
Sinon:
|
|
698
|
+
List[Tuple[Type, ComponentMetadata]]: Liste des classes avec leurs métadonnées
|
|
699
|
+
"""
|
|
700
|
+
# Conservation de la compatibilité avec l'ancien code
|
|
701
|
+
if not any([tags, capability, framework, model_type, include_metadata]):
|
|
702
|
+
return list(_MODEL_ADAPTER_REGISTRY)
|
|
703
|
+
|
|
704
|
+
# Utilisation du nouveau système de registre
|
|
705
|
+
registry = _REGISTRY[ComponentType.MODEL_ADAPTER]
|
|
706
|
+
|
|
707
|
+
# Préparation des critères de base
|
|
708
|
+
criteria = {}
|
|
709
|
+
if tags:
|
|
710
|
+
criteria["tags"] = tags
|
|
711
|
+
if capability:
|
|
712
|
+
criteria["capabilities"] = {capability: True}
|
|
713
|
+
|
|
714
|
+
# Récupération des résultats initiaux
|
|
715
|
+
results = registry.find(**criteria) if criteria else registry.get_all()
|
|
716
|
+
|
|
717
|
+
# Filtrage supplémentaire si nécessaire
|
|
718
|
+
if framework or model_type:
|
|
719
|
+
filtered_results = []
|
|
720
|
+
for cls, metadata in results:
|
|
721
|
+
include = True
|
|
722
|
+
if framework and ("capabilities" not in metadata.__dict__ or
|
|
723
|
+
"supported_frameworks" not in metadata.capabilities or
|
|
724
|
+
framework not in metadata.capabilities["supported_frameworks"]):
|
|
725
|
+
include = False
|
|
726
|
+
if model_type and ("capabilities" not in metadata.__dict__ or
|
|
727
|
+
"model_types" not in metadata.capabilities or
|
|
728
|
+
model_type not in metadata.capabilities["model_types"]):
|
|
729
|
+
include = False
|
|
730
|
+
if include:
|
|
731
|
+
filtered_results.append((cls, metadata))
|
|
732
|
+
results = filtered_results
|
|
733
|
+
|
|
734
|
+
# Format de retour
|
|
735
|
+
if include_metadata:
|
|
736
|
+
return results
|
|
737
|
+
else:
|
|
738
|
+
return [cls for cls, _ in results]
|
|
739
|
+
|
|
740
|
+
|
|
741
|
+
def get_registered_compliance_checkers(tags: List[str] = None, regulation: str = None,
|
|
742
|
+
certification_level: str = None, include_metadata: bool = False) -> List[Union[Type, Tuple[Type, ComponentMetadata]]]:
|
|
743
|
+
"""
|
|
744
|
+
Récupère tous les vérificateurs de conformité enregistrés avec filtrage avancé.
|
|
745
|
+
|
|
746
|
+
Args:
|
|
747
|
+
tags: Liste de tags pour filtrer les vérificateurs (optionnel)
|
|
748
|
+
regulation: Réglementation spécifique requise ("gdpr", "ai_act", etc.)
|
|
749
|
+
certification_level: Niveau de certification requis ("self_assessed", "official", etc.)
|
|
750
|
+
include_metadata: Si True, retourne aussi les métadonnées associées
|
|
751
|
+
|
|
752
|
+
Returns:
|
|
753
|
+
Si include_metadata=False:
|
|
754
|
+
List[Type]: Liste des classes de vérificateurs enregistrées
|
|
755
|
+
Sinon:
|
|
756
|
+
List[Tuple[Type, ComponentMetadata]]: Liste des classes avec leurs métadonnées
|
|
757
|
+
"""
|
|
758
|
+
# Conservation de la compatibilité avec l'ancien code
|
|
759
|
+
if not any([tags, regulation, certification_level, include_metadata]):
|
|
760
|
+
return list(_COMPLIANCE_CHECKER_REGISTRY)
|
|
761
|
+
|
|
762
|
+
# Utilisation du nouveau système de registre
|
|
763
|
+
registry = _REGISTRY[ComponentType.COMPLIANCE_CHECKER]
|
|
764
|
+
|
|
765
|
+
# Préparation des critères
|
|
766
|
+
criteria = {}
|
|
767
|
+
if tags:
|
|
768
|
+
criteria["tags"] = tags
|
|
769
|
+
|
|
770
|
+
# Récupération des résultats initiaux
|
|
771
|
+
results = registry.find(**criteria) if criteria else registry.get_all()
|
|
772
|
+
|
|
773
|
+
# Filtrage supplémentaire si nécessaire
|
|
774
|
+
if regulation or certification_level:
|
|
775
|
+
filtered_results = []
|
|
776
|
+
for cls, metadata in results:
|
|
777
|
+
include = True
|
|
778
|
+
if regulation and ("capabilities" not in metadata.__dict__ or
|
|
779
|
+
"supported_regulations" not in metadata.capabilities or
|
|
780
|
+
regulation not in metadata.capabilities["supported_regulations"]):
|
|
781
|
+
include = False
|
|
782
|
+
if certification_level and ("capabilities" not in metadata.__dict__ or
|
|
783
|
+
"certification_level" not in metadata.capabilities or
|
|
784
|
+
certification_level != metadata.capabilities["certification_level"]):
|
|
785
|
+
include = False
|
|
786
|
+
if include:
|
|
787
|
+
filtered_results.append((cls, metadata))
|
|
788
|
+
results = filtered_results
|
|
789
|
+
|
|
790
|
+
# Format de retour
|
|
791
|
+
if include_metadata:
|
|
792
|
+
return results
|
|
793
|
+
else:
|
|
794
|
+
return [cls for cls, _ in results]
|
|
795
|
+
|
|
796
|
+
|
|
797
|
+
def build_dependency_graph() -> Dict[str, List[str]]:
|
|
798
|
+
"""
|
|
799
|
+
Construit un graphe orienté des dépendances entre composants enregistrés.
|
|
800
|
+
|
|
801
|
+
Analyse les métadonnées de dépendances de tous les composants enregistrés et
|
|
802
|
+
construit une représentation sous forme de graphe pour détecter les cycles
|
|
803
|
+
ou d'autres problèmes de dépendance.
|
|
804
|
+
|
|
805
|
+
Returns:
|
|
806
|
+
Dict[str, List[str]]: Graphe de dépendances où les clés sont les noms des composants
|
|
807
|
+
et les valeurs sont les listes des noms des composants dépendants
|
|
808
|
+
"""
|
|
809
|
+
dependency_graph = {}
|
|
810
|
+
|
|
811
|
+
# Analyse de tous les types de composants
|
|
812
|
+
for component_type in ComponentType:
|
|
813
|
+
registry = _REGISTRY[component_type]
|
|
814
|
+
components = registry.get_all()
|
|
815
|
+
|
|
816
|
+
for cls, metadata in components:
|
|
817
|
+
component_name = metadata.name
|
|
818
|
+
dependency_graph[component_name] = []
|
|
819
|
+
|
|
820
|
+
# Vérifie les dépendances déclarées dans les métadonnées
|
|
821
|
+
for dep_name, _ in metadata.dependencies.items():
|
|
822
|
+
dependency_graph[component_name].append(dep_name)
|
|
823
|
+
|
|
824
|
+
return dependency_graph
|
|
825
|
+
|
|
826
|
+
|
|
827
|
+
def detect_dependency_cycles() -> List[List[str]]:
|
|
828
|
+
"""
|
|
829
|
+
Détecte les cycles de dépendance dans le graphe de dépendances.
|
|
830
|
+
|
|
831
|
+
Utilise l'algorithme de recherche en profondeur pour détecter tous les cycles élémentaires
|
|
832
|
+
dans le graphe orienté des dépendances.
|
|
833
|
+
|
|
834
|
+
Returns:
|
|
835
|
+
List[List[str]]: Liste des cycles détectés, chaque cycle étant une liste de noms de composants
|
|
836
|
+
"""
|
|
837
|
+
graph = build_dependency_graph()
|
|
838
|
+
cycles = []
|
|
839
|
+
|
|
840
|
+
def find_cycles_from(node, path=None, visited=None):
|
|
841
|
+
if path is None:
|
|
842
|
+
path = []
|
|
843
|
+
if visited is None:
|
|
844
|
+
visited = set()
|
|
845
|
+
|
|
846
|
+
if node in path:
|
|
847
|
+
# Cycle détecté
|
|
848
|
+
cycle_start = path.index(node)
|
|
849
|
+
cycle = path[cycle_start:] + [node]
|
|
850
|
+
cycles.append(cycle)
|
|
851
|
+
return
|
|
852
|
+
|
|
853
|
+
if node in visited:
|
|
854
|
+
return
|
|
855
|
+
|
|
856
|
+
visited.add(node)
|
|
857
|
+
path.append(node)
|
|
858
|
+
|
|
859
|
+
for neighbor in graph.get(node, []):
|
|
860
|
+
find_cycles_from(neighbor, path[:], visited)
|
|
861
|
+
|
|
862
|
+
# Lance la détection depuis chaque nœud
|
|
863
|
+
for node in graph:
|
|
864
|
+
find_cycles_from(node)
|
|
865
|
+
|
|
866
|
+
return cycles
|
|
867
|
+
|
|
868
|
+
|
|
869
|
+
def validate_component_dependencies() -> Dict[str, List[Dict[str, Any]]]:
|
|
870
|
+
"""
|
|
871
|
+
Valide que toutes les dépendances déclarées dans les métadonnées sont satisfaites.
|
|
872
|
+
|
|
873
|
+
Vérifie pour chaque composant que:
|
|
874
|
+
1. Les composants dépendants existent
|
|
875
|
+
2. La version minimale requise est satisfaite
|
|
876
|
+
3. Aucun cycle de dépendance n'existe
|
|
877
|
+
|
|
878
|
+
Returns:
|
|
879
|
+
Dict[str, List[Dict[str, Any]]]: Dictionnaire des erreurs de dépendance par composant
|
|
880
|
+
"""
|
|
881
|
+
errors = {}
|
|
882
|
+
|
|
883
|
+
# Récupération des composants de tous les registres
|
|
884
|
+
all_components = {}
|
|
885
|
+
for component_type in ComponentType:
|
|
886
|
+
registry = _REGISTRY[component_type]
|
|
887
|
+
for cls, metadata in registry.get_all():
|
|
888
|
+
all_components[metadata.name] = (cls, metadata)
|
|
889
|
+
|
|
890
|
+
# Vérification des dépendances pour chaque composant
|
|
891
|
+
for component_name, (_, metadata) in all_components.items():
|
|
892
|
+
component_errors = []
|
|
893
|
+
|
|
894
|
+
# Vérifie chaque dépendance déclarée
|
|
895
|
+
for dep_name, min_version in metadata.dependencies.items():
|
|
896
|
+
# Vérifie l'existence de la dépendance
|
|
897
|
+
if dep_name not in all_components:
|
|
898
|
+
component_errors.append({
|
|
899
|
+
"type": "missing_dependency",
|
|
900
|
+
"dependency": dep_name,
|
|
901
|
+
"message": f"Dépendance '{dep_name}' non trouvée"
|
|
902
|
+
})
|
|
903
|
+
continue
|
|
904
|
+
|
|
905
|
+
# Vérifie la version de la dépendance
|
|
906
|
+
_, dep_metadata = all_components[dep_name]
|
|
907
|
+
if dep_metadata.version < min_version:
|
|
908
|
+
component_errors.append({
|
|
909
|
+
"type": "version_mismatch",
|
|
910
|
+
"dependency": dep_name,
|
|
911
|
+
"required": str(min_version),
|
|
912
|
+
"available": str(dep_metadata.version),
|
|
913
|
+
"message": f"Version requise '{min_version}' supérieure à '{dep_metadata.version}' disponible"
|
|
914
|
+
})
|
|
915
|
+
|
|
916
|
+
# Enregistre les erreurs si présentes
|
|
917
|
+
if component_errors:
|
|
918
|
+
errors[component_name] = component_errors
|
|
919
|
+
|
|
920
|
+
# Détection des cycles
|
|
921
|
+
cycles = detect_dependency_cycles()
|
|
922
|
+
if cycles:
|
|
923
|
+
for cycle in cycles:
|
|
924
|
+
cycle_str = " -> ".join(cycle)
|
|
925
|
+
for component in cycle:
|
|
926
|
+
if component not in errors:
|
|
927
|
+
errors[component] = []
|
|
928
|
+
errors[component].append({
|
|
929
|
+
"type": "dependency_cycle",
|
|
930
|
+
"cycle": cycle,
|
|
931
|
+
"message": f"Cycle de dépendance détecté: {cycle_str}"
|
|
932
|
+
})
|
|
933
|
+
|
|
934
|
+
return errors
|
|
935
|
+
|
|
936
|
+
|
|
937
|
+
def scan_modules_for_registrations(package_name="xplia", auto_register=False):
|
|
938
|
+
"""
|
|
939
|
+
Analyse récursivement les modules de l'application pour enregistrer les classes décorées.
|
|
940
|
+
|
|
941
|
+
Cette fonction parcourt tous les modules du package spécifié et recherche les classes
|
|
942
|
+
qui devraient être enregistrées en se basant sur l'héritage ou les annotations.
|
|
943
|
+
|
|
944
|
+
Args:
|
|
945
|
+
package_name: Nom du package racine à scanner (par défaut: "xplia")
|
|
946
|
+
auto_register: Si True, enregistre automatiquement les classes détectées
|
|
947
|
+
non encore enregistrées
|
|
948
|
+
|
|
949
|
+
Returns:
|
|
950
|
+
Dict[ComponentType, List[Type]]: Dictionnaire des classes détectées par type de composant
|
|
951
|
+
"""
|
|
952
|
+
import importlib
|
|
953
|
+
import pkgutil
|
|
954
|
+
import inspect
|
|
955
|
+
import sys
|
|
956
|
+
|
|
957
|
+
# Classes de base à rechercher par type de composant
|
|
958
|
+
base_classes = {
|
|
959
|
+
# Ces noms devront être adaptés aux noms réels des classes de base
|
|
960
|
+
ComponentType.EXPLAINER: ["BaseExplainer", "ExplainerBase"],
|
|
961
|
+
ComponentType.VISUALIZER: ["BaseVisualizer", "VisualizerBase"],
|
|
962
|
+
ComponentType.MODEL_ADAPTER: ["BaseModelAdapter", "ModelAdapterBase"],
|
|
963
|
+
ComponentType.COMPLIANCE_CHECKER: ["BaseComplianceChecker", "ComplianceCheckerBase"]
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
discovered_components = {ctype: [] for ctype in ComponentType}
|
|
967
|
+
|
|
968
|
+
def import_submodules(package):
|
|
969
|
+
"""Importe récursivement tous les sous-modules d'un package."""
|
|
970
|
+
if isinstance(package, str):
|
|
971
|
+
package = importlib.import_module(package)
|
|
972
|
+
results = {}
|
|
973
|
+
for _, name, is_pkg in pkgutil.iter_modules(package.__path__, package.__name__ + '.'):
|
|
974
|
+
try:
|
|
975
|
+
results[name] = importlib.import_module(name)
|
|
976
|
+
if is_pkg:
|
|
977
|
+
results.update(import_submodules(name))
|
|
978
|
+
except Exception as e:
|
|
979
|
+
print(f"Erreur lors de l'importation de {name}: {e}")
|
|
980
|
+
return results
|
|
981
|
+
|
|
982
|
+
try:
|
|
983
|
+
# Importe récursivement tous les modules
|
|
984
|
+
modules = import_submodules(package_name)
|
|
985
|
+
|
|
986
|
+
# Scanner chaque module pour les classes potentielles
|
|
987
|
+
for module_name, module in modules.items():
|
|
988
|
+
for item_name, item in inspect.getmembers(module):
|
|
989
|
+
# Vérifie si c'est une classe définie dans ce module
|
|
990
|
+
if inspect.isclass(item) and item.__module__ == module.__name__:
|
|
991
|
+
# Vérifie l'héritage pour chaque type de composant
|
|
992
|
+
for ctype, base_class_names in base_classes.items():
|
|
993
|
+
for base_name in base_class_names:
|
|
994
|
+
# Vérifie si le nom de la classe parente correspond
|
|
995
|
+
for base_class in item.__mro__[1:]: # Skip self
|
|
996
|
+
if base_class.__name__ == base_name:
|
|
997
|
+
discovered_components[ctype].append(item)
|
|
998
|
+
break
|
|
999
|
+
|
|
1000
|
+
# Enregistrement automatique si demandé
|
|
1001
|
+
if auto_register:
|
|
1002
|
+
for ctype, components in discovered_components.items():
|
|
1003
|
+
for component in components:
|
|
1004
|
+
# Vérifie si déjà enregistré
|
|
1005
|
+
is_registered = False
|
|
1006
|
+
|
|
1007
|
+
# Vérifie dans l'ancien système de registre
|
|
1008
|
+
if ctype == ComponentType.EXPLAINER and component in _EXPLAINER_REGISTRY:
|
|
1009
|
+
is_registered = True
|
|
1010
|
+
elif ctype == ComponentType.VISUALIZER and component in _VISUALIZER_REGISTRY:
|
|
1011
|
+
is_registered = True
|
|
1012
|
+
elif ctype == ComponentType.MODEL_ADAPTER and component in _MODEL_ADAPTER_REGISTRY:
|
|
1013
|
+
is_registered = True
|
|
1014
|
+
elif ctype == ComponentType.COMPLIANCE_CHECKER and component in _COMPLIANCE_CHECKER_REGISTRY:
|
|
1015
|
+
is_registered = True
|
|
1016
|
+
|
|
1017
|
+
# Vérifie dans le nouveau système de registre
|
|
1018
|
+
for cls, _ in _REGISTRY[ctype].get_all():
|
|
1019
|
+
if cls == component:
|
|
1020
|
+
is_registered = True
|
|
1021
|
+
break
|
|
1022
|
+
|
|
1023
|
+
# Si non enregistré, enregistre avec des métadonnées par défaut
|
|
1024
|
+
if not is_registered:
|
|
1025
|
+
metadata = ComponentMetadata(
|
|
1026
|
+
name=component.__name__,
|
|
1027
|
+
component_type=ctype,
|
|
1028
|
+
version=Version("1.0.0"),
|
|
1029
|
+
description=component.__doc__ or f"Auto-discovered {ctype.name.lower()}",
|
|
1030
|
+
author="Auto-discovery",
|
|
1031
|
+
tags=["auto-discovered", ctype.name.lower()],
|
|
1032
|
+
capabilities={},
|
|
1033
|
+
dependencies={},
|
|
1034
|
+
examples=[],
|
|
1035
|
+
priority=0,
|
|
1036
|
+
configuration_schema={}
|
|
1037
|
+
)
|
|
1038
|
+
_REGISTRY[ctype].register(component, metadata)
|
|
1039
|
+
|
|
1040
|
+
# Mise à jour de l'ancien registre pour compatibilité
|
|
1041
|
+
if ctype == ComponentType.EXPLAINER:
|
|
1042
|
+
_EXPLAINER_REGISTRY.add(component)
|
|
1043
|
+
elif ctype == ComponentType.VISUALIZER:
|
|
1044
|
+
_VISUALIZER_REGISTRY.add(component)
|
|
1045
|
+
elif ctype == ComponentType.MODEL_ADAPTER:
|
|
1046
|
+
_MODEL_ADAPTER_REGISTRY.add(component)
|
|
1047
|
+
elif ctype == ComponentType.COMPLIANCE_CHECKER:
|
|
1048
|
+
_COMPLIANCE_CHECKER_REGISTRY.add(component)
|
|
1049
|
+
|
|
1050
|
+
except Exception as e:
|
|
1051
|
+
print(f"Erreur lors du scan des modules: {e}")
|
|
1052
|
+
|
|
1053
|
+
return discovered_components
|
|
1054
|
+
|
|
1055
|
+
|
|
1056
|
+
# Déclencher l'enregistrement automatique lors de l'importation
|
|
1057
|
+
# (commenté pour l'instant car les classes de base ne sont pas encore toutes définies)
|
|
1058
|
+
# scan_modules_for_registrations()
|
|
1059
|
+
|
|
1060
|
+
|
|
1061
|
+
class Registry:
|
|
1062
|
+
"""
|
|
1063
|
+
Classe principale de registre pour XPLIA.
|
|
1064
|
+
|
|
1065
|
+
Fournit une interface unifiée pour accéder à tous les types de composants
|
|
1066
|
+
enregistrés dans le système.
|
|
1067
|
+
"""
|
|
1068
|
+
|
|
1069
|
+
def __init__(self):
|
|
1070
|
+
"""Initialise le registre global."""
|
|
1071
|
+
self._registries = _REGISTRY
|
|
1072
|
+
|
|
1073
|
+
def get_explainers(self, **filters) -> List[Type]:
|
|
1074
|
+
"""
|
|
1075
|
+
Récupère les explainers enregistrés.
|
|
1076
|
+
|
|
1077
|
+
Args:
|
|
1078
|
+
**filters: Critères de filtrage (tags, capability, etc.)
|
|
1079
|
+
|
|
1080
|
+
Returns:
|
|
1081
|
+
List[Type]: Liste des classes d'explainers
|
|
1082
|
+
"""
|
|
1083
|
+
return get_registered_explainers(**filters)
|
|
1084
|
+
|
|
1085
|
+
def get_visualizers(self, **filters) -> List[Type]:
|
|
1086
|
+
"""
|
|
1087
|
+
Récupère les visualiseurs enregistrés.
|
|
1088
|
+
|
|
1089
|
+
Args:
|
|
1090
|
+
**filters: Critères de filtrage
|
|
1091
|
+
|
|
1092
|
+
Returns:
|
|
1093
|
+
List[Type]: Liste des classes de visualiseurs
|
|
1094
|
+
"""
|
|
1095
|
+
return get_registered_visualizers(**filters)
|
|
1096
|
+
|
|
1097
|
+
def get_model_adapters(self, **filters) -> List[Type]:
|
|
1098
|
+
"""
|
|
1099
|
+
Récupère les adaptateurs de modèles enregistrés.
|
|
1100
|
+
|
|
1101
|
+
Args:
|
|
1102
|
+
**filters: Critères de filtrage
|
|
1103
|
+
|
|
1104
|
+
Returns:
|
|
1105
|
+
List[Type]: Liste des classes d'adaptateurs
|
|
1106
|
+
"""
|
|
1107
|
+
return get_registered_model_adapters(**filters)
|
|
1108
|
+
|
|
1109
|
+
def get_compliance_checkers(self, **filters) -> List[Type]:
|
|
1110
|
+
"""
|
|
1111
|
+
Récupère les vérificateurs de conformité enregistrés.
|
|
1112
|
+
|
|
1113
|
+
Args:
|
|
1114
|
+
**filters: Critères de filtrage
|
|
1115
|
+
|
|
1116
|
+
Returns:
|
|
1117
|
+
List[Type]: Liste des classes de vérificateurs
|
|
1118
|
+
"""
|
|
1119
|
+
return get_registered_compliance_checkers(**filters)
|
|
1120
|
+
|
|
1121
|
+
def register(self, component_type: ComponentType, component_class: Type,
|
|
1122
|
+
metadata: Optional[ComponentMetadata] = None) -> None:
|
|
1123
|
+
"""
|
|
1124
|
+
Enregistre un composant dans le registre approprié.
|
|
1125
|
+
|
|
1126
|
+
Args:
|
|
1127
|
+
component_type: Type de composant
|
|
1128
|
+
component_class: Classe du composant
|
|
1129
|
+
metadata: Métadonnées optionnelles
|
|
1130
|
+
"""
|
|
1131
|
+
if metadata is None:
|
|
1132
|
+
metadata = ComponentMetadata(
|
|
1133
|
+
name=component_class.__name__,
|
|
1134
|
+
component_type=component_type,
|
|
1135
|
+
version=Version("1.0.0"),
|
|
1136
|
+
description=component_class.__doc__ or ""
|
|
1137
|
+
)
|
|
1138
|
+
|
|
1139
|
+
self._registries[component_type].register(component_class, metadata)
|
|
1140
|
+
|
|
1141
|
+
def unregister(self, component_type: ComponentType, name: str) -> bool:
|
|
1142
|
+
"""
|
|
1143
|
+
Désenregistre un composant.
|
|
1144
|
+
|
|
1145
|
+
Args:
|
|
1146
|
+
component_type: Type de composant
|
|
1147
|
+
name: Nom du composant
|
|
1148
|
+
|
|
1149
|
+
Returns:
|
|
1150
|
+
bool: True si le composant a été désenregistré
|
|
1151
|
+
"""
|
|
1152
|
+
return self._registries[component_type].unregister(name)
|
|
1153
|
+
|
|
1154
|
+
def get_component(self, component_type: ComponentType, name: str) -> Optional[Tuple[Type, ComponentMetadata]]:
|
|
1155
|
+
"""
|
|
1156
|
+
Récupère un composant spécifique.
|
|
1157
|
+
|
|
1158
|
+
Args:
|
|
1159
|
+
component_type: Type de composant
|
|
1160
|
+
name: Nom du composant
|
|
1161
|
+
|
|
1162
|
+
Returns:
|
|
1163
|
+
Optional[Tuple[Type, ComponentMetadata]]: Composant et ses métadonnées
|
|
1164
|
+
"""
|
|
1165
|
+
return self._registries[component_type].get(name)
|
|
1166
|
+
|
|
1167
|
+
def list_all_components(self) -> Dict[ComponentType, List[str]]:
|
|
1168
|
+
"""
|
|
1169
|
+
Liste tous les composants enregistrés par type.
|
|
1170
|
+
|
|
1171
|
+
Returns:
|
|
1172
|
+
Dict[ComponentType, List[str]]: Dictionnaire des noms de composants par type
|
|
1173
|
+
"""
|
|
1174
|
+
result = {}
|
|
1175
|
+
for ctype, registry in self._registries.items():
|
|
1176
|
+
result[ctype] = [metadata.name for _, metadata in registry.get_all()]
|
|
1177
|
+
return result
|
|
1178
|
+
|
|
1179
|
+
def validate_dependencies(self) -> Dict[str, List[Dict[str, Any]]]:
|
|
1180
|
+
"""
|
|
1181
|
+
Valide toutes les dépendances du registre.
|
|
1182
|
+
|
|
1183
|
+
Returns:
|
|
1184
|
+
Dict[str, List[Dict[str, Any]]]: Erreurs de dépendances par composant
|
|
1185
|
+
"""
|
|
1186
|
+
return validate_component_dependencies()
|
|
1187
|
+
|
|
1188
|
+
def detect_cycles(self) -> List[List[str]]:
|
|
1189
|
+
"""
|
|
1190
|
+
Détecte les cycles de dépendances.
|
|
1191
|
+
|
|
1192
|
+
Returns:
|
|
1193
|
+
List[List[str]]: Liste des cycles détectés
|
|
1194
|
+
"""
|
|
1195
|
+
return detect_dependency_cycles()
|
|
1196
|
+
|
|
1197
|
+
def export_metadata(self, component_type: Optional[ComponentType] = None) -> Dict[str, Any]:
|
|
1198
|
+
"""
|
|
1199
|
+
Exporte les métadonnées de tous les composants.
|
|
1200
|
+
|
|
1201
|
+
Args:
|
|
1202
|
+
component_type: Type de composant spécifique (optionnel)
|
|
1203
|
+
|
|
1204
|
+
Returns:
|
|
1205
|
+
Dict[str, Any]: Métadonnées exportées
|
|
1206
|
+
"""
|
|
1207
|
+
result = {}
|
|
1208
|
+
|
|
1209
|
+
types_to_export = [component_type] if component_type else list(ComponentType)
|
|
1210
|
+
|
|
1211
|
+
for ctype in types_to_export:
|
|
1212
|
+
registry = self._registries[ctype]
|
|
1213
|
+
result[ctype.value] = []
|
|
1214
|
+
for _, metadata in registry.get_all():
|
|
1215
|
+
result[ctype.value].append(metadata.to_dict())
|
|
1216
|
+
|
|
1217
|
+
return result
|
|
1218
|
+
|
|
1219
|
+
def clear(self, component_type: Optional[ComponentType] = None) -> None:
|
|
1220
|
+
"""
|
|
1221
|
+
Vide le registre.
|
|
1222
|
+
|
|
1223
|
+
Args:
|
|
1224
|
+
component_type: Type de composant à vider (optionnel, vide tout si None)
|
|
1225
|
+
"""
|
|
1226
|
+
if component_type:
|
|
1227
|
+
self._registries[component_type].components.clear()
|
|
1228
|
+
else:
|
|
1229
|
+
for registry in self._registries.values():
|
|
1230
|
+
registry.components.clear()
|
|
1231
|
+
|
|
1232
|
+
|
|
1233
|
+
# Instance globale du registre
|
|
1234
|
+
_global_registry = Registry()
|