python-clu 0.12.4__tar.gz → 0.12.7__tar.gz

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 (284) hide show
  1. {python_clu-0.12.4 → python_clu-0.12.7}/.bumpversion.toml +1 -1
  2. {python_clu-0.12.4 → python_clu-0.12.7}/CHANGELOG.md +101 -1
  3. {python_clu-0.12.4 → python_clu-0.12.7}/MANIFEST.in +0 -1
  4. {python_clu-0.12.4 → python_clu-0.12.7}/Makefile +1 -1
  5. {python_clu-0.12.4 → python_clu-0.12.7}/PKG-INFO +149 -86
  6. {python_clu-0.12.4 → python_clu-0.12.7}/README.md +143 -84
  7. python_clu-0.12.7/clu/__version__.py +1 -0
  8. {python_clu-0.12.4 → python_clu-0.12.7}/clu/config/formats/jsonfile.py +1 -1
  9. {python_clu-0.12.4 → python_clu-0.12.7}/clu/config/formats/picklefile.py +1 -1
  10. {python_clu-0.12.4 → python_clu-0.12.7}/clu/config/formats/tomlfile.py +15 -5
  11. {python_clu-0.12.4 → python_clu-0.12.7}/clu/config/formats/yamlfile.py +1 -1
  12. {python_clu-0.12.4 → python_clu-0.12.7}/clu/exporting.py +1 -3
  13. {python_clu-0.12.4 → python_clu-0.12.7}/clu/predicates.py +6 -0
  14. {python_clu-0.12.4 → python_clu-0.12.7}/clu/repl/ansi.py +8 -4
  15. python_clu-0.12.7/clu/repl/cli/ansidocs.py +49 -0
  16. {python_clu-0.12.4 → python_clu-0.12.7}/clu/scripts/repl.py +0 -2
  17. {python_clu-0.12.4 → python_clu-0.12.7}/clu/testing/utils.py +2 -10
  18. {python_clu-0.12.4 → python_clu-0.12.7}/pyproject.toml +6 -0
  19. {python_clu-0.12.4 → python_clu-0.12.7}/python_clu.egg-info/PKG-INFO +149 -86
  20. {python_clu-0.12.4 → python_clu-0.12.7}/python_clu.egg-info/SOURCES.txt +6 -4
  21. {python_clu-0.12.4 → python_clu-0.12.7}/python_clu.egg-info/entry_points.txt +1 -0
  22. {python_clu-0.12.4 → python_clu-0.12.7}/python_clu.egg-info/requires.txt +3 -1
  23. {python_clu-0.12.4 → python_clu-0.12.7}/requirements/install.txt +3 -1
  24. python_clu-0.12.7/scratch/images/toml-module-rant.jpg +0 -0
  25. python_clu-0.12.7/setup.cfg +4 -0
  26. {python_clu-0.12.4 → python_clu-0.12.7}/setup.py +2 -1
  27. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_config.py +9 -11
  28. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_importing.py +1 -1
  29. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_repl_modules.py +0 -2
  30. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_scripts_repl.py +1 -2
  31. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_typology.py +2 -2
  32. python_clu-0.12.7/tests/yodogg/yodogg/__init__.py +0 -0
  33. {python_clu-0.12.4 → python_clu-0.12.7}/tests/yodogg/yodogg/config.py +4 -4
  34. python_clu-0.12.4/clu/__version__.py +0 -1
  35. python_clu-0.12.4/setup.cfg +0 -31
  36. {python_clu-0.12.4 → python_clu-0.12.7}/.coveragerc +0 -0
  37. {python_clu-0.12.4 → python_clu-0.12.7}/.editorconfig +0 -0
  38. {python_clu-0.12.4 → python_clu-0.12.7}/.gitchangelog.rc +0 -0
  39. {python_clu-0.12.4 → python_clu-0.12.7}/.gitignore +0 -0
  40. {python_clu-0.12.4 → python_clu-0.12.7}/.landscape.yml +0 -0
  41. {python_clu-0.12.4 → python_clu-0.12.7}/.travis.yml +0 -0
  42. {python_clu-0.12.4 → python_clu-0.12.7}/ABOUT.md +0 -0
  43. {python_clu-0.12.4 → python_clu-0.12.7}/CLASSIFIERS.txt +0 -0
  44. {python_clu-0.12.4 → python_clu-0.12.7}/CLU_Treatment.md +0 -0
  45. {python_clu-0.12.4 → python_clu-0.12.7}/CODE_OF_CONDUCT.md +0 -0
  46. {python_clu-0.12.4 → python_clu-0.12.7}/LICENSE.txt +0 -0
  47. {python_clu-0.12.4 → python_clu-0.12.7}/appveyor.yml +0 -0
  48. {python_clu-0.12.4 → python_clu-0.12.7}/clu/__init__.py +0 -0
  49. {python_clu-0.12.4 → python_clu-0.12.7}/clu/__main__.py +0 -0
  50. {python_clu-0.12.4 → python_clu-0.12.7}/clu/abstract.py +0 -0
  51. {python_clu-0.12.4 → python_clu-0.12.7}/clu/all.py +0 -0
  52. {python_clu-0.12.4 → python_clu-0.12.7}/clu/api/__init__.py +0 -0
  53. {python_clu-0.12.4 → python_clu-0.12.7}/clu/api/__main__.py +0 -0
  54. {python_clu-0.12.4 → python_clu-0.12.7}/clu/application.py +0 -0
  55. {python_clu-0.12.4 → python_clu-0.12.7}/clu/compilation/__init__.py +0 -0
  56. {python_clu-0.12.4 → python_clu-0.12.7}/clu/compilation/compiledb.py +0 -0
  57. {python_clu-0.12.4 → python_clu-0.12.7}/clu/compilation/macros.py +0 -0
  58. {python_clu-0.12.4 → python_clu-0.12.7}/clu/config/__init__.py +0 -0
  59. {python_clu-0.12.4 → python_clu-0.12.7}/clu/config/abc.py +0 -0
  60. {python_clu-0.12.4 → python_clu-0.12.7}/clu/config/codecs.py +0 -0
  61. {python_clu-0.12.4 → python_clu-0.12.7}/clu/config/env.py +0 -0
  62. {python_clu-0.12.4 → python_clu-0.12.7}/clu/config/filebase.py +0 -0
  63. {python_clu-0.12.4 → python_clu-0.12.7}/clu/config/formats/__init__.py +0 -0
  64. {python_clu-0.12.4 → python_clu-0.12.7}/clu/config/keymap.py +0 -0
  65. {python_clu-0.12.4 → python_clu-0.12.7}/clu/config/keymapview.py +0 -0
  66. {python_clu-0.12.4/clu/repl/cli → python_clu-0.12.7/clu/config/legacy}/__init__.py +0 -0
  67. {python_clu-0.12.4/clu/config → python_clu-0.12.7/clu/config/legacy}/base.py +0 -0
  68. {python_clu-0.12.4/clu/config → python_clu-0.12.7/clu/config/legacy}/fieldtypes.py +0 -0
  69. {python_clu-0.12.4/clu/config → python_clu-0.12.7/clu/config/legacy}/settings.py +0 -0
  70. {python_clu-0.12.4 → python_clu-0.12.7}/clu/config/ns.py +0 -0
  71. {python_clu-0.12.4 → python_clu-0.12.7}/clu/config/proxy.py +0 -0
  72. {python_clu-0.12.4 → python_clu-0.12.7}/clu/constants/__init__.py +0 -0
  73. {python_clu-0.12.4 → python_clu-0.12.7}/clu/constants/__main__.py +0 -0
  74. {python_clu-0.12.4 → python_clu-0.12.7}/clu/constants/consts.py +0 -0
  75. {python_clu-0.12.4 → python_clu-0.12.7}/clu/constants/data.py +0 -0
  76. {python_clu-0.12.4 → python_clu-0.12.7}/clu/constants/enums.py +0 -0
  77. {python_clu-0.12.4 → python_clu-0.12.7}/clu/constants/exceptions.py +0 -0
  78. {python_clu-0.12.4 → python_clu-0.12.7}/clu/constants/polyfills.py +0 -0
  79. {python_clu-0.12.4 → python_clu-0.12.7}/clu/csv.py +0 -0
  80. {python_clu-0.12.4 → python_clu-0.12.7}/clu/dicts.py +0 -0
  81. {python_clu-0.12.4 → python_clu-0.12.7}/clu/dispatch.py +0 -0
  82. {python_clu-0.12.4 → python_clu-0.12.7}/clu/enums.py +0 -0
  83. {python_clu-0.12.4 → python_clu-0.12.7}/clu/extending.py +0 -0
  84. {python_clu-0.12.4 → python_clu-0.12.7}/clu/fs/__init__.py +0 -0
  85. {python_clu-0.12.4 → python_clu-0.12.7}/clu/fs/abc.py +0 -0
  86. {python_clu-0.12.4 → python_clu-0.12.7}/clu/fs/appdirectories.py +0 -0
  87. {python_clu-0.12.4 → python_clu-0.12.7}/clu/fs/filesystem.py +0 -0
  88. {python_clu-0.12.4 → python_clu-0.12.7}/clu/fs/misc.py +0 -0
  89. {python_clu-0.12.4 → python_clu-0.12.7}/clu/fs/pypath.py +0 -0
  90. {python_clu-0.12.4 → python_clu-0.12.7}/clu/fs/sourcetree.py +0 -0
  91. {python_clu-0.12.4 → python_clu-0.12.7}/clu/importing/__init__.py +0 -0
  92. {python_clu-0.12.4 → python_clu-0.12.7}/clu/importing/__main__.py +0 -0
  93. {python_clu-0.12.4 → python_clu-0.12.7}/clu/importing/base.py +0 -0
  94. {python_clu-0.12.4 → python_clu-0.12.7}/clu/importing/proxy.py +0 -0
  95. {python_clu-0.12.4 → python_clu-0.12.7}/clu/keyvalue.py +0 -0
  96. {python_clu-0.12.4 → python_clu-0.12.7}/clu/mathematics.py +0 -0
  97. {python_clu-0.12.4 → python_clu-0.12.7}/clu/naming.py +0 -0
  98. {python_clu-0.12.4 → python_clu-0.12.7}/clu/repl/__init__.py +0 -0
  99. {python_clu-0.12.4 → python_clu-0.12.7}/clu/repl/banners.py +0 -0
  100. {python_clu-0.12.4/clu/scripts → python_clu-0.12.7/clu/repl/cli}/__init__.py +0 -0
  101. {python_clu-0.12.4 → python_clu-0.12.7}/clu/repl/cli/boilerplate.py +0 -0
  102. {python_clu-0.12.4 → python_clu-0.12.7}/clu/repl/cli/boilerplate_copy.py +0 -0
  103. {python_clu-0.12.4 → python_clu-0.12.7}/clu/repl/cli/print_version.py +0 -0
  104. {python_clu-0.12.4 → python_clu-0.12.7}/clu/repl/columnize.py +0 -0
  105. {python_clu-0.12.4 → python_clu-0.12.7}/clu/repl/modules.py +0 -0
  106. {python_clu-0.12.4 → python_clu-0.12.7}/clu/repr.py +0 -0
  107. {python_clu-0.12.4 → python_clu-0.12.7}/clu/sanitizer.py +0 -0
  108. {python_clu-0.12.4 → python_clu-0.12.7}/clu/scripts/.gitignore +0 -0
  109. {python_clu-0.12.4 → python_clu-0.12.7}/clu/scripts/README.md +0 -0
  110. {python_clu-0.12.4/clu/shelving → python_clu-0.12.7/clu/scripts}/__init__.py +0 -0
  111. {python_clu-0.12.4 → python_clu-0.12.7}/clu/scripts/ansicolors.py +0 -0
  112. {python_clu-0.12.4 → python_clu-0.12.7}/clu/scripts/boilerplate.py +0 -0
  113. {python_clu-0.12.4 → python_clu-0.12.7}/clu/scripts/dictroast.py +0 -0
  114. {python_clu-0.12.4 → python_clu-0.12.7}/clu/scripts/legacy/forkumask.py +0 -0
  115. {python_clu-0.12.4 → python_clu-0.12.7}/clu/scripts/legacy/repl-bpython.py +0 -0
  116. {python_clu-0.12.4 → python_clu-0.12.7}/clu/scripts/legacy/repl-ipython.py +0 -0
  117. {python_clu-0.12.4 → python_clu-0.12.7}/clu/scripts/legacy/repl-ptpython.py +0 -0
  118. {python_clu-0.12.4 → python_clu-0.12.7}/clu/scripts/legacy/repl-pyzo.py +0 -0
  119. {python_clu-0.12.4 → python_clu-0.12.7}/clu/scripts/legacy/xdg-runtime.py +0 -0
  120. {python_clu-0.12.4 → python_clu-0.12.7}/clu/scripts/prediversus.py +0 -0
  121. {python_clu-0.12.4 → python_clu-0.12.7}/clu/scripts/treeline.py +0 -0
  122. {python_clu-0.12.4/tests → python_clu-0.12.7/clu/shelving}/__init__.py +0 -0
  123. {python_clu-0.12.4 → python_clu-0.12.7}/clu/shelving/redat.py +0 -0
  124. {python_clu-0.12.4 → python_clu-0.12.7}/clu/shelving/redis.conf +0 -0
  125. {python_clu-0.12.4 → python_clu-0.12.7}/clu/stdio.py +0 -0
  126. {python_clu-0.12.4 → python_clu-0.12.7}/clu/testing/__init__.py +0 -0
  127. {python_clu-0.12.4 → python_clu-0.12.7}/clu/testing/hook.py +0 -0
  128. {python_clu-0.12.4 → python_clu-0.12.7}/clu/testing/obsolete.py +0 -0
  129. {python_clu-0.12.4 → python_clu-0.12.7}/clu/testing/pytest.py +0 -0
  130. {python_clu-0.12.4 → python_clu-0.12.7}/clu/typespace/__init__.py +0 -0
  131. {python_clu-0.12.4 → python_clu-0.12.7}/clu/typespace/__main__.py +0 -0
  132. {python_clu-0.12.4 → python_clu-0.12.7}/clu/typespace/namespace.py +0 -0
  133. {python_clu-0.12.4 → python_clu-0.12.7}/clu/typology.py +0 -0
  134. {python_clu-0.12.4 → python_clu-0.12.7}/clu/version/__init__.py +0 -0
  135. {python_clu-0.12.4 → python_clu-0.12.7}/clu/version/__main__.py +0 -0
  136. {python_clu-0.12.4 → python_clu-0.12.7}/clu/version/git_version.py +0 -0
  137. {python_clu-0.12.4 → python_clu-0.12.7}/clu/version/read_version.py +0 -0
  138. {python_clu-0.12.4 → python_clu-0.12.7}/codecov.yml +0 -0
  139. {python_clu-0.12.4 → python_clu-0.12.7}/conftest.py +0 -0
  140. {python_clu-0.12.4 → python_clu-0.12.7}/docs/.DS_Store +0 -0
  141. {python_clu-0.12.4 → python_clu-0.12.7}/docs/Makefile +0 -0
  142. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/doctrees/api.doctree +0 -0
  143. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/doctrees/environment.pickle +0 -0
  144. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/doctrees/generated/clu.doctree +0 -0
  145. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/doctrees/index.doctree +0 -0
  146. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/.buildinfo +0 -0
  147. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_sources/api.rst.txt +0 -0
  148. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_sources/generated/clu.rst.txt +0 -0
  149. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_sources/index.rst.txt +0 -0
  150. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/_sphinx_javascript_frameworks_compat.js +0 -0
  151. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/alabaster.css +0 -0
  152. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/basic.css +0 -0
  153. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/css/badge_only.css +0 -0
  154. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  155. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  156. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  157. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  158. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  159. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/css/fonts/fontawesome-webfont.svg +0 -0
  160. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  161. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  162. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  163. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
  164. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  165. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/css/fonts/lato-bold.woff +0 -0
  166. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/css/fonts/lato-bold.woff2 +0 -0
  167. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
  168. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  169. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/css/fonts/lato-normal.woff +0 -0
  170. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/css/fonts/lato-normal.woff2 +0 -0
  171. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/css/theme.css +0 -0
  172. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/custom.css +0 -0
  173. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/doctools.js +0 -0
  174. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/documentation_options.js +0 -0
  175. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/file.png +0 -0
  176. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/jquery-3.6.0.js +0 -0
  177. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/jquery.js +0 -0
  178. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/js/badge_only.js +0 -0
  179. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/js/html5shiv-printshiv.min.js +0 -0
  180. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/js/html5shiv.min.js +0 -0
  181. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/js/theme.js +0 -0
  182. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/language_data.js +0 -0
  183. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/minus.png +0 -0
  184. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/plus.png +0 -0
  185. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/pygments.css +0 -0
  186. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/searchtools.js +0 -0
  187. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/underscore-1.13.1.js +0 -0
  188. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/_static/underscore.js +0 -0
  189. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/api.html +0 -0
  190. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/generated/clu.html +0 -0
  191. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/genindex.html +0 -0
  192. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/index.html +0 -0
  193. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/objects.inv +0 -0
  194. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/py-modindex.html +0 -0
  195. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/search.html +0 -0
  196. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/html/searchindex.js +0 -0
  197. {python_clu-0.12.4 → python_clu-0.12.7}/docs/build/man/clu.1 +0 -0
  198. {python_clu-0.12.4 → python_clu-0.12.7}/docs/make.bat +0 -0
  199. {python_clu-0.12.4 → python_clu-0.12.7}/docs/source/api.rst +0 -0
  200. {python_clu-0.12.4 → python_clu-0.12.7}/docs/source/conf.py +0 -0
  201. {python_clu-0.12.4 → python_clu-0.12.7}/docs/source/generated/clu.rst +0 -0
  202. {python_clu-0.12.4 → python_clu-0.12.7}/docs/source/index.rst +0 -0
  203. {python_clu-0.12.4 → python_clu-0.12.7}/hooks/autohook.sh +0 -0
  204. {python_clu-0.12.4 → python_clu-0.12.7}/hooks/post-push/00-coverage.sh +0 -0
  205. {python_clu-0.12.4 → python_clu-0.12.7}/hooks/pre-push/00-noop.sh +0 -0
  206. {python_clu-0.12.4 → python_clu-0.12.7}/hooks/pre-push/01-direnv-stdlib.sh +0 -0
  207. {python_clu-0.12.4 → python_clu-0.12.7}/hooks/scripts/coverage.sh +0 -0
  208. {python_clu-0.12.4 → python_clu-0.12.7}/hooks/scripts/display-issues.sh +0 -0
  209. {python_clu-0.12.4 → python_clu-0.12.7}/hooks/scripts/git-pushex +0 -0
  210. {python_clu-0.12.4 → python_clu-0.12.7}/hooks/scripts/noop.sh +0 -0
  211. {python_clu-0.12.4 → python_clu-0.12.7}/mypy.ini +0 -0
  212. {python_clu-0.12.4 → python_clu-0.12.7}/noxfile.py +0 -0
  213. {python_clu-0.12.4 → python_clu-0.12.7}/pytest.ini +0 -0
  214. {python_clu-0.12.4 → python_clu-0.12.7}/python_clu.egg-info/dependency_links.txt +0 -0
  215. {python_clu-0.12.4 → python_clu-0.12.7}/python_clu.egg-info/top_level.txt +0 -0
  216. {python_clu-0.12.4 → python_clu-0.12.7}/python_clu.egg-info/zip-safe +0 -0
  217. {python_clu-0.12.4 → python_clu-0.12.7}/pytype.cfg +0 -0
  218. {python_clu-0.12.4 → python_clu-0.12.7}/requirements/changelog.txt +0 -0
  219. {python_clu-0.12.4 → python_clu-0.12.7}/requirements/dev.txt +0 -0
  220. {python_clu-0.12.4 → python_clu-0.12.7}/requirements/docs.txt +0 -0
  221. {python_clu-0.12.4 → python_clu-0.12.7}/requirements/nox/codecov.txt +0 -0
  222. {python_clu-0.12.4 → python_clu-0.12.7}/requirements/nox/docs.txt +0 -0
  223. {python_clu-0.12.4 → python_clu-0.12.7}/requirements/nox/manifest.txt +0 -0
  224. {python_clu-0.12.4 → python_clu-0.12.7}/requirements/nox/pyproject.txt +0 -0
  225. {python_clu-0.12.4 → python_clu-0.12.7}/requirements/nox/repl.txt +0 -0
  226. {python_clu-0.12.4 → python_clu-0.12.7}/requirements/nox/tests.txt +0 -0
  227. {python_clu-0.12.4 → python_clu-0.12.7}/requirements/tox.txt +0 -0
  228. {python_clu-0.12.4 → python_clu-0.12.7}/requirements/typecheck.txt +0 -0
  229. {python_clu-0.12.4 → python_clu-0.12.7}/scratch/direnv_transformed_env.py +0 -0
  230. {python_clu-0.12.4 → python_clu-0.12.7}/scratch/images/clu-module-list-example-small.jpg +0 -0
  231. {python_clu-0.12.4 → python_clu-0.12.7}/scratch/images/clu-module-list-example.jpg +0 -0
  232. {python_clu-0.12.4 → python_clu-0.12.7}/scratch/images/clu-module-list-example.pxd +0 -0
  233. {python_clu-0.12.4 → python_clu-0.12.7}/scratch/images/clu-testing-time-totals-example-small.jpg +0 -0
  234. {python_clu-0.12.4 → python_clu-0.12.7}/scratch/images/clu-testing-time-totals-example.jpg +0 -0
  235. {python_clu-0.12.4 → python_clu-0.12.7}/scratch/images/clu-testing-time-totals-example.pxd +0 -0
  236. {python_clu-0.12.4 → python_clu-0.12.7}/scratch/images/construx-and-capsela-small.jpg +0 -0
  237. {python_clu-0.12.4 → python_clu-0.12.7}/scratch/images/construx-and-capsela.jpg +0 -0
  238. {python_clu-0.12.4 → python_clu-0.12.7}/scratch/images/construx-and-capsela.pxd +0 -0
  239. {python_clu-0.12.4 → python_clu-0.12.7}/scratch/inline-tests-ImportError-uggggh.ipynb +0 -0
  240. {python_clu-0.12.4 → python_clu-0.12.7}/scratch/nteract.ipynb +0 -0
  241. {python_clu-0.12.4/tests/yodogg → python_clu-0.12.7/tests}/__init__.py +0 -0
  242. {python_clu-0.12.4 → python_clu-0.12.7}/tests/data/1-58.jpg +0 -0
  243. {python_clu-0.12.4 → python_clu-0.12.7}/tests/data/3471426989_aa8e83cac5_o.jpg +0 -0
  244. {python_clu-0.12.4 → python_clu-0.12.7}/tests/data/3472236406_1fbf1a567d_o.jpg +0 -0
  245. {python_clu-0.12.4 → python_clu-0.12.7}/tests/data/8600JC.jpg +0 -0
  246. {python_clu-0.12.4 → python_clu-0.12.7}/tests/data/8ba.png +0 -0
  247. {python_clu-0.12.4 → python_clu-0.12.7}/tests/data/IMG_20180505_205153567.jpg +0 -0
  248. {python_clu-0.12.4 → python_clu-0.12.7}/tests/data/cheetah-003.jpg +0 -0
  249. {python_clu-0.12.4 → python_clu-0.12.7}/tests/data/config/clu-config.toml +0 -0
  250. {python_clu-0.12.4 → python_clu-0.12.7}/tests/data/config/yodogg.toml +0 -0
  251. {python_clu-0.12.4 → python_clu-0.12.7}/tests/data/shutterstock_90194617.jpg +0 -0
  252. {python_clu-0.12.4 → python_clu-0.12.7}/tests/data/yodata/09163d51421853.5608b3c2a1be0.jpg +0 -0
  253. {python_clu-0.12.4 → python_clu-0.12.7}/tests/data/yodata/5d0227342500004e12e3506d.jpg +0 -0
  254. {python_clu-0.12.4 → python_clu-0.12.7}/tests/data/yodata/BlackCat2_large-22.jpg +0 -0
  255. {python_clu-0.12.4 → python_clu-0.12.7}/tests/data/yodogg/Serval_Cat_Kitten-706.jpg +0 -0
  256. {python_clu-0.12.4 → python_clu-0.12.7}/tests/data/yodogg/Servals_Thoiry_19801.jpg +0 -0
  257. {python_clu-0.12.4 → python_clu-0.12.7}/tests/data/yodogg/video-pride-serval.jpg +0 -0
  258. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_abstract.py +0 -0
  259. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_all.py +0 -0
  260. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_boilerplate.py +0 -0
  261. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_config_abc.py +0 -0
  262. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_csv.py +0 -0
  263. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_dicts.py +0 -0
  264. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_dispatch.py +0 -0
  265. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_enum_aliases.py +0 -0
  266. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_exporting.py +0 -0
  267. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_extending.py +0 -0
  268. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_fs_abc.py +0 -0
  269. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_fs_appdirectories.py +0 -0
  270. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_fs_filesystem.py +0 -0
  271. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_fs_misc.py +0 -0
  272. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_keyvalue.py +0 -0
  273. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_mathematics.py +0 -0
  274. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_naming.py +0 -0
  275. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_predicates.py +0 -0
  276. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_repl_columnize.py +0 -0
  277. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_repr.py +0 -0
  278. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_typespace_namespace.py +0 -0
  279. {python_clu-0.12.4 → python_clu-0.12.7}/tests/test_version.py +0 -0
  280. {python_clu-0.12.4 → python_clu-0.12.7}/tests/yodogg/.tm_properties +0 -0
  281. {python_clu-0.12.4/tests/yodogg → python_clu-0.12.7/tests}/yodogg/__init__.py +0 -0
  282. {python_clu-0.12.4 → python_clu-0.12.7}/tests/yodogg/yodogg/exporting.py +0 -0
  283. {python_clu-0.12.4 → python_clu-0.12.7}/tests/yodogg/yodogg/iheard.py +0 -0
  284. {python_clu-0.12.4 → python_clu-0.12.7}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
 
