python-clu 0.12.13__tar.gz → 0.12.14__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 (285) hide show
  1. {python_clu-0.12.13 → python_clu-0.12.14}/.bumpversion.toml +1 -1
  2. {python_clu-0.12.13 → python_clu-0.12.14}/CHANGELOG.md +185 -1
  3. {python_clu-0.12.13 → python_clu-0.12.14}/PKG-INFO +17 -7
  4. {python_clu-0.12.13 → python_clu-0.12.14}/README.md +17 -7
  5. python_clu-0.12.14/clu/__version__.py +1 -0
  6. {python_clu-0.12.13 → python_clu-0.12.14}/clu/config/abc.py +51 -19
  7. {python_clu-0.12.13 → python_clu-0.12.14}/clu/config/formats/tomlfile.py +3 -0
  8. {python_clu-0.12.13 → python_clu-0.12.14}/clu/config/keymap.py +22 -20
  9. python_clu-0.12.13/clu/config/utils.py → python_clu-0.12.14/clu/config/keymaputils.py +1 -1
  10. {python_clu-0.12.13 → python_clu-0.12.14}/clu/config/keymapview.py +18 -30
  11. {python_clu-0.12.13 → python_clu-0.12.14}/clu/config/ns.py +3 -1
  12. {python_clu-0.12.13 → python_clu-0.12.14}/clu/constants/consts.py +6 -0
  13. {python_clu-0.12.13 → python_clu-0.12.14}/clu/dicts.py +46 -11
  14. {python_clu-0.12.13 → python_clu-0.12.14}/clu/predicates.py +10 -10
  15. {python_clu-0.12.13 → python_clu-0.12.14}/clu/scripts/repl.py +2 -0
  16. {python_clu-0.12.13 → python_clu-0.12.14}/clu/scripts/treeline.py +16 -22
  17. python_clu-0.12.14/clu/trie.py +244 -0
  18. {python_clu-0.12.13 → python_clu-0.12.14}/clu/typology.py +37 -4
  19. {python_clu-0.12.13 → python_clu-0.12.14}/python_clu.egg-info/PKG-INFO +17 -7
  20. {python_clu-0.12.13 → python_clu-0.12.14}/python_clu.egg-info/SOURCES.txt +2 -1
  21. {python_clu-0.12.13 → python_clu-0.12.14}/setup.py +1 -1
  22. {python_clu-0.12.13 → python_clu-0.12.14}/tests/data/config/clu-config.toml +1 -6
  23. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_config.py +8 -74
  24. python_clu-0.12.13/clu/__version__.py +0 -1
  25. {python_clu-0.12.13 → python_clu-0.12.14}/.coveragerc +0 -0
  26. {python_clu-0.12.13 → python_clu-0.12.14}/.editorconfig +0 -0
  27. {python_clu-0.12.13 → python_clu-0.12.14}/.gitchangelog.rc +0 -0
  28. {python_clu-0.12.13 → python_clu-0.12.14}/.gitignore +0 -0
  29. {python_clu-0.12.13 → python_clu-0.12.14}/.landscape.yml +0 -0
  30. {python_clu-0.12.13 → python_clu-0.12.14}/.travis.yml +0 -0
  31. {python_clu-0.12.13 → python_clu-0.12.14}/ABOUT.md +0 -0
  32. {python_clu-0.12.13 → python_clu-0.12.14}/CLASSIFIERS.txt +0 -0
  33. {python_clu-0.12.13 → python_clu-0.12.14}/CLU_Treatment.md +0 -0
  34. {python_clu-0.12.13 → python_clu-0.12.14}/CODE_OF_CONDUCT.md +0 -0
  35. {python_clu-0.12.13 → python_clu-0.12.14}/LICENSE.txt +0 -0
  36. {python_clu-0.12.13 → python_clu-0.12.14}/MANIFEST.in +0 -0
  37. {python_clu-0.12.13 → python_clu-0.12.14}/Makefile +0 -0
  38. {python_clu-0.12.13 → python_clu-0.12.14}/appveyor.yml +0 -0
  39. {python_clu-0.12.13 → python_clu-0.12.14}/clu/__init__.py +0 -0
  40. {python_clu-0.12.13 → python_clu-0.12.14}/clu/__main__.py +0 -0
  41. {python_clu-0.12.13 → python_clu-0.12.14}/clu/abstract.py +0 -0
  42. {python_clu-0.12.13 → python_clu-0.12.14}/clu/all.py +0 -0
  43. {python_clu-0.12.13 → python_clu-0.12.14}/clu/api/__init__.py +0 -0
  44. {python_clu-0.12.13 → python_clu-0.12.14}/clu/api/__main__.py +0 -0
  45. {python_clu-0.12.13 → python_clu-0.12.14}/clu/application.py +0 -0
  46. {python_clu-0.12.13 → python_clu-0.12.14}/clu/compilation/__init__.py +0 -0
  47. {python_clu-0.12.13 → python_clu-0.12.14}/clu/compilation/compiledb.py +0 -0
  48. {python_clu-0.12.13 → python_clu-0.12.14}/clu/compilation/macros.py +0 -0
  49. {python_clu-0.12.13 → python_clu-0.12.14}/clu/config/__init__.py +0 -0
  50. {python_clu-0.12.13 → python_clu-0.12.14}/clu/config/codecs.py +0 -0
  51. {python_clu-0.12.13 → python_clu-0.12.14}/clu/config/env.py +0 -0
  52. {python_clu-0.12.13 → python_clu-0.12.14}/clu/config/filebase.py +0 -0
  53. {python_clu-0.12.13 → python_clu-0.12.14}/clu/config/formats/__init__.py +0 -0
  54. {python_clu-0.12.13 → python_clu-0.12.14}/clu/config/formats/jsonfile.py +0 -0
  55. {python_clu-0.12.13 → python_clu-0.12.14}/clu/config/formats/picklefile.py +0 -0
  56. {python_clu-0.12.13 → python_clu-0.12.14}/clu/config/formats/yamlfile.py +0 -0
  57. {python_clu-0.12.13 → python_clu-0.12.14}/clu/config/legacy/__init__.py +0 -0
  58. {python_clu-0.12.13 → python_clu-0.12.14}/clu/config/legacy/base.py +0 -0
  59. {python_clu-0.12.13 → python_clu-0.12.14}/clu/config/legacy/fieldtypes.py +0 -0
  60. {python_clu-0.12.13 → python_clu-0.12.14}/clu/config/legacy/settings.py +0 -0
  61. {python_clu-0.12.13 → python_clu-0.12.14}/clu/config/proxy.py +0 -0
  62. {python_clu-0.12.13 → python_clu-0.12.14}/clu/constants/__init__.py +0 -0
  63. {python_clu-0.12.13 → python_clu-0.12.14}/clu/constants/__main__.py +0 -0
  64. {python_clu-0.12.13 → python_clu-0.12.14}/clu/constants/data.py +0 -0
  65. {python_clu-0.12.13 → python_clu-0.12.14}/clu/constants/enums.py +0 -0
  66. {python_clu-0.12.13 → python_clu-0.12.14}/clu/constants/exceptions.py +0 -0
  67. {python_clu-0.12.13 → python_clu-0.12.14}/clu/constants/polyfills.py +0 -0
  68. {python_clu-0.12.13 → python_clu-0.12.14}/clu/csv.py +0 -0
  69. {python_clu-0.12.13 → python_clu-0.12.14}/clu/dispatch.py +0 -0
  70. {python_clu-0.12.13 → python_clu-0.12.14}/clu/enums.py +0 -0
  71. {python_clu-0.12.13 → python_clu-0.12.14}/clu/exporting.py +0 -0
  72. {python_clu-0.12.13 → python_clu-0.12.14}/clu/extending.py +0 -0
  73. {python_clu-0.12.13 → python_clu-0.12.14}/clu/fs/__init__.py +0 -0
  74. {python_clu-0.12.13 → python_clu-0.12.14}/clu/fs/abc.py +0 -0
  75. {python_clu-0.12.13 → python_clu-0.12.14}/clu/fs/appdirectories.py +0 -0
  76. {python_clu-0.12.13 → python_clu-0.12.14}/clu/fs/filesystem.py +0 -0
  77. {python_clu-0.12.13 → python_clu-0.12.14}/clu/fs/misc.py +0 -0
  78. {python_clu-0.12.13 → python_clu-0.12.14}/clu/fs/pypath.py +0 -0
  79. {python_clu-0.12.13 → python_clu-0.12.14}/clu/fs/sourcetree.py +0 -0
  80. {python_clu-0.12.13 → python_clu-0.12.14}/clu/importing/__init__.py +0 -0
  81. {python_clu-0.12.13 → python_clu-0.12.14}/clu/importing/__main__.py +0 -0
  82. {python_clu-0.12.13 → python_clu-0.12.14}/clu/importing/base.py +0 -0
  83. {python_clu-0.12.13 → python_clu-0.12.14}/clu/importing/proxy.py +0 -0
  84. {python_clu-0.12.13 → python_clu-0.12.14}/clu/keyvalue.py +0 -0
  85. {python_clu-0.12.13 → python_clu-0.12.14}/clu/mathematics.py +0 -0
  86. {python_clu-0.12.13 → python_clu-0.12.14}/clu/naming.py +0 -0
  87. {python_clu-0.12.13 → python_clu-0.12.14}/clu/repl/__init__.py +0 -0
  88. {python_clu-0.12.13 → python_clu-0.12.14}/clu/repl/ansi.py +0 -0
  89. {python_clu-0.12.13 → python_clu-0.12.14}/clu/repl/banners.py +0 -0
  90. {python_clu-0.12.13 → python_clu-0.12.14}/clu/repl/cli/__init__.py +0 -0
  91. {python_clu-0.12.13 → python_clu-0.12.14}/clu/repl/cli/ansidocs.py +0 -0
  92. {python_clu-0.12.13 → python_clu-0.12.14}/clu/repl/cli/boilerplate.py +0 -0
  93. {python_clu-0.12.13 → python_clu-0.12.14}/clu/repl/cli/boilerplate_copy.py +0 -0
  94. {python_clu-0.12.13 → python_clu-0.12.14}/clu/repl/cli/print_version.py +0 -0
  95. {python_clu-0.12.13 → python_clu-0.12.14}/clu/repl/columnize.py +0 -0
  96. {python_clu-0.12.13 → python_clu-0.12.14}/clu/repl/modules.py +0 -0
  97. {python_clu-0.12.13 → python_clu-0.12.14}/clu/repr.py +0 -0
  98. {python_clu-0.12.13 → python_clu-0.12.14}/clu/sanitizer.py +0 -0
  99. {python_clu-0.12.13 → python_clu-0.12.14}/clu/scripts/.gitignore +0 -0
  100. {python_clu-0.12.13 → python_clu-0.12.14}/clu/scripts/README.md +0 -0
  101. {python_clu-0.12.13 → python_clu-0.12.14}/clu/scripts/__init__.py +0 -0
  102. {python_clu-0.12.13 → python_clu-0.12.14}/clu/scripts/ansicolors.py +0 -0
  103. {python_clu-0.12.13 → python_clu-0.12.14}/clu/scripts/boilerplate.py +0 -0
  104. {python_clu-0.12.13 → python_clu-0.12.14}/clu/scripts/dictroast.py +0 -0
  105. {python_clu-0.12.13 → python_clu-0.12.14}/clu/scripts/legacy/forkumask.py +0 -0
  106. {python_clu-0.12.13 → python_clu-0.12.14}/clu/scripts/legacy/repl-bpython.py +0 -0
  107. {python_clu-0.12.13 → python_clu-0.12.14}/clu/scripts/legacy/repl-ipython.py +0 -0
  108. {python_clu-0.12.13 → python_clu-0.12.14}/clu/scripts/legacy/repl-ptpython.py +0 -0
  109. {python_clu-0.12.13 → python_clu-0.12.14}/clu/scripts/legacy/repl-pyzo.py +0 -0
  110. {python_clu-0.12.13 → python_clu-0.12.14}/clu/scripts/legacy/xdg-runtime.py +0 -0
  111. {python_clu-0.12.13 → python_clu-0.12.14}/clu/scripts/prediversus.py +0 -0
  112. {python_clu-0.12.13 → python_clu-0.12.14}/clu/shelving/__init__.py +0 -0
  113. {python_clu-0.12.13 → python_clu-0.12.14}/clu/shelving/redat.py +0 -0
  114. {python_clu-0.12.13 → python_clu-0.12.14}/clu/shelving/redis.conf +0 -0
  115. {python_clu-0.12.13 → python_clu-0.12.14}/clu/stdio.py +0 -0
  116. {python_clu-0.12.13 → python_clu-0.12.14}/clu/testing/__init__.py +0 -0
  117. {python_clu-0.12.13 → python_clu-0.12.14}/clu/testing/hook.py +0 -0
  118. {python_clu-0.12.13 → python_clu-0.12.14}/clu/testing/obsolete.py +0 -0
  119. {python_clu-0.12.13 → python_clu-0.12.14}/clu/testing/pytest.py +0 -0
  120. {python_clu-0.12.13 → python_clu-0.12.14}/clu/testing/utils.py +0 -0
  121. {python_clu-0.12.13 → python_clu-0.12.14}/clu/typespace/__init__.py +0 -0
  122. {python_clu-0.12.13 → python_clu-0.12.14}/clu/typespace/__main__.py +0 -0
  123. {python_clu-0.12.13 → python_clu-0.12.14}/clu/typespace/namespace.py +0 -0
  124. {python_clu-0.12.13 → python_clu-0.12.14}/clu/version/__init__.py +0 -0
  125. {python_clu-0.12.13 → python_clu-0.12.14}/clu/version/__main__.py +0 -0
  126. {python_clu-0.12.13 → python_clu-0.12.14}/clu/version/git_version.py +0 -0
  127. {python_clu-0.12.13 → python_clu-0.12.14}/clu/version/read_version.py +0 -0
  128. {python_clu-0.12.13 → python_clu-0.12.14}/codecov.yml +0 -0
  129. {python_clu-0.12.13 → python_clu-0.12.14}/conftest.py +0 -0
  130. {python_clu-0.12.13 → python_clu-0.12.14}/docs/.DS_Store +0 -0
  131. {python_clu-0.12.13 → python_clu-0.12.14}/docs/Makefile +0 -0
  132. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/doctrees/api.doctree +0 -0
  133. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/doctrees/environment.pickle +0 -0
  134. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/doctrees/generated/clu.doctree +0 -0
  135. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/doctrees/index.doctree +0 -0
  136. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/.buildinfo +0 -0
  137. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_sources/api.rst.txt +0 -0
  138. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_sources/generated/clu.rst.txt +0 -0
  139. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_sources/index.rst.txt +0 -0
  140. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/_sphinx_javascript_frameworks_compat.js +0 -0
  141. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/alabaster.css +0 -0
  142. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/basic.css +0 -0
  143. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/css/badge_only.css +0 -0
  144. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  145. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  146. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  147. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  148. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  149. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/css/fonts/fontawesome-webfont.svg +0 -0
  150. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  151. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  152. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  153. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
  154. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  155. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/css/fonts/lato-bold.woff +0 -0
  156. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/css/fonts/lato-bold.woff2 +0 -0
  157. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
  158. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  159. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/css/fonts/lato-normal.woff +0 -0
  160. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/css/fonts/lato-normal.woff2 +0 -0
  161. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/css/theme.css +0 -0
  162. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/custom.css +0 -0
  163. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/doctools.js +0 -0
  164. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/documentation_options.js +0 -0
  165. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/file.png +0 -0
  166. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/jquery-3.6.0.js +0 -0
  167. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/jquery.js +0 -0
  168. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/js/badge_only.js +0 -0
  169. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/js/html5shiv-printshiv.min.js +0 -0
  170. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/js/html5shiv.min.js +0 -0
  171. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/js/theme.js +0 -0
  172. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/language_data.js +0 -0
  173. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/minus.png +0 -0
  174. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/plus.png +0 -0
  175. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/pygments.css +0 -0
  176. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/searchtools.js +0 -0
  177. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/underscore-1.13.1.js +0 -0
  178. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/_static/underscore.js +0 -0
  179. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/api.html +0 -0
  180. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/generated/clu.html +0 -0
  181. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/genindex.html +0 -0
  182. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/index.html +0 -0
  183. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/objects.inv +0 -0
  184. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/py-modindex.html +0 -0
  185. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/search.html +0 -0
  186. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/html/searchindex.js +0 -0
  187. {python_clu-0.12.13 → python_clu-0.12.14}/docs/build/man/clu.1 +0 -0
  188. {python_clu-0.12.13 → python_clu-0.12.14}/docs/make.bat +0 -0
  189. {python_clu-0.12.13 → python_clu-0.12.14}/docs/source/api.rst +0 -0
  190. {python_clu-0.12.13 → python_clu-0.12.14}/docs/source/conf.py +0 -0
  191. {python_clu-0.12.13 → python_clu-0.12.14}/docs/source/generated/clu.rst +0 -0
  192. {python_clu-0.12.13 → python_clu-0.12.14}/docs/source/index.rst +0 -0
  193. {python_clu-0.12.13 → python_clu-0.12.14}/hooks/autohook.sh +0 -0
  194. {python_clu-0.12.13 → python_clu-0.12.14}/hooks/post-push/00-coverage.sh +0 -0
  195. {python_clu-0.12.13 → python_clu-0.12.14}/hooks/pre-push/00-noop.sh +0 -0
  196. {python_clu-0.12.13 → python_clu-0.12.14}/hooks/pre-push/01-direnv-stdlib.sh +0 -0
  197. {python_clu-0.12.13 → python_clu-0.12.14}/hooks/scripts/coverage.sh +0 -0
  198. {python_clu-0.12.13 → python_clu-0.12.14}/hooks/scripts/display-issues.sh +0 -0
  199. {python_clu-0.12.13 → python_clu-0.12.14}/hooks/scripts/git-pushex +0 -0
  200. {python_clu-0.12.13 → python_clu-0.12.14}/hooks/scripts/noop.sh +0 -0
  201. {python_clu-0.12.13 → python_clu-0.12.14}/mypy.ini +0 -0
  202. {python_clu-0.12.13 → python_clu-0.12.14}/noxfile.py +0 -0
  203. {python_clu-0.12.13 → python_clu-0.12.14}/pyproject.toml +0 -0
  204. {python_clu-0.12.13 → python_clu-0.12.14}/pytest.ini +0 -0
  205. {python_clu-0.12.13 → python_clu-0.12.14}/python_clu.egg-info/dependency_links.txt +0 -0
  206. {python_clu-0.12.13 → python_clu-0.12.14}/python_clu.egg-info/entry_points.txt +0 -0
  207. {python_clu-0.12.13 → python_clu-0.12.14}/python_clu.egg-info/requires.txt +0 -0
  208. {python_clu-0.12.13 → python_clu-0.12.14}/python_clu.egg-info/top_level.txt +0 -0
  209. {python_clu-0.12.13 → python_clu-0.12.14}/python_clu.egg-info/zip-safe +0 -0
  210. {python_clu-0.12.13 → python_clu-0.12.14}/pytype.cfg +0 -0
  211. {python_clu-0.12.13 → python_clu-0.12.14}/requirements/changelog.txt +0 -0
  212. {python_clu-0.12.13 → python_clu-0.12.14}/requirements/dev.txt +0 -0
  213. {python_clu-0.12.13 → python_clu-0.12.14}/requirements/docs.txt +0 -0
  214. {python_clu-0.12.13 → python_clu-0.12.14}/requirements/install.txt +0 -0
  215. {python_clu-0.12.13 → python_clu-0.12.14}/requirements/nox/codecov.txt +0 -0
  216. {python_clu-0.12.13 → python_clu-0.12.14}/requirements/nox/docs.txt +0 -0
  217. {python_clu-0.12.13 → python_clu-0.12.14}/requirements/nox/manifest.txt +0 -0
  218. {python_clu-0.12.13 → python_clu-0.12.14}/requirements/nox/pyproject.txt +0 -0
  219. {python_clu-0.12.13 → python_clu-0.12.14}/requirements/nox/repl.txt +0 -0
  220. {python_clu-0.12.13 → python_clu-0.12.14}/requirements/nox/tests.txt +0 -0
  221. {python_clu-0.12.13 → python_clu-0.12.14}/requirements/tox.txt +0 -0
  222. {python_clu-0.12.13 → python_clu-0.12.14}/requirements/typecheck.txt +0 -0
  223. {python_clu-0.12.13 → python_clu-0.12.14}/scratch/direnv_transformed_env.py +0 -0
  224. {python_clu-0.12.13 → python_clu-0.12.14}/scratch/images/clu-module-list-example-small.jpg +0 -0
  225. {python_clu-0.12.13 → python_clu-0.12.14}/scratch/images/clu-module-list-example.jpg +0 -0
  226. {python_clu-0.12.13 → python_clu-0.12.14}/scratch/images/clu-module-list-example.pxd +0 -0
  227. {python_clu-0.12.13 → python_clu-0.12.14}/scratch/images/clu-testing-time-totals-example-small.jpg +0 -0
  228. {python_clu-0.12.13 → python_clu-0.12.14}/scratch/images/clu-testing-time-totals-example.jpg +0 -0
  229. {python_clu-0.12.13 → python_clu-0.12.14}/scratch/images/clu-testing-time-totals-example.pxd +0 -0
  230. {python_clu-0.12.13 → python_clu-0.12.14}/scratch/images/construx-and-capsela-small.jpg +0 -0
  231. {python_clu-0.12.13 → python_clu-0.12.14}/scratch/images/construx-and-capsela.jpg +0 -0
  232. {python_clu-0.12.13 → python_clu-0.12.14}/scratch/images/construx-and-capsela.pxd +0 -0
  233. {python_clu-0.12.13 → python_clu-0.12.14}/scratch/images/toml-module-rant.jpg +0 -0
  234. {python_clu-0.12.13 → python_clu-0.12.14}/scratch/inline-tests-ImportError-uggggh.ipynb +0 -0
  235. {python_clu-0.12.13 → python_clu-0.12.14}/scratch/nteract.ipynb +0 -0
  236. {python_clu-0.12.13 → python_clu-0.12.14}/setup.cfg +0 -0
  237. {python_clu-0.12.13 → python_clu-0.12.14}/tests/__init__.py +0 -0
  238. {python_clu-0.12.13 → python_clu-0.12.14}/tests/data/1-58.jpg +0 -0
  239. {python_clu-0.12.13 → python_clu-0.12.14}/tests/data/3471426989_aa8e83cac5_o.jpg +0 -0
  240. {python_clu-0.12.13 → python_clu-0.12.14}/tests/data/3472236406_1fbf1a567d_o.jpg +0 -0
  241. {python_clu-0.12.13 → python_clu-0.12.14}/tests/data/8600JC.jpg +0 -0
  242. {python_clu-0.12.13 → python_clu-0.12.14}/tests/data/8ba.png +0 -0
  243. {python_clu-0.12.13 → python_clu-0.12.14}/tests/data/IMG_20180505_205153567.jpg +0 -0
  244. {python_clu-0.12.13 → python_clu-0.12.14}/tests/data/cheetah-003.jpg +0 -0
  245. {python_clu-0.12.13 → python_clu-0.12.14}/tests/data/config/yodogg.toml +0 -0
  246. {python_clu-0.12.13 → python_clu-0.12.14}/tests/data/shutterstock_90194617.jpg +0 -0
  247. {python_clu-0.12.13 → python_clu-0.12.14}/tests/data/yodata/09163d51421853.5608b3c2a1be0.jpg +0 -0
  248. {python_clu-0.12.13 → python_clu-0.12.14}/tests/data/yodata/5d0227342500004e12e3506d.jpg +0 -0
  249. {python_clu-0.12.13 → python_clu-0.12.14}/tests/data/yodata/BlackCat2_large-22.jpg +0 -0
  250. {python_clu-0.12.13 → python_clu-0.12.14}/tests/data/yodogg/Serval_Cat_Kitten-706.jpg +0 -0
  251. {python_clu-0.12.13 → python_clu-0.12.14}/tests/data/yodogg/Servals_Thoiry_19801.jpg +0 -0
  252. {python_clu-0.12.13 → python_clu-0.12.14}/tests/data/yodogg/video-pride-serval.jpg +0 -0
  253. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_abstract.py +0 -0
  254. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_all.py +0 -0
  255. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_boilerplate.py +0 -0
  256. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_config_abc.py +0 -0
  257. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_csv.py +0 -0
  258. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_dicts.py +0 -0
  259. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_dispatch.py +0 -0
  260. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_enum_aliases.py +0 -0
  261. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_exporting.py +0 -0
  262. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_extending.py +0 -0
  263. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_fs_abc.py +0 -0
  264. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_fs_appdirectories.py +0 -0
  265. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_fs_filesystem.py +0 -0
  266. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_fs_misc.py +0 -0
  267. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_importing.py +0 -0
  268. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_keyvalue.py +0 -0
  269. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_mathematics.py +0 -0
  270. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_naming.py +0 -0
  271. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_predicates.py +0 -0
  272. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_repl_columnize.py +0 -0
  273. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_repl_modules.py +0 -0
  274. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_repr.py +0 -0
  275. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_scripts_repl.py +0 -0
  276. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_typespace_namespace.py +0 -0
  277. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_typology.py +0 -0
  278. {python_clu-0.12.13 → python_clu-0.12.14}/tests/test_version.py +0 -0
  279. {python_clu-0.12.13 → python_clu-0.12.14}/tests/yodogg/.tm_properties +0 -0
  280. {python_clu-0.12.13 → python_clu-0.12.14}/tests/yodogg/__init__.py +0 -0
  281. {python_clu-0.12.13 → python_clu-0.12.14}/tests/yodogg/yodogg/__init__.py +0 -0
  282. {python_clu-0.12.13 → python_clu-0.12.14}/tests/yodogg/yodogg/config.py +0 -0
  283. {python_clu-0.12.13 → python_clu-0.12.14}/tests/yodogg/yodogg/exporting.py +0 -0
  284. {python_clu-0.12.13 → python_clu-0.12.14}/tests/yodogg/yodogg/iheard.py +0 -0
  285. {python_clu-0.12.13 → python_clu-0.12.14}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
 
