python-clu 0.12.15__tar.gz → 0.12.17__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 (288) hide show
  1. {python_clu-0.12.15 → python_clu-0.12.17}/.bumpversion.toml +1 -1
  2. {python_clu-0.12.15 → python_clu-0.12.17}/CHANGELOG.md +103 -1
  3. {python_clu-0.12.15 → python_clu-0.12.17}/PKG-INFO +10 -11
  4. python_clu-0.12.17/clu/__version__.py +1 -0
  5. {python_clu-0.12.15 → python_clu-0.12.17}/clu/abstract.py +11 -1
  6. {python_clu-0.12.15 → python_clu-0.12.17}/clu/config/abc.py +25 -9
  7. {python_clu-0.12.15 → python_clu-0.12.17}/clu/config/env.py +5 -11
  8. {python_clu-0.12.15 → python_clu-0.12.17}/clu/config/filebase.py +2 -4
  9. {python_clu-0.12.15 → python_clu-0.12.17}/clu/config/keymap.py +8 -18
  10. {python_clu-0.12.15 → python_clu-0.12.17}/clu/dicts.py +1 -4
  11. {python_clu-0.12.15 → python_clu-0.12.17}/clu/enums.py +3 -1
  12. {python_clu-0.12.15 → python_clu-0.12.17}/clu/exporting.py +8 -7
  13. {python_clu-0.12.15 → python_clu-0.12.17}/clu/fs/sourcetree.py +2 -4
  14. {python_clu-0.12.15 → python_clu-0.12.17}/clu/importing/base.py +1 -4
  15. {python_clu-0.12.15 → python_clu-0.12.17}/clu/predicates.py +1 -4
  16. {python_clu-0.12.15 → python_clu-0.12.17}/clu/repl/ansi.py +16 -8
  17. {python_clu-0.12.15 → python_clu-0.12.17}/clu/repl/cli/ansidocs.py +1 -3
  18. {python_clu-0.12.15 → python_clu-0.12.17}/clu/repl/cli/boilerplate_copy.py +3 -5
  19. {python_clu-0.12.15 → python_clu-0.12.17}/clu/scripts/legacy/repl-bpython.py +0 -10
  20. {python_clu-0.12.15 → python_clu-0.12.17}/clu/scripts/repl.py +1 -2
  21. {python_clu-0.12.15 → python_clu-0.12.17}/clu/scripts/treeline.py +8 -11
  22. {python_clu-0.12.15 → python_clu-0.12.17}/clu/testing/utils.py +2 -2
  23. {python_clu-0.12.15 → python_clu-0.12.17}/clu/typespace/namespace.py +2 -4
  24. {python_clu-0.12.15 → python_clu-0.12.17}/clu/typology.py +1 -5
  25. {python_clu-0.12.15 → python_clu-0.12.17}/noxfile.py +6 -3
  26. {python_clu-0.12.15 → python_clu-0.12.17}/pyproject.toml +10 -8
  27. {python_clu-0.12.15 → python_clu-0.12.17}/python_clu.egg-info/PKG-INFO +10 -11
  28. {python_clu-0.12.15 → python_clu-0.12.17}/python_clu.egg-info/requires.txt +1 -3
  29. python_clu-0.12.17/python_clu.egg-info/zip-safe +1 -0
  30. {python_clu-0.12.15 → python_clu-0.12.17}/requirements/install.txt +0 -2
  31. python_clu-0.12.17/requirements/nox/pyproject.txt +5 -0
  32. {python_clu-0.12.15 → python_clu-0.12.17}/requirements/nox/repl.txt +1 -2
  33. {python_clu-0.12.15 → python_clu-0.12.17}/requirements/nox/tests.txt +1 -1
  34. {python_clu-0.12.15 → python_clu-0.12.17}/setup.py +1 -1
  35. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_config.py +1 -1
  36. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_repl_modules.py +3 -1
  37. python_clu-0.12.15/clu/__version__.py +0 -1
  38. python_clu-0.12.15/python_clu.egg-info/top_level.txt +0 -1
  39. python_clu-0.12.15/requirements/nox/pyproject.txt +0 -4
  40. {python_clu-0.12.15 → python_clu-0.12.17}/.coveragerc +0 -0
  41. {python_clu-0.12.15 → python_clu-0.12.17}/.editorconfig +0 -0
  42. {python_clu-0.12.15 → python_clu-0.12.17}/.gitchangelog.rc +0 -0
  43. {python_clu-0.12.15 → python_clu-0.12.17}/.gitignore +0 -0
  44. {python_clu-0.12.15 → python_clu-0.12.17}/.landscape.yml +0 -0
  45. {python_clu-0.12.15 → python_clu-0.12.17}/.travis.yml +0 -0
  46. {python_clu-0.12.15 → python_clu-0.12.17}/ABOUT.md +0 -0
  47. {python_clu-0.12.15 → python_clu-0.12.17}/CLASSIFIERS.txt +0 -0
  48. {python_clu-0.12.15 → python_clu-0.12.17}/CLU_Treatment.md +0 -0
  49. {python_clu-0.12.15 → python_clu-0.12.17}/CODE_OF_CONDUCT.md +0 -0
  50. {python_clu-0.12.15 → python_clu-0.12.17}/LICENSE.txt +0 -0
  51. {python_clu-0.12.15 → python_clu-0.12.17}/MANIFEST.in +0 -0
  52. {python_clu-0.12.15 → python_clu-0.12.17}/Makefile +0 -0
  53. {python_clu-0.12.15 → python_clu-0.12.17}/README.md +0 -0
  54. {python_clu-0.12.15 → python_clu-0.12.17}/appveyor.yml +0 -0
  55. {python_clu-0.12.15 → python_clu-0.12.17}/clu/__init__.py +0 -0
  56. {python_clu-0.12.15 → python_clu-0.12.17}/clu/__main__.py +0 -0
  57. {python_clu-0.12.15 → python_clu-0.12.17}/clu/all.py +0 -0
  58. {python_clu-0.12.15 → python_clu-0.12.17}/clu/api/__init__.py +0 -0
  59. {python_clu-0.12.15 → python_clu-0.12.17}/clu/api/__main__.py +0 -0
  60. {python_clu-0.12.15 → python_clu-0.12.17}/clu/application.py +0 -0
  61. {python_clu-0.12.15 → python_clu-0.12.17}/clu/compilation/__init__.py +0 -0
  62. {python_clu-0.12.15 → python_clu-0.12.17}/clu/compilation/compiledb.py +0 -0
  63. {python_clu-0.12.15 → python_clu-0.12.17}/clu/compilation/macros.py +0 -0
  64. {python_clu-0.12.15 → python_clu-0.12.17}/clu/config/__init__.py +0 -0
  65. {python_clu-0.12.15 → python_clu-0.12.17}/clu/config/codecs.py +0 -0
  66. {python_clu-0.12.15 → python_clu-0.12.17}/clu/config/formats/__init__.py +0 -0
  67. {python_clu-0.12.15 → python_clu-0.12.17}/clu/config/formats/jsonfile.py +0 -0
  68. {python_clu-0.12.15 → python_clu-0.12.17}/clu/config/formats/picklefile.py +0 -0
  69. {python_clu-0.12.15 → python_clu-0.12.17}/clu/config/formats/tomlfile.py +0 -0
  70. {python_clu-0.12.15 → python_clu-0.12.17}/clu/config/formats/yamlfile.py +0 -0
  71. {python_clu-0.12.15 → python_clu-0.12.17}/clu/config/keymaputils.py +0 -0
  72. {python_clu-0.12.15 → python_clu-0.12.17}/clu/config/keymapview.py +0 -0
  73. {python_clu-0.12.15 → python_clu-0.12.17}/clu/config/legacy/__init__.py +0 -0
  74. {python_clu-0.12.15 → python_clu-0.12.17}/clu/config/legacy/base.py +0 -0
  75. {python_clu-0.12.15 → python_clu-0.12.17}/clu/config/legacy/fieldtypes.py +0 -0
  76. {python_clu-0.12.15 → python_clu-0.12.17}/clu/config/legacy/settings.py +0 -0
  77. {python_clu-0.12.15 → python_clu-0.12.17}/clu/config/ns.py +0 -0
  78. {python_clu-0.12.15 → python_clu-0.12.17}/clu/config/proxy.py +0 -0
  79. {python_clu-0.12.15 → python_clu-0.12.17}/clu/constants/__init__.py +0 -0
  80. {python_clu-0.12.15 → python_clu-0.12.17}/clu/constants/__main__.py +0 -0
  81. {python_clu-0.12.15 → python_clu-0.12.17}/clu/constants/consts.py +0 -0
  82. {python_clu-0.12.15 → python_clu-0.12.17}/clu/constants/data.py +0 -0
  83. {python_clu-0.12.15 → python_clu-0.12.17}/clu/constants/enums.py +0 -0
  84. {python_clu-0.12.15 → python_clu-0.12.17}/clu/constants/exceptions.py +0 -0
  85. {python_clu-0.12.15 → python_clu-0.12.17}/clu/constants/polyfills.py +0 -0
  86. {python_clu-0.12.15 → python_clu-0.12.17}/clu/csv.py +0 -0
  87. {python_clu-0.12.15 → python_clu-0.12.17}/clu/dispatch.py +0 -0
  88. {python_clu-0.12.15 → python_clu-0.12.17}/clu/extending.py +0 -0
  89. {python_clu-0.12.15 → python_clu-0.12.17}/clu/fs/__init__.py +0 -0
  90. {python_clu-0.12.15 → python_clu-0.12.17}/clu/fs/abc.py +0 -0
  91. {python_clu-0.12.15 → python_clu-0.12.17}/clu/fs/appdirectories.py +0 -0
  92. {python_clu-0.12.15 → python_clu-0.12.17}/clu/fs/filesystem.py +0 -0
  93. {python_clu-0.12.15 → python_clu-0.12.17}/clu/fs/misc.py +0 -0
  94. {python_clu-0.12.15 → python_clu-0.12.17}/clu/fs/pypath.py +0 -0
  95. {python_clu-0.12.15 → python_clu-0.12.17}/clu/importing/__init__.py +0 -0
  96. {python_clu-0.12.15 → python_clu-0.12.17}/clu/importing/__main__.py +0 -0
  97. {python_clu-0.12.15 → python_clu-0.12.17}/clu/importing/proxy.py +0 -0
  98. {python_clu-0.12.15 → python_clu-0.12.17}/clu/keyvalue.py +0 -0
  99. {python_clu-0.12.15 → python_clu-0.12.17}/clu/mathematics.py +0 -0
  100. {python_clu-0.12.15 → python_clu-0.12.17}/clu/naming.py +0 -0
  101. {python_clu-0.12.15 → python_clu-0.12.17}/clu/repl/__init__.py +0 -0
  102. {python_clu-0.12.15 → python_clu-0.12.17}/clu/repl/banners.py +0 -0
  103. {python_clu-0.12.15 → python_clu-0.12.17}/clu/repl/cli/__init__.py +0 -0
  104. {python_clu-0.12.15 → python_clu-0.12.17}/clu/repl/cli/boilerplate.py +0 -0
  105. {python_clu-0.12.15 → python_clu-0.12.17}/clu/repl/cli/print_version.py +0 -0
  106. {python_clu-0.12.15 → python_clu-0.12.17}/clu/repl/columnize.py +0 -0
  107. {python_clu-0.12.15 → python_clu-0.12.17}/clu/repl/modules.py +0 -0
  108. {python_clu-0.12.15 → python_clu-0.12.17}/clu/repr.py +0 -0
  109. {python_clu-0.12.15 → python_clu-0.12.17}/clu/sanitizer.py +0 -0
  110. {python_clu-0.12.15 → python_clu-0.12.17}/clu/scripts/.gitignore +0 -0
  111. {python_clu-0.12.15 → python_clu-0.12.17}/clu/scripts/README.md +0 -0
  112. {python_clu-0.12.15 → python_clu-0.12.17}/clu/scripts/__init__.py +0 -0
  113. {python_clu-0.12.15 → python_clu-0.12.17}/clu/scripts/ansicolors.py +0 -0
  114. {python_clu-0.12.15 → python_clu-0.12.17}/clu/scripts/boilerplate.py +0 -0
  115. {python_clu-0.12.15 → python_clu-0.12.17}/clu/scripts/dictroast.py +0 -0
  116. {python_clu-0.12.15 → python_clu-0.12.17}/clu/scripts/legacy/forkumask.py +0 -0
  117. {python_clu-0.12.15 → python_clu-0.12.17}/clu/scripts/legacy/repl-ipython.py +0 -0
  118. {python_clu-0.12.15 → python_clu-0.12.17}/clu/scripts/legacy/repl-ptpython.py +0 -0
  119. {python_clu-0.12.15 → python_clu-0.12.17}/clu/scripts/legacy/repl-pyzo.py +0 -0
  120. {python_clu-0.12.15 → python_clu-0.12.17}/clu/scripts/legacy/xdg-runtime.py +0 -0
  121. {python_clu-0.12.15 → python_clu-0.12.17}/clu/scripts/prediversus.py +0 -0
  122. {python_clu-0.12.15 → python_clu-0.12.17}/clu/shelving/__init__.py +0 -0
  123. {python_clu-0.12.15 → python_clu-0.12.17}/clu/shelving/redat.py +0 -0
  124. {python_clu-0.12.15 → python_clu-0.12.17}/clu/shelving/redis.conf +0 -0
  125. {python_clu-0.12.15 → python_clu-0.12.17}/clu/stdio.py +0 -0
  126. {python_clu-0.12.15 → python_clu-0.12.17}/clu/testing/__init__.py +0 -0
  127. {python_clu-0.12.15 → python_clu-0.12.17}/clu/testing/hook.py +0 -0
  128. {python_clu-0.12.15 → python_clu-0.12.17}/clu/testing/obsolete.py +0 -0
  129. {python_clu-0.12.15 → python_clu-0.12.17}/clu/testing/pytest.py +0 -0
  130. {python_clu-0.12.15 → python_clu-0.12.17}/clu/trie.py +0 -0
  131. {python_clu-0.12.15 → python_clu-0.12.17}/clu/typespace/__init__.py +0 -0
  132. {python_clu-0.12.15 → python_clu-0.12.17}/clu/typespace/__main__.py +0 -0
  133. {python_clu-0.12.15 → python_clu-0.12.17}/clu/version/__init__.py +0 -0
  134. {python_clu-0.12.15 → python_clu-0.12.17}/clu/version/__main__.py +0 -0
  135. {python_clu-0.12.15 → python_clu-0.12.17}/clu/version/git_version.py +0 -0
  136. {python_clu-0.12.15 → python_clu-0.12.17}/clu/version/read_version.py +0 -0
  137. {python_clu-0.12.15 → python_clu-0.12.17}/codecov.yml +0 -0
  138. {python_clu-0.12.15 → python_clu-0.12.17}/conftest.py +0 -0
  139. {python_clu-0.12.15 → python_clu-0.12.17}/docs/.DS_Store +0 -0
  140. {python_clu-0.12.15 → python_clu-0.12.17}/docs/Makefile +0 -0
  141. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/doctrees/api.doctree +0 -0
  142. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/doctrees/environment.pickle +0 -0
  143. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/doctrees/generated/clu.doctree +0 -0
  144. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/doctrees/index.doctree +0 -0
  145. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/.buildinfo +0 -0
  146. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_sources/api.rst.txt +0 -0
  147. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_sources/generated/clu.rst.txt +0 -0
  148. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_sources/index.rst.txt +0 -0
  149. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/_sphinx_javascript_frameworks_compat.js +0 -0
  150. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/alabaster.css +0 -0
  151. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/basic.css +0 -0
  152. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/css/badge_only.css +0 -0
  153. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  154. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  155. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  156. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  157. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  158. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/css/fonts/fontawesome-webfont.svg +0 -0
  159. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  160. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  161. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  162. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
  163. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  164. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/css/fonts/lato-bold.woff +0 -0
  165. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/css/fonts/lato-bold.woff2 +0 -0
  166. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
  167. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  168. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/css/fonts/lato-normal.woff +0 -0
  169. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/css/fonts/lato-normal.woff2 +0 -0
  170. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/css/theme.css +0 -0
  171. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/custom.css +0 -0
  172. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/doctools.js +0 -0
  173. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/documentation_options.js +0 -0
  174. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/file.png +0 -0
  175. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/jquery-3.6.0.js +0 -0
  176. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/jquery.js +0 -0
  177. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/js/badge_only.js +0 -0
  178. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/js/html5shiv-printshiv.min.js +0 -0
  179. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/js/html5shiv.min.js +0 -0
  180. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/js/theme.js +0 -0
  181. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/language_data.js +0 -0
  182. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/minus.png +0 -0
  183. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/plus.png +0 -0
  184. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/pygments.css +0 -0
  185. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/searchtools.js +0 -0
  186. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/underscore-1.13.1.js +0 -0
  187. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/_static/underscore.js +0 -0
  188. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/api.html +0 -0
  189. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/generated/clu.html +0 -0
  190. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/genindex.html +0 -0
  191. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/index.html +0 -0
  192. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/objects.inv +0 -0
  193. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/py-modindex.html +0 -0
  194. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/search.html +0 -0
  195. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/html/searchindex.js +0 -0
  196. {python_clu-0.12.15 → python_clu-0.12.17}/docs/build/man/clu.1 +0 -0
  197. {python_clu-0.12.15 → python_clu-0.12.17}/docs/make.bat +0 -0
  198. {python_clu-0.12.15 → python_clu-0.12.17}/docs/source/api.rst +0 -0
  199. {python_clu-0.12.15 → python_clu-0.12.17}/docs/source/conf.py +0 -0
  200. {python_clu-0.12.15 → python_clu-0.12.17}/docs/source/generated/clu.rst +0 -0
  201. {python_clu-0.12.15 → python_clu-0.12.17}/docs/source/index.rst +0 -0
  202. {python_clu-0.12.15 → python_clu-0.12.17}/hooks/autohook.sh +0 -0
  203. {python_clu-0.12.15 → python_clu-0.12.17}/hooks/post-push/00-coverage.sh +0 -0
  204. {python_clu-0.12.15 → python_clu-0.12.17}/hooks/pre-push/00-noop.sh +0 -0
  205. {python_clu-0.12.15 → python_clu-0.12.17}/hooks/pre-push/01-direnv-stdlib.sh +0 -0
  206. {python_clu-0.12.15 → python_clu-0.12.17}/hooks/scripts/coverage.sh +0 -0
  207. {python_clu-0.12.15 → python_clu-0.12.17}/hooks/scripts/display-issues.sh +0 -0
  208. {python_clu-0.12.15 → python_clu-0.12.17}/hooks/scripts/git-pushex +0 -0
  209. {python_clu-0.12.15 → python_clu-0.12.17}/hooks/scripts/noop.sh +0 -0
  210. {python_clu-0.12.15 → python_clu-0.12.17}/mypy.ini +0 -0
  211. {python_clu-0.12.15 → python_clu-0.12.17}/pytest.ini +0 -0
  212. {python_clu-0.12.15 → python_clu-0.12.17}/python_clu.egg-info/SOURCES.txt +0 -0
  213. {python_clu-0.12.15 → python_clu-0.12.17}/python_clu.egg-info/dependency_links.txt +0 -0
  214. {python_clu-0.12.15 → python_clu-0.12.17}/python_clu.egg-info/entry_points.txt +0 -0
  215. /python_clu-0.12.15/python_clu.egg-info/zip-safe → /python_clu-0.12.17/python_clu.egg-info/top_level.txt +0 -0
  216. {python_clu-0.12.15 → python_clu-0.12.17}/pytype.cfg +0 -0
  217. {python_clu-0.12.15 → python_clu-0.12.17}/requirements/changelog.txt +0 -0
  218. {python_clu-0.12.15 → python_clu-0.12.17}/requirements/dev.txt +0 -0
  219. {python_clu-0.12.15 → python_clu-0.12.17}/requirements/docs.txt +0 -0
  220. {python_clu-0.12.15 → python_clu-0.12.17}/requirements/nox/codecov.txt +0 -0
  221. {python_clu-0.12.15 → python_clu-0.12.17}/requirements/nox/docs.txt +0 -0
  222. {python_clu-0.12.15 → python_clu-0.12.17}/requirements/nox/manifest.txt +0 -0
  223. {python_clu-0.12.15 → python_clu-0.12.17}/requirements/tox.txt +0 -0
  224. {python_clu-0.12.15 → python_clu-0.12.17}/requirements/typecheck.txt +0 -0
  225. {python_clu-0.12.15 → python_clu-0.12.17}/scratch/direnv_transformed_env.py +0 -0
  226. {python_clu-0.12.15 → python_clu-0.12.17}/scratch/images/clu-module-list-example-small.jpg +0 -0
  227. {python_clu-0.12.15 → python_clu-0.12.17}/scratch/images/clu-module-list-example.jpg +0 -0
  228. {python_clu-0.12.15 → python_clu-0.12.17}/scratch/images/clu-module-list-example.pxd +0 -0
  229. {python_clu-0.12.15 → python_clu-0.12.17}/scratch/images/clu-testing-time-totals-example-small.jpg +0 -0
  230. {python_clu-0.12.15 → python_clu-0.12.17}/scratch/images/clu-testing-time-totals-example.jpg +0 -0
  231. {python_clu-0.12.15 → python_clu-0.12.17}/scratch/images/clu-testing-time-totals-example.pxd +0 -0
  232. {python_clu-0.12.15 → python_clu-0.12.17}/scratch/images/construx-and-capsela-small.jpg +0 -0
  233. {python_clu-0.12.15 → python_clu-0.12.17}/scratch/images/construx-and-capsela.jpg +0 -0
  234. {python_clu-0.12.15 → python_clu-0.12.17}/scratch/images/construx-and-capsela.pxd +0 -0
  235. {python_clu-0.12.15 → python_clu-0.12.17}/scratch/images/moira.png +0 -0
  236. {python_clu-0.12.15 → python_clu-0.12.17}/scratch/images/toml-module-rant.jpg +0 -0
  237. {python_clu-0.12.15 → python_clu-0.12.17}/scratch/inline-tests-ImportError-uggggh.ipynb +0 -0
  238. {python_clu-0.12.15 → python_clu-0.12.17}/scratch/nteract.ipynb +0 -0
  239. {python_clu-0.12.15 → python_clu-0.12.17}/setup.cfg +0 -0
  240. {python_clu-0.12.15 → python_clu-0.12.17}/tests/__init__.py +0 -0
  241. {python_clu-0.12.15 → python_clu-0.12.17}/tests/data/1-58.jpg +0 -0
  242. {python_clu-0.12.15 → python_clu-0.12.17}/tests/data/3471426989_aa8e83cac5_o.jpg +0 -0
  243. {python_clu-0.12.15 → python_clu-0.12.17}/tests/data/3472236406_1fbf1a567d_o.jpg +0 -0
  244. {python_clu-0.12.15 → python_clu-0.12.17}/tests/data/8600JC.jpg +0 -0
  245. {python_clu-0.12.15 → python_clu-0.12.17}/tests/data/8ba.png +0 -0
  246. {python_clu-0.12.15 → python_clu-0.12.17}/tests/data/IMG_20180505_205153567.jpg +0 -0
  247. {python_clu-0.12.15 → python_clu-0.12.17}/tests/data/cheetah-003.jpg +0 -0
  248. {python_clu-0.12.15 → python_clu-0.12.17}/tests/data/config/clu-config.toml +0 -0
  249. {python_clu-0.12.15 → python_clu-0.12.17}/tests/data/config/yodogg.toml +0 -0
  250. {python_clu-0.12.15 → python_clu-0.12.17}/tests/data/shutterstock_90194617.jpg +0 -0
  251. {python_clu-0.12.15 → python_clu-0.12.17}/tests/data/yodata/09163d51421853.5608b3c2a1be0.jpg +0 -0
  252. {python_clu-0.12.15 → python_clu-0.12.17}/tests/data/yodata/5d0227342500004e12e3506d.jpg +0 -0
  253. {python_clu-0.12.15 → python_clu-0.12.17}/tests/data/yodata/BlackCat2_large-22.jpg +0 -0
  254. {python_clu-0.12.15 → python_clu-0.12.17}/tests/data/yodogg/Serval_Cat_Kitten-706.jpg +0 -0
  255. {python_clu-0.12.15 → python_clu-0.12.17}/tests/data/yodogg/Servals_Thoiry_19801.jpg +0 -0
  256. {python_clu-0.12.15 → python_clu-0.12.17}/tests/data/yodogg/video-pride-serval.jpg +0 -0
  257. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_abstract.py +0 -0
  258. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_all.py +0 -0
  259. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_boilerplate.py +0 -0
  260. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_config_abc.py +0 -0
  261. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_csv.py +0 -0
  262. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_dicts.py +0 -0
  263. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_dispatch.py +0 -0
  264. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_enum_aliases.py +0 -0
  265. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_exporting.py +0 -0
  266. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_extending.py +0 -0
  267. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_fs_abc.py +0 -0
  268. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_fs_appdirectories.py +0 -0
  269. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_fs_filesystem.py +0 -0
  270. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_fs_misc.py +0 -0
  271. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_importing.py +0 -0
  272. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_keyvalue.py +0 -0
  273. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_mathematics.py +0 -0
  274. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_naming.py +0 -0
  275. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_predicates.py +0 -0
  276. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_repl_columnize.py +0 -0
  277. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_repr.py +0 -0
  278. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_scripts_repl.py +0 -0
  279. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_typespace_namespace.py +0 -0
  280. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_typology.py +0 -0
  281. {python_clu-0.12.15 → python_clu-0.12.17}/tests/test_version.py +0 -0
  282. {python_clu-0.12.15 → python_clu-0.12.17}/tests/yodogg/.tm_properties +0 -0
  283. {python_clu-0.12.15 → python_clu-0.12.17}/tests/yodogg/__init__.py +0 -0
  284. {python_clu-0.12.15 → python_clu-0.12.17}/tests/yodogg/yodogg/__init__.py +0 -0
  285. {python_clu-0.12.15 → python_clu-0.12.17}/tests/yodogg/yodogg/config.py +0 -0
  286. {python_clu-0.12.15 → python_clu-0.12.17}/tests/yodogg/yodogg/exporting.py +0 -0
  287. {python_clu-0.12.15 → python_clu-0.12.17}/tests/yodogg/yodogg/iheard.py +0 -0
  288. {python_clu-0.12.15 → python_clu-0.12.17}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
 