2
2
  [tool.bumpversion]
3
- current_version = "0.12.4"
3
+ current_version = "0.12.7"
4
4
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
5
5
  serialize = ["{major}.{minor}.{patch}"]
6
6
  search = "{current_version}"
@@ -1,7 +1,103 @@
1
1
  # Changelog
2
2
 
3
3
 
4
- ## 0.12.3:pre13+g5d70474 [SNAPSHOT]
4
+ ## v0.12.6 (2025-05-19)
5
+
6
+ ### Other
7
+
8
+ * Bumped version: 0.12.5 → 0.12.6. [Alexander Böhn]
9
+
10
+ * [make] New changelog added. [Alexander Böhn]
11
+
12
+ * The ANSI docstring CLU command seems to be up to snuff. [Alexander Böhn]
13
+
14
+ * Further along the prettyprinting path. [Alexander Böhn]
15
+
16
+ * Started on a new CLU command to prettyprint ANSI docstrings. [Alexander Böhn]
17
+
18
+ … please bear with as we travel on this journey together
19
+
20
+ * Gratuitously expanded the docstring for `negate(…)` in `clu.predicates` [Alexander Böhn]
21
+
22
+ … comparing the function to a child with oppositional-defiant disorder.
23
+ It makes a lot of sense, no?
24
+
25
+ * Spruced up the ANSI inline tests. [Alexander Böhn]
26
+
27
+
28
+ ## v0.12.5 (2025-05-19)
29
+
30
+ ### Add
31
+
32
+ * Adding TOML module discussion screenshot. [Alexander Böhn]
33
+
34
+ ### Other
35
+
36
+ * Bumped version: 0.12.4 → 0.12.5. [Alexander Böhn]
37
+
38
+ * [make] New changelog added. [Alexander Böhn]
39
+
40
+ * Starting to remove the legacy parts of `clu.config` [Alexander Böhn]
41
+
42
+ … fucking finally. These bits were an early draft of what became
43
+ the KeyMap system – they’ve been removed thoroughly from all the
44
+ farthest and darkest corners CLU has grown over the years. All
45
+ the legacy shit was pretty much only used in testing, and like
46
+ accedentally in some of the config file stuff. Good riddance I
47
+ say – the only thing that broke is a bunch of tests as old as the
48
+ legacy code itself. Yeah!
49
+
50
+ * Updated the TOML file config reader (using native parsers) [Alexander Böhn]
51
+
52
+ … which can I ask, what the fuck is this dog’s breakfast with the
53
+ native TOML modules?! The standard-library pure-python thing is
54
+ just called “toml”. Fine, so far so good. Then, if you want
55
+ native TOML I/O, you have to install *two* native modules. The
56
+ one with “load(…)” and “loads(…)” is called ‘tomli’. Like, it’s
57
+ like “The ‘i’ is for input! Like accelerated input!” Sure. That’s
58
+ somewhat reasonable, it’d be nice if it was all in one module.
59
+ Because the other TOML native module has your “dump(…)” and your
60
+ “dumps(…)”, right, so what’s that one called though? Is it, by any
61
+ chance, ‘tomlo’? as in “The ‘o’ is for output”. Well no, that is
62
+ not the name of this module. In some sort of fit of solidarity
63
+ with ‘tomli’ the author of this shit decided to call it – wait
64
+ for it now…
65
+
66
+ « tomli_w »
67
+
68
+ … yes you read that correctly. Not ‘tomlo’, not ‘tomlw’, none of
69
+ any sort of sense-making moniker, nor any moniker that doesn’t
70
+ make sense but at least was crafted with some sort of follow-able
71
+ logic. Nor, heaven forbid, would these modules be *combined* into
72
+ something sort of like the pure-python TOML thing, only native.
73
+ THAT WOULD BE WAY TOO MUCH TO ASK.
74
+
75
+ … so of course I did what I did in this commit, which was to firstly
76
+ import ‘tomli_w’ (The ‘w’ is for whatever!) as ‘tomlo’. And then
77
+ I stitched them together in a class called “toml” (crazy, right?)
78
+ that just had static alias methods to the native module functions.
79
+ Aesthetics are important, and they ain’t easy, it would seem. Yo.
80
+
81
+ * Sometimes, I prefer to ask permission first. [Alexander Böhn]
82
+
83
+ * Removed `setup.cfg` entry from `MANIFEST.in` [Alexander Böhn]
84
+
85
+ * Minor `README.md` tweak. [Alexander Böhn]
86
+
87
+ * Updated `README.md` with information on `clu.enums` and `clu.all` [Alexander Böhn]
88
+
89
+ * EVEN MORE syntax-highlighted `README.md` code. [Alexander Böhn]
90
+
91
+ * More syntax-highlighted `README.md` code. [Alexander Böhn]
92
+
93
+ * Trying out syntax-highlighted fenced code block in `README.md` [Alexander Böhn]
94
+
95
+ * A few more addenda in `pyproject.toml` [Alexander Böhn]
96
+
97
+ * Removed the old `setup.cfg` file. [Alexander Böhn]
98
+
99
+
100
+ ## v0.12.4 (2025-05-19)
5
101
 