2
2
  [tool.bumpversion]
3
- current_version = "0.12.13"
3
+ current_version = "0.12.14"
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,187 @@
1
1
  # Changelog
2
2
 
3
3
 
4
- ## 0.12.12:pre12+gf9e1a9f [SNAPSHOT]
4
+ ## 0.12.13:pre32+g85452ed [SNAPSHOT]
5
+
6
+ ### Add
7
+
8
+ * Added stub description of `clu.trie` to `README.md` [Alexander Böhn]
9
+
10
+ Just leaving this right here, like for later
11
+
12
+ * Adding the beginnings of a new `clu.trie` basic library. [Alexander Böhn]
13
+
14
+ … seeing where this goes. This is in aid of parsing keymap namespaced
15
+ keys faster or more betterer, depending, so we will see where this
16
+ goes. AS ALWAYS, PULLS ARE WELCOME!!!!! 🥰
17
+
18
+ * Added a link in `README.md` to the new `clu.config.utils` module. [Alexander Böhn]
19
+
20
+ * Addressing some unexpected issues with KeyMap views and config files. [Alexander Böhn]
21
+
22
+ … I mean, the tests run OK………………… butttt………………
23
+
24
+ ### Other
25
+
26
+ * Ensure the valorous `clu.constants.consts.NoDefault` class looks good. [Alexander Böhn]
27
+
28
+ … meaning its class-based and instance-based repr methods return
29
+ nothing but “NoDefault”, now and forever. There is only a single
30
+ NoDefault class ever, out there; its only instance is itself.
31
+
32
+ *** NoDefault Stands Alone ***
33
+
34
+ … Erm, yes. Yes!
35
+
36
+ * Better living through your functional friends: `filter`, `map`, and `reduce` [Alexander Böhn]
37
+
38
+ * At long last, `clu.predicates.@itervariadic(…)` passes keyword args. [Alexander Böhn]
39
+
40
+ … fucking FINALLY. It did not do this for like ever and, I’ll just
41
+ tell you, I was totally scared to fuck with it; like maybe I had
42
+ tried to get it to do kwargs at some point and AT THAT VERY EXACT
43
+ MOMENT my aunt’s ferret died, which scarred me for life and forged
44
+ a very inexplicable but nonetheless quite strong mental link in
45
+ my mind, between passing kwargs in @itervariadic and the death
46
+ that we all face. Maybe (I have no aunts tho) but something.
47
+
48
+ * Fixed wrong-function call in `allsimilar(…)`’s unhashable-input branch. [Alexander Böhn]
49
+
50
+ … N.B. need to ensure tests cover all lambdas, and both code branches
51
+ for these; also ensure @itervariadic’s niceties are assuaged
52
+
53
+ * New `clu.typology` functions for checking an iterable’s contents. [Alexander Böhn]
54
+
55
+ … like: “allthesame(iterable)” works with hashable OR non-hashable
56
+ contents!! HOW DID HE DO THAT??? you ask. Check the code, it was
57
+ a good time!
58
+ … similarly “allsimilar(iterable[, xform=casefold]) will basically
59
+ do when ‘allthesame(…)’ does but after applying some convenience
60
+ item-transformer function
61
+ … Both of these use @itervariadic, are documented, and export all
62
+ their (equally well-documented) constituent lambdas
63
+
64
+ Indeed yes!
65
+
66
+ * Providing a slightly more invariant `__hash__` for frozen keymaps. [Alexander Böhn]
67
+
68
+ * All-new, all-singing all-dancing recursive ordered expansion!!! [Alexander Böhn]
69
+
70
+ … Specifically:
71
+ • Our verenable and yet lovely “clu.config.abc.FlatOrderedSet”
72
+ alongside our exotic, experimental “clu.dicts.ChainMapPlusPlus”
73
+ now have recursive expansion iterator initialization functions!!
74
+ • WHAT DOES THAT MEAN?!? you ask (nay, demand) to know? Well. Both
75
+ of those classes each can accept an arbitrary bunch of *things*
76
+ when initializing their respective instances. Idiomatically, that
77
+ arbitrary bunch can contain instances of the very class being
78
+ initialized!
79
+ • Up until like just now, pretty much, both of those classes would
80
+ expand such instances in-place and in-order when they came across
81
+ them during initialization. Sorta. I mean, they kind-of clumsily
82
+ did like some if/thens and would expand instances, but only one
83
+ level deep for sure. It was unreliable fragile shit even when it
84
+ did work – but I loved both these true-CLU containers when they
85
+ were functional!
86
+ • But now they are, like totally – they are quickly and recursively
87
+ each using an “expand(…)” method to both expand and uniquify all
88
+ things in the list they end up containing. You should read this
89
+ code because I am proud of it and it is cool. It’s documented,
90
+ too, so yeah you’re welcome!!
91
+
92
+ … of course some other ancillary things were tweaked for this; as of
93
+ this time, all tests have gone green. So in conclusion: fuck yes.
94
+
95
+ * Scrapped a few *really* old `clu.config` tests whose meaning is lost. [Alexander Böhn]
96
+
97
+ … like they were only testing inoperative legacy shit – the likes
98
+ of which, while aspirational in its day, is all something I’d
99
+ enjoy completely forgetting about as soon as is biologically
100
+ advisable. In essence. Yes!
101
+
102
+ * Trying to squeeze more speed out of `clu.config.abc.FlatOrderedSet` [Alexander Böhn]
103
+
104
+ … I love that class, I’ll have you know – warts and all, I do love
105
+ that motherfucking thing
106
+
107
+ * Tweaks in the clu.config.abc.FlatOrderedSet initialization. [Alexander Böhn]
108
+
109
+ … basically I love using “filter(¬)” whenever possible
110
+
111
+ * Such a minor optimization it may just be premature. [Alexander Böhn]
112
+
113
+ * Minor changes to `clu.config.keymap.FrozenNested::submap(…)` [Alexander Böhn]
114
+
115
+ … AGAIN. I know. These are minor, yes, but they clarify things too
116
+
117
+ * An inline test and a fixture for `clu.tree` [Alexander Böhn]
118
+
119
+ … it’s something, OK? Gimme like five minutes, unless your kids are
120
+ on fire or something of similar urgency. THANK YOU.
121
+
122
+ * Fixed a few uncaught errors there in `clu.trie.Trie` [Alexander Böhn]
123
+
124
+ … time for inline tests here in this new module, ay wot, wot, wot?
125
+
126
+ * Split the gratuitous `clu.trie.Trie` methods off from the essentials. [Alexander Böhn]
127
+
128
+ … maybe this makes things go faster, even with slots, when memory
129
+ is the thing at issue? I know not. But I am not above doing this,
130
+ clearly as we can see
131
+
132
+ * Fixed a few dangling references to `config.utils` [Alexander Böhn]
133
+
134
+ Q.v. commit supra.
135
+
136
+ * An extremely minor clarification. [Alexander Böhn]
137
+
138
+ … namely, the first arg for that lambda is always a class instance,
139
+ not a regular-instance instance, erm. So instead it says “cls”,
140
+ now, and not “self”, and I consider myself at least clarified
141
+ (if not edified).
142
+
143
+ * Renaming `clu.config.utils` to `clu.config.keymaputils` [Alexander Böhn]
144
+
145
+ … There are waaaaaaaaay too many “utils.py” modules out there in
146
+ the world, if you asked me. I’m doing *my* part.
147
+
148
+ * Fixed another `README.md` glitch. [Alexander Böhn]
149
+
150
+ … there was a problematic set of superscript HTML tags that were
151
+ being literally rendered.
152
+
153
+ * Dealt with the download link in `README.md` [Alexander Böhn]
154
+
155
+ … as in, it will (or at least, *should*) always be current now
156
+
157
+ * Various and sundry semantic renamings. [Alexander Böhn]
158
+
159
+ * OK SO. I had to revert some things. [Alexander Böhn]
160
+
161
+ … namely I got reaaeeaaaalllll clever with those namespaced-walker
162
+ keymap view “__iter__(…)” methods – as it turns out, because of
163
+ all that reeeaaaaaalllll clever shiit I pulled with the submaps
164
+ being all properly of the right class, oh ho ho, yadda yadda,
165
+ but that did NOT WORK. Namely iterating a keymap submap can trigger
166
+ some crazy recursive shit in some cases, e.g. with the “Environ”
167
+ maps and other such things.
168
+
169
+ … soooooo. Until I unfuck this, the rule is “do not iterate submaps
170
+ within NamespacedWalker views’ ‘__iter__(…)’ methods – in fact,
171
+ probably don’t fucking iterate them at all in this context, OK?”
172
+
173
+ … yeah. OK yeah.
174
+
175
+ * Simplify, and Exclude. [Alexander Böhn]
176
+
177
+ * More `clu.config.keymap` nitpicks like simians endlessly grooming. [Alexander Böhn]
178
+
179
+ * Ooooo I hate turning generators back into stupid returns. [Alexander Böhn]
180
+
181
+ * Some (no doubt premature) optimizations in `clu.config.keymapview` [Alexander Böhn]
182
+
183
+
184
+ ## v0.12.13 (2025-06-13)
5
185
 