2
2
  [tool.bumpversion]
3
- current_version = "0.12.15"
3
+ current_version = "0.12.17"
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,105 @@
1
1
  # Changelog
2
2
 
3
3
 
4
- ## 0.12.14:pre29+g3c4002c [SNAPSHOT]
4
+ ## 0.12.16:pre10+gf42970e [SNAPSHOT]
5
+
6
+ ### Fix
7
+
8
+ * Fixed “include” segment in `pyproject.toml` [Alexander Böhn]
9
+
10
+ ### Add
11
+
12
+ * Added a license URL to `pyproject.toml` [Alexander Böhn]
13
+
14
+ ### Other
15
+
16
+ * Moving around the “xerox” dependency. [Alexander Böhn]
17
+
18
+ * Trying not to have to build anything upon install. [Alexander Böhn]
19
+
20
+ * Brushing up some command-endpoint-related stuff. [Alexander Böhn]
21
+
22
+ * Making the `pyproject.toml` validator moew OCD-ish. [Alexander Böhn]
23
+
24
+ … we install an external bundle of other schemas people have made
25
+ for this validator (which thank fuck someone else did this, it
26
+ has to be the boringest thing in the world to write these things
27
+ in, like, my opinion – more power to those who feel otherwise).
28
+
29
+ * Finally got the `nox` behavior for which I was looking. [Alexander Böhn]
30
+
31
+ … just didn’t want to run `coverage` by default, is all, ah.
32
+
33
+ * Capitalized key names in `project.urls`, within `pyproject.toml` [Alexander Böhn]
34
+
35
+ * Didn’t need •that• anymore. [Alexander Böhn]
36
+
37
+ … a minor dead-code cleanup.
38
+
39
+
40
+ ## v0.12.16 (2025-08-27)
41
+
42
+ ### Tweaks
43
+
44
+ * Tweaked many things, in the name of speeeeeed. [Alexander Böhn]
45
+
46
+ ### Add
47
+
48
+ * Added a missing __slots__ attribute to some abstract classes. [Alexander Böhn]
49
+
50
+ … dunno if that was possibly causing issues, but you never know
51
+
52
+ ### Remove
53
+
54
+ * Removed several more gratuitous error-checks on initialization. [Alexander Böhn]
55
+
56
+ … these are all those that look for TypeErrors in “__init__(…)” or
57
+ “__new__(…)” methods. Best to do without, so far, yes.
58
+
59
+ * Removed the vestigial “more-itertools” package requirement. [Alexander Böhn]
60
+
61
+ * Removed the “six” package requirement. [Alexander Böhn]
62
+
63
+ … yaaaaaay!
64
+
65
+ ### Other
66
+
67
+ * Bumped version: 0.12.15 → 0.12.16. [Alexander Böhn]
68
+
69
+ * [make] Changelog updated @ 3ba5ee3. [Alexander Böhn]
70
+
71
+ * Miscellany. [Alexander Böhn]
72
+
73
+ … some kwarg-passing here, some import-trimming there. NBD.
74
+
75
+ * This should be the last of the problematic initializer error-checks. [Alexander Böhn]
76
+
77
+ * Killed dead code. [Alexander Böhn]
78
+
79
+ * Simplified more initializers. [Alexander Böhn]
80
+
81
+ * Simplified `clu.config.keymap.FrozenFlat.__init__(…)`’s `super()` call. [Alexander Böhn]
82
+
83
+ … I have this weird habit of catchint TypeErrors whenever I do a
84
+ “super().__init__(…)” call, because I originally wanted to work
85
+ around some fucked-up PyPy3 bug that necessitated doing that,
86
+ basically. But it’s dumb and probably hiding real problems, so
87
+ let’s no longer do that. Yes.
88
+
89
+ * Updated the `clu.repl.ansi` enums to use `clu.abstract.Appreciative` [Alexander Böhn]
90
+
91
+ … The base type was using a really clumsy “is_ansi(…)” class method
92
+ to do this – that exact same clumsy function is now an offical
93
+ “appreciates(…)” method (see the ABC in question!) and the call
94
+ sites have been updated accordingly too. Now all that needs to
95
+ happen is the method itself has to get totally rewritten. Yes!
96
+
97
+ * A very small update. [Alexander Böhn]
98
+
99
+ … allegedly, “{}” creates an empty dict faster than “dict()” does
100
+
101
+
102
+ ## v0.12.15 (2025-07-06)
5
103
 