6
102
  ### Add
7
103
 
@@ -11,6 +107,10 @@
11
107
 
12
108
  ### Other
13
109
 
110
+ * Bumped version: 0.12.3 → 0.12.4. [Alexander Böhn]
111
+
112
+ * [make] New changelog added. [Alexander Böhn]
113
+
14
114
  * More refinements to the whole `pyproject.toml` deal. [Alexander Böhn]
15
115
 
16
116
  * Fixed a few `pyproject.toml` build-related things. [Alexander Böhn]
@@ -25,7 +25,6 @@ include noxfile.py
25
25
  include pyproject.toml
26
26
  include pytest.ini
27
27
  include pytype.cfg
28
- include setup.cfg
29
28
  include setup.py
30
29
  include tox.ini
31
30
 
@@ -31,7 +31,7 @@ clean-type-caches:
31
31
  rm -rf $(PROJECT_VENV)/var/cache/pytype
32
32
 
33
33
  cython:
34
- python setup.py build_ext --inplace
34
+ python -m setup build_ext --inplace
35
35
 
36
36
  sdist:
37
37
  python -m build
@@ -1,11 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-clu
3
- Version: 0.12.4
3
+ Version: 0.12.7
4
4
  Summary: Python-CLU: Common Lightweight Utilities
5
5
  Home-page: https://github.com/fish2000/clu