6
186
  ### Add
7
187
 
@@ -9,6 +189,10 @@
9
189
 
10
190
  ### Other
11
191
 
192
+ * Bumped version: 0.12.12 → 0.12.13. [Alexander Böhn]
193
+
194
+ * [make] New changelog added. [Alexander Böhn]
195
+
12
196
  * Nixed `clu.dicts.ChainMap.__eq__(…)` for the moment. [Alexander Böhn]
13
197
 
14
198
  … because I have reason to believe that, at this time, it may suck.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-clu
3
- Version: 0.12.13
3
+ Version: 0.12.14
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
@@ -152,7 +152,8 @@ So do have a look around. Here’s an abridged breakdown of some things within:
152
152
 
153
153
  … and there are plenty of tools for rolling your own `KeyMap`s in [`clu.config`][clu.config]: the
154
154
  [`proxy`][clu.config.proxy] subpackage has a `KeyMap` proxy class, [`ns`][clu.config.ns] has utility functions
155
- for manipulating namespace strings, [`keymapview`][clu.config.keymapview] has a class tower for
155
+ for manipulating namespace strings, [`keymaputils`][clu.config.keymaputils] has more general utility functions (right now
156
+ the `freeze`/`thaw` functions live there), [`keymapview`][clu.config.keymapview] has a class tower for
156
157
  [`KeyMap`][clu.config.keymap] key/value/item views, and [`abc`][clu.config.abc] has, as you’d expect, all