6
104
  ### New
7
105
 
@@ -48,6 +146,10 @@
48
146
 
49
147
  ### Other
50
148
 
149
+ * Bumped version: 0.12.14 → 0.12.15. [Alexander Böhn]
150
+
151
+ * [make] Changelog updated @ 3c4002c. [Alexander Böhn]
152
+
51
153
  * That inline test was better as a precheck function. [Alexander Böhn]
52
154
 
53
155
  * Got `clu.config.codecs` working with annotated dicts. [Alexander Böhn]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-clu
3
- Version: 0.12.15
3
+ Version: 0.12.17
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
@@ -8,13 +8,14 @@ Author: Alexander Böhn
8
8
  Author-email: Alexander Böhn <fish2000@gmail.com>
9
9
  Maintainer-email: Alexander Böhn <fish2000@gmail.com>
10
10
  License-Expression: LicenseRef-CLU-MIT
11
- Project-URL: homepage, https://github.com/fish2000/CLU
12
- Project-URL: repository, https://github.com/fish2000/CLU
13
- Project-URL: documentation, https://github.com/fish2000/CLU/blob/master/README.md
14
- Project-URL: source, https://github.com/fish2000/CLU
15
- Project-URL: tracker, https://github.com/fish2000/CLU/issues
16
- Project-URL: changelog, https://github.com/fish2000/CLU/blob/master/CHANGELOG.md
17
- Project-URL: download, https://pypi.org/project/python-clu/
11
+ Project-URL: Homepage, https://github.com/fish2000/CLU
12
+ Project-URL: Repository, https://github.com/fish2000/CLU
13
+ Project-URL: Documentation, https://github.com/fish2000/CLU/blob/master/README.md
14
+ Project-URL: Source, https://github.com/fish2000/CLU
15
+ Project-URL: Tracker, https://github.com/fish2000/CLU/issues
16
+ Project-URL: Changelog, https://github.com/fish2000/CLU/blob/master/CHANGELOG.md
17
+ Project-URL: Download, https://pypi.org/project/python-clu/
18
+ Project-URL: License, https://github.com/fish2000/CLU/blob/master/LICENSE.txt
18
19
  Keywords: testing,command,command-line,utilities,modules,REPL,tools
