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
@@ -0,0 +1,1307 @@
1
+ import re
2
+ from functools import partial, reduce
3
+ from math import gcd
4
+ from operator import itemgetter
5
+ from typing import (
6
+ TYPE_CHECKING,
7
+ Any,
8
+ Callable,
9
+ Dict,
10
+ Iterable,
11
+ List,
12
+ NamedTuple,
13
+ Optional,
14
+ Tuple,
15
+ Union,
16
+ )
17
+
18
+ from ._loop import loop_last
19
+ from ._pick import pick_bool
20
+ from ._wrap import divide_line
21
+ from .align import AlignMethod
22
+ from .cells import cell_len, set_cell_size
23
+ from .containers import Lines
24
+ from .control import strip_control_codes
25
+ from .emoji import EmojiVariant
26
+ from .jupyter import JupyterMixin
27
+ from .measure import Measurement
28
+ from .segment import Segment
29
+ from .style import Style, StyleType
30
+
31
+ if TYPE_CHECKING: # pragma: no cover
32
+ from .console import Console, ConsoleOptions, JustifyMethod, OverflowMethod
33
+
34
+ DEFAULT_JUSTIFY: "JustifyMethod" = "default"
35
+ DEFAULT_OVERFLOW: "OverflowMethod" = "fold"
36
+
37
+
38
+ _re_whitespace = re.compile(r"\s+$")
39
+
40
+ TextType = Union[str, "Text"]
41
+
42
+ GetStyleCallable = Callable[[str], Optional[StyleType]]
43
+
44
+
45
+ class Span(NamedTuple):
46
+ """A marked up region in some text."""
47
+
48
+ start: int
49
+ """Span start index."""
50
+ end: int
51
+ """Span end index."""
52
+ style: Union[str, Style]
53
+ """Style associated with the span."""
54
+
55
+ def __repr__(self) -> str:
56
+ return f"Span({self.start}, {self.end}, {self.style!r})"
57
+
58
+ def __bool__(self) -> bool:
59
+ return self.end > self.start
60
+
61
+ def split(self, offset: int) -> Tuple["Span", Optional["Span"]]:
62
+ """Split a span in to 2 from a given offset."""
63
+
64
+ if offset < self.start:
65
+ return self, None
66
+ if offset >= self.end:
67
+ return self, None
68
+
69
+ start, end, style = self
70
+ span1 = Span(start, min(end, offset), style)
71
+ span2 = Span(span1.end, end, style)
72
+ return span1, span2
73
+
74
+ def move(self, offset: int) -> "Span":
75
+ """Move start and end by a given offset.
76
+
77
+ Args:
78
+ offset (int): Number of characters to add to start and end.
79
+
80
+ Returns:
81
+ TextSpan: A new TextSpan with adjusted position.
82
+ """
83
+ start, end, style = self
84
+ return Span(start + offset, end + offset, style)
85
+
86
+ def right_crop(self, offset: int) -> "Span":
87
+ """Crop the span at the given offset.
88
+
89
+ Args:
90
+ offset (int): A value between start and end.
91
+
92
+ Returns:
93
+ Span: A new (possibly smaller) span.
94
+ """
95
+ start, end, style = self
96
+ if offset >= end:
97
+ return self
98
+ return Span(start, min(offset, end), style)
99
+
100
+
101
+ class Text(JupyterMixin):
102
+ """Text with color / style.
103
+
104
+ Args:
105
+ text (str, optional): Default unstyled text. Defaults to "".
106
+ style (Union[str, Style], optional): Base style for text. Defaults to "".
107
+ justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None.
108
+ overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None.
109
+ no_wrap (bool, optional): Disable text wrapping, or None for default. Defaults to None.
110
+ end (str, optional): Character to end text with. Defaults to "\\\\n".
111
+ tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to 8.
112
+ spans (List[Span], optional). A list of predefined style spans. Defaults to None.
113
+ """
114
+
115
+ __slots__ = [
116
+ "_text",
117
+ "style",
118
+ "justify",
119
+ "overflow",
120
+ "no_wrap",
121
+ "end",
122
+ "tab_size",
123
+ "_spans",
124
+ "_length",
125
+ ]
126
+
127
+ def __init__(
128
+ self,
129
+ text: str = "",
130
+ style: Union[str, Style] = "",
131
+ *,
132
+ justify: Optional["JustifyMethod"] = None,
133
+ overflow: Optional["OverflowMethod"] = None,
134
+ no_wrap: Optional[bool] = None,
135
+ end: str = "\n",
136
+ tab_size: Optional[int] = 8,
137
+ spans: Optional[List[Span]] = None,
138
+ ) -> None:
139
+ sanitized_text = strip_control_codes(text)
140
+ self._text = [sanitized_text]
141
+ self.style = style
142
+ self.justify: Optional["JustifyMethod"] = justify
143
+ self.overflow: Optional["OverflowMethod"] = overflow
144
+ self.no_wrap = no_wrap
145
+ self.end = end
146
+ self.tab_size = tab_size
147
+ self._spans: List[Span] = spans or []
148
+ self._length: int = len(sanitized_text)
149
+
150
+ def __len__(self) -> int:
151
+ return self._length
152
+
153
+ def __bool__(self) -> bool:
154
+ return bool(self._length)
155
+
156
+ def __str__(self) -> str:
157
+ return self.plain
158
+
159
+ def __repr__(self) -> str:
160
+ return f"<text {self.plain!r} {self._spans!r}>"
161
+
162
+ def __add__(self, other: Any) -> "Text":
163
+ if isinstance(other, (str, Text)):
164
+ result = self.copy()
165
+ result.append(other)
166
+ return result
167
+ return NotImplemented
168
+
169
+ def __eq__(self, other: object) -> bool:
170
+ if not isinstance(other, Text):
171
+ return NotImplemented
172
+ return self.plain == other.plain and self._spans == other._spans
173
+
174
+ def __contains__(self, other: object) -> bool:
175
+ if isinstance(other, str):
176
+ return other in self.plain
177
+ elif isinstance(other, Text):
178
+ return other.plain in self.plain
179
+ return False
180
+
181
+ def __getitem__(self, slice: Union[int, slice]) -> "Text":
182
+ def get_text_at(offset: int) -> "Text":
183
+ _Span = Span
184
+ text = Text(
185
+ self.plain[offset],
186
+ spans=[
187
+ _Span(0, 1, style)
188
+ for start, end, style in self._spans
189
+ if end > offset >= start
190
+ ],
191
+ end="",
192
+ )
193
+ return text
194
+
195
+ if isinstance(slice, int):
196
+ return get_text_at(slice)
197
+ else:
198
+ start, stop, step = slice.indices(len(self.plain))
199
+ if step == 1:
200
+ lines = self.divide([start, stop])
201
+ return lines[1]
202
+ else:
203
+ # This would be a bit of work to implement efficiently
204
+ # For now, its not required
205
+ raise TypeError("slices with step!=1 are not supported")
206
+
207
+ @property
208
+ def cell_len(self) -> int:
209
+ """Get the number of cells required to render this text."""
210
+ return cell_len(self.plain)
211
+
212
+ @property
213
+ def markup(self) -> str:
214
+ """Get console markup to render this Text.
215
+
216
+ Returns:
217
+ str: A string potentially creating markup tags.
218
+ """
219
+ from .markup import escape
220
+
221
+ output: List[str] = []
222
+
223
+ plain = self.plain
224
+ markup_spans = [
225
+ (0, False, self.style),
226
+ *((span.start, False, span.style) for span in self._spans),
227
+ *((span.end, True, span.style) for span in self._spans),
228
+ (len(plain), True, self.style),
229
+ ]
230
+ markup_spans.sort(key=itemgetter(0, 1))
231
+ position = 0
232
+ append = output.append
233
+ for offset, closing, style in markup_spans:
234
+ if offset > position:
235
+ append(escape(plain[position:offset]))
236
+ position = offset
237
+ if style:
238
+ append(f"[/{style}]" if closing else f"[{style}]")
239
+ markup = "".join(output)
240
+ return markup
241
+
242
+ @classmethod
243
+ def from_markup(
244
+ cls,
245
+ text: str,
246
+ *,
247
+ style: Union[str, Style] = "",
248
+ emoji: bool = True,
249
+ emoji_variant: Optional[EmojiVariant] = None,
250
+ justify: Optional["JustifyMethod"] = None,
251
+ overflow: Optional["OverflowMethod"] = None,
252
+ end: str = "\n",
253
+ ) -> "Text":
254
+ """Create Text instance from markup.
255
+
256
+ Args:
257
+ text (str): A string containing console markup.
258
+ emoji (bool, optional): Also render emoji code. Defaults to True.
259
+ justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None.
260
+ overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None.
261
+ end (str, optional): Character to end text with. Defaults to "\\\\n".
262
+
263
+ Returns:
264
+ Text: A Text instance with markup rendered.
265
+ """
266
+ from .markup import render
267
+
268
+ rendered_text = render(text, style, emoji=emoji, emoji_variant=emoji_variant)
269
+ rendered_text.justify = justify
270
+ rendered_text.overflow = overflow
271
+ rendered_text.end = end
272
+ return rendered_text
273
+
274
+ @classmethod
275
+ def from_ansi(
276
+ cls,
277
+ text: str,
278
+ *,
279
+ style: Union[str, Style] = "",
280
+ justify: Optional["JustifyMethod"] = None,
281
+ overflow: Optional["OverflowMethod"] = None,
282
+ no_wrap: Optional[bool] = None,
283
+ end: str = "\n",
284
+ tab_size: Optional[int] = 8,
285
+ ) -> "Text":
286
+ """Create a Text object from a string containing ANSI escape codes.
287
+
288
+ Args:
289
+ text (str): A string containing escape codes.
290
+ style (Union[str, Style], optional): Base style for text. Defaults to "".
291
+ justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None.
292
+ overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None.
293
+ no_wrap (bool, optional): Disable text wrapping, or None for default. Defaults to None.
294
+ end (str, optional): Character to end text with. Defaults to "\\\\n".
295
+ tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to 8.
296
+ """
297
+ from .ansi import AnsiDecoder
298
+
299
+ joiner = Text(
300
+ "\n",
301
+ justify=justify,
302
+ overflow=overflow,
303
+ no_wrap=no_wrap,
304
+ end=end,
305
+ tab_size=tab_size,
306
+ style=style,
307
+ )
308
+ decoder = AnsiDecoder()
309
+ result = joiner.join(line for line in decoder.decode(text))
310
+ return result
311
+
312
+ @classmethod
313
+ def styled(
314
+ cls,
315
+ text: str,
316
+ style: StyleType = "",
317
+ *,
318
+ justify: Optional["JustifyMethod"] = None,
319
+ overflow: Optional["OverflowMethod"] = None,
320
+ ) -> "Text":
321
+ """Construct a Text instance with a pre-applied styled. A style applied in this way won't be used
322
+ to pad the text when it is justified.
323
+
324
+ Args:
325
+ text (str): A string containing console markup.
326
+ style (Union[str, Style]): Style to apply to the text. Defaults to "".
327
+ justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None.
328
+ overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None.
329
+
330
+ Returns:
331
+ Text: A text instance with a style applied to the entire string.
332
+ """
333
+ styled_text = cls(text, justify=justify, overflow=overflow)
334
+ styled_text.stylize(style)
335
+ return styled_text
336
+
337
+ @classmethod
338
+ def assemble(
339
+ cls,
340
+ *parts: Union[str, "Text", Tuple[str, StyleType]],
341
+ style: Union[str, Style] = "",
342
+ justify: Optional["JustifyMethod"] = None,
343
+ overflow: Optional["OverflowMethod"] = None,
344
+ no_wrap: Optional[bool] = None,
345
+ end: str = "\n",
346
+ tab_size: int = 8,
347
+ meta: Optional[Dict[str, Any]] = None,
348
+ ) -> "Text":
349
+ """Construct a text instance by combining a sequence of strings with optional styles.
350
+ The positional arguments should be either strings, or a tuple of string + style.
351
+
352
+ Args:
353
+ style (Union[str, Style], optional): Base style for text. Defaults to "".
354
+ justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None.
355
+ overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None.
356
+ end (str, optional): Character to end text with. Defaults to "\\\\n".
357
+ tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to 8.
358
+ meta (Dict[str, Any], optional). Meta data to apply to text, or None for no meta data. Default to None
359
+
360
+ Returns:
361
+ Text: A new text instance.
362
+ """
363
+ text = cls(
364
+ style=style,
365
+ justify=justify,
366
+ overflow=overflow,
367
+ no_wrap=no_wrap,
368
+ end=end,
369
+ tab_size=tab_size,
370
+ )
371
+ append = text.append
372
+ _Text = Text
373
+ for part in parts:
374
+ if isinstance(part, (_Text, str)):
375
+ append(part)
376
+ else:
377
+ append(*part)
378
+ if meta:
379
+ text.apply_meta(meta)
380
+ return text
381
+
382
+ @property
383
+ def plain(self) -> str:
384
+ """Get the text as a single string."""
385
+ if len(self._text) != 1:
386
+ self._text[:] = ["".join(self._text)]
387
+ return self._text[0]
388
+
389
+ @plain.setter
390
+ def plain(self, new_text: str) -> None:
391
+ """Set the text to a new value."""
392
+ if new_text != self.plain:
393
+ sanitized_text = strip_control_codes(new_text)
394
+ self._text[:] = [sanitized_text]
395
+ old_length = self._length
396
+ self._length = len(sanitized_text)
397
+ if old_length > self._length:
398
+ self._trim_spans()
399
+
400
+ @property
401
+ def spans(self) -> List[Span]:
402
+ """Get a reference to the internal list of spans."""
403
+ return self._spans
404
+
405
+ @spans.setter
406
+ def spans(self, spans: List[Span]) -> None:
407
+ """Set spans."""
408
+ self._spans = spans[:]
409
+
410
+ def blank_copy(self, plain: str = "") -> "Text":
411
+ """Return a new Text instance with copied meta data (but not the string or spans)."""
412
+ copy_self = Text(
413
+ plain,
414
+ style=self.style,
415
+ justify=self.justify,
416
+ overflow=self.overflow,
417
+ no_wrap=self.no_wrap,
418
+ end=self.end,
419
+ tab_size=self.tab_size,
420
+ )
421
+ return copy_self
422
+
423
+ def copy(self) -> "Text":
424
+ """Return a copy of this instance."""
425
+ copy_self = Text(
426
+ self.plain,
427
+ style=self.style,
428
+ justify=self.justify,
429
+ overflow=self.overflow,
430
+ no_wrap=self.no_wrap,
431
+ end=self.end,
432
+ tab_size=self.tab_size,
433
+ )
434
+ copy_self._spans[:] = self._spans
435
+ return copy_self
436
+
437
+ def stylize(
438
+ self,
439
+ style: Union[str, Style],
440
+ start: int = 0,
441
+ end: Optional[int] = None,
442
+ ) -> None:
443
+ """Apply a style to the text, or a portion of the text.
444
+
445
+ Args:
446
+ style (Union[str, Style]): Style instance or style definition to apply.
447
+ start (int): Start offset (negative indexing is supported). Defaults to 0.
448
+ end (Optional[int], optional): End offset (negative indexing is supported), or None for end of text. Defaults to None.
449
+ """
450
+ if style:
451
+ length = len(self)
452
+ if start < 0:
453
+ start = length + start
454
+ if end is None:
455
+ end = length
456
+ if end < 0:
457
+ end = length + end
458
+ if start >= length or end <= start:
459
+ # Span not in text or not valid
460
+ return
461
+ self._spans.append(Span(start, min(length, end), style))
462
+
463
+ def stylize_before(
464
+ self,
465
+ style: Union[str, Style],
466
+ start: int = 0,
467
+ end: Optional[int] = None,
468
+ ) -> None:
469
+ """Apply a style to the text, or a portion of the text. Styles will be applied before other styles already present.
470
+
471
+ Args:
472
+ style (Union[str, Style]): Style instance or style definition to apply.
473
+ start (int): Start offset (negative indexing is supported). Defaults to 0.
474
+ end (Optional[int], optional): End offset (negative indexing is supported), or None for end of text. Defaults to None.
475
+ """
476
+ if style:
477
+ length = len(self)
478
+ if start < 0:
479
+ start = length + start
480
+ if end is None:
481
+ end = length
482
+ if end < 0:
483
+ end = length + end
484
+ if start >= length or end <= start:
485
+ # Span not in text or not valid
486
+ return
487
+ self._spans.insert(0, Span(start, min(length, end), style))
488
+
489
+ def apply_meta(
490
+ self, meta: Dict[str, Any], start: int = 0, end: Optional[int] = None
491
+ ) -> None:
492
+ """Apply meta data to the text, or a portion of the text.
493
+
494
+ Args:
495
+ meta (Dict[str, Any]): A dict of meta information.
496
+ start (int): Start offset (negative indexing is supported). Defaults to 0.
497
+ end (Optional[int], optional): End offset (negative indexing is supported), or None for end of text. Defaults to None.
498
+
499
+ """
500
+ style = Style.from_meta(meta)
501
+ self.stylize(style, start=start, end=end)
502
+
503
+ def on(self, meta: Optional[Dict[str, Any]] = None, **handlers: Any) -> "Text":
504
+ """Apply event handlers (used by Textual project).
505
+
506
+ Example:
507
+ >>> from rich.text import Text
508
+ >>> text = Text("hello world")
509
+ >>> text.on(click="view.toggle('world')")
510
+
511
+ Args:
512
+ meta (Dict[str, Any]): Mapping of meta information.
513
+ **handlers: Keyword args are prefixed with "@" to defined handlers.
514
+
515
+ Returns:
516
+ Text: Self is returned to method may be chained.
517
+ """
518
+ meta = {} if meta is None else meta
519
+ meta.update({f"@{key}": value for key, value in handlers.items()})
520
+ self.stylize(Style.from_meta(meta))
521
+ return self
522
+
523
+ def remove_suffix(self, suffix: str) -> None:
524
+ """Remove a suffix if it exists.
525
+
526
+ Args:
527
+ suffix (str): Suffix to remove.
528
+ """
529
+ if self.plain.endswith(suffix):
530
+ self.right_crop(len(suffix))
531
+
532
+ def get_style_at_offset(self, console: "Console", offset: int) -> Style:
533
+ """Get the style of a character at give offset.
534
+
535
+ Args:
536
+ console (~Console): Console where text will be rendered.
537
+ offset (int): Offset in to text (negative indexing supported)
538
+
539
+ Returns:
540
+ Style: A Style instance.
541
+ """
542
+ # TODO: This is a little inefficient, it is only used by full justify
543
+ if offset < 0:
544
+ offset = len(self) + offset
545
+ get_style = console.get_style
546
+ style = get_style(self.style).copy()
547
+ for start, end, span_style in self._spans:
548
+ if end > offset >= start:
549
+ style += get_style(span_style, default="")
550
+ return style
551
+
552
+ def highlight_regex(
553
+ self,
554
+ re_highlight: str,
555
+ style: Optional[Union[GetStyleCallable, StyleType]] = None,
556
+ *,
557
+ style_prefix: str = "",
558
+ ) -> int:
559
+ """Highlight text with a regular expression, where group names are
560
+ translated to styles.
561
+
562
+ Args:
563
+ re_highlight (str): A regular expression.
564
+ style (Union[GetStyleCallable, StyleType]): Optional style to apply to whole match, or a callable
565
+ which accepts the matched text and returns a style. Defaults to None.
566
+ style_prefix (str, optional): Optional prefix to add to style group names.
567
+
568
+ Returns:
569
+ int: Number of regex matches
570
+ """
571
+ count = 0
572
+ append_span = self._spans.append
573
+ _Span = Span
574
+ plain = self.plain
575
+ for match in re.finditer(re_highlight, plain):
576
+ get_span = match.span
577
+ if style:
578
+ start, end = get_span()
579
+ match_style = style(plain[start:end]) if callable(style) else style
580
+ if match_style is not None and end > start:
581
+ append_span(_Span(start, end, match_style))
582
+
583
+ count += 1
584
+ for name in match.groupdict().keys():
585
+ start, end = get_span(name)
586
+ if start != -1 and end > start:
587
+ append_span(_Span(start, end, f"{style_prefix}{name}"))
588
+ return count
589
+
590
+ def highlight_words(
591
+ self,
592
+ words: Iterable[str],
593
+ style: Union[str, Style],
594
+ *,
595
+ case_sensitive: bool = True,
596
+ ) -> int:
597
+ """Highlight words with a style.
598
+
599
+ Args:
600
+ words (Iterable[str]): Worlds to highlight.
601
+ style (Union[str, Style]): Style to apply.
602
+ case_sensitive (bool, optional): Enable case sensitive matchings. Defaults to True.
603
+
604
+ Returns:
605
+ int: Number of words highlighted.
606
+ """
607
+ re_words = "|".join(re.escape(word) for word in words)
608
+ add_span = self._spans.append
609
+ count = 0
610
+ _Span = Span
611
+ for match in re.finditer(
612
+ re_words, self.plain, flags=0 if case_sensitive else re.IGNORECASE
613
+ ):
614
+ start, end = match.span(0)
615
+ add_span(_Span(start, end, style))
616
+ count += 1
617
+ return count
618
+
619
+ def rstrip(self) -> None:
620
+ """Strip whitespace from end of text."""
621
+ self.plain = self.plain.rstrip()
622
+
623
+ def rstrip_end(self, size: int) -> None:
624
+ """Remove whitespace beyond a certain width at the end of the text.
625
+
626
+ Args:
627
+ size (int): The desired size of the text.
628
+ """
629
+ text_length = len(self)
630
+ if text_length > size:
631
+ excess = text_length - size
632
+ whitespace_match = _re_whitespace.search(self.plain)
633
+ if whitespace_match is not None:
634
+ whitespace_count = len(whitespace_match.group(0))
635
+ self.right_crop(min(whitespace_count, excess))
636
+
637
+ def set_length(self, new_length: int) -> None:
638
+ """Set new length of the text, clipping or padding is required."""
639
+ length = len(self)
640
+ if length != new_length:
641
+ if length < new_length:
642
+ self.pad_right(new_length - length)
643
+ else:
644
+ self.right_crop(length - new_length)
645
+
646
+ def __rich_console__(
647
+ self, console: "Console", options: "ConsoleOptions"
648
+ ) -> Iterable[Segment]:
649
+ tab_size: int = console.tab_size or self.tab_size or 8
650
+ justify = self.justify or options.justify or DEFAULT_JUSTIFY
651
+
652
+ overflow = self.overflow or options.overflow or DEFAULT_OVERFLOW
653
+
654
+ lines = self.wrap(
655
+ console,
656
+ options.max_width,
657
+ justify=justify,
658
+ overflow=overflow,
659
+ tab_size=tab_size or 8,
660
+ no_wrap=pick_bool(self.no_wrap, options.no_wrap, False),
661
+ )
662
+ all_lines = Text("\n").join(lines)
663
+ yield from all_lines.render(console, end=self.end)
664
+
665
+ def __rich_measure__(
666
+ self, console: "Console", options: "ConsoleOptions"
667
+ ) -> Measurement:
668
+ text = self.plain
669
+ lines = text.splitlines()
670
+ max_text_width = max(cell_len(line) for line in lines) if lines else 0
671
+ words = text.split()
672
+ min_text_width = (
673
+ max(cell_len(word) for word in words) if words else max_text_width
674
+ )
675
+ return Measurement(min_text_width, max_text_width)
676
+
677
+ def render(self, console: "Console", end: str = "") -> Iterable["Segment"]:
678
+ """Render the text as Segments.
679
+
680
+ Args:
681
+ console (Console): Console instance.
682
+ end (Optional[str], optional): Optional end character.
683
+
684
+ Returns:
685
+ Iterable[Segment]: Result of render that may be written to the console.
686
+ """
687
+ _Segment = Segment
688
+ text = self.plain
689
+ if not self._spans:
690
+ yield Segment(text)
691
+ if end:
692
+ yield _Segment(end)
693
+ return
694
+ get_style = partial(console.get_style, default=Style.null())
695
+
696
+ enumerated_spans = list(enumerate(self._spans, 1))
697
+ style_map = {index: get_style(span.style) for index, span in enumerated_spans}
698
+ style_map[0] = get_style(self.style)
699
+
700
+ spans = [
701
+ (0, False, 0),
702
+ *((span.start, False, index) for index, span in enumerated_spans),
703
+ *((span.end, True, index) for index, span in enumerated_spans),
704
+ (len(text), True, 0),
705
+ ]
706
+ spans.sort(key=itemgetter(0, 1))
707
+
708
+ stack: List[int] = []
709
+ stack_append = stack.append
710
+ stack_pop = stack.remove
711
+
712
+ style_cache: Dict[Tuple[Style, ...], Style] = {}
713
+ style_cache_get = style_cache.get
714
+ combine = Style.combine
715
+
716
+ def get_current_style() -> Style:
717
+ """Construct current style from stack."""
718
+ styles = tuple(style_map[_style_id] for _style_id in sorted(stack))
719
+ cached_style = style_cache_get(styles)
720
+ if cached_style is not None:
721
+ return cached_style
722
+ current_style = combine(styles)
723
+ style_cache[styles] = current_style
724
+ return current_style
725
+
726
+ for (offset, leaving, style_id), (next_offset, _, _) in zip(spans, spans[1:]):
727
+ if leaving:
728
+ stack_pop(style_id)
729
+ else:
730
+ stack_append(style_id)
731
+ if next_offset > offset:
732
+ yield _Segment(text[offset:next_offset], get_current_style())
733
+ if end:
734
+ yield _Segment(end)
735
+
736
+ def join(self, lines: Iterable["Text"]) -> "Text":
737
+ """Join text together with this instance as the separator.
738
+
739
+ Args:
740
+ lines (Iterable[Text]): An iterable of Text instances to join.
741
+
742
+ Returns:
743
+ Text: A new text instance containing join text.
744
+ """
745
+
746
+ new_text = self.blank_copy()
747
+
748
+ def iter_text() -> Iterable["Text"]:
749
+ if self.plain:
750
+ for last, line in loop_last(lines):
751
+ yield line
752
+ if not last:
753
+ yield self
754
+ else:
755
+ yield from lines
756
+
757
+ extend_text = new_text._text.extend
758
+ append_span = new_text._spans.append
759
+ extend_spans = new_text._spans.extend
760
+ offset = 0
761
+ _Span = Span
762
+
763
+ for text in iter_text():
764
+ extend_text(text._text)
765
+ if text.style:
766
+ append_span(_Span(offset, offset + len(text), text.style))
767
+ extend_spans(
768
+ _Span(offset + start, offset + end, style)
769
+ for start, end, style in text._spans
770
+ )
771
+ offset += len(text)
772
+ new_text._length = offset
773
+ return new_text
774
+
775
+ def expand_tabs(self, tab_size: Optional[int] = None) -> None:
776
+ """Converts tabs to spaces.
777
+
778
+ Args:
779
+ tab_size (int, optional): Size of tabs. Defaults to 8.
780
+
781
+ """
782
+ if "\t" not in self.plain:
783
+ return
784
+ pos = 0
785
+ if tab_size is None:
786
+ tab_size = self.tab_size
787
+ assert tab_size is not None
788
+ result = self.blank_copy()
789
+ append = result.append
790
+
791
+ _style = self.style
792
+ for line in self.split("\n", include_separator=True):
793
+ parts = line.split("\t", include_separator=True)
794
+ for part in parts:
795
+ if part.plain.endswith("\t"):
796
+ part._text = [part.plain[:-1] + " "]
797
+ append(part)
798
+ pos += len(part)
799
+ spaces = tab_size - ((pos - 1) % tab_size) - 1
800
+ if spaces:
801
+ append(" " * spaces, _style)
802
+ pos += spaces
803
+ else:
804
+ append(part)
805
+ self._text = [result.plain]
806
+ self._length = len(self.plain)
807
+ self._spans[:] = result._spans
808
+
809
+ def truncate(
810
+ self,
811
+ max_width: int,
812
+ *,
813
+ overflow: Optional["OverflowMethod"] = None,
814
+ pad: bool = False,
815
+ ) -> None:
816
+ """Truncate text if it is longer that a given width.
817
+
818
+ Args:
819
+ max_width (int): Maximum number of characters in text.
820
+ overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to None, to use self.overflow.
821
+ pad (bool, optional): Pad with spaces if the length is less than max_width. Defaults to False.
822
+ """
823
+ _overflow = overflow or self.overflow or DEFAULT_OVERFLOW
824
+ if _overflow != "ignore":
825
+ length = cell_len(self.plain)
826
+ if length > max_width:
827
+ if _overflow == "ellipsis":
828
+ self.plain = set_cell_size(self.plain, max_width - 1) + "…"
829
+ else:
830
+ self.plain = set_cell_size(self.plain, max_width)
831
+ if pad and length < max_width:
832
+ spaces = max_width - length
833
+ self._text = [f"{self.plain}{' ' * spaces}"]
834
+ self._length = len(self.plain)
835
+
836
+ def _trim_spans(self) -> None:
837
+ """Remove or modify any spans that are over the end of the text."""
838
+ max_offset = len(self.plain)
839
+ _Span = Span
840
+ self._spans[:] = [
841
+ (
842
+ span
843
+ if span.end < max_offset
844
+ else _Span(span.start, min(max_offset, span.end), span.style)
845
+ )
846
+ for span in self._spans
847
+ if span.start < max_offset
848
+ ]
849
+
850
+ def pad(self, count: int, character: str = " ") -> None:
851
+ """Pad left and right with a given number of characters.
852
+
853
+ Args:
854
+ count (int): Width of padding.
855
+ """
856
+ assert len(character) == 1, "Character must be a string of length 1"
857
+ if count:
858
+ pad_characters = character * count
859
+ self.plain = f"{pad_characters}{self.plain}{pad_characters}"
860
+ _Span = Span
861
+ self._spans[:] = [
862
+ _Span(start + count, end + count, style)
863
+ for start, end, style in self._spans
864
+ ]
865
+
866
+ def pad_left(self, count: int, character: str = " ") -> None:
867
+ """Pad the left with a given character.
868
+
869
+ Args:
870
+ count (int): Number of characters to pad.
871
+ character (str, optional): Character to pad with. Defaults to " ".
872
+ """
873
+ assert len(character) == 1, "Character must be a string of length 1"
874
+ if count:
875
+ self.plain = f"{character * count}{self.plain}"
876
+ _Span = Span
877
+ self._spans[:] = [
878
+ _Span(start + count, end + count, style)
879
+ for start, end, style in self._spans
880
+ ]
881
+
882
+ def pad_right(self, count: int, character: str = " ") -> None:
883
+ """Pad the right with a given character.
884
+
885
+ Args:
886
+ count (int): Number of characters to pad.
887
+ character (str, optional): Character to pad with. Defaults to " ".
888
+ """
889
+ assert len(character) == 1, "Character must be a string of length 1"
890
+ if count:
891
+ self.plain = f"{self.plain}{character * count}"
892
+
893
+ def align(self, align: AlignMethod, width: int, character: str = " ") -> None:
894
+ """Align text to a given width.
895
+
896
+ Args:
897
+ align (AlignMethod): One of "left", "center", or "right".
898
+ width (int): Desired width.
899
+ character (str, optional): Character to pad with. Defaults to " ".
900
+ """
901
+ self.truncate(width)
902
+ excess_space = width - cell_len(self.plain)
903
+ if excess_space:
904
+ if align == "left":
905
+ self.pad_right(excess_space, character)
906
+ elif align == "center":
907
+ left = excess_space // 2
908
+ self.pad_left(left, character)
909
+ self.pad_right(excess_space - left, character)
910
+ else:
911
+ self.pad_left(excess_space, character)
912
+
913
+ def append(
914
+ self, text: Union["Text", str], style: Optional[Union[str, "Style"]] = None
915
+ ) -> "Text":
916
+ """Add text with an optional style.
917
+
918
+ Args:
919
+ text (Union[Text, str]): A str or Text to append.
920
+ style (str, optional): A style name. Defaults to None.
921
+
922
+ Returns:
923
+ Text: Returns self for chaining.
924
+ """
925
+
926
+ if not isinstance(text, (str, Text)):
927
+ raise TypeError("Only str or Text can be appended to Text")
928
+
929
+ if len(text):
930
+ if isinstance(text, str):
931
+ sanitized_text = strip_control_codes(text)
932
+ self._text.append(sanitized_text)
933
+ offset = len(self)
934
+ text_length = len(sanitized_text)
935
+ if style is not None:
936
+ self._spans.append(Span(offset, offset + text_length, style))
937
+ self._length += text_length
938
+ elif isinstance(text, Text):
939
+ _Span = Span
940
+ if style is not None:
941
+ raise ValueError(
942
+ "style must not be set when appending Text instance"
943
+ )
944
+ text_length = self._length
945
+ if text.style is not None:
946
+ self._spans.append(
947
+ _Span(text_length, text_length + len(text), text.style)
948
+ )
949
+ self._text.append(text.plain)
950
+ self._spans.extend(
951
+ _Span(start + text_length, end + text_length, style)
952
+ for start, end, style in text._spans
953
+ )
954
+ self._length += len(text)
955
+ return self
956
+
957
+ def append_text(self, text: "Text") -> "Text":
958
+ """Append another Text instance. This method is more performant that Text.append, but
959
+ only works for Text.
960
+
961
+ Returns:
962
+ Text: Returns self for chaining.
963
+ """
964
+ _Span = Span
965
+ text_length = self._length
966
+ if text.style is not None:
967
+ self._spans.append(_Span(text_length, text_length + len(text), text.style))
968
+ self._text.append(text.plain)
969
+ self._spans.extend(
970
+ _Span(start + text_length, end + text_length, style)
971
+ for start, end, style in text._spans
972
+ )
973
+ self._length += len(text)
974
+ return self
975
+
976
+ def append_tokens(
977
+ self, tokens: Iterable[Tuple[str, Optional[StyleType]]]
978
+ ) -> "Text":
979
+ """Append iterable of str and style. Style may be a Style instance or a str style definition.
980
+
981
+ Args:
982
+ pairs (Iterable[Tuple[str, Optional[StyleType]]]): An iterable of tuples containing str content and style.
983
+
984
+ Returns:
985
+ Text: Returns self for chaining.
986
+ """
987
+ append_text = self._text.append
988
+ append_span = self._spans.append
989
+ _Span = Span
990
+ offset = len(self)
991
+ for content, style in tokens:
992
+ append_text(content)
993
+ if style is not None:
994
+ append_span(_Span(offset, offset + len(content), style))
995
+ offset += len(content)
996
+ self._length = offset
997
+ return self
998
+
999
+ def copy_styles(self, text: "Text") -> None:
1000
+ """Copy styles from another Text instance.
1001
+
1002
+ Args:
1003
+ text (Text): A Text instance to copy styles from, must be the same length.
1004
+ """
1005
+ self._spans.extend(text._spans)
1006
+
1007
+ def split(
1008
+ self,
1009
+ separator: str = "\n",
1010
+ *,
1011
+ include_separator: bool = False,
1012
+ allow_blank: bool = False,
1013
+ ) -> Lines:
1014
+ """Split rich text in to lines, preserving styles.
1015
+
1016
+ Args:
1017
+ separator (str, optional): String to split on. Defaults to "\\\\n".
1018
+ include_separator (bool, optional): Include the separator in the lines. Defaults to False.
1019
+ allow_blank (bool, optional): Return a blank line if the text ends with a separator. Defaults to False.
1020
+
1021
+ Returns:
1022
+ List[RichText]: A list of rich text, one per line of the original.
1023
+ """
1024
+ assert separator, "separator must not be empty"
1025
+
1026
+ text = self.plain
1027
+ if separator not in text:
1028
+ return Lines([self.copy()])
1029
+
1030
+ if include_separator:
1031
+ lines = self.divide(
1032
+ match.end() for match in re.finditer(re.escape(separator), text)
1033
+ )
1034
+ else:
1035
+
1036
+ def flatten_spans() -> Iterable[int]:
1037
+ for match in re.finditer(re.escape(separator), text):
1038
+ start, end = match.span()
1039
+ yield start
1040
+ yield end
1041
+
1042
+ lines = Lines(
1043
+ line for line in self.divide(flatten_spans()) if line.plain != separator
1044
+ )
1045
+
1046
+ if not allow_blank and text.endswith(separator):
1047
+ lines.pop()
1048
+
1049
+ return lines
1050
+
1051
+ def divide(self, offsets: Iterable[int]) -> Lines:
1052
+ """Divide text in to a number of lines at given offsets.
1053
+
1054
+ Args:
1055
+ offsets (Iterable[int]): Offsets used to divide text.
1056
+
1057
+ Returns:
1058
+ Lines: New RichText instances between offsets.
1059
+ """
1060
+ _offsets = list(offsets)
1061
+
1062
+ if not _offsets:
1063
+ return Lines([self.copy()])
1064
+
1065
+ text = self.plain
1066
+ text_length = len(text)
1067
+ divide_offsets = [0, *_offsets, text_length]
1068
+ line_ranges = list(zip(divide_offsets, divide_offsets[1:]))
1069
+
1070
+ style = self.style
1071
+ justify = self.justify
1072
+ overflow = self.overflow
1073
+ _Text = Text
1074
+ new_lines = Lines(
1075
+ _Text(
1076
+ text[start:end],
1077
+ style=style,
1078
+ justify=justify,
1079
+ overflow=overflow,
1080
+ )
1081
+ for start, end in line_ranges
1082
+ )
1083
+ if not self._spans:
1084
+ return new_lines
1085
+
1086
+ _line_appends = [line._spans.append for line in new_lines._lines]
1087
+ line_count = len(line_ranges)
1088
+ _Span = Span
1089
+
1090
+ for span_start, span_end, style in self._spans:
1091
+
1092
+ lower_bound = 0
1093
+ upper_bound = line_count
1094
+ start_line_no = (lower_bound + upper_bound) // 2
1095
+
1096
+ while True:
1097
+ line_start, line_end = line_ranges[start_line_no]
1098
+ if span_start < line_start:
1099
+ upper_bound = start_line_no - 1
1100
+ elif span_start > line_end:
1101
+ lower_bound = start_line_no + 1
1102
+ else:
1103
+ break
1104
+ start_line_no = (lower_bound + upper_bound) // 2
1105
+
1106
+ if span_end < line_end:
1107
+ end_line_no = start_line_no
1108
+ else:
1109
+ end_line_no = lower_bound = start_line_no
1110
+ upper_bound = line_count
1111
+
1112
+ while True:
1113
+ line_start, line_end = line_ranges[end_line_no]
1114
+ if span_end < line_start:
1115
+ upper_bound = end_line_no - 1
1116
+ elif span_end > line_end:
1117
+ lower_bound = end_line_no + 1
1118
+ else:
1119
+ break
1120
+ end_line_no = (lower_bound + upper_bound) // 2
1121
+
1122
+ for line_no in range(start_line_no, end_line_no + 1):
1123
+ line_start, line_end = line_ranges[line_no]
1124
+ new_start = max(0, span_start - line_start)
1125
+ new_end = min(span_end - line_start, line_end - line_start)
1126
+ if new_end > new_start:
1127
+ _line_appends[line_no](_Span(new_start, new_end, style))
1128
+
1129
+ return new_lines
1130
+
1131
+ def right_crop(self, amount: int = 1) -> None:
1132
+ """Remove a number of characters from the end of the text."""
1133
+ max_offset = len(self.plain) - amount
1134
+ _Span = Span
1135
+ self._spans[:] = [
1136
+ (
1137
+ span
1138
+ if span.end < max_offset
1139
+ else _Span(span.start, min(max_offset, span.end), span.style)
1140
+ )
1141
+ for span in self._spans
1142
+ if span.start < max_offset
1143
+ ]
1144
+ self._text = [self.plain[:-amount]]
1145
+ self._length -= amount
1146
+
1147
+ def wrap(
1148
+ self,
1149
+ console: "Console",
1150
+ width: int,
1151
+ *,
1152
+ justify: Optional["JustifyMethod"] = None,
1153
+ overflow: Optional["OverflowMethod"] = None,
1154
+ tab_size: int = 8,
1155
+ no_wrap: Optional[bool] = None,
1156
+ ) -> Lines:
1157
+ """Word wrap the text.
1158
+
1159
+ Args:
1160
+ console (Console): Console instance.
1161
+ width (int): Number of characters per line.
1162
+ emoji (bool, optional): Also render emoji code. Defaults to True.
1163
+ justify (str, optional): Justify method: "default", "left", "center", "full", "right". Defaults to "default".
1164
+ overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to None.
1165
+ tab_size (int, optional): Default tab size. Defaults to 8.
1166
+ no_wrap (bool, optional): Disable wrapping, Defaults to False.
1167
+
1168
+ Returns:
1169
+ Lines: Number of lines.
1170
+ """
1171
+ wrap_justify = justify or self.justify or DEFAULT_JUSTIFY
1172
+ wrap_overflow = overflow or self.overflow or DEFAULT_OVERFLOW
1173
+
1174
+ no_wrap = pick_bool(no_wrap, self.no_wrap, False) or overflow == "ignore"
1175
+
1176
+ lines = Lines()
1177
+ for line in self.split(allow_blank=True):
1178
+ if "\t" in line:
1179
+ line.expand_tabs(tab_size)
1180
+ if no_wrap:
1181
+ new_lines = Lines([line])
1182
+ else:
1183
+ offsets = divide_line(str(line), width, fold=wrap_overflow == "fold")
1184
+ new_lines = line.divide(offsets)
1185
+ for line in new_lines:
1186
+ line.rstrip_end(width)
1187
+ if wrap_justify:
1188
+ new_lines.justify(
1189
+ console, width, justify=wrap_justify, overflow=wrap_overflow
1190
+ )
1191
+ for line in new_lines:
1192
+ line.truncate(width, overflow=wrap_overflow)
1193
+ lines.extend(new_lines)
1194
+ return lines
1195
+
1196
+ def fit(self, width: int) -> Lines:
1197
+ """Fit the text in to given width by chopping in to lines.
1198
+
1199
+ Args:
1200
+ width (int): Maximum characters in a line.
1201
+
1202
+ Returns:
1203
+ Lines: Lines container.
1204
+ """
1205
+ lines: Lines = Lines()
1206
+ append = lines.append
1207
+ for line in self.split():
1208
+ line.set_length(width)
1209
+ append(line)
1210
+ return lines
1211
+
1212
+ def detect_indentation(self) -> int:
1213
+ """Auto-detect indentation of code.
1214
+
1215
+ Returns:
1216
+ int: Number of spaces used to indent code.
1217
+ """
1218
+
1219
+ _indentations = {
1220
+ len(match.group(1))
1221
+ for match in re.finditer(r"^( *)(.*)$", self.plain, flags=re.MULTILINE)
1222
+ }
1223
+
1224
+ try:
1225
+ indentation = (
1226
+ reduce(gcd, [indent for indent in _indentations if not indent % 2]) or 1
1227
+ )
1228
+ except TypeError:
1229
+ indentation = 1
1230
+
1231
+ return indentation
1232
+
1233
+ def with_indent_guides(
1234
+ self,
1235
+ indent_size: Optional[int] = None,
1236
+ *,
1237
+ character: str = "│",
1238
+ style: StyleType = "dim green",
1239
+ ) -> "Text":
1240
+ """Adds indent guide lines to text.
1241
+
1242
+ Args:
1243
+ indent_size (Optional[int]): Size of indentation, or None to auto detect. Defaults to None.
1244
+ character (str, optional): Character to use for indentation. Defaults to "│".
1245
+ style (Union[Style, str], optional): Style of indent guides.
1246
+
1247
+ Returns:
1248
+ Text: New text with indentation guides.
1249
+ """
1250
+
1251
+ _indent_size = self.detect_indentation() if indent_size is None else indent_size
1252
+
1253
+ text = self.copy()
1254
+ text.expand_tabs()
1255
+ indent_line = f"{character}{' ' * (_indent_size - 1)}"
1256
+
1257
+ re_indent = re.compile(r"^( *)(.*)$")
1258
+ new_lines: List[Text] = []
1259
+ add_line = new_lines.append
1260
+ blank_lines = 0
1261
+ for line in text.split(allow_blank=True):
1262
+ match = re_indent.match(line.plain)
1263
+ if not match or not match.group(2):
1264
+ blank_lines += 1
1265
+ continue
1266
+ indent = match.group(1)
1267
+ full_indents, remaining_space = divmod(len(indent), _indent_size)
1268
+ new_indent = f"{indent_line * full_indents}{' ' * remaining_space}"
1269
+ line.plain = new_indent + line.plain[len(new_indent) :]
1270
+ line.stylize(style, 0, len(new_indent))
1271
+ if blank_lines:
1272
+ new_lines.extend([Text(new_indent, style=style)] * blank_lines)
1273
+ blank_lines = 0
1274
+ add_line(line)
1275
+ if blank_lines:
1276
+ new_lines.extend([Text("", style=style)] * blank_lines)
1277
+
1278
+ new_text = text.blank_copy("\n").join(new_lines)
1279
+ return new_text
1280
+
1281
+
1282
+ if __name__ == "__main__": # pragma: no cover
1283
+ from pip._vendor.rich.console import Console
1284
+
1285
+ text = Text(
1286
+ """\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n"""
1287
+ )
1288
+ text.highlight_words(["Lorem"], "bold")
1289
+ text.highlight_words(["ipsum"], "italic")
1290
+
1291
+ console = Console()
1292
+
1293
+ console.rule("justify='left'")
1294
+ console.print(text, style="red")
1295
+ console.print()
1296
+
1297
+ console.rule("justify='center'")
1298
+ console.print(text, style="green", justify="center")
1299
+ console.print()
1300
+
1301
+ console.rule("justify='right'")
1302
+ console.print(text, style="blue", justify="right")
1303
+ console.print()
1304
+
1305
+ console.rule("justify='full'")
1306
+ console.print(text, style="magenta", justify="full")
1307
+ console.print()