157
158
  the abstract base classes upon which our [`KeyMap`s][clu.config.keymap] are built, for your perusal and
158
159
  eventual enjoyment.
@@ -252,9 +253,9 @@ So do have a look around. Here’s an abridged breakdown of some things within:
252
253
  [`types.ModuleType`][types.ModuleType] is to be found in `typespace.types.Module`, [`types.FunctionType`][types.FunctionType]
253
254
  is `typespace.types.Function`, et cetera, ad nauseum, so you can just do `from clu.typespace import types`
254
255
  to lose the redundant “Type” naming suffix – which I don’t know about you but that annoys me, I mean we all know
255
- that these things are types because they are in the fucking [`types`][types] module and don’t need those overly verbose extra four characters
256
- there at the end. ALSO, there are additional useful types, from Python’s standard library and common packages,
257
- in the [`types` namespace][clu.typespace.namespace]. YOU’RE WELCOME!!
256
+ that these things are types because they are in the fucking [`types`][types] module and don’t need those overly
257
+ verbose extra four characters there at the end. ALSO, there are additional useful types, from Python’s standard
258
+ library and common packages, in the [`types` namespace][clu.typespace.namespace]. YOU’RE WELCOME!!
258
259
 
259
260
  * [`enums`][clu.enums]: Furnishes `alias(…)` – which, spoiler alert, let you create aliases within your enums!