19
20
  Platform: any
20
21
  Classifier: Development Status :: 5 - Production/Stable
@@ -42,7 +43,6 @@ Requires-Dist: enum34>=1.1.0; python_version < "3.4"
42
43
  Requires-Dist: humanize>=1.0.0
43
44
  Requires-Dist: importlib-metadata>=1.4.0; python_version < "3.8"
44
45
  Requires-Dist: mock>=4.0.0
45
- Requires-Dist: more_itertools>=8.0.0
46
46
  Requires-Dist: multidict>=4.7.0
47
47
  Requires-Dist: packaging
48
48
  Requires-Dist: pout>=0.8.13
@@ -50,17 +50,16 @@ Requires-Dist: pygments>=2.0.0
50
50
  Requires-Dist: PyYAML>=5.3.0
51
51
  Requires-Dist: redis>=3.4.0
52
52
  Requires-Dist: setuptools>=30.0.0
53
- Requires-Dist: six>=1.10.0
54
53
  Requires-Dist: toml>=0.10.0
55
54
  Requires-Dist: tomli>=2.2.0
56
55
  Requires-Dist: tomli_w>=1.2.0
57
56
  Requires-Dist: wheel>=0.34.0
58
57
  Requires-Dist: zict>=0.1.2
59
58
  Provides-Extra: all
