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.
Files changed (870) hide show
  1. venv/Lib/site-packages/_distutils_hack/__init__.py +222 -0
  2. venv/Lib/site-packages/_distutils_hack/override.py +1 -0
  3. venv/Lib/site-packages/pip/__init__.py +13 -0
  4. venv/Lib/site-packages/pip/__main__.py +24 -0
  5. venv/Lib/site-packages/pip/__pip-runner__.py +50 -0
  6. venv/Lib/site-packages/pip/_internal/__init__.py +19 -0
  7. venv/Lib/site-packages/pip/_internal/build_env.py +311 -0
  8. venv/Lib/site-packages/pip/_internal/cache.py +292 -0
  9. venv/Lib/site-packages/pip/_internal/cli/__init__.py +4 -0
  10. venv/Lib/site-packages/pip/_internal/cli/autocompletion.py +171 -0
  11. venv/Lib/site-packages/pip/_internal/cli/base_command.py +236 -0
  12. venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py +1074 -0
  13. venv/Lib/site-packages/pip/_internal/cli/command_context.py +27 -0
  14. venv/Lib/site-packages/pip/_internal/cli/main.py +79 -0
  15. venv/Lib/site-packages/pip/_internal/cli/main_parser.py +134 -0
  16. venv/Lib/site-packages/pip/_internal/cli/parser.py +294 -0
  17. venv/Lib/site-packages/pip/_internal/cli/progress_bars.py +68 -0
  18. venv/Lib/site-packages/pip/_internal/cli/req_command.py +508 -0
  19. venv/Lib/site-packages/pip/_internal/cli/spinners.py +159 -0
  20. venv/Lib/site-packages/pip/_internal/cli/status_codes.py +6 -0
  21. venv/Lib/site-packages/pip/_internal/commands/__init__.py +132 -0
  22. venv/Lib/site-packages/pip/_internal/commands/cache.py +222 -0
  23. venv/Lib/site-packages/pip/_internal/commands/check.py +54 -0
  24. venv/Lib/site-packages/pip/_internal/commands/completion.py +121 -0
  25. venv/Lib/site-packages/pip/_internal/commands/configuration.py +282 -0
  26. venv/Lib/site-packages/pip/_internal/commands/debug.py +199 -0
  27. venv/Lib/site-packages/pip/_internal/commands/download.py +147 -0
  28. venv/Lib/site-packages/pip/_internal/commands/freeze.py +108 -0
  29. venv/Lib/site-packages/pip/_internal/commands/hash.py +59 -0
  30. venv/Lib/site-packages/pip/_internal/commands/help.py +41 -0
  31. venv/Lib/site-packages/pip/_internal/commands/index.py +139 -0
  32. venv/Lib/site-packages/pip/_internal/commands/inspect.py +92 -0
  33. venv/Lib/site-packages/pip/_internal/commands/install.py +778 -0
  34. venv/Lib/site-packages/pip/_internal/commands/list.py +368 -0
  35. venv/Lib/site-packages/pip/_internal/commands/search.py +174 -0
  36. venv/Lib/site-packages/pip/_internal/commands/show.py +189 -0
  37. venv/Lib/site-packages/pip/_internal/commands/uninstall.py +113 -0
  38. venv/Lib/site-packages/pip/_internal/commands/wheel.py +183 -0
  39. venv/Lib/site-packages/pip/_internal/configuration.py +381 -0
  40. venv/Lib/site-packages/pip/_internal/distributions/__init__.py +21 -0
  41. venv/Lib/site-packages/pip/_internal/distributions/base.py +39 -0
  42. venv/Lib/site-packages/pip/_internal/distributions/installed.py +23 -0
  43. venv/Lib/site-packages/pip/_internal/distributions/sdist.py +150 -0
  44. venv/Lib/site-packages/pip/_internal/distributions/wheel.py +34 -0
  45. venv/Lib/site-packages/pip/_internal/exceptions.py +733 -0
  46. venv/Lib/site-packages/pip/_internal/index/__init__.py +2 -0
  47. venv/Lib/site-packages/pip/_internal/index/collector.py +505 -0
  48. venv/Lib/site-packages/pip/_internal/index/package_finder.py +1029 -0
  49. venv/Lib/site-packages/pip/_internal/index/sources.py +223 -0
  50. venv/Lib/site-packages/pip/_internal/locations/__init__.py +467 -0
  51. venv/Lib/site-packages/pip/_internal/locations/_distutils.py +173 -0
  52. venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py +213 -0
  53. venv/Lib/site-packages/pip/_internal/locations/base.py +81 -0
  54. venv/Lib/site-packages/pip/_internal/main.py +12 -0
  55. venv/Lib/site-packages/pip/_internal/metadata/__init__.py +127 -0
  56. venv/Lib/site-packages/pip/_internal/metadata/_json.py +84 -0
  57. venv/Lib/site-packages/pip/_internal/metadata/base.py +688 -0
  58. venv/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py +4 -0
  59. venv/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py +55 -0
  60. venv/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py +224 -0
  61. venv/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py +188 -0
  62. venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py +270 -0
  63. venv/Lib/site-packages/pip/_internal/models/__init__.py +2 -0
  64. venv/Lib/site-packages/pip/_internal/models/candidate.py +34 -0
  65. venv/Lib/site-packages/pip/_internal/models/direct_url.py +237 -0
  66. venv/Lib/site-packages/pip/_internal/models/format_control.py +80 -0
  67. venv/Lib/site-packages/pip/_internal/models/index.py +28 -0
  68. venv/Lib/site-packages/pip/_internal/models/installation_report.py +53 -0
  69. venv/Lib/site-packages/pip/_internal/models/link.py +581 -0
  70. venv/Lib/site-packages/pip/_internal/models/scheme.py +31 -0
  71. venv/Lib/site-packages/pip/_internal/models/search_scope.py +132 -0
  72. venv/Lib/site-packages/pip/_internal/models/selection_prefs.py +51 -0
  73. venv/Lib/site-packages/pip/_internal/models/target_python.py +110 -0
  74. venv/Lib/site-packages/pip/_internal/models/wheel.py +92 -0
  75. venv/Lib/site-packages/pip/_internal/network/__init__.py +2 -0
  76. venv/Lib/site-packages/pip/_internal/network/auth.py +561 -0
  77. venv/Lib/site-packages/pip/_internal/network/cache.py +69 -0
  78. venv/Lib/site-packages/pip/_internal/network/download.py +186 -0
  79. venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py +210 -0
  80. venv/Lib/site-packages/pip/_internal/network/session.py +519 -0
  81. venv/Lib/site-packages/pip/_internal/network/utils.py +96 -0
  82. venv/Lib/site-packages/pip/_internal/network/xmlrpc.py +60 -0
  83. venv/Lib/site-packages/pip/_internal/operations/__init__.py +0 -0
  84. venv/Lib/site-packages/pip/_internal/operations/build/__init__.py +0 -0
  85. venv/Lib/site-packages/pip/_internal/operations/build/build_tracker.py +124 -0
  86. venv/Lib/site-packages/pip/_internal/operations/build/metadata.py +39 -0
  87. venv/Lib/site-packages/pip/_internal/operations/build/metadata_editable.py +41 -0
  88. venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py +74 -0
  89. venv/Lib/site-packages/pip/_internal/operations/build/wheel.py +37 -0
  90. venv/Lib/site-packages/pip/_internal/operations/build/wheel_editable.py +46 -0
  91. venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py +102 -0
  92. venv/Lib/site-packages/pip/_internal/operations/check.py +187 -0
  93. venv/Lib/site-packages/pip/_internal/operations/freeze.py +255 -0
  94. venv/Lib/site-packages/pip/_internal/operations/install/__init__.py +2 -0
  95. venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py +46 -0
  96. venv/Lib/site-packages/pip/_internal/operations/install/wheel.py +740 -0
  97. venv/Lib/site-packages/pip/_internal/operations/prepare.py +743 -0
  98. venv/Lib/site-packages/pip/_internal/pyproject.py +179 -0
  99. venv/Lib/site-packages/pip/_internal/req/__init__.py +92 -0
  100. venv/Lib/site-packages/pip/_internal/req/constructors.py +506 -0
  101. venv/Lib/site-packages/pip/_internal/req/req_file.py +552 -0
  102. venv/Lib/site-packages/pip/_internal/req/req_install.py +874 -0
  103. venv/Lib/site-packages/pip/_internal/req/req_set.py +119 -0
  104. venv/Lib/site-packages/pip/_internal/req/req_uninstall.py +650 -0
  105. venv/Lib/site-packages/pip/_internal/resolution/__init__.py +0 -0
  106. venv/Lib/site-packages/pip/_internal/resolution/base.py +20 -0
  107. venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py +0 -0
  108. venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py +600 -0
  109. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py +0 -0
  110. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py +141 -0
  111. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py +555 -0
  112. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py +730 -0
  113. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py +155 -0
  114. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py +255 -0
  115. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py +80 -0
  116. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py +165 -0
  117. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py +299 -0
  118. venv/Lib/site-packages/pip/_internal/self_outdated_check.py +242 -0
  119. venv/Lib/site-packages/pip/_internal/utils/__init__.py +0 -0
  120. venv/Lib/site-packages/pip/_internal/utils/_jaraco_text.py +109 -0
  121. venv/Lib/site-packages/pip/_internal/utils/_log.py +38 -0
  122. venv/Lib/site-packages/pip/_internal/utils/appdirs.py +52 -0
  123. venv/Lib/site-packages/pip/_internal/utils/compat.py +63 -0
  124. venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py +165 -0
  125. venv/Lib/site-packages/pip/_internal/utils/datetime.py +11 -0
  126. venv/Lib/site-packages/pip/_internal/utils/deprecation.py +120 -0
  127. venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py +87 -0
  128. venv/Lib/site-packages/pip/_internal/utils/egg_link.py +72 -0
  129. venv/Lib/site-packages/pip/_internal/utils/encoding.py +36 -0
  130. venv/Lib/site-packages/pip/_internal/utils/entrypoints.py +84 -0
  131. venv/Lib/site-packages/pip/_internal/utils/filesystem.py +153 -0
  132. venv/Lib/site-packages/pip/_internal/utils/filetypes.py +27 -0
  133. venv/Lib/site-packages/pip/_internal/utils/glibc.py +88 -0
  134. venv/Lib/site-packages/pip/_internal/utils/hashes.py +151 -0
  135. venv/Lib/site-packages/pip/_internal/utils/inject_securetransport.py +35 -0
  136. venv/Lib/site-packages/pip/_internal/utils/logging.py +348 -0
  137. venv/Lib/site-packages/pip/_internal/utils/misc.py +735 -0
  138. venv/Lib/site-packages/pip/_internal/utils/models.py +39 -0
  139. venv/Lib/site-packages/pip/_internal/utils/packaging.py +57 -0
  140. venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py +146 -0
  141. venv/Lib/site-packages/pip/_internal/utils/subprocess.py +260 -0
  142. venv/Lib/site-packages/pip/_internal/utils/temp_dir.py +246 -0
  143. venv/Lib/site-packages/pip/_internal/utils/unpacking.py +257 -0
  144. venv/Lib/site-packages/pip/_internal/utils/urls.py +62 -0
  145. venv/Lib/site-packages/pip/_internal/utils/virtualenv.py +104 -0
  146. venv/Lib/site-packages/pip/_internal/utils/wheel.py +136 -0
  147. venv/Lib/site-packages/pip/_internal/vcs/__init__.py +15 -0
  148. venv/Lib/site-packages/pip/_internal/vcs/bazaar.py +112 -0
  149. venv/Lib/site-packages/pip/_internal/vcs/git.py +526 -0
  150. venv/Lib/site-packages/pip/_internal/vcs/mercurial.py +163 -0
  151. venv/Lib/site-packages/pip/_internal/vcs/subversion.py +324 -0
  152. venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py +705 -0
  153. venv/Lib/site-packages/pip/_internal/wheel_builder.py +355 -0
  154. venv/Lib/site-packages/pip/_vendor/__init__.py +120 -0
  155. venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py +18 -0
  156. venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py +61 -0
  157. venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py +137 -0
  158. venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py +65 -0
  159. venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py +9 -0
  160. venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py +188 -0
  161. venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py +39 -0
  162. venv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py +32 -0
  163. venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py +439 -0
  164. venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py +111 -0
  165. venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py +139 -0
  166. venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py +190 -0
  167. venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py +33 -0
  168. venv/Lib/site-packages/pip/_vendor/certifi/__init__.py +4 -0
  169. venv/Lib/site-packages/pip/_vendor/certifi/__main__.py +12 -0
  170. venv/Lib/site-packages/pip/_vendor/certifi/core.py +108 -0
  171. venv/Lib/site-packages/pip/_vendor/chardet/__init__.py +115 -0
  172. venv/Lib/site-packages/pip/_vendor/chardet/big5freq.py +386 -0
  173. venv/Lib/site-packages/pip/_vendor/chardet/big5prober.py +47 -0
  174. venv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py +261 -0
  175. venv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py +106 -0
  176. venv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py +147 -0
  177. venv/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py +0 -0
  178. venv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py +112 -0
  179. venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py +90 -0
  180. venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachinedict.py +19 -0
  181. venv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py +49 -0
  182. venv/Lib/site-packages/pip/_vendor/chardet/enums.py +85 -0
  183. venv/Lib/site-packages/pip/_vendor/chardet/escprober.py +102 -0
  184. venv/Lib/site-packages/pip/_vendor/chardet/escsm.py +261 -0
  185. venv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py +102 -0
  186. venv/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py +196 -0
  187. venv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py +47 -0
  188. venv/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py +388 -0
  189. venv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py +47 -0
  190. venv/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py +284 -0
  191. venv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py +47 -0
  192. venv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py +316 -0
  193. venv/Lib/site-packages/pip/_vendor/chardet/jisfreq.py +325 -0
  194. venv/Lib/site-packages/pip/_vendor/chardet/johabfreq.py +2382 -0
  195. venv/Lib/site-packages/pip/_vendor/chardet/johabprober.py +47 -0
  196. venv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py +238 -0
  197. venv/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py +4649 -0
  198. venv/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py +4397 -0
  199. venv/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py +4380 -0
  200. venv/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py +4649 -0
  201. venv/Lib/site-packages/pip/_vendor/chardet/langrussianmodel.py +5725 -0
  202. venv/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py +4380 -0
  203. venv/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py +4380 -0
  204. venv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py +147 -0
  205. venv/Lib/site-packages/pip/_vendor/chardet/macromanprober.py +162 -0
  206. venv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py +95 -0
  207. venv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py +57 -0
  208. venv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py +661 -0
  209. venv/Lib/site-packages/pip/_vendor/chardet/metadata/__init__.py +0 -0
  210. venv/Lib/site-packages/pip/_vendor/chardet/metadata/languages.py +352 -0
  211. venv/Lib/site-packages/pip/_vendor/chardet/resultdict.py +16 -0
  212. venv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py +162 -0
  213. venv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py +88 -0
  214. venv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py +105 -0
  215. venv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py +362 -0
  216. venv/Lib/site-packages/pip/_vendor/chardet/utf1632prober.py +225 -0
  217. venv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py +82 -0
  218. venv/Lib/site-packages/pip/_vendor/chardet/version.py +9 -0
  219. venv/Lib/site-packages/pip/_vendor/colorama/__init__.py +7 -0
  220. venv/Lib/site-packages/pip/_vendor/colorama/ansi.py +102 -0
  221. venv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py +277 -0
  222. venv/Lib/site-packages/pip/_vendor/colorama/initialise.py +121 -0
  223. venv/Lib/site-packages/pip/_vendor/colorama/tests/__init__.py +1 -0
  224. venv/Lib/site-packages/pip/_vendor/colorama/tests/ansi_test.py +76 -0
  225. venv/Lib/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py +294 -0
  226. venv/Lib/site-packages/pip/_vendor/colorama/tests/initialise_test.py +189 -0
  227. venv/Lib/site-packages/pip/_vendor/colorama/tests/isatty_test.py +57 -0
  228. venv/Lib/site-packages/pip/_vendor/colorama/tests/utils.py +49 -0
  229. venv/Lib/site-packages/pip/_vendor/colorama/tests/winterm_test.py +131 -0
  230. venv/Lib/site-packages/pip/_vendor/colorama/win32.py +180 -0
  231. venv/Lib/site-packages/pip/_vendor/colorama/winterm.py +195 -0
  232. venv/Lib/site-packages/pip/_vendor/distlib/__init__.py +23 -0
  233. venv/Lib/site-packages/pip/_vendor/distlib/compat.py +1116 -0
  234. venv/Lib/site-packages/pip/_vendor/distlib/database.py +1350 -0
  235. venv/Lib/site-packages/pip/_vendor/distlib/index.py +508 -0
  236. venv/Lib/site-packages/pip/_vendor/distlib/locators.py +1300 -0
  237. venv/Lib/site-packages/pip/_vendor/distlib/manifest.py +393 -0
  238. venv/Lib/site-packages/pip/_vendor/distlib/markers.py +152 -0
  239. venv/Lib/site-packages/pip/_vendor/distlib/metadata.py +1076 -0
  240. venv/Lib/site-packages/pip/_vendor/distlib/resources.py +358 -0
  241. venv/Lib/site-packages/pip/_vendor/distlib/scripts.py +437 -0
  242. venv/Lib/site-packages/pip/_vendor/distlib/util.py +1932 -0
  243. venv/Lib/site-packages/pip/_vendor/distlib/version.py +739 -0
  244. venv/Lib/site-packages/pip/_vendor/distlib/wheel.py +1082 -0
  245. venv/Lib/site-packages/pip/_vendor/distro/__init__.py +54 -0
  246. venv/Lib/site-packages/pip/_vendor/distro/__main__.py +4 -0
  247. venv/Lib/site-packages/pip/_vendor/distro/distro.py +1399 -0
  248. venv/Lib/site-packages/pip/_vendor/idna/__init__.py +44 -0
  249. venv/Lib/site-packages/pip/_vendor/idna/codec.py +112 -0
  250. venv/Lib/site-packages/pip/_vendor/idna/compat.py +13 -0
  251. venv/Lib/site-packages/pip/_vendor/idna/core.py +400 -0
  252. venv/Lib/site-packages/pip/_vendor/idna/idnadata.py +2151 -0
  253. venv/Lib/site-packages/pip/_vendor/idna/intranges.py +54 -0
  254. venv/Lib/site-packages/pip/_vendor/idna/package_data.py +2 -0
  255. venv/Lib/site-packages/pip/_vendor/idna/uts46data.py +8600 -0
  256. venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py +57 -0
  257. venv/Lib/site-packages/pip/_vendor/msgpack/exceptions.py +48 -0
  258. venv/Lib/site-packages/pip/_vendor/msgpack/ext.py +193 -0
  259. venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py +1010 -0
  260. venv/Lib/site-packages/pip/_vendor/packaging/__about__.py +26 -0
  261. venv/Lib/site-packages/pip/_vendor/packaging/__init__.py +25 -0
  262. venv/Lib/site-packages/pip/_vendor/packaging/_manylinux.py +301 -0
  263. venv/Lib/site-packages/pip/_vendor/packaging/_musllinux.py +136 -0
  264. venv/Lib/site-packages/pip/_vendor/packaging/_structures.py +61 -0
  265. venv/Lib/site-packages/pip/_vendor/packaging/markers.py +304 -0
  266. venv/Lib/site-packages/pip/_vendor/packaging/requirements.py +146 -0
  267. venv/Lib/site-packages/pip/_vendor/packaging/specifiers.py +802 -0
  268. venv/Lib/site-packages/pip/_vendor/packaging/tags.py +487 -0
  269. venv/Lib/site-packages/pip/_vendor/packaging/utils.py +136 -0
  270. venv/Lib/site-packages/pip/_vendor/packaging/version.py +504 -0
  271. venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py +3361 -0
  272. venv/Lib/site-packages/pip/_vendor/platformdirs/__init__.py +566 -0
  273. venv/Lib/site-packages/pip/_vendor/platformdirs/__main__.py +53 -0
  274. venv/Lib/site-packages/pip/_vendor/platformdirs/android.py +210 -0
  275. venv/Lib/site-packages/pip/_vendor/platformdirs/api.py +223 -0
  276. venv/Lib/site-packages/pip/_vendor/platformdirs/macos.py +91 -0
  277. venv/Lib/site-packages/pip/_vendor/platformdirs/unix.py +223 -0
  278. venv/Lib/site-packages/pip/_vendor/platformdirs/version.py +4 -0
  279. venv/Lib/site-packages/pip/_vendor/platformdirs/windows.py +255 -0
  280. venv/Lib/site-packages/pip/_vendor/pygments/__init__.py +82 -0
  281. venv/Lib/site-packages/pip/_vendor/pygments/__main__.py +17 -0
  282. venv/Lib/site-packages/pip/_vendor/pygments/cmdline.py +668 -0
  283. venv/Lib/site-packages/pip/_vendor/pygments/console.py +70 -0
  284. venv/Lib/site-packages/pip/_vendor/pygments/filter.py +71 -0
  285. venv/Lib/site-packages/pip/_vendor/pygments/filters/__init__.py +940 -0
  286. venv/Lib/site-packages/pip/_vendor/pygments/formatter.py +124 -0
  287. venv/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py +158 -0
  288. venv/Lib/site-packages/pip/_vendor/pygments/formatters/_mapping.py +23 -0
  289. venv/Lib/site-packages/pip/_vendor/pygments/formatters/bbcode.py +108 -0
  290. venv/Lib/site-packages/pip/_vendor/pygments/formatters/groff.py +170 -0
  291. venv/Lib/site-packages/pip/_vendor/pygments/formatters/html.py +989 -0
  292. venv/Lib/site-packages/pip/_vendor/pygments/formatters/img.py +645 -0
  293. venv/Lib/site-packages/pip/_vendor/pygments/formatters/irc.py +154 -0
  294. venv/Lib/site-packages/pip/_vendor/pygments/formatters/latex.py +521 -0
  295. venv/Lib/site-packages/pip/_vendor/pygments/formatters/other.py +161 -0
  296. venv/Lib/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py +83 -0
  297. venv/Lib/site-packages/pip/_vendor/pygments/formatters/rtf.py +146 -0
  298. venv/Lib/site-packages/pip/_vendor/pygments/formatters/svg.py +188 -0
  299. venv/Lib/site-packages/pip/_vendor/pygments/formatters/terminal.py +127 -0
  300. venv/Lib/site-packages/pip/_vendor/pygments/formatters/terminal256.py +338 -0
  301. venv/Lib/site-packages/pip/_vendor/pygments/lexer.py +943 -0
  302. venv/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py +362 -0
  303. venv/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py +559 -0
  304. venv/Lib/site-packages/pip/_vendor/pygments/lexers/python.py +1198 -0
  305. venv/Lib/site-packages/pip/_vendor/pygments/modeline.py +43 -0
  306. venv/Lib/site-packages/pip/_vendor/pygments/plugin.py +88 -0
  307. venv/Lib/site-packages/pip/_vendor/pygments/regexopt.py +91 -0
  308. venv/Lib/site-packages/pip/_vendor/pygments/scanner.py +104 -0
  309. venv/Lib/site-packages/pip/_vendor/pygments/sphinxext.py +217 -0
  310. venv/Lib/site-packages/pip/_vendor/pygments/style.py +197 -0
  311. venv/Lib/site-packages/pip/_vendor/pygments/styles/__init__.py +103 -0
  312. venv/Lib/site-packages/pip/_vendor/pygments/token.py +213 -0
  313. venv/Lib/site-packages/pip/_vendor/pygments/unistring.py +153 -0
  314. venv/Lib/site-packages/pip/_vendor/pygments/util.py +330 -0
  315. venv/Lib/site-packages/pip/_vendor/pyparsing/__init__.py +322 -0
  316. venv/Lib/site-packages/pip/_vendor/pyparsing/actions.py +217 -0
  317. venv/Lib/site-packages/pip/_vendor/pyparsing/common.py +432 -0
  318. venv/Lib/site-packages/pip/_vendor/pyparsing/core.py +6115 -0
  319. venv/Lib/site-packages/pip/_vendor/pyparsing/diagram/__init__.py +656 -0
  320. venv/Lib/site-packages/pip/_vendor/pyparsing/exceptions.py +299 -0
  321. venv/Lib/site-packages/pip/_vendor/pyparsing/helpers.py +1100 -0
  322. venv/Lib/site-packages/pip/_vendor/pyparsing/results.py +796 -0
  323. venv/Lib/site-packages/pip/_vendor/pyparsing/testing.py +331 -0
  324. venv/Lib/site-packages/pip/_vendor/pyparsing/unicode.py +361 -0
  325. venv/Lib/site-packages/pip/_vendor/pyparsing/util.py +284 -0
  326. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__init__.py +23 -0
  327. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_compat.py +8 -0
  328. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_impl.py +330 -0
  329. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py +18 -0
  330. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py +353 -0
  331. venv/Lib/site-packages/pip/_vendor/requests/__init__.py +182 -0
  332. venv/Lib/site-packages/pip/_vendor/requests/__version__.py +14 -0
  333. venv/Lib/site-packages/pip/_vendor/requests/_internal_utils.py +50 -0
  334. venv/Lib/site-packages/pip/_vendor/requests/adapters.py +538 -0
  335. venv/Lib/site-packages/pip/_vendor/requests/api.py +157 -0
  336. venv/Lib/site-packages/pip/_vendor/requests/auth.py +315 -0
  337. venv/Lib/site-packages/pip/_vendor/requests/certs.py +24 -0
  338. venv/Lib/site-packages/pip/_vendor/requests/compat.py +67 -0
  339. venv/Lib/site-packages/pip/_vendor/requests/cookies.py +561 -0
  340. venv/Lib/site-packages/pip/_vendor/requests/exceptions.py +141 -0
  341. venv/Lib/site-packages/pip/_vendor/requests/help.py +131 -0
  342. venv/Lib/site-packages/pip/_vendor/requests/hooks.py +33 -0
  343. venv/Lib/site-packages/pip/_vendor/requests/models.py +1034 -0
  344. venv/Lib/site-packages/pip/_vendor/requests/packages.py +16 -0
  345. venv/Lib/site-packages/pip/_vendor/requests/sessions.py +833 -0
  346. venv/Lib/site-packages/pip/_vendor/requests/status_codes.py +128 -0
  347. venv/Lib/site-packages/pip/_vendor/requests/structures.py +99 -0
  348. venv/Lib/site-packages/pip/_vendor/requests/utils.py +1094 -0
  349. venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py +26 -0
  350. venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__init__.py +0 -0
  351. venv/Lib/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py +6 -0
  352. venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py +133 -0
  353. venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py +43 -0
  354. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py +547 -0
  355. venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py +170 -0
  356. venv/Lib/site-packages/pip/_vendor/rich/__init__.py +177 -0
  357. venv/Lib/site-packages/pip/_vendor/rich/__main__.py +274 -0
  358. venv/Lib/site-packages/pip/_vendor/rich/_cell_widths.py +451 -0
  359. venv/Lib/site-packages/pip/_vendor/rich/_emoji_codes.py +3610 -0
  360. venv/Lib/site-packages/pip/_vendor/rich/_emoji_replace.py +32 -0
  361. venv/Lib/site-packages/pip/_vendor/rich/_export_format.py +76 -0
  362. venv/Lib/site-packages/pip/_vendor/rich/_extension.py +10 -0
  363. venv/Lib/site-packages/pip/_vendor/rich/_fileno.py +24 -0
  364. venv/Lib/site-packages/pip/_vendor/rich/_inspect.py +270 -0
  365. venv/Lib/site-packages/pip/_vendor/rich/_log_render.py +94 -0
  366. venv/Lib/site-packages/pip/_vendor/rich/_loop.py +43 -0
  367. venv/Lib/site-packages/pip/_vendor/rich/_null_file.py +69 -0
  368. venv/Lib/site-packages/pip/_vendor/rich/_palettes.py +309 -0
  369. venv/Lib/site-packages/pip/_vendor/rich/_pick.py +17 -0
  370. venv/Lib/site-packages/pip/_vendor/rich/_ratio.py +160 -0
  371. venv/Lib/site-packages/pip/_vendor/rich/_spinners.py +482 -0
  372. venv/Lib/site-packages/pip/_vendor/rich/_stack.py +16 -0
  373. venv/Lib/site-packages/pip/_vendor/rich/_timer.py +19 -0
  374. venv/Lib/site-packages/pip/_vendor/rich/_win32_console.py +662 -0
  375. venv/Lib/site-packages/pip/_vendor/rich/_windows.py +72 -0
  376. venv/Lib/site-packages/pip/_vendor/rich/_windows_renderer.py +56 -0
  377. venv/Lib/site-packages/pip/_vendor/rich/_wrap.py +56 -0
  378. venv/Lib/site-packages/pip/_vendor/rich/abc.py +33 -0
  379. venv/Lib/site-packages/pip/_vendor/rich/align.py +311 -0
  380. venv/Lib/site-packages/pip/_vendor/rich/ansi.py +240 -0
  381. venv/Lib/site-packages/pip/_vendor/rich/bar.py +94 -0
  382. venv/Lib/site-packages/pip/_vendor/rich/box.py +517 -0
  383. venv/Lib/site-packages/pip/_vendor/rich/cells.py +154 -0
  384. venv/Lib/site-packages/pip/_vendor/rich/color.py +622 -0
  385. venv/Lib/site-packages/pip/_vendor/rich/color_triplet.py +38 -0
  386. venv/Lib/site-packages/pip/_vendor/rich/columns.py +187 -0
  387. venv/Lib/site-packages/pip/_vendor/rich/console.py +2633 -0
  388. venv/Lib/site-packages/pip/_vendor/rich/constrain.py +37 -0
  389. venv/Lib/site-packages/pip/_vendor/rich/containers.py +167 -0
  390. venv/Lib/site-packages/pip/_vendor/rich/control.py +225 -0
  391. venv/Lib/site-packages/pip/_vendor/rich/default_styles.py +190 -0
  392. venv/Lib/site-packages/pip/_vendor/rich/diagnose.py +37 -0
  393. venv/Lib/site-packages/pip/_vendor/rich/emoji.py +96 -0
  394. venv/Lib/site-packages/pip/_vendor/rich/errors.py +34 -0
  395. venv/Lib/site-packages/pip/_vendor/rich/file_proxy.py +57 -0
  396. venv/Lib/site-packages/pip/_vendor/rich/filesize.py +89 -0
  397. venv/Lib/site-packages/pip/_vendor/rich/highlighter.py +232 -0
  398. venv/Lib/site-packages/pip/_vendor/rich/json.py +140 -0
  399. venv/Lib/site-packages/pip/_vendor/rich/jupyter.py +101 -0
  400. venv/Lib/site-packages/pip/_vendor/rich/layout.py +443 -0
  401. venv/Lib/site-packages/pip/_vendor/rich/live.py +375 -0
  402. venv/Lib/site-packages/pip/_vendor/rich/live_render.py +113 -0
  403. venv/Lib/site-packages/pip/_vendor/rich/logging.py +289 -0
  404. venv/Lib/site-packages/pip/_vendor/rich/markup.py +246 -0
  405. venv/Lib/site-packages/pip/_vendor/rich/measure.py +151 -0
  406. venv/Lib/site-packages/pip/_vendor/rich/padding.py +141 -0
  407. venv/Lib/site-packages/pip/_vendor/rich/pager.py +34 -0
  408. venv/Lib/site-packages/pip/_vendor/rich/palette.py +100 -0
  409. venv/Lib/site-packages/pip/_vendor/rich/panel.py +308 -0
  410. venv/Lib/site-packages/pip/_vendor/rich/pretty.py +994 -0
  411. venv/Lib/site-packages/pip/_vendor/rich/progress.py +1702 -0
  412. venv/Lib/site-packages/pip/_vendor/rich/progress_bar.py +224 -0
  413. venv/Lib/site-packages/pip/_vendor/rich/prompt.py +376 -0
  414. venv/Lib/site-packages/pip/_vendor/rich/protocol.py +42 -0
  415. venv/Lib/site-packages/pip/_vendor/rich/region.py +10 -0
  416. venv/Lib/site-packages/pip/_vendor/rich/repr.py +149 -0
  417. venv/Lib/site-packages/pip/_vendor/rich/rule.py +130 -0
  418. venv/Lib/site-packages/pip/_vendor/rich/scope.py +86 -0
  419. venv/Lib/site-packages/pip/_vendor/rich/screen.py +54 -0
  420. venv/Lib/site-packages/pip/_vendor/rich/segment.py +739 -0
  421. venv/Lib/site-packages/pip/_vendor/rich/spinner.py +137 -0
  422. venv/Lib/site-packages/pip/_vendor/rich/status.py +132 -0
  423. venv/Lib/site-packages/pip/_vendor/rich/style.py +796 -0
  424. venv/Lib/site-packages/pip/_vendor/rich/styled.py +42 -0
  425. venv/Lib/site-packages/pip/_vendor/rich/syntax.py +948 -0
  426. venv/Lib/site-packages/pip/_vendor/rich/table.py +1002 -0
  427. venv/Lib/site-packages/pip/_vendor/rich/terminal_theme.py +153 -0
  428. venv/Lib/site-packages/pip/_vendor/rich/text.py +1307 -0
  429. venv/Lib/site-packages/pip/_vendor/rich/theme.py +115 -0
  430. venv/Lib/site-packages/pip/_vendor/rich/themes.py +5 -0
  431. venv/Lib/site-packages/pip/_vendor/rich/traceback.py +756 -0
  432. venv/Lib/site-packages/pip/_vendor/rich/tree.py +251 -0
  433. venv/Lib/site-packages/pip/_vendor/six.py +998 -0
  434. venv/Lib/site-packages/pip/_vendor/tenacity/__init__.py +608 -0
  435. venv/Lib/site-packages/pip/_vendor/tenacity/_asyncio.py +94 -0
  436. venv/Lib/site-packages/pip/_vendor/tenacity/_utils.py +76 -0
  437. venv/Lib/site-packages/pip/_vendor/tenacity/after.py +51 -0
  438. venv/Lib/site-packages/pip/_vendor/tenacity/before.py +46 -0
  439. venv/Lib/site-packages/pip/_vendor/tenacity/before_sleep.py +71 -0
  440. venv/Lib/site-packages/pip/_vendor/tenacity/nap.py +43 -0
  441. venv/Lib/site-packages/pip/_vendor/tenacity/retry.py +272 -0
  442. venv/Lib/site-packages/pip/_vendor/tenacity/stop.py +103 -0
  443. venv/Lib/site-packages/pip/_vendor/tenacity/tornadoweb.py +59 -0
  444. venv/Lib/site-packages/pip/_vendor/tenacity/wait.py +228 -0
  445. venv/Lib/site-packages/pip/_vendor/tomli/__init__.py +11 -0
  446. venv/Lib/site-packages/pip/_vendor/tomli/_parser.py +691 -0
  447. venv/Lib/site-packages/pip/_vendor/tomli/_re.py +107 -0
  448. venv/Lib/site-packages/pip/_vendor/tomli/_types.py +10 -0
  449. venv/Lib/site-packages/pip/_vendor/typing_extensions.py +3072 -0
  450. venv/Lib/site-packages/pip/_vendor/urllib3/__init__.py +102 -0
  451. venv/Lib/site-packages/pip/_vendor/urllib3/_collections.py +337 -0
  452. venv/Lib/site-packages/pip/_vendor/urllib3/_version.py +2 -0
  453. venv/Lib/site-packages/pip/_vendor/urllib3/connection.py +572 -0
  454. venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py +1132 -0
  455. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py +0 -0
  456. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py +36 -0
  457. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py +0 -0
  458. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py +519 -0
  459. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py +397 -0
  460. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py +314 -0
  461. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py +130 -0
  462. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py +518 -0
  463. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py +921 -0
  464. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py +216 -0
  465. venv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py +323 -0
  466. venv/Lib/site-packages/pip/_vendor/urllib3/fields.py +274 -0
  467. venv/Lib/site-packages/pip/_vendor/urllib3/filepost.py +98 -0
  468. venv/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py +0 -0
  469. venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py +0 -0
  470. venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py +51 -0
  471. venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py +155 -0
  472. venv/Lib/site-packages/pip/_vendor/urllib3/packages/six.py +1076 -0
  473. venv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py +537 -0
  474. venv/Lib/site-packages/pip/_vendor/urllib3/request.py +170 -0
  475. venv/Lib/site-packages/pip/_vendor/urllib3/response.py +879 -0
  476. venv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py +49 -0
  477. venv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py +149 -0
  478. venv/Lib/site-packages/pip/_vendor/urllib3/util/proxy.py +57 -0
  479. venv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py +22 -0
  480. venv/Lib/site-packages/pip/_vendor/urllib3/util/request.py +137 -0
  481. venv/Lib/site-packages/pip/_vendor/urllib3/util/response.py +107 -0
  482. venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py +620 -0
  483. venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py +495 -0
  484. venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py +159 -0
  485. venv/Lib/site-packages/pip/_vendor/urllib3/util/ssltransport.py +221 -0
  486. venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py +271 -0
  487. venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py +435 -0
  488. venv/Lib/site-packages/pip/_vendor/urllib3/util/wait.py +152 -0
  489. venv/Lib/site-packages/pip/_vendor/webencodings/__init__.py +342 -0
  490. venv/Lib/site-packages/pip/_vendor/webencodings/labels.py +231 -0
  491. venv/Lib/site-packages/pip/_vendor/webencodings/mklabels.py +59 -0
  492. venv/Lib/site-packages/pip/_vendor/webencodings/tests.py +153 -0
  493. venv/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py +325 -0
  494. venv/Lib/site-packages/pip/py.typed +4 -0
  495. venv/Lib/site-packages/pkg_resources/__init__.py +3296 -0
  496. venv/Lib/site-packages/pkg_resources/_vendor/__init__.py +0 -0
  497. venv/Lib/site-packages/pkg_resources/_vendor/appdirs.py +608 -0
  498. venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__init__.py +36 -0
  499. venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_adapters.py +170 -0
  500. venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_common.py +104 -0
  501. venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_compat.py +98 -0
  502. venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_itertools.py +35 -0
  503. venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_legacy.py +121 -0
  504. venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/abc.py +137 -0
  505. venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/readers.py +122 -0
  506. venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/simple.py +116 -0
  507. venv/Lib/site-packages/pkg_resources/_vendor/jaraco/__init__.py +0 -0
  508. venv/Lib/site-packages/pkg_resources/_vendor/jaraco/context.py +213 -0
  509. venv/Lib/site-packages/pkg_resources/_vendor/jaraco/functools.py +525 -0
  510. venv/Lib/site-packages/pkg_resources/_vendor/jaraco/text/__init__.py +599 -0
  511. venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/__init__.py +4 -0
  512. venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/more.py +4316 -0
  513. venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/recipes.py +698 -0
  514. venv/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py +26 -0
  515. venv/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py +25 -0
  516. venv/Lib/site-packages/pkg_resources/_vendor/packaging/_manylinux.py +301 -0
  517. venv/Lib/site-packages/pkg_resources/_vendor/packaging/_musllinux.py +136 -0
  518. venv/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py +61 -0
  519. venv/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py +304 -0
  520. venv/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py +146 -0
  521. venv/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py +802 -0
  522. venv/Lib/site-packages/pkg_resources/_vendor/packaging/tags.py +487 -0
  523. venv/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py +136 -0
  524. venv/Lib/site-packages/pkg_resources/_vendor/packaging/version.py +504 -0
  525. venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__init__.py +331 -0
  526. venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/actions.py +207 -0
  527. venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/common.py +424 -0
  528. venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/core.py +5814 -0
  529. venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/diagram/__init__.py +642 -0
  530. venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/exceptions.py +267 -0
  531. venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/helpers.py +1088 -0
  532. venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/results.py +760 -0
  533. venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/testing.py +331 -0
  534. venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/unicode.py +352 -0
  535. venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/util.py +235 -0
  536. venv/Lib/site-packages/pkg_resources/_vendor/zipp.py +329 -0
  537. venv/Lib/site-packages/pkg_resources/extern/__init__.py +76 -0
  538. venv/Lib/site-packages/setuptools/__init__.py +247 -0
  539. venv/Lib/site-packages/setuptools/_deprecation_warning.py +7 -0
  540. venv/Lib/site-packages/setuptools/_distutils/__init__.py +24 -0
  541. venv/Lib/site-packages/setuptools/_distutils/_collections.py +56 -0
  542. venv/Lib/site-packages/setuptools/_distutils/_functools.py +20 -0
  543. venv/Lib/site-packages/setuptools/_distutils/_macos_compat.py +12 -0
  544. venv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py +572 -0
  545. venv/Lib/site-packages/setuptools/_distutils/archive_util.py +280 -0
  546. venv/Lib/site-packages/setuptools/_distutils/bcppcompiler.py +408 -0
  547. venv/Lib/site-packages/setuptools/_distutils/ccompiler.py +1220 -0
  548. venv/Lib/site-packages/setuptools/_distutils/cmd.py +436 -0
  549. venv/Lib/site-packages/setuptools/_distutils/command/__init__.py +25 -0
  550. venv/Lib/site-packages/setuptools/_distutils/command/_framework_compat.py +55 -0
  551. venv/Lib/site-packages/setuptools/_distutils/command/bdist.py +157 -0
  552. venv/Lib/site-packages/setuptools/_distutils/command/bdist_dumb.py +144 -0
  553. venv/Lib/site-packages/setuptools/_distutils/command/bdist_rpm.py +615 -0
  554. venv/Lib/site-packages/setuptools/_distutils/command/build.py +153 -0
  555. venv/Lib/site-packages/setuptools/_distutils/command/build_clib.py +208 -0
  556. venv/Lib/site-packages/setuptools/_distutils/command/build_ext.py +787 -0
  557. venv/Lib/site-packages/setuptools/_distutils/command/build_py.py +407 -0
  558. venv/Lib/site-packages/setuptools/_distutils/command/build_scripts.py +173 -0
  559. venv/Lib/site-packages/setuptools/_distutils/command/check.py +151 -0
  560. venv/Lib/site-packages/setuptools/_distutils/command/clean.py +76 -0
  561. venv/Lib/site-packages/setuptools/_distutils/command/config.py +377 -0
  562. venv/Lib/site-packages/setuptools/_distutils/command/install.py +814 -0
  563. venv/Lib/site-packages/setuptools/_distutils/command/install_data.py +84 -0
  564. venv/Lib/site-packages/setuptools/_distutils/command/install_egg_info.py +91 -0
  565. venv/Lib/site-packages/setuptools/_distutils/command/install_headers.py +45 -0
  566. venv/Lib/site-packages/setuptools/_distutils/command/install_lib.py +238 -0
  567. venv/Lib/site-packages/setuptools/_distutils/command/install_scripts.py +61 -0
  568. venv/Lib/site-packages/setuptools/_distutils/command/py37compat.py +31 -0
  569. venv/Lib/site-packages/setuptools/_distutils/command/register.py +319 -0
  570. venv/Lib/site-packages/setuptools/_distutils/command/sdist.py +531 -0
  571. venv/Lib/site-packages/setuptools/_distutils/command/upload.py +205 -0
  572. venv/Lib/site-packages/setuptools/_distutils/config.py +139 -0
  573. venv/Lib/site-packages/setuptools/_distutils/core.py +291 -0
  574. venv/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py +364 -0
  575. venv/Lib/site-packages/setuptools/_distutils/debug.py +5 -0
  576. venv/Lib/site-packages/setuptools/_distutils/dep_util.py +96 -0
  577. venv/Lib/site-packages/setuptools/_distutils/dir_util.py +243 -0
  578. venv/Lib/site-packages/setuptools/_distutils/dist.py +1286 -0
  579. venv/Lib/site-packages/setuptools/_distutils/errors.py +127 -0
  580. venv/Lib/site-packages/setuptools/_distutils/extension.py +248 -0
  581. venv/Lib/site-packages/setuptools/_distutils/fancy_getopt.py +470 -0
  582. venv/Lib/site-packages/setuptools/_distutils/file_util.py +249 -0
  583. venv/Lib/site-packages/setuptools/_distutils/filelist.py +371 -0
  584. venv/Lib/site-packages/setuptools/_distutils/log.py +80 -0
  585. venv/Lib/site-packages/setuptools/_distutils/msvc9compiler.py +832 -0
  586. venv/Lib/site-packages/setuptools/_distutils/msvccompiler.py +695 -0
  587. venv/Lib/site-packages/setuptools/_distutils/py38compat.py +8 -0
  588. venv/Lib/site-packages/setuptools/_distutils/py39compat.py +22 -0
  589. venv/Lib/site-packages/setuptools/_distutils/spawn.py +109 -0
  590. venv/Lib/site-packages/setuptools/_distutils/sysconfig.py +558 -0
  591. venv/Lib/site-packages/setuptools/_distutils/text_file.py +287 -0
  592. venv/Lib/site-packages/setuptools/_distutils/unixccompiler.py +401 -0
  593. venv/Lib/site-packages/setuptools/_distutils/util.py +513 -0
  594. venv/Lib/site-packages/setuptools/_distutils/version.py +358 -0
  595. venv/Lib/site-packages/setuptools/_distutils/versionpredicate.py +175 -0
  596. venv/Lib/site-packages/setuptools/_entry_points.py +86 -0
  597. venv/Lib/site-packages/setuptools/_imp.py +82 -0
  598. venv/Lib/site-packages/setuptools/_importlib.py +47 -0
  599. venv/Lib/site-packages/setuptools/_itertools.py +23 -0
  600. venv/Lib/site-packages/setuptools/_path.py +29 -0
  601. venv/Lib/site-packages/setuptools/_reqs.py +19 -0
  602. venv/Lib/site-packages/setuptools/_vendor/__init__.py +0 -0
  603. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__init__.py +1047 -0
  604. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py +68 -0
  605. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_collections.py +30 -0
  606. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_compat.py +71 -0
  607. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_functools.py +104 -0
  608. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py +73 -0
  609. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_meta.py +48 -0
  610. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_text.py +99 -0
  611. venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__init__.py +36 -0
  612. venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_adapters.py +170 -0
  613. venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_common.py +104 -0
  614. venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_compat.py +98 -0
  615. venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_itertools.py +35 -0
  616. venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_legacy.py +121 -0
  617. venv/Lib/site-packages/setuptools/_vendor/importlib_resources/abc.py +137 -0
  618. venv/Lib/site-packages/setuptools/_vendor/importlib_resources/readers.py +122 -0
  619. venv/Lib/site-packages/setuptools/_vendor/importlib_resources/simple.py +116 -0
  620. venv/Lib/site-packages/setuptools/_vendor/jaraco/__init__.py +0 -0
  621. venv/Lib/site-packages/setuptools/_vendor/jaraco/context.py +213 -0
  622. venv/Lib/site-packages/setuptools/_vendor/jaraco/functools.py +525 -0
  623. venv/Lib/site-packages/setuptools/_vendor/jaraco/text/__init__.py +599 -0
  624. venv/Lib/site-packages/setuptools/_vendor/more_itertools/__init__.py +4 -0
  625. venv/Lib/site-packages/setuptools/_vendor/more_itertools/more.py +3824 -0
  626. venv/Lib/site-packages/setuptools/_vendor/more_itertools/recipes.py +620 -0
  627. venv/Lib/site-packages/setuptools/_vendor/ordered_set.py +488 -0
  628. venv/Lib/site-packages/setuptools/_vendor/packaging/__about__.py +26 -0
  629. venv/Lib/site-packages/setuptools/_vendor/packaging/__init__.py +25 -0
  630. venv/Lib/site-packages/setuptools/_vendor/packaging/_manylinux.py +301 -0
  631. venv/Lib/site-packages/setuptools/_vendor/packaging/_musllinux.py +136 -0
  632. venv/Lib/site-packages/setuptools/_vendor/packaging/_structures.py +61 -0
  633. venv/Lib/site-packages/setuptools/_vendor/packaging/markers.py +304 -0
  634. venv/Lib/site-packages/setuptools/_vendor/packaging/requirements.py +146 -0
  635. venv/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py +802 -0
  636. venv/Lib/site-packages/setuptools/_vendor/packaging/tags.py +487 -0
  637. venv/Lib/site-packages/setuptools/_vendor/packaging/utils.py +136 -0
  638. venv/Lib/site-packages/setuptools/_vendor/packaging/version.py +504 -0
  639. venv/Lib/site-packages/setuptools/_vendor/pyparsing/__init__.py +331 -0
  640. venv/Lib/site-packages/setuptools/_vendor/pyparsing/actions.py +207 -0
  641. venv/Lib/site-packages/setuptools/_vendor/pyparsing/common.py +424 -0
  642. venv/Lib/site-packages/setuptools/_vendor/pyparsing/core.py +5814 -0
  643. venv/Lib/site-packages/setuptools/_vendor/pyparsing/diagram/__init__.py +642 -0
  644. venv/Lib/site-packages/setuptools/_vendor/pyparsing/exceptions.py +267 -0
  645. venv/Lib/site-packages/setuptools/_vendor/pyparsing/helpers.py +1088 -0
  646. venv/Lib/site-packages/setuptools/_vendor/pyparsing/results.py +760 -0
  647. venv/Lib/site-packages/setuptools/_vendor/pyparsing/testing.py +331 -0
  648. venv/Lib/site-packages/setuptools/_vendor/pyparsing/unicode.py +352 -0
  649. venv/Lib/site-packages/setuptools/_vendor/pyparsing/util.py +235 -0
  650. venv/Lib/site-packages/setuptools/_vendor/tomli/__init__.py +11 -0
  651. venv/Lib/site-packages/setuptools/_vendor/tomli/_parser.py +691 -0
  652. venv/Lib/site-packages/setuptools/_vendor/tomli/_re.py +107 -0
  653. venv/Lib/site-packages/setuptools/_vendor/tomli/_types.py +10 -0
  654. venv/Lib/site-packages/setuptools/_vendor/typing_extensions.py +2296 -0
  655. venv/Lib/site-packages/setuptools/_vendor/zipp.py +329 -0
  656. venv/Lib/site-packages/setuptools/archive_util.py +213 -0
  657. venv/Lib/site-packages/setuptools/build_meta.py +511 -0
  658. venv/Lib/site-packages/setuptools/command/__init__.py +12 -0
  659. venv/Lib/site-packages/setuptools/command/alias.py +78 -0
  660. venv/Lib/site-packages/setuptools/command/bdist_egg.py +457 -0
  661. venv/Lib/site-packages/setuptools/command/bdist_rpm.py +40 -0
  662. venv/Lib/site-packages/setuptools/command/build.py +146 -0
  663. venv/Lib/site-packages/setuptools/command/build_clib.py +101 -0
  664. venv/Lib/site-packages/setuptools/command/build_ext.py +383 -0
  665. venv/Lib/site-packages/setuptools/command/build_py.py +368 -0
  666. venv/Lib/site-packages/setuptools/command/develop.py +193 -0
  667. venv/Lib/site-packages/setuptools/command/dist_info.py +142 -0
  668. venv/Lib/site-packages/setuptools/command/easy_install.py +2312 -0
  669. venv/Lib/site-packages/setuptools/command/editable_wheel.py +844 -0
  670. venv/Lib/site-packages/setuptools/command/egg_info.py +763 -0
  671. venv/Lib/site-packages/setuptools/command/install.py +139 -0
  672. venv/Lib/site-packages/setuptools/command/install_egg_info.py +63 -0
  673. venv/Lib/site-packages/setuptools/command/install_lib.py +122 -0
  674. venv/Lib/site-packages/setuptools/command/install_scripts.py +70 -0
  675. venv/Lib/site-packages/setuptools/command/py36compat.py +134 -0
  676. venv/Lib/site-packages/setuptools/command/register.py +18 -0
  677. venv/Lib/site-packages/setuptools/command/rotate.py +64 -0
  678. venv/Lib/site-packages/setuptools/command/saveopts.py +22 -0
  679. venv/Lib/site-packages/setuptools/command/sdist.py +210 -0
  680. venv/Lib/site-packages/setuptools/command/setopt.py +149 -0
  681. venv/Lib/site-packages/setuptools/command/test.py +251 -0
  682. venv/Lib/site-packages/setuptools/command/upload.py +17 -0
  683. venv/Lib/site-packages/setuptools/command/upload_docs.py +213 -0
  684. venv/Lib/site-packages/setuptools/config/__init__.py +35 -0
  685. venv/Lib/site-packages/setuptools/config/_apply_pyprojecttoml.py +377 -0
  686. venv/Lib/site-packages/setuptools/config/_validate_pyproject/__init__.py +34 -0
  687. venv/Lib/site-packages/setuptools/config/_validate_pyproject/error_reporting.py +318 -0
  688. venv/Lib/site-packages/setuptools/config/_validate_pyproject/extra_validations.py +36 -0
  689. venv/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py +51 -0
  690. venv/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py +1035 -0
  691. venv/Lib/site-packages/setuptools/config/_validate_pyproject/formats.py +259 -0
  692. venv/Lib/site-packages/setuptools/config/expand.py +462 -0
  693. venv/Lib/site-packages/setuptools/config/pyprojecttoml.py +493 -0
  694. venv/Lib/site-packages/setuptools/config/setupcfg.py +762 -0
  695. venv/Lib/site-packages/setuptools/dep_util.py +25 -0
  696. venv/Lib/site-packages/setuptools/depends.py +176 -0
  697. venv/Lib/site-packages/setuptools/discovery.py +600 -0
  698. venv/Lib/site-packages/setuptools/dist.py +1222 -0
  699. venv/Lib/site-packages/setuptools/errors.py +58 -0
  700. venv/Lib/site-packages/setuptools/extension.py +148 -0
  701. venv/Lib/site-packages/setuptools/extern/__init__.py +76 -0
  702. venv/Lib/site-packages/setuptools/glob.py +167 -0
  703. venv/Lib/site-packages/setuptools/installer.py +104 -0
  704. venv/Lib/site-packages/setuptools/launch.py +36 -0
  705. venv/Lib/site-packages/setuptools/logging.py +36 -0
  706. venv/Lib/site-packages/setuptools/monkey.py +165 -0
  707. venv/Lib/site-packages/setuptools/msvc.py +1703 -0
  708. venv/Lib/site-packages/setuptools/namespaces.py +107 -0
  709. venv/Lib/site-packages/setuptools/package_index.py +1126 -0
  710. venv/Lib/site-packages/setuptools/py34compat.py +13 -0
  711. venv/Lib/site-packages/setuptools/sandbox.py +530 -0
  712. venv/Lib/site-packages/setuptools/unicode_utils.py +42 -0
  713. venv/Lib/site-packages/setuptools/version.py +6 -0
  714. venv/Lib/site-packages/setuptools/wheel.py +222 -0
  715. venv/Lib/site-packages/setuptools/windows_support.py +29 -0
  716. xplia/__init__.py +72 -0
  717. xplia/api/__init__.py +432 -0
  718. xplia/api/fastapi_app.py +453 -0
  719. xplia/cli.py +321 -0
  720. xplia/compliance/__init__.py +39 -0
  721. xplia/compliance/ai_act.py +538 -0
  722. xplia/compliance/compliance_checker.py +511 -0
  723. xplia/compliance/compliance_report.py +236 -0
  724. xplia/compliance/expert_review/__init__.py +18 -0
  725. xplia/compliance/expert_review/evaluation_criteria.py +209 -0
  726. xplia/compliance/expert_review/integration.py +270 -0
  727. xplia/compliance/expert_review/trust_expert_evaluator.py +379 -0
  728. xplia/compliance/explanation_rights.py +45 -0
  729. xplia/compliance/formatters/__init__.py +35 -0
  730. xplia/compliance/formatters/csv_formatter.py +179 -0
  731. xplia/compliance/formatters/html_formatter.py +689 -0
  732. xplia/compliance/formatters/html_trust_formatter.py +147 -0
  733. xplia/compliance/formatters/json_formatter.py +107 -0
  734. xplia/compliance/formatters/pdf_formatter.py +641 -0
  735. xplia/compliance/formatters/pdf_trust_formatter.py +309 -0
  736. xplia/compliance/formatters/trust_formatter_mixin.py +267 -0
  737. xplia/compliance/formatters/xml_formatter.py +173 -0
  738. xplia/compliance/gdpr.py +803 -0
  739. xplia/compliance/hipaa.py +134 -0
  740. xplia/compliance/report_base.py +205 -0
  741. xplia/compliance/report_generator.py +820 -0
  742. xplia/compliance/translations.py +299 -0
  743. xplia/core/__init__.py +98 -0
  744. xplia/core/base.py +391 -0
  745. xplia/core/config.py +297 -0
  746. xplia/core/factory.py +416 -0
  747. xplia/core/model_adapters/__init__.py +47 -0
  748. xplia/core/model_adapters/base.py +160 -0
  749. xplia/core/model_adapters/pytorch_adapter.py +339 -0
  750. xplia/core/model_adapters/sklearn_adapter.py +215 -0
  751. xplia/core/model_adapters/tensorflow_adapter.py +280 -0
  752. xplia/core/model_adapters/xgboost_adapter.py +295 -0
  753. xplia/core/optimizations.py +322 -0
  754. xplia/core/performance/__init__.py +57 -0
  755. xplia/core/performance/cache_manager.py +502 -0
  756. xplia/core/performance/memory_optimizer.py +465 -0
  757. xplia/core/performance/parallel_executor.py +327 -0
  758. xplia/core/registry.py +1234 -0
  759. xplia/explainers/__init__.py +70 -0
  760. xplia/explainers/__init__updated.py +62 -0
  761. xplia/explainers/adaptive/__init__.py +24 -0
  762. xplia/explainers/adaptive/explainer_selector.py +405 -0
  763. xplia/explainers/adaptive/explanation_quality.py +395 -0
  764. xplia/explainers/adaptive/fusion_strategies.py +297 -0
  765. xplia/explainers/adaptive/meta_explainer.py +320 -0
  766. xplia/explainers/adversarial/__init__.py +21 -0
  767. xplia/explainers/adversarial/adversarial_xai.py +678 -0
  768. xplia/explainers/anchor_explainer.py +1769 -0
  769. xplia/explainers/attention_explainer.py +996 -0
  770. xplia/explainers/bayesian/__init__.py +8 -0
  771. xplia/explainers/bayesian/bayesian_explainer.py +127 -0
  772. xplia/explainers/bias/__init__.py +17 -0
  773. xplia/explainers/bias/advanced_bias_detection.py +934 -0
  774. xplia/explainers/calibration/__init__.py +26 -0
  775. xplia/explainers/calibration/audience_adapter.py +376 -0
  776. xplia/explainers/calibration/audience_profiles.py +372 -0
  777. xplia/explainers/calibration/calibration_metrics.py +299 -0
  778. xplia/explainers/calibration/explanation_calibrator.py +460 -0
  779. xplia/explainers/causal/__init__.py +19 -0
  780. xplia/explainers/causal/causal_inference.py +669 -0
  781. xplia/explainers/certified/__init__.py +21 -0
  782. xplia/explainers/certified/certified_explanations.py +619 -0
  783. xplia/explainers/continual/__init__.py +8 -0
  784. xplia/explainers/continual/continual_explainer.py +102 -0
  785. xplia/explainers/counterfactual_explainer.py +804 -0
  786. xplia/explainers/counterfactuals/__init__.py +17 -0
  787. xplia/explainers/counterfactuals/advanced_counterfactuals.py +259 -0
  788. xplia/explainers/expert_evaluator.py +538 -0
  789. xplia/explainers/feature_importance_explainer.py +376 -0
  790. xplia/explainers/federated/__init__.py +17 -0
  791. xplia/explainers/federated/federated_xai.py +664 -0
  792. xplia/explainers/generative/__init__.py +15 -0
  793. xplia/explainers/generative/generative_explainer.py +243 -0
  794. xplia/explainers/gradient_explainer.py +3590 -0
  795. xplia/explainers/graph/__init__.py +26 -0
  796. xplia/explainers/graph/gnn_explainer.py +638 -0
  797. xplia/explainers/graph/molecular_explainer.py +438 -0
  798. xplia/explainers/lime_explainer.py +1580 -0
  799. xplia/explainers/llm/__init__.py +23 -0
  800. xplia/explainers/llm/llm_explainability.py +737 -0
  801. xplia/explainers/metalearning/__init__.py +15 -0
  802. xplia/explainers/metalearning/metalearning_explainer.py +276 -0
  803. xplia/explainers/moe/__init__.py +8 -0
  804. xplia/explainers/moe/moe_explainer.py +108 -0
  805. xplia/explainers/multimodal/__init__.py +30 -0
  806. xplia/explainers/multimodal/base.py +262 -0
  807. xplia/explainers/multimodal/diffusion_explainer.py +608 -0
  808. xplia/explainers/multimodal/foundation_model_explainer.py +323 -0
  809. xplia/explainers/multimodal/registry.py +139 -0
  810. xplia/explainers/multimodal/text_image_explainer.py +381 -0
  811. xplia/explainers/multimodal/vision_language_explainer.py +608 -0
  812. xplia/explainers/nas/__init__.py +5 -0
  813. xplia/explainers/nas/nas_explainer.py +65 -0
  814. xplia/explainers/neuralodes/__init__.py +5 -0
  815. xplia/explainers/neuralodes/neuralode_explainer.py +64 -0
  816. xplia/explainers/neurosymbolic/__init__.py +8 -0
  817. xplia/explainers/neurosymbolic/neurosymbolic_explainer.py +97 -0
  818. xplia/explainers/partial_dependence_explainer.py +509 -0
  819. xplia/explainers/privacy/__init__.py +21 -0
  820. xplia/explainers/privacy/differential_privacy_xai.py +624 -0
  821. xplia/explainers/quantum/__init__.py +5 -0
  822. xplia/explainers/quantum/quantum_explainer.py +79 -0
  823. xplia/explainers/recommender/__init__.py +8 -0
  824. xplia/explainers/recommender/recsys_explainer.py +124 -0
  825. xplia/explainers/reinforcement/__init__.py +15 -0
  826. xplia/explainers/reinforcement/rl_explainer.py +173 -0
  827. xplia/explainers/shap_explainer.py +2238 -0
  828. xplia/explainers/streaming/__init__.py +19 -0
  829. xplia/explainers/streaming/streaming_xai.py +703 -0
  830. xplia/explainers/timeseries/__init__.py +15 -0
  831. xplia/explainers/timeseries/timeseries_explainer.py +252 -0
  832. xplia/explainers/trust/__init__.py +24 -0
  833. xplia/explainers/trust/confidence_report.py +368 -0
  834. xplia/explainers/trust/fairwashing.py +489 -0
  835. xplia/explainers/trust/uncertainty.py +453 -0
  836. xplia/explainers/unified_explainer.py +566 -0
  837. xplia/explainers/unified_explainer_utils.py +309 -0
  838. xplia/integrations/__init__.py +3 -0
  839. xplia/integrations/mlflow_integration.py +331 -0
  840. xplia/integrations/wandb_integration.py +375 -0
  841. xplia/plugins/__init__.py +36 -0
  842. xplia/plugins/example_visualizer.py +11 -0
  843. xplia/utils/__init__.py +18 -0
  844. xplia/utils/performance.py +119 -0
  845. xplia/utils/validation.py +109 -0
  846. xplia/visualizations/__init__.py +31 -0
  847. xplia/visualizations/base.py +256 -0
  848. xplia/visualizations/boxplot_chart.py +224 -0
  849. xplia/visualizations/charts_impl.py +65 -0
  850. xplia/visualizations/gauge_chart.py +211 -0
  851. xplia/visualizations/gradient_viz.py +117 -0
  852. xplia/visualizations/heatmap_chart.py +173 -0
  853. xplia/visualizations/histogram_chart.py +176 -0
  854. xplia/visualizations/line_chart.py +100 -0
  855. xplia/visualizations/pie_chart.py +134 -0
  856. xplia/visualizations/radar_chart.py +154 -0
  857. xplia/visualizations/registry.py +76 -0
  858. xplia/visualizations/sankey_chart.py +190 -0
  859. xplia/visualizations/scatter_chart.py +252 -0
  860. xplia/visualizations/table_chart.py +263 -0
  861. xplia/visualizations/treemap_chart.py +216 -0
  862. xplia/visualizations.py +535 -0
  863. xplia/visualizers/__init__.py +87 -0
  864. xplia/visualizers/base_visualizer.py +294 -0
  865. xplia-1.0.1.dist-info/METADATA +685 -0
  866. xplia-1.0.1.dist-info/RECORD +870 -0
  867. xplia-1.0.1.dist-info/WHEEL +5 -0
  868. xplia-1.0.1.dist-info/entry_points.txt +2 -0
  869. xplia-1.0.1.dist-info/licenses/LICENSE +21 -0
  870. 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()