260
261
  Oh yes. Like so:
@@ -434,6 +435,13 @@ So do have a look around. Here’s an abridged breakdown of some things within:
434
435
  * [`sanitizer`][clu.sanitizer]: functions for cleaning up unicode. Right now there is just a list-based `sanitize(…)`
435
436
  function that tones down anything with high-value code points to the point where it can be safely `ascii`-ified.
436
437
 
438
+ * [`trie`][clu.trie]: A relative newcomer, [`clu.trie`][clu.trie] is a toolkit for building trie-search type custom
439
+ systems for parsing specific things, i.e. error strings, program output… [`clu.config.keymap`][KeyMap keys] maybe,
440
+ who knows. It’s all shiny and new (meaning: the current contents will fail to blow your mind); if tries and/or other
441
+ similar tree-search dark arts are, like, your thing: do hit me up with suggestions or samples, or PULL REQUESTS!!
442
+ How do I love pull requests. I’ll toast your name for life, if you were to send me one good PR. On this or anything
443
+ else (you’re heartily invited to nitpick my abundantly horrid spelling errors too if you are into that). Yes!
444
+
437
445
  * [`typology`][clu.typology]: This is like [`clu.predicates`][clu.predicates] but with more predicates, many of which are
438
446
  based on typelists. The module is full of typelists and it uses them extensively in its predicates, via `isinstance(…)`,