60
- Requires-Dist: more_itertools>=8.0.0; extra == "all"
61
59
  Requires-Dist: numpy>=1.17.0; extra == "all"
62
60
  Requires-Dist: Pillow>=7.1.0; extra == "all"
63
61
  Requires-Dist: pytest>=5.4.0; extra == "all"
62
+ Requires-Dist: xerox>=0.4.0; extra == "all"
64
63
  Requires-Dist: zipp>=2.0.0; extra == "all"
65
64
  Dynamic: author
66
65
  Dynamic: download-url
@@ -0,0 +1 @@
1
+ __version__ = '0.12.17'
@@ -118,7 +118,6 @@ class Appreciative(abc.ABC):
118
118
  class will assume that classes will appreciate… something
119
119
  like that. OK? OK.
120
120
  """
121
-
122
121
  __slots__ = tuple()
123
122
 
124
123
  @classmethod
@@ -126,6 +125,13 @@ class Appreciative(abc.ABC):
126
125
  def appreciates(cls, instance):
127
126
  """ Boolean, tests if the class “appreciates” an instance """
128
127
  ...
128
+
129
+ @classmethod
130
+ def __subclasshook__(cls, subcls):
131
+ if cls is Appreciative:
132
+ appreciates = getattr(subcls, 'appreciates', None)
133
+ return callable(appreciates)
134
+ return NotImplemented
129
135
 
130
136
  class Format(collections.abc.Callable, metaclass=Slotted):
131
137
 
@@ -179,6 +185,7 @@ class Serializable(abc.ABC):
179
185
  class. This dict is based on the class, and contains whatever the
180
186
  “from_dict(…)” method expects.
181
187
  """