6
6
  Download-URL: https://github.com/fish2000/clu/zipball/master
7
7
  Author: Alexander Böhn
8
8
  Author-email: Alexander Böhn <fish2000@gmail.com>
9
+ Maintainer-email: Alexander Böhn <fish2000@gmail.com>
10
+ License-Expression: LicenseRef-CLU-MIT
9
11
  Project-URL: homepage, https://github.com/fish2000/CLU
10
12
  Project-URL: repository, https://github.com/fish2000/CLU
11
13
  Project-URL: documentation, https://github.com/fish2000/CLU/blob/master/README.md
@@ -33,7 +35,7 @@ Classifier: Programming Language :: Python :: Implementation :: CPython
33
35
  Classifier: Programming Language :: Python :: Implementation :: PyPy
34
36
  Description-Content-Type: text/markdown
35
37
  License-File: LICENSE.txt
36
- Requires-Dist: build
38
+ Requires-Dist: build>=1.2.2
37
39
  Requires-Dist: Click>=7.0
38
40
  Requires-Dist: colorama>=0.4.0
39
41
  Requires-Dist: dataclasses>=0.6; python_version < "3.7"
@@ -52,6 +54,8 @@ Requires-Dist: redis>=3.4.0
52
54
  Requires-Dist: setuptools>=30.0.0