439
447
  `issubclass(…)` and a custom version of same called `subclasscheck(…)` which tries very hard to work with
@@ -445,7 +453,7 @@ So do have a look around. Here’s an abridged breakdown of some things within:
445
453
  primitives amongst other things. The (skeletal) [`git_version`][clu.version.git_version] subpackage has a
446
454
  couple of [Git-related][git-link] functions, but what you really want is in [`read_version`][clu.version.read_version]
447
455
  – therein you’ll find a `read_version_file(…)` function that uses the `ast` module to read one of those
448
- `__version__.py` files I know you have lying around. Yes![<sup>†</sup>](#dagger)
456
+ `__version__.py` files I know you have lying around. Yes[<sup>†</sup>](#dagger)!
449
457
 
450
458
  * [The `pytest` testsuite][clu-testsuite]: CLU has a full set of [`pytest`][pytest-link]-compatible unit tests.
451
459
  In addition to copious module-specific [CLU inline tests][clu.testing], you can run this test suite using
@@ -471,7 +479,7 @@ So do have a look around. Here’s an abridged breakdown of some things within:
471
479
 
472
480
  <!--- LINKS! LINKS! LINKS! -->
473
481
  [pypi-link]: https://pypi.org/project/python-clu/
474
- [download-link]: https://files.pythonhosted.org/packages/3e/af/4b0dfabe816cee7802cf6981f7f79770c4f05f8df4ac64fc6984789baaaa/python_clu-0.12.3.tar.gz
482
+ [download-link]: https://github.com/fish2000/CLU/archive/refs/heads/master.zip
475
483
  [homage-replutilities-link]: https://github.com/fish2000/homage/blob/master/.script-bin/replutilities.py
476
484
  [clu-tron-link]: https://tron.fandom.com/wiki/Clu
477
485
 
@@ -498,6 +506,7 @@ So do have a look around. Here’s an abridged breakdown of some things within:
498
506
  [clu.config.keymapview]: https://github.com/fish2000/CLU/tree/master/clu/config/keymapview.py
499
507
  [clu.config.ns]: https://github.com/fish2000/CLU/tree/master/clu/config/ns.py
500
508
  [clu.config.proxy]: https://github.com/fish2000/CLU/tree/master/clu/config/proxy.py
509
+ [clu.config.keymaputils]: https://github.com/fish2000/CLU/tree/master/clu/config/keymaputils.py
501
510
 
502
511
  [clu.constants]: https://github.com/fish2000/CLU/tree/master/clu/constants
503
512
  [clu.constants.consts]: https://github.com/fish2000/CLU/tree/master/clu/constants/consts.py
@@ -558,6 +567,7 @@ So do have a look around. Here’s an abridged breakdown of some things within:
558
567
  [clu.repr]: https://github.com/fish2000/CLU/tree/master/clu/repr.py
559
568
  [clu.sanitizer]: https://github.com/fish2000/CLU/tree/master/clu/sanitizer.py
560
569
  [clu.stdio]: https://github.com/fish2000/CLU/tree/master/clu/stdio.py
570
+ [clu.trie]: https://github.com/fish2000/CLU/tree/master/clu/trie.py
561
571
  [clu.typology]: https://github.com/fish2000/CLU/tree/master/clu/typology.py
562
572
 
563
573
  [instakit]: https://github.com/fish2000/instakit
@@ -82,7 +82,8 @@ So do have a look around. Here’s an abridged breakdown of some things within:
82
82
 
83
83
  … and there are plenty of tools for rolling your own `KeyMap`s in [`clu.config`][clu.config]: the
84
84
  [`proxy`][clu.config.proxy] subpackage has a `KeyMap` proxy class, [`ns`][clu.config.ns] has utility functions
85
- for manipulating namespace strings, [`keymapview`][clu.config.keymapview] has a class tower for
85
+ for manipulating namespace strings, [`keymaputils`][clu.config.keymaputils] has more general utility functions (right now
86
+ the `freeze`/`thaw` functions live there), [`keymapview`][clu.config.keymapview] has a class tower for
86
87
  [`KeyMap`][clu.config.keymap] key/value/item views, and [`abc`][clu.config.abc] has, as you’d expect, all
87
88
  the abstract base classes upon which our [`KeyMap`s][clu.config.keymap] are built, for your perusal and
88
89
  eventual enjoyment.
@@ -182,9 +183,9 @@ So do have a look around. Here’s an abridged breakdown of some things within:
182
183
  [`types.ModuleType`][types.ModuleType] is to be found in `typespace.types.Module`, [`types.FunctionType`][types.FunctionType]
183
184
  is `typespace.types.Function`, et cetera, ad nauseum, so you can just do `from clu.typespace import types`
184
185
  to lose the redundant “Type” naming suffix – which I don’t know about you but that annoys me, I mean we all know
185
- that these things are types because they are in the fucking [`types`][types] module and don’t need those overly verbose extra four characters
186
- there at the end. ALSO, there are additional useful types, from Python’s standard library and common packages,
187
- in the [`types` namespace][clu.typespace.namespace]. YOU’RE WELCOME!!
186
+ that these things are types because they are in the fucking [`types`][types] module and don’t need those overly
187
+ verbose extra four characters there at the end. ALSO, there are additional useful types, from Python’s standard
188
+ library and common packages, in the [`types` namespace][clu.typespace.namespace]. YOU’RE WELCOME!!
188
189
 
189
190
  * [`enums`][clu.enums]: Furnishes `alias(…)` – which, spoiler alert, let you create aliases within your enums!
190
191
  Oh yes. Like so:
@@ -364,6 +365,13 @@ So do have a look around. Here’s an abridged breakdown of some things within:
364
365
  * [`sanitizer`][clu.sanitizer]: functions for cleaning up unicode. Right now there is just a list-based `sanitize(…)`
365
366
  function that tones down anything with high-value code points to the point where it can be safely `ascii`-ified.
366
367
 
368
+ * [`trie`][clu.trie]: A relative newcomer, [`clu.trie`][clu.trie] is a toolkit for building trie-search type custom
369
+ systems for parsing specific things, i.e. error strings, program output… [`clu.config.keymap`][KeyMap keys] maybe,
370
+ who knows. It’s all shiny and new (meaning: the current contents will fail to blow your mind); if tries and/or other
371
+ similar tree-search dark arts are, like, your thing: do hit me up with suggestions or samples, or PULL REQUESTS!!
372
+ How do I love pull requests. I’ll toast your name for life, if you were to send me one good PR. On this or anything
373
+ else (you’re heartily invited to nitpick my abundantly horrid spelling errors too if you are into that). Yes!
374
+
367
375
  * [`typology`][clu.typology]: This is like [`clu.predicates`][clu.predicates] but with more predicates, many of which are
368
376
  based on typelists. The module is full of typelists and it uses them extensively in its predicates, via `isinstance(…)`,
369
377
  `issubclass(…)` and a custom version of same called `subclasscheck(…)` which tries very hard to work with
@@ -375,7 +383,7 @@ So do have a look around. Here’s an abridged breakdown of some things within:
375
383
  primitives amongst other things. The (skeletal) [`git_version`][clu.version.git_version] subpackage has a
376
384
  couple of [Git-related][git-link] functions, but what you really want is in [`read_version`][clu.version.read_version]
377
385
  – therein you’ll find a `read_version_file(…)` function that uses the `ast` module to read one of those
378
- `__version__.py` files I know you have lying around. Yes![<sup>†</sup>](#dagger)
386
+ `__version__.py` files I know you have lying around. Yes[<sup>†</sup>](#dagger)!
379
387
 
380
388
  * [The `pytest` testsuite][clu-testsuite]: CLU has a full set of [`pytest`][pytest-link]-compatible unit tests.
381
389
  In addition to copious module-specific [CLU inline tests][clu.testing], you can run this test suite using
@@ -401,7 +409,7 @@ So do have a look around. Here’s an abridged breakdown of some things within:
401
409
 
402
410
  <!--- LINKS! LINKS! LINKS! -->
403
411
  [pypi-link]: https://pypi.org/project/python-clu/
404
- [download-link]: https://files.pythonhosted.org/packages/3e/af/4b0dfabe816cee7802cf6981f7f79770c4f05f8df4ac64fc6984789baaaa/python_clu-0.12.3.tar.gz
412
+ [download-link]: https://github.com/fish2000/CLU/archive/refs/heads/master.zip
405
413
  [homage-replutilities-link]: https://github.com/fish2000/homage/blob/master/.script-bin/replutilities.py
406
414
  [clu-tron-link]: https://tron.fandom.com/wiki/Clu
407
415
 
@@ -428,6 +436,7 @@ So do have a look around. Here’s an abridged breakdown of some things within:
428
436
  [clu.config.keymapview]: https://github.com/fish2000/CLU/tree/master/clu/config/keymapview.py
429
437
  [clu.config.ns]: https://github.com/fish2000/CLU/tree/master/clu/config/ns.py
430
438
  [clu.config.proxy]: https://github.com/fish2000/CLU/tree/master/clu/config/proxy.py
439
+ [clu.config.keymaputils]: https://github.com/fish2000/CLU/tree/master/clu/config/keymaputils.py
431
440
 
432
441
  [clu.constants]: https://github.com/fish2000/CLU/tree/master/clu/constants
433
442
  [clu.constants.consts]: https://github.com/fish2000/CLU/tree/master/clu/constants/consts.py
@@ -488,6 +497,7 @@ So do have a look around. Here’s an abridged breakdown of some things within:
488
497
  [clu.repr]: https://github.com/fish2000/CLU/tree/master/clu/repr.py
489
498
  [clu.sanitizer]: https://github.com/fish2000/CLU/tree/master/clu/sanitizer.py
490
499
  [clu.stdio]: https://github.com/fish2000/CLU/tree/master/clu/stdio.py
500
+ [clu.trie]: https://github.com/fish2000/CLU/tree/master/clu/trie.py
491
501
  [clu.typology]: https://github.com/fish2000/CLU/tree/master/clu/typology.py
492
502
 
493
503
  [instakit]: https://github.com/fish2000/instakit
@@ -504,4 +514,4 @@ So do have a look around. Here’s an abridged breakdown of some things within:
504
514
  [types.FunctionType]: https://docs.python.org/3/library/types.html#types.FunctionType
505
515
  [types.SimpleNamespace]: https://docs.python.org/3/library/types.html#additional-utility-classes-and-functions
506
516
  [zipfile]: https://docs.python.org/3/library/zipfile.html
507
- [dicts]: https://docs.python.org/3/tutorial/datastructures.html#dictionaries
517
+ [dicts]: https://docs.python.org/3/tutorial/datastructures.html#dictionaries
@@ -0,0 +1 @@
1
+ __version__ = '0.12.14'
@@ -15,7 +15,7 @@ from clu.config.ns import unpack_ns, pack_ns, get_ns, compare_ns
15
15
  from clu.config.keymapview import KeyMapKeysView, KeyMapItemsView, KeyMapValuesView
16
16
  from clu.config.keymapview import NamespaceWalkerKeysView, NamespaceWalkerItemsView
17
17
  from clu.config.keymapview import NamespaceWalkerValuesView
18
- from clu.config.utils import freeze_class
18
+ from clu.config.keymaputils import freeze_class
19
19
 
20
20
  from clu.naming import qualified_import, qualified_name, nameof
21
21
  from clu.predicates import (typeof,
@@ -202,7 +202,7 @@ class FrozenKeyMap(FrozenKeyMapBase):
202
202
  return KeyMapValuesView(self, *namespaces)
203
203
 
204
204
  def __hash__(self):
205
- return hash(tuple(self.values()))
205
+ return hash(tuple(self.keys())) ^ len(self)
206
206
 
207
207
  def _get_namespace_foset(self):
208
208
  return FlatOrderedSet(get_ns(nskey) for nskey in sorted(self) if NAMESPACE_SEP in nskey)
@@ -415,17 +415,17 @@ class NamespaceWalker(FrozenKeyMap):
415
415
 
416
416
  def __contains__(self, nskey):
417
417
  key, fragments = unpack_ns(nskey)
418
- for *ns, k, value in self.walk():
418
+ for *frags, k, value in self.walk():
419
419
  if k == key:
420
- if compare_ns(ns, fragments):
420
+ if compare_ns(frags, fragments):
421
421
  return True
422
422
  return False
423
423
 
424
424
  def __getitem__(self, nskey):
425
425
  key, fragments = unpack_ns(nskey)
426
- for *ns, k, value in self.walk():
426
+ for *frags, k, value in self.walk():
427
427
  if k == key:
428
- if compare_ns(ns, fragments):
428
+ if compare_ns(frags, fragments):
429
429
  return value
430
430
  raise KeyError(nskey)
431
431
 
@@ -481,35 +481,64 @@ class FlatOrderedSet(collections.abc.Set,
481
481
 
482
482
  @classmethod
483
483
  def is_a(cls, instance):
484
+ """ Check to see if a thing – an instance, whatever – is, like,
485
+ close enough to what “this class” is to be a viable enough
486
+ thing that way. Erm. Like it can be a FlatOrderedSet or whatever
487
+ for our purposes (which is, while initialization, just something
488
+ that is ordered and may or may not have other FlatOrderedSets
489
+ all up inside it). That probably doesn’t help. I’ll rewrite
490
+ this docstring and rename the function later, yes.
491
+ """
484
492
  return isinstance(instance, (cls, FlatOrderedSet)) or \
485
493
  isinstance(getattr(instance, 'things', None),
486
494
  collections.abc.Iterable)
487
495
 
496
+ @classmethod
497
+ def expand(cls, *things, seen=None, predicate=always):
498
+ """ Go through a list-like containerful of things, and if any of
499
+ those is a container just like we are, expand it in place –
500
+ recursively, of course, so everything can be nested as fuck
501
+ for all we care (q.v. “FlatOrderedSet::is_a(…)” doc supra).
502
+
503
+ """
504
+ # Set up a set of everything “seen”, which we pass forward
505
+ # into recursive calls:
506
+ thingseen = seen or set()
507
+
508
+ # Step through the non-None things we were given, preserving
509
+ # their order:
510
+ for thing in filter(None, things):
511
+ if cls.is_a(thing):
512
+ # Are they “us”? If so, recursively expand them:
513
+ yield from cls.expand(*thing, seen=thingseen, predicate=predicate)
514
+
515
+ elif predicate(thing):
516
+ # If they are not us, does our predicate test OK
517
+ # against, ah, “them”? If it does, add them to the
518
+ # seen-set and yield them out:
519
+ if thing not in thingseen:
520
+ thingseen.add(thing)
521
+ yield thing
522
+
488
523
  def __init__(self, *things, predicate=always):
489
524
  """ Initialize a new FlatOrderedSet instance with zero or more things.
490
525
 
491
526
  Optionally, a unary boolean function “predicate” may be specified
492
527
  to filter the list of things.
493
528
  """
529
+ # Make sure the predicate is not garbage:
494
530
  if uncallable(predicate):
495
531
  raise ValueError("FlatOrderedSet requires a callable predicate")
496
- thinglist = []
532
+
533
+ # Budget knock-off of the logic from “clu.predicates.itervariadic”:
497
534
  if len(things) == 1:
498
535
  if isexpandable(things[0]):
499
536
  things = things[0]
500
537
  elif iscontainer(things[0]) and not ismapping(things[0]):
501
538
  things = tuple(things[0])
502
- for thing in things:
503
- if thing is not None:
504
- if type(self).is_a(thing):
505
- for other in thing.things:
506
- if predicate(other):
507
- if other not in thinglist:
508
- thinglist.append(other)
509
- elif predicate(thing):
510
- if thing not in thinglist:
511
- thinglist.append(thing)
512
- self.things = tuple(thinglist)
539
+
540
+ # Install a flat, uniquified version of what we were passed
541
+ self.things = tuple(self.expand(*things, predicate=predicate))
513
542
  self.predicate = predicate
514
543
 
515
544
  def __iter__(self):
@@ -535,6 +564,9 @@ class FlatOrderedSet(collections.abc.Set,
535
564
  def __bool__(self):
536
565
  return len(self.things) > 0
537
566
 
567
+ def _hash(self):
568
+ return hash(self.things)
569
+
538
570
  def __hash__(self):
539
571
  return self._hash()
540
572
 
@@ -594,7 +626,7 @@ class FlatOrderedSet(collections.abc.Set,
594
626
 
595
627
  def to_dict(self):
596
628
  """ Used by `clu.config.codecs` to serialize FlatOrderedSets """
597
- return { 'things' : self.things,
629
+ return { 'things' : copy.copy(self.things),
598
630
  'predicate' : qualified_name(self.predicate) }
599
631
 
600
632
 
@@ -68,6 +68,9 @@ class TomlFile(TomlFileBase, appname=toml_appname,
68
68
  """
69
69
  pass
70
70
 
71
+ # FrozenTomlFile = TomlFile
72
+ # export(FrozenTomlFile, name='FrozenTomlFile', doc="Equivalent to “clu.config.formats.TomlFile”")
73
+
71
74
  # Assign the modules’ `__all__` and `__dir__` using the exporter:
72
75
  __all__, __dir__ = exporter.all_and_dir()
73
76
 
@@ -1,20 +1,17 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  from __future__ import print_function
3
- from functools import lru_cache
4
3
 
5
4
  import clu.abstract
6
5
  import copy
7
6
  import sys, re
8
7
 
9
8
  from clu.config import abc, ns
10
- from clu.config.utils import thaw_name, thaw_class, freeze_name, freeze_class
9
+ from clu.config.keymaputils import thaw_name, thaw_class, freeze_name, freeze_class
11
10
  from clu.constants import consts
12
11
  from clu.predicates import tuplize, typeof
13
12
  from clu.typology import ismapping
14
13
  from clu.exporting import Exporter, sysmods, itermodule
15
14
 
16
- cache = lambda function: lru_cache(maxsize=16, typed=False)(function)
17
-
18
15
  exporter = Exporter(path=__file__)
19
16
  export = exporter.decorator()
20
17
 
@@ -196,13 +193,14 @@ class FrozenNested(abc.NamespaceWalker, clu.abstract.ReprWrapper,
196
193
  def thaw(self):
197
194
  return thaw_class(type(self))(tree=copy.deepcopy(self.tree))
198
195
 
199
- def submap(self, *namespaces, unprefixed=False):
196
+ def submap(self, *namespaces, unprefixed=False, cls=False):
200
197
  """ Return a flattened mapping, if possible a mutable one,
201
198
  containing only items with keys matching the specified
202
199
  namespaces (as namespaced:key:paths).
203
200
  """
204
201
  # We’ll need this later:
205
- cls = freeze_class(type(self))
202
+ if not cls:
203
+ cls = freeze_class(type(self))
206
204
 
207
205
  # Short-circuit for returning unprefixed top-level items:
208
206
  if unprefixed:
@@ -212,14 +210,14 @@ class FrozenNested(abc.NamespaceWalker, clu.abstract.ReprWrapper,
212
210
  # If it’s not unprefixed, and we have no namespaces,
213
211
  # we cough up a new instance with our data:
214
212
  if not namespaces:
215
- return cls(self)
213
+ return cls(self.tree)
216
214
 
217
215
  # Our namespaces, their output data:
218
- ours = tuple(self.namespaces())
219
- theirs = dict()
216
+ ours = frozenset(self._get_namespace_foset().things)
217
+ theirs = {}
220
218
 
221
- # Go through the namespaces we were given, and copy anything
222
- # we have that matches those namespaces into a new output dict,
219
+ # Go through the namespaces we were passed, and copy anything
220
+ # we have that matches those namespaces into a new output dict –
223
221
  # wholesale and sans any namespaced-key prefixes:
224
222
  for namespace in namespaces:
225
223
  if namespace not in ours:
@@ -227,11 +225,11 @@ class FrozenNested(abc.NamespaceWalker, clu.abstract.ReprWrapper,
227
225
  d = self.tree
228
226
  for fragment in ns.split_ns(namespace):
229
227
  d = d[fragment]
230
- theirs.update({ namespace : d })
228
+ theirs[namespace] = d
231
229
 
232
230
  # Return a (possibly frozen) instance containing the specified
233
231
  # namespaced data, as a namespaced instance:
234
- return cls(**theirs)
232
+ return cls(theirs)
235
233
 
236
234
  def inner_repr(self):
237
235
  return repr(self.tree)
@@ -374,16 +372,17 @@ def flatdict():
374
372
  """ Flat-dictionary fixture function """
375
373
  out = {}
376
374
  for mappingpath in mapwalk(nestedmaps()):
377
- *namespaces, key, value = mappingpath
378
- nskey = ns.pack_ns(key, *namespaces)
375
+ *fragments, key, value = mappingpath
376
+ nskey = ns.pack_ns(key, *fragments)
379
377
  out[nskey] = value
380
378
  return out
381
379
 
382
380
  @inline.fixture
383
- def frozenclasses(check=True):
381
+ def frozenclasses():
384
382
  """ Scan `sys.modules` for “frozen”-looking types """
385
383
  from clu.naming import qualified_name
386
384
  seen = set()
385
+ out = list()
387
386
  for module in sysmods():
388
387
  for key, value in itermodule(module):
389
388
  if key.startswith("rozen", 1):
@@ -392,13 +391,16 @@ def frozenclasses(check=True):
392
391
  modname = qualified_name(module)
393
392
  if modname == '__main__':
394
393
  modname = exporter.dotpath
395
- yield (key, value, modname, thaw_name(key))
394
+ out.append((key, value, modname, thaw_name(key)))
395
+ return tuple(out)
396
396
 
397
397
  @inline.fixture
398
398
  def frozenclassnames():
399
399
  """ Same as the `frozenclasses()` fixture but with just the names """
400
- for quadruple in tuple(frozenclasses(check=True)):
401
- yield (quadruple[0], quadruple[2], quadruple[3])
400
+ out = list()
401
+ for quadruple in frozenclasses():
402
+ out.append((quadruple[0], quadruple[2], quadruple[3]))
403
+ return tuple(out)
402
404
 
403
405
  @inline.fixture
404
406
  def arbitrary():
@@ -600,4 +602,4 @@ def test():
600
602
  return inline.test(100)
601
603
 
602
604
  if __name__ == '__main__':
603
- sys.exit(test())
605
+ sys.exit(test())
@@ -83,7 +83,7 @@ def thaw_name(name):
83
83
  @cache
84
84
  def freeze_name(name):
85
85
  """ Private function, to cache “frozen” class names """
86
- if name.startswith("rozen", 1):
86
+ if name.startswith("rozen", 1) or name.endswith('File'):
87
87
  return name
88
88
  if name.islower():
89
89
  return f"frozen{name}"