188
+ __slots__ = tuple()
182
189
 
183
190
  @classmethod
184
191
  def from_dict(cls, instance_dict):
@@ -262,6 +269,7 @@ class SlottedRepr(ReprWrapper, metaclass=Slotted):
262
269
  inheritance chain’s value for “__slots__” to build the repr
263
270
  string for its instances
264
271
  """
272
+ __slots__ = tuple()
265
273
 
266
274
  def inner_repr(self):
267
275
  """ Use the union of __slots__, defined across this classes’
@@ -278,6 +286,7 @@ class MappingViewRepr(ReprWrapper):
278
286
  """ A ReprWrapper class that simply returns the repr for a
279
287
  “self._mapping” value – of which most MappingView types make use.
280
288
  """
289
+ __slots__ = tuple()
281
290
 
282
291
  def inner_repr(self): # pragma: no cover
283
292
  """ Return the repr string for “self._mapping” """
@@ -364,6 +373,7 @@ class ValueDescriptor(Descriptor):
364
373
  """ A descriptor whose repr-string tries to be a literal reflection
365
374
  of its wrapped value
366
375
  """
376
+ __slots__ = tuple()
367
377
 
368
378
  def __repr__(self):
369
379
  """ A custom repr for the ValueDescriptor’s literal value """
@@ -164,14 +164,26 @@ class FrozenKeyMap(FrozenKeyMapBase):
164
164
 
165
165
  def submap(self, *namespaces, unprefixed=False):
166
166
  """ Return a flattened dict containing only the namespaced items. """
167
+ # Get the frozen version of this class:
167
168
  cls = freeze_class(type(self))
169
+
170
+ # Shortcut for unprefixed keys:
168
171
  if unprefixed:
169
- return cls({ nskey : self[nskey] for nskey in self if NAMESPACE_SEP not in nskey })
172
+ return cls({ nskey : self[nskey] \
173
+ for nskey in self \
174
+ if NAMESPACE_SEP not in nskey })
175
+
176
+ # Shortcut for a lack of namespaces:
170
177
  if not namespaces:
171
178
  return cls(self)
172
- out = dict()
179
+
180
+ # Iterate namespaces, taking those matching our namespaces
181
+ # for a new instance:
182
+ out = {}
173
183
  for namespace in namespaces:
174
- out.update({ nskey : self[nskey] for nskey in self if nskey.startswith(namespace) })
184
+ out.update({ nskey : self[nskey] \
185
+ for nskey in self \
186
+ if nskey.startswith(namespace) })
175
187
  return cls(out)
176
188
 
177
189
  def keys(self, *namespaces, unprefixed=False):
@@ -205,7 +217,9 @@ class FrozenKeyMap(FrozenKeyMapBase):
205
217
  return hash(tuple(self.keys())) ^ len(self)
206
218
 
207
219
  def _get_namespace_foset(self):
208
- return FlatOrderedSet(get_ns(nskey) for nskey in sorted(self) if NAMESPACE_SEP in nskey)
220
+ return FlatOrderedSet(get_ns(nskey) \
221
+ for nskey in self \
222
+ if NAMESPACE_SEP in nskey)
209
223
 
210
224
  def namespaces(self):
211
225
  yield from self._get_namespace_foset()
@@ -374,10 +388,12 @@ class NamespaceWalker(FrozenKeyMap):
374
388
  if cls is None:
375
389
  from clu.config.keymap import FrozenFlat
376
390
  cls = FrozenFlat
377
- return cls({ pack_ns(key, *fragments) : value for *fragments, key, value in self.walk() })
391
+ return cls({ pack_ns(key, *fragments) : value \
392
+ for *fragments, key, value in self.walk() })
378
393
 
379
394
  def _get_namespace_foset(self):
380
- return FlatOrderedSet(concatenate_ns(*fragments) for *fragments, _, _ in self.walk() if fragments)
395
+ return FlatOrderedSet(concatenate_ns(*fragments) \
396
+ for *fragments, _, _ in self.walk() if fragments)
381
397
 
382
398
  def keys(self, *namespaces, unprefixed=False):
383
399
  """ Return a namespaced view over either all keys in the mapping,
@@ -479,9 +495,8 @@ class FlatOrderedSet(collections.abc.Set,
479
495
  """ Used by `clu.config.codecs` to deserialize FlatOrderedSets """
480
496
  out = cls()
481
497
  out.things = tuple(instance_dict['things'])
498
+ out.predicate = qualified_import(instance_dict['predicate'])
482
499
  return out
483
- # return cls(*instance_dict['things'],
484
- # predicate=qualified_import(instance_dict['predicate']))
485
500
 
486
501
  @classmethod
487
502
  def appreciates(cls, instance):
@@ -618,7 +633,8 @@ class FlatOrderedSet(collections.abc.Set,
618
633
  def clone(self, deep=False, memo=None):
619
634
  copier = getattr(copy, deep and 'deepcopy' or 'copy')
620
635
  out = type(self)()
621
- out.things = tuple(map(copier, self.things))
636
+ out.things = copier(self.things)
637
+ out.predicate = self.predicate
622
638
  return out
623
639
 
624
640
  def inner_repr(self):
@@ -72,10 +72,7 @@ class FrozenEnviron(NamespaceWalker, clu.abstract.ReprWrapper,
72
72
  """ Initialize a FrozenKeyMap instance wrapping an environment-variable
73
73
  dictionary from a target dictionary, with a supplied appname.
74
74
  """
75
- try:
76
- super().__init__(**updates)
77
- except TypeError:
78
- super().__init__()
75
+ super().__init__()
79
76
  self.appname = appname or APPNAME
80
77
  self.environment = environment is None \
81
78
  and os.environ.copy() \
@@ -142,13 +139,10 @@ class Environ(FrozenEnviron, KeyMap, contextlib.AbstractContextManager):
142
139
  """
143
140
  if environment is None:
144
141
  environment = os.environ
145
- try:
146
- super().__init__(environment=environment,
147
- appname=appname,
148
- **updates)
149
- except TypeError:
150
- super().__init__(environment=environment,
151
- appname=appname)
142
+
143
+ super().__init__(environment=environment,
144
+ appname=appname,
145
+ **updates)
152
146
  self.stash = None