53
55
  Requires-Dist: six>=1.10.0
54
56
  Requires-Dist: toml>=0.10.0
57
+ Requires-Dist: tomli>=2.2.0
58
+ Requires-Dist: tomli_w>=1.2.0
55
59
  Requires-Dist: wheel>=0.34.0
56
60
  Requires-Dist: zict>=0.1.2
57
61
  Provides-Extra: all
@@ -116,20 +120,24 @@ So do have a look around. Here’s an abridged breakdown of some things within:
116
120
  around lexically namespaced dictionaries called “KeyMaps”, which basic examples of which can be
117
121
  found in [`clu.config.keymap`][clu.config.keymap]. If your nested data looks like:
118
122
 
119
- data = {
120
- 'yo' : {
121
- 'dogg' : {
122
- 'i-heard' : {
123
- 'you-like' : "nested data"
124
- }
123
+ ```python
124
+ data = {
125
+ 'yo' : {
126
+ 'dogg' : {
127
+ 'i-heard' : {
128
+ 'you-like' : "nested data"
125
129
  }
126
130
  }
127
131
  }
132
+ }
133
+ ```
128
134
 
129
135
  … and you assign it to a keymap, like e.g. `keyed = keymap.Nested(data).flatten()`, then you can
130
136
  use `keyed` like so:
131
137
 
132
- assert keyed["yo:dogg:i-heard:you-like"] == "nested data"
138
+ ```python
139
+ assert keyed["yo:dogg:i-heard:you-like"] == "nested data"
140
+ ```
133
141
 
134
142
  … The `Flat` and `Nested` classes are cheap to construct and lightweight, and generally act like most
135
143
  [`dict`][dicts] instances in most of the expected ways. There is also an environment-variable [`keymap`][clu.config.keymap]
@@ -137,10 +145,12 @@ So do have a look around. Here’s an abridged breakdown of some things within:
137
145
  `MYAPP_CONFIG_THINGY`, they can be accessed through `env.FrozenEnviron(appname='myapp')` or
138
146
  `env.Environ(appname='myapp')` like so:
139
147
 
140
- appenv = Environ(appname='myapp')
141
- assert appenv['config:thingy'] == "some value"
142
- appenv['config:doohickey'] = "a different value" # sets MYAPP_CONFIG_DOOHICKEY
143
- # in the current env
148
+ ```python
149
+ appenv = Environ(appname='myapp')
150
+ assert appenv['config:thingy'] == "some value"
151
+ appenv['config:doohickey'] = "a different value" # sets MYAPP_CONFIG_DOOHICKEY
152
+ # in the current env
153
+ ```
144
154
 
145
155
  … and there are plenty of tools for rolling your own `KeyMap`s in [`clu.config`][clu.config]: the
146
156
  [`proxy`][clu.config.proxy] subpackage has a `KeyMap` proxy class, [`ns`][clu.config.ns] has utility functions
@@ -153,6 +163,15 @@ So do have a look around. Here’s an abridged breakdown of some things within:
153
163
  [polyfills][clu.constants.polyfills] to allow certain dependencies from the Python standard library to work even
154
164
  when some of their moving parts are missing (i.e. Ye Olde Pythone 2.7, various PyPy implementations, etc).
155
165
 
166
+ * [`all`][clu.all]: Herein you will find some verrrrry interesting “meta” functions for CLU. You have the `import_all_modules(…)`
167
+ function, which when provided your projects’ base path and appname, will return all the package names therein,
168
+ whether class-based modules defined through [`clu.exporting`][clu.exporting] or plain ol’ modules defined by files
169
+ ending in “.py”, basically. It’s awesome.
170
+
171
+ The companion function `import_clu_modules(¬)` is a shortcut just for everything within CLU, and `inline_tests(…)`
172
+ yields an iterator over every CLU module that defines inline tests through [`clu.testing`][clu.testing]. These
173
+ are very useful within CLU; for your own project, write your own functions modeled after these! You can’t go wrong.
174
+
156
175
  * [`fs`][clu.fs]: Filesystem-related things. Submodules include:
157
176
 
158
177
  * [`fs.filesystem`][clu.fs.filesystem]: classes representing filesystem primitives like `Directory`,
@@ -177,28 +196,30 @@ So do have a look around. Here’s an abridged breakdown of some things within:
177
196
 
178
197
  * [`importing`][clu.importing]: a whole class-based-module system! Basically you can do this:
179
198
 
180
- class Derived(clu.importing.base.Module):
181
-
182
- """ I heard you like docstrings """
183
-
184
- yo = 'dogg'
185
-
186
- @export
187
- def yodogg(self):
188
- return "I heard you like"
189
-
190
- @export
191
- def nodogg(self):
192
- return None
193
-
194
- export(yo, name='yo')
195
-
196
- from clu.app import Derived as derived # TAKE NOTE!!!
197
-
198
- assert isinstance(derived, Module)
199
- assert derived.yo == 'dogg'
200
- assert derived.yodogg() == "I heard you like"
201
- assert derived.nodogg() is None
199
+ ```python
200
+ class Derived(clu.importing.base.Module):
201
+
202
+ """ I heard you like docstrings """
203
+
204
+ yo = 'dogg'
205
+
206
+ @export
207
+ def yodogg(self):
208
+ return "I heard you like"
209
+
210
+ @export
211
+ def nodogg(self):
212
+ return None
213
+
214
+ export(yo, name='yo')
215
+
216
+ from clu.app import Derived as derived # TAKE NOTE!!!
217
+
218
+ assert isinstance(derived, Module)
219
+ assert derived.yo == 'dogg'
220
+ assert derived.yodogg() == "I heard you like"
221
+ assert derived.nodogg() is None
222
+ ```
202
223
 
203
224
  … see that? just by subclassing [`clu.importing.base.Module`][clu.importing.base] you can create something
204
225
  instantly importable. Awesome, wouldn’t you say? I would say. We’re working out the best way to create the
@@ -214,7 +235,9 @@ So do have a look around. Here’s an abridged breakdown of some things within:
214
235
 
215
236
  [`clu.scripts`][clu.scripts] contains a [“repl.py”][clu.scripts.repl] file, which is meant to be loaded into an interactive interpreter like e.g.:
216
237
 
217
- $ bpython -i «PATH_TO_CLU»/clu/scripts/repl.py
238
+ ```bash
239
+ $ bpython -i «PATH_TO_CLU»/clu/scripts/repl.py
240
+ ```
218
241
 
219
242
  … which will set all of CLU up for you to use interactively. N.B. if you have your own script you want to include
220
243
  but stil want to use CLU, you can set the `CLU_USER_SCRIPT` environment variable to the path to your own script,
@@ -235,6 +258,34 @@ So do have a look around. Here’s an abridged breakdown of some things within:
235
258
  there at the end. ALSO, there are additional useful types, from Python’s standard library and common packages,
236
259
  in the [`types` namespace][clu.typespace.namespace]. YOU’RE WELCOME!!
237
260
 
261
+ * [`enums`][clu.enums]: Furnishes `alias(…)` – which, spoiler alert, let you create aliases within your enums!
262
+ Oh yes. Like so:
263
+
264
+ ```python
265
+
266
+ from clu.enums import alias
267
+
268
+ @unique
269
+ class Numbers(Enum):
270
+ ONE = 1
271
+ TWO = 2
272
+ THREE = 3
273
+ UNO = alias(ONE)
274
+ DOS = alias(TWO)
275
+ TRÉS = alias(THREE)
276
+
277
+ assert Numbers.ONE == Numbers.UNO
278
+ assert Numbers.TWO == Numbers.DOS
279
+ assert Numbers.THREE == Numbers.TRÉS
280
+
281
+ ```
282
+
283
+ … aaaaand BOOM, there you go! The `alias` members of an enum don’t show up when iterating the
284
+ enum’s members, so they’re for your convenience. For a fantastic CLUish real-life example, have a look at
285
+ the [`clu.repl.ansi`][clu.repl.ansi] module, and [the enums it defines][clu.repl.ansi.enums] – these use a metaclass
286
+ to line the enum’s standard members up with some predefined class attributes defined in a third-party module;
287
+ we use `alias(…)` to provide more obvious lexical aliases of these attributes. Yes!
288
+
238
289
  * [`dicts`][clu.dicts]: Functions and classes for wrangling [`dict`s][dicts] (and actually [`Mapping`][collections.abc.Mapping]
239
290
  and [`MutableMapping`][collections.abc.MutableMapping] descendants in general). There are ABCs for
240
291
  key/value/item views for your own mappings, a much better `ChainMap`, written from scratch and improving
@@ -244,29 +295,34 @@ So do have a look around. Here’s an abridged breakdown of some things within:
244
295
  * [`exporting`][clu.exporting]: This is kind of the heart of CLU. At the beginning of all internal CLU modules, you’ll find something
245
296
  using the `Exporter`, like this:
246
297
 
247
- from clu.exporting import Exporter
248
-
249
- exporter = Exporter(path=__file__)
250
- export = exporter.decorator()
298
+ ```python
299
+ from clu.exporting import Exporter
251
300
 
301
+ exporter = Exporter(path=__file__)
302
+ export = exporter.decorator()
303
+ ```
252
304
  … which I know, I know, the use of `__file__` there is kind of irritating. But that `exporter` instance is now
253
305
  registered with CLU, and whenever there’s a class or function you want made available outside the module,
254
306
  you can specify it like:
255
307
 
256
- @export
257
- def public_function():
258
- print("I’m so public")
259
-
260
- class PrivateAncestor:
261
- """ I’m more private, don’t play with me """
262
-
263
- @export
264
- class PublicThing(PrivateAncestor):
265
- """ I’m very public, indeed, and available """
308
+ ```python
309
+ @export
310
+ def public_function():
311
+ print("I’m so public")
312
+
313
+ class PrivateAncestor:
314
+ """ I’m more private, don’t play with me """
315
+
316
+ @export
317
+ class PublicThing(PrivateAncestor):
318
+ """ I’m very public, indeed, and available """
319
+ ```
266
320
 
267
321
  At the end of the module (but before your CLU tests, q.v. note _sub_.) you put:
268
322
 
269
- __all__, __dir__ = exporter.all_and_dir()
323
+ ```python
324
+ __all__, __dir__ = exporter.all_and_dir()
325
+ ```
270
326
 
271
327
  … which makes things clear what is public and what is private to consumers of your code, without messing
272
328
  around with underscore prefixes, which I find coarse, and vulgar. You’re not just labeling things for export,
@@ -277,8 +333,10 @@ So do have a look around. Here’s an abridged breakdown of some things within:
277
333
  For your own project, at some part in your code, all you have to do is: `from clu.exporting import ExporterBase`,
278
334
  and then subclass `ExporterBase` with your app’s name and base path. Like so:
279
335
 
280
- class Exporter(ExporterBase, basepath="/your/project", appname="MyProject"):
281
- pass
336
+ ```python
337
+ class Exporter(ExporterBase, basepath="/your/project", appname="MyProject"):
338
+ pass
339
+ ```
282
340
 
283
341
  … then import your own importer (or call it whatever you want) at the top of your own CLUish modules and
284
342
  instantiate per the example _supra_. See also [`clu.scripts.dictroast`][clu.scripts.dictroast] for other tricks your
@@ -288,38 +346,40 @@ So do have a look around. Here’s an abridged breakdown of some things within:
288
346
  [`pytest`][pytest-link] – all you have to do is, after your line assigning `__all__` and `__dir__` at the end
289
347
  of the module proper, something like:
290
348
 
291
- def test():
292
- from clu.testing.utils import inline
293
-
294
- @inline.precheck
295
- def before_everything_else():
296
- """ This function runs once before testing """
297
- # ...
298
-
299
- @inline
300
- def first_test():
301
- """ This test does one thing """
302
- # ...
303
-
304
- @inline
305
- def second_test():
306
- """ This test does another thing """
307
- # ...
308
-
309
- @inline.runif(something == something_else)
310
- def test_conditionally_run():
311
- """ This test only does something if `something` == `something_else` """
312
- # ...
313
-
314
- @inline.diagnostic
315
- def apres_testing():
316
- """ This function runs once after testing """
317
- # ...
318
-
319
- return inline.test(100)
320
-
321
- if __name__ == '__main__':
322
- sys.exit(test())
349
+ ```python
350
+ def test():
351
+ from clu.testing.utils import inline
352
+
353
+ @inline.precheck
354
+ def before_everything_else():
355
+ """ This function runs once before testing """
356
+ # ...
357
+
358
+ @inline
359
+ def first_test():
360
+ """ This test does one thing """
361
+ # ...
362
+
363
+ @inline
364
+ def second_test():
365
+ """ This test does another thing """
366
+ # ...
367
+
368
+ @inline.runif(something == something_else)
369
+ def test_conditionally_run():
370
+ """ This test only does something if `something` == `something_else` """
371
+ # ...
372
+
373
+ @inline.diagnostic
374
+ def apres_testing():
375
+ """ This function runs once after testing """
376
+ # ...
377
+
378
+ return inline.test(100)
379
+
380
+ if __name__ == '__main__':
381
+ sys.exit(test())
382
+ ```
323
383
 
324
384
  … running the module (with either `python -m yourapp.yourmodule` or, say, [Nox][nox-link]) will show
325
385
  you each tests’ output. But see that `return inline.test(100)` line? That integer argument tells
@@ -345,7 +405,9 @@ So do have a look around. Here’s an abridged breakdown of some things within:
345
405
  “qualified names” – for instance, you can use `naming.qualified_import(…)` to import a class [`CurveSet`][instakit.processors.curves.CurveSet]
346
406
  from its package [`instakit.processors.curves`][instakit.processors.curves] by doing:
347
407
 
348
- CurveSet = qualified_import('instakit.processors.curves.CurveSet')
408
+ ```python
409
+ CurveSet = qualified_import('instakit.processors.curves.CurveSet')
410
+ ```
349
411
 
350
412
  … which that may be handier for you than composing and hard-coding an `import` statement. See also the
351
413
  `nameof(…)` and `moduleof(…)` functions, and the utility functions (e.g. `qualified_name(…)`) and
@@ -456,6 +518,7 @@ So do have a look around. Here’s an abridged breakdown of some things within:
456
518
 
457
519
  [clu.repl]: https://github.com/fish2000/CLU/tree/master/clu/repl
458
520
  [clu.repl.ansi]: https://github.com/fish2000/CLU/tree/master/clu/repl/ansi.py
521
+ [clu.repl.ansi.enums]: https://github.com/fish2000/CLU/blob/c5be3edcea7774b0d042b13125458fef6bd8a303/clu/repl/ansi.py#L150-L222
459
522
  [clu.repl.banners]: https://github.com/fish2000/CLU/tree/master/clu/repl/banners.py
460
523
  [clu.repl.columnize]: https://github.com/fish2000/CLU/tree/master/clu/repl/columnize.py
461
524
  [clu.repl.modules]: https://github.com/fish2000/CLU/tree/master/clu/repl/modules.py