153
147
 
154
148
  def freeze(self):
@@ -177,10 +177,8 @@ class FileBase(Nested, FileName): # type: ignore
177
177
  extra_user_dirs = kwargs.pop('extra_user_dirs', None)
178
178
  search_sys_path = kwargs.pop('search_sys_path', False)
179
179
 
180
- try:
181
- super(FileBase, self).__init__(*args, **kwargs)
182
- except TypeError:
183
- super(FileBase, self).__init__()
180
+ # Call super:
181
+ super(FileBase, self).__init__(*args, **kwargs)
184
182
 
185
183
  if isvalidpath(filepath):
186
184
  self.filepath = filepath
@@ -62,10 +62,7 @@ class FrozenFlat(abc.FrozenKeyMap, clu.abstract.ReprWrapper,
62
62
  output of ‘pack_ns(…)’ (q.v. function definition supra.)
63
63
  """
64
64
  # Call up:
65
- try:
66
- super().__init__(**updates)
67
- except TypeError:
68
- super().__init__()
65
+ super().__init__(**updates)
69
66
 
70
67
  # Sort out our passed-in dictionary:
71
68
  if hasattr(dictionary, 'dictionary'):
@@ -170,9 +167,8 @@ class FrozenNested(abc.NamespaceWalker, clu.abstract.ReprWrapper,
170
167
  @classmethod
171
168
  def from_dict(cls, instance_dict):
172
169
  """ Used by `clu.config.codecs` to deserialize keymaps """
173
- out = cls()
170
+ out = cls(nskeyset=instance_dict.get('nskeyset', None))
174
171
  out.tree = instance_dict['tree']
175
- out.nskeys = instance_dict['nskeyset']
176
172
  return out
177
173
 
178
174
  def __init__(self, tree=None, *, nskeyset=None, **updates):
@@ -180,10 +176,7 @@ class FrozenNested(abc.NamespaceWalker, clu.abstract.ReprWrapper,
180
176
  target nested dictionary (or a “tree” of dicts).
181
177
  """
182
178
  # Call up:
183
- try:
184
- super().__init__(**updates)
185
- except TypeError:
186
- super().__init__()
179
+ super().__init__()
187
180
 
188
181
  # Sort out the nature of the input:
189
182
  if hasattr(tree, 'tree'):
@@ -192,7 +185,7 @@ class FrozenNested(abc.NamespaceWalker, clu.abstract.ReprWrapper,
192
185
  tree = getattr(tree.nestify(), 'tree')
193
186
 
194
187
  # Assign, and deal with updates:
195
- self.tree = dictify(tree or {}, cls=dict)
188
+ self.tree = dictify(tree or {})
196
189
  if updates:
197
190
  for nskey, value in updates.items():
198
191
  key, fragments = ns.unpack_ns(nskey)
@@ -206,7 +199,7 @@ class FrozenNested(abc.NamespaceWalker, clu.abstract.ReprWrapper,
206
199
  d[key] = value
207
200
 
208
201
  # Keep the keyset we got:
209
- self.nskeys = nskeyset
202
+ self.nskeys = nskeyset and frozenset(nskeyset) or None
210
203
 
211
204
  def walk(self):
212
205
  """ Iteratively walk the nested KeyMap’s tree of dicts. """
@@ -222,7 +215,7 @@ class FrozenNested(abc.NamespaceWalker, clu.abstract.ReprWrapper,
222
215
  return thaw_class(type(self))(tree=copy.copy(self.tree),
223
216
  nskeyset=copy.copy(self.nskeys))
224
217
 
225
- def submap(self, *namespaces, unprefixed=False, cls=False):
218
+ def submap(self, *namespaces, unprefixed=False, cls=None):
226
219
  """ Return a flattened mapping, if possible a mutable one,
227
220
  containing only items with keys matching the specified
228
221
  namespaces (as namespaced:key:paths).
@@ -233,7 +226,7 @@ class FrozenNested(abc.NamespaceWalker, clu.abstract.ReprWrapper,
233
226
 
234
227
  # Short-circuit for returning unprefixed top-level items:
235
228
  if unprefixed:
236
- return cls({ key : value \
229
+ return cls({ key: value \
237
230
  for key, value in self.tree.items() \
238
231
  if not ismapping(value) })
239
232
 
@@ -298,10 +291,7 @@ class Nested(FrozenNested, abc.KeyMap):
298
291
  target nested dictionary (or a “tree” of dicts).
299
292
  """
300
293
  # Call up, without passing nskeyset:
301
- try:
302
- super().__init__(tree=tree, nskeyset=None, **updates)
303
- except TypeError:
304
- super().__init__()
294
+ super().__init__(tree=tree, nskeyset=None, **updates)
305
295
 
306
296
  # Mutable-ize the keyset:
307
297
  self.nskeys = nskeyset and set(nskeyset) or set(self.nskeyset())
@@ -108,10 +108,7 @@ class ChainRepr(Repr):
108
108
  """ Initialize a ChainRepr, with default params
109
109
  for ‘maxlevel’, ‘maxstring’, and ‘maxother’.
110
110
  """
111
- try:
112
- super().__init__(*args, **kwargs)
113
- except TypeError:
114
- super().__init__()
111
+ super().__init__(*args, **kwargs)
115
112
  self.maxlevel = maxlevel
116
113
  self.maxstring = maxstring
117
114
  self.maxother = maxother
@@ -1,7 +1,9 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  from __future__ import print_function
3
3
 
4
+ import abc
4
5
  import clu.abstract
6
+ import collections.abc
5
7
 
6
8
  from clu.constants.polyfills import Enum, EnumMeta # type: ignore
7
9
  from clu.exporting import Exporter
@@ -101,7 +103,7 @@ class alias(clu.abstract.BaseDescriptor, metaclass=clu.abstract.Slotted):
101
103
  cls.__aliases__[self.name] = self.member_for_value(cls, self.aliased)
102
104
 
103
105
  @export
104
- class AliasingEnumMeta(EnumMeta):
106
+ class AliasingEnumMeta(EnumMeta, abc.ABCMeta):
105
107
 
106
108
  def __new__(metacls, name, bases, attributes, **kwargs):
107
109
  """ Ensure `__aliases__` is a dictionary attribute on the new class.
@@ -316,9 +316,12 @@ class Registry(abc.ABC, metaclass=clu.abstract.Slotted):
316
316
  appname = determine_name(cls)
317
317
  else:
318
318
  if appname in classes:
319
- raise TypeError(f"appname already registered: {appname}")
320
- appnames.add(appname)
321
- classes[appname] = cls
319
+ # raise TypeError(f"appname already registered: {appname}")
320
+ warnings.warn(f"appname already registered: “{appname}”",
321
+ ExportWarning, stacklevel=2)
322
+ else:
323
+ appnames.add(appname)
324
+ classes[appname] = cls
322
325
  super().__init_subclass__(**kwargs) # type: ignore
323
326
  cls.instances = weakref.WeakValueDictionary()
324
327
  cls.appname = clu.abstract.ValueDescriptor(appname)
@@ -434,10 +437,8 @@ class ExporterBase(collections.abc.MutableMapping,
434
437
  if putative in cls.instances:
435
438
  return cls.instances[putative]
436
439
 
437
- try:
438
- instance = super().__new__(cls, *args, **kwargs) # type: ignore
439
- except TypeError:
440
- instance = super().__new__(cls)
440
+ # Call super:
441
+ instance = super().__new__(cls) # type: ignore
441
442
 
442
443
  instance.__exports__ = {}
443
444
  instance.path = path
@@ -23,10 +23,8 @@ class SourceTree(abc.ABC, metaclass=Slotted):
23
23
  __slots__ = ('directory', 'header_lines', 'filepath')
24
24
 
25
25
  def __init__(self, filepath, path=None, **kwargs):
26
- try:
27
- super(SourceTree, self).__init__(**kwargs)
28
- except TypeError:
29
- super(SourceTree, self).__init__()
26
+ # Call super:
27
+ super(SourceTree, self).__init__(**kwargs)
30
28
 
31
29
  # Check the “srctree” file:
32
30
  if not os.path.isfile(filepath):
@@ -374,10 +374,7 @@ class LoaderBase(clu.abstract.AppName,
374
374
  # Create and register a new loader, as per the
375
375
  # arguments with which to initialize this new
376
376
  # loader instance:
377
- try:
378
- cls.instances[key] = instance = super().__new__(cls, *args, **kwargs)
379
- except TypeError:
380
- cls.instances[key] = instance = super().__new__(cls)
377
+ cls.instances[key] = instance = super().__new__(cls, *args, **kwargs)
381
378
 
382
379
  # Return the newly created instance:
383
380
  return instance
@@ -275,10 +275,7 @@ class Partial(partial):
275
275
  def __init__(self, *args, **kwargs):
276
276
  """ Initialize a new Partial object, with a predicate and a function """
277
277
  # N.B. The real action seems to happen in partial.__new__(…)
278
- try:
279
- super().__init__(*args, **kwargs)
280
- except:
281
- super().__init__() # type: ignore
278
+ super().__init__()
282
279
 
283
280
  # Name the Partial instance, as if it’s a phi-type:
284
281
  self.__name__ = self.__qualname__ = φ
@@ -18,7 +18,7 @@ from clu.predicates import mro, or_none
18
18
  from clu.typology import dict_types, isstring, isbytes
19
19
  from clu.fs.misc import re_matcher
20
20
  from clu.naming import nameof, qualified_name, isinspectable
21
- from clu.enums import alias, AliasingEnumMeta
21
+ from clu.enums import alias, AliasingEnum, AliasingEnumMeta
22
22
  from clu.stdio import std, linebreak, flush_all
23
23
  from clu.exporting import Exporter
24
24
 
@@ -28,12 +28,14 @@ export = exporter.decorator()
28
28
  print_separator = lambda filler='-': print(filler * SEPARATOR_WIDTH)
29
29
 
30
30
  @export
31
- class ANSIBase(Enum):
31
+ class ANSIBase(clu.abstract.Appreciative, AliasingEnum):
32
32
 
33
33
  """ Root ancestor class for all ANSI-code enums """
34
34
 
35
35
  @classmethod
36
- def is_ansi(cls, instance):
36
+ def appreciates(cls, instance):
37
+ """ Boolean, tests if the class “appreciates” an instance """
38
+ # N.B. This is far too ripe for false positives
37
39
  return cls in mro(instance)
38
40
 
39
41
  @export
@@ -133,7 +135,7 @@ class ANSI(AliasingEnumMeta):
133
135
  """ Convert a specifier of unknown type to an enum or alias member """
134
136
  if specifier is None:
135
137
  return cls.NOTHING
136
- elif cls.is_ansi(specifier):
138
+ elif cls.appreciates(specifier):
137
139
  return specifier # Already an ANSI type, return it
138
140
  if isstring(specifier):
139
141
  return cls.for_name(specifier) # Match by name, decoding if necessary
@@ -325,7 +327,7 @@ class ANSIFormat(clu.abstract.Format,
325
327
  text = from_value
326
328
  elif isbytes(from_value):
327
329
  text = str(from_value, encoding=ENCODING)
328
- elif ANSIBase.is_ansi(from_value):
330
+ elif ANSIBase.appreciates(from_value):
329
331
  text = from_value
330
332
  instance = cls.get_or_create(Text.convert(text),
331
333
  Background.convert(background),
@@ -583,8 +585,8 @@ wrapper_kws = lambda **kwargs: { **BASE_KWARGS, **kwargs }
583
585
  @export
584
586
  class HighlighterWrapper(TextWrapper):
585
587
 
586
- def __init__(self):
587
- super().__init__(**wrapper_kws())
588
+ def __init__(self, **kwargs):
589
+ super().__init__(**wrapper_kws(**kwargs))
588
590
 
589
591
  @export
590
592
  class DualOptionWrapper(clu.abstract.Format):
@@ -699,10 +701,13 @@ class DocFormat(clu.abstract.Format):
699
701
  self.putpara(paragraph)
700
702
 
701
703
  self.putln(count=2)
704
+ return thing
702
705
 
703
706
  def __call__(self, *things):
707
+ out = None
704
708
  for thing in things:
705
- self.render(thing)
709
+ out = self.render(thing)
710
+ return out
706
711
 
707
712
  def old_ansidoc(*things):
708
713
  """ old_ansidoc(*things) → Print the docstring value for each thing, in ANSI color """
@@ -749,6 +754,9 @@ def old_ansidoc(*things):
749
754
  linebreak()
750
755
  print()
751
756
  flush_all()
757
+
758
+ # Return thing(s)
759
+ return len(things) == 1 and things[0] or things
752
760
 
753
761
  ansidoc = DocFormat()
754
762
 
@@ -14,7 +14,6 @@ def actually_print_ansidocs(dotpath):
14
14
  formatting accordingly (as in, no ANSI if we can’t ANSI)
15
15
  """
16
16
  from clu.naming import qualified_import
17
- from importlib import import_module
18
17
 
19
18
  # Attempt to import it:
20
19
  try:
@@ -27,8 +26,7 @@ def actually_print_ansidocs(dotpath):
27
26
  sys.exit(os.EX_CONFIG)
28
27
 
29
28
  # This goes directly to stdout:
30
- ansidocs(thing)
31
- return thing
29
+ return ansidocs.render(thing)
32
30
 
33
31
  def ansidocs_command():
34
32
  """ Print out the ANSI-ified docstring for the given thing(s) """
@@ -1,12 +1,10 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  from __future__ import print_function
3
- import sys, os
4
-
5
- from clu.repl.cli.boilerplate import boilerplate_command
3
+ import sys, os, xerox
6
4
 
7
5
  def boilerplate_copy_command(): # pragma: no cover
8
- import xerox
9
- return boilerplate_command(function=xerox.copy)
6
+ from clu.repl.cli import boilerplate
7
+ return boilerplate.boilerplate_command(function=xerox.copy)
10
8
 
11
9
  if __name__ == '__main__':
12
10
  print("Copying boilerplate to clipboard…")