python-clu 0.11.4__tar.gz → 0.11.6__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 (269) hide show
  1. {python_clu-0.11.4 → python_clu-0.11.6}/.bumpversion.toml +1 -1
  2. {python_clu-0.11.4 → python_clu-0.11.6}/CLASSIFIERS.txt +0 -1
  3. {python_clu-0.11.4 → python_clu-0.11.6}/PKG-INFO +1 -2
  4. python_clu-0.11.6/clu/__version__.py +1 -0
  5. {python_clu-0.11.4 → python_clu-0.11.6}/clu/abstract.py +1 -1
  6. {python_clu-0.11.4 → python_clu-0.11.6}/clu/exporting.py +26 -16
  7. {python_clu-0.11.4 → python_clu-0.11.6}/clu/fs/abc.py +3 -2
  8. {python_clu-0.11.4 → python_clu-0.11.6}/clu/fs/filesystem.py +10 -11
  9. {python_clu-0.11.4 → python_clu-0.11.6}/clu/predicates.py +10 -8
  10. {python_clu-0.11.4 → python_clu-0.11.6}/clu/repl/modules.py +42 -22
  11. {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/repl.py +7 -4
  12. {python_clu-0.11.4 → python_clu-0.11.6}/python_clu.egg-info/PKG-INFO +1 -2
  13. {python_clu-0.11.4 → python_clu-0.11.6}/setup.py +1 -1
  14. python_clu-0.11.4/clu/__version__.py +0 -1
  15. {python_clu-0.11.4 → python_clu-0.11.6}/.coveragerc +0 -0
  16. {python_clu-0.11.4 → python_clu-0.11.6}/.editorconfig +0 -0
  17. {python_clu-0.11.4 → python_clu-0.11.6}/.gitchangelog.rc +0 -0
  18. {python_clu-0.11.4 → python_clu-0.11.6}/.gitignore +0 -0
  19. {python_clu-0.11.4 → python_clu-0.11.6}/.landscape.yml +0 -0
  20. {python_clu-0.11.4 → python_clu-0.11.6}/.travis.yml +0 -0
  21. {python_clu-0.11.4 → python_clu-0.11.6}/ABOUT.md +0 -0
  22. {python_clu-0.11.4 → python_clu-0.11.6}/CHANGELOG.md +0 -0
  23. {python_clu-0.11.4 → python_clu-0.11.6}/CODE_OF_CONDUCT.md +0 -0
  24. {python_clu-0.11.4 → python_clu-0.11.6}/COPYING.md +0 -0
  25. {python_clu-0.11.4 → python_clu-0.11.6}/LICENSE.txt +0 -0
  26. {python_clu-0.11.4 → python_clu-0.11.6}/MANIFEST.in +0 -0
  27. {python_clu-0.11.4 → python_clu-0.11.6}/Makefile +0 -0
  28. {python_clu-0.11.4 → python_clu-0.11.6}/README.md +0 -0
  29. {python_clu-0.11.4 → python_clu-0.11.6}/appveyor.yml +0 -0
  30. {python_clu-0.11.4 → python_clu-0.11.6}/clu/__init__.py +0 -0
  31. {python_clu-0.11.4 → python_clu-0.11.6}/clu/__main__.py +0 -0
  32. {python_clu-0.11.4 → python_clu-0.11.6}/clu/all.py +0 -0
  33. {python_clu-0.11.4 → python_clu-0.11.6}/clu/api/__init__.py +0 -0
  34. {python_clu-0.11.4 → python_clu-0.11.6}/clu/api/__main__.py +0 -0
  35. {python_clu-0.11.4 → python_clu-0.11.6}/clu/application.py +0 -0
  36. {python_clu-0.11.4 → python_clu-0.11.6}/clu/compilation/__init__.py +0 -0
  37. {python_clu-0.11.4 → python_clu-0.11.6}/clu/compilation/compiledb.py +0 -0
  38. {python_clu-0.11.4 → python_clu-0.11.6}/clu/compilation/macros.py +0 -0
  39. {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/__init__.py +0 -0
  40. {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/abc.py +0 -0
  41. {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/base.py +0 -0
  42. {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/codecs.py +0 -0
  43. {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/env.py +0 -0
  44. {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/fieldtypes.py +0 -0
  45. {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/filebase.py +0 -0
  46. {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/formats/__init__.py +0 -0
  47. {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/formats/jsonfile.py +0 -0
  48. {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/formats/picklefile.py +0 -0
  49. {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/formats/tomlfile.py +0 -0
  50. {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/formats/yamlfile.py +0 -0
  51. {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/keymap.py +0 -0
  52. {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/keymapview.py +0 -0
  53. {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/ns.py +0 -0
  54. {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/proxy.py +0 -0
  55. {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/settings.py +0 -0
  56. {python_clu-0.11.4 → python_clu-0.11.6}/clu/constants/__init__.py +0 -0
  57. {python_clu-0.11.4 → python_clu-0.11.6}/clu/constants/__main__.py +0 -0
  58. {python_clu-0.11.4 → python_clu-0.11.6}/clu/constants/consts.py +0 -0
  59. {python_clu-0.11.4 → python_clu-0.11.6}/clu/constants/data.py +0 -0
  60. {python_clu-0.11.4 → python_clu-0.11.6}/clu/constants/enums.py +0 -0
  61. {python_clu-0.11.4 → python_clu-0.11.6}/clu/constants/exceptions.py +0 -0
  62. {python_clu-0.11.4 → python_clu-0.11.6}/clu/constants/polyfills.py +0 -0
  63. {python_clu-0.11.4 → python_clu-0.11.6}/clu/csv.py +0 -0
  64. {python_clu-0.11.4 → python_clu-0.11.6}/clu/dicts.py +0 -0
  65. {python_clu-0.11.4 → python_clu-0.11.6}/clu/dispatch.py +0 -0
  66. {python_clu-0.11.4 → python_clu-0.11.6}/clu/enums.py +0 -0
  67. {python_clu-0.11.4 → python_clu-0.11.6}/clu/extending.py +0 -0
  68. {python_clu-0.11.4 → python_clu-0.11.6}/clu/fs/__init__.py +0 -0
  69. {python_clu-0.11.4 → python_clu-0.11.6}/clu/fs/appdirectories.py +0 -0
  70. {python_clu-0.11.4 → python_clu-0.11.6}/clu/fs/misc.py +0 -0
  71. {python_clu-0.11.4 → python_clu-0.11.6}/clu/fs/pypath.py +0 -0
  72. {python_clu-0.11.4 → python_clu-0.11.6}/clu/fs/sourcetree.py +0 -0
  73. {python_clu-0.11.4 → python_clu-0.11.6}/clu/importing/__init__.py +0 -0
  74. {python_clu-0.11.4 → python_clu-0.11.6}/clu/importing/__main__.py +0 -0
  75. {python_clu-0.11.4 → python_clu-0.11.6}/clu/importing/base.py +0 -0
  76. {python_clu-0.11.4 → python_clu-0.11.6}/clu/importing/proxy.py +0 -0
  77. {python_clu-0.11.4 → python_clu-0.11.6}/clu/keyvalue.py +0 -0
  78. {python_clu-0.11.4 → python_clu-0.11.6}/clu/mathematics.py +0 -0
  79. {python_clu-0.11.4 → python_clu-0.11.6}/clu/naming.py +0 -0
  80. {python_clu-0.11.4 → python_clu-0.11.6}/clu/repl/__init__.py +0 -0
  81. {python_clu-0.11.4 → python_clu-0.11.6}/clu/repl/ansi.py +0 -0
  82. {python_clu-0.11.4 → python_clu-0.11.6}/clu/repl/banners.py +0 -0
  83. {python_clu-0.11.4 → python_clu-0.11.6}/clu/repl/cli/__init__.py +0 -0
  84. {python_clu-0.11.4 → python_clu-0.11.6}/clu/repl/cli/boilerplate.py +0 -0
  85. {python_clu-0.11.4 → python_clu-0.11.6}/clu/repl/cli/boilerplate_copy.py +0 -0
  86. {python_clu-0.11.4 → python_clu-0.11.6}/clu/repl/cli/print_version.py +0 -0
  87. {python_clu-0.11.4 → python_clu-0.11.6}/clu/repl/columnize.py +0 -0
  88. {python_clu-0.11.4 → python_clu-0.11.6}/clu/repr.py +0 -0
  89. {python_clu-0.11.4 → python_clu-0.11.6}/clu/sanitizer.py +0 -0
  90. {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/.gitignore +0 -0
  91. {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/README.md +0 -0
  92. {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/__init__.py +0 -0
  93. {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/ansicolors.py +0 -0
  94. {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/boilerplate.py +0 -0
  95. {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/dictroast.py +0 -0
  96. {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/legacy/forkumask.py +0 -0
  97. {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/legacy/repl-bpython.py +0 -0
  98. {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/legacy/repl-ipython.py +0 -0
  99. {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/legacy/repl-ptpython.py +0 -0
  100. {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/legacy/repl-pyzo.py +0 -0
  101. {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/legacy/xdg-runtime.py +0 -0
  102. {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/prediversus.py +0 -0
  103. {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/treeline.py +0 -0
  104. {python_clu-0.11.4 → python_clu-0.11.6}/clu/shelving/__init__.py +0 -0
  105. {python_clu-0.11.4 → python_clu-0.11.6}/clu/shelving/redat.py +0 -0
  106. {python_clu-0.11.4 → python_clu-0.11.6}/clu/shelving/redis.conf +0 -0
  107. {python_clu-0.11.4 → python_clu-0.11.6}/clu/stdio.py +0 -0
  108. {python_clu-0.11.4 → python_clu-0.11.6}/clu/testing/__init__.py +0 -0
  109. {python_clu-0.11.4 → python_clu-0.11.6}/clu/testing/hook.py +0 -0
  110. {python_clu-0.11.4 → python_clu-0.11.6}/clu/testing/obsolete.py +0 -0
  111. {python_clu-0.11.4 → python_clu-0.11.6}/clu/testing/pytest.py +0 -0
  112. {python_clu-0.11.4 → python_clu-0.11.6}/clu/testing/utils.py +0 -0
  113. {python_clu-0.11.4 → python_clu-0.11.6}/clu/typespace/__init__.py +0 -0
  114. {python_clu-0.11.4 → python_clu-0.11.6}/clu/typespace/__main__.py +0 -0
  115. {python_clu-0.11.4 → python_clu-0.11.6}/clu/typespace/namespace.py +0 -0
  116. {python_clu-0.11.4 → python_clu-0.11.6}/clu/typology.py +0 -0
  117. {python_clu-0.11.4 → python_clu-0.11.6}/clu/version/__init__.py +0 -0
  118. {python_clu-0.11.4 → python_clu-0.11.6}/clu/version/__main__.py +0 -0
  119. {python_clu-0.11.4 → python_clu-0.11.6}/clu/version/git_version.py +0 -0
  120. {python_clu-0.11.4 → python_clu-0.11.6}/clu/version/read_version.py +0 -0
  121. {python_clu-0.11.4 → python_clu-0.11.6}/codecov.yml +0 -0
  122. {python_clu-0.11.4 → python_clu-0.11.6}/conftest.py +0 -0
  123. {python_clu-0.11.4 → python_clu-0.11.6}/docs/Makefile +0 -0
  124. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/doctrees/api.doctree +0 -0
  125. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/doctrees/environment.pickle +0 -0
  126. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/doctrees/generated/clu.doctree +0 -0
  127. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/doctrees/index.doctree +0 -0
  128. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/.buildinfo +0 -0
  129. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_sources/api.rst.txt +0 -0
  130. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_sources/generated/clu.rst.txt +0 -0
  131. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_sources/index.rst.txt +0 -0
  132. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/_sphinx_javascript_frameworks_compat.js +0 -0
  133. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/alabaster.css +0 -0
  134. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/basic.css +0 -0
  135. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/badge_only.css +0 -0
  136. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  137. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  138. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  139. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  140. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  141. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/fontawesome-webfont.svg +0 -0
  142. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  143. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  144. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  145. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
  146. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  147. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/lato-bold.woff +0 -0
  148. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/lato-bold.woff2 +0 -0
  149. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
  150. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  151. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/lato-normal.woff +0 -0
  152. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/lato-normal.woff2 +0 -0
  153. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/theme.css +0 -0
  154. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/custom.css +0 -0
  155. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/doctools.js +0 -0
  156. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/documentation_options.js +0 -0
  157. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/file.png +0 -0
  158. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/jquery-3.6.0.js +0 -0
  159. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/jquery.js +0 -0
  160. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/js/badge_only.js +0 -0
  161. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/js/html5shiv-printshiv.min.js +0 -0
  162. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/js/html5shiv.min.js +0 -0
  163. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/js/theme.js +0 -0
  164. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/language_data.js +0 -0
  165. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/minus.png +0 -0
  166. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/plus.png +0 -0
  167. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/pygments.css +0 -0
  168. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/searchtools.js +0 -0
  169. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/underscore-1.13.1.js +0 -0
  170. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/underscore.js +0 -0
  171. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/api.html +0 -0
  172. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/generated/clu.html +0 -0
  173. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/genindex.html +0 -0
  174. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/index.html +0 -0
  175. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/objects.inv +0 -0
  176. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/py-modindex.html +0 -0
  177. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/search.html +0 -0
  178. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/searchindex.js +0 -0
  179. {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/man/clu.1 +0 -0
  180. {python_clu-0.11.4 → python_clu-0.11.6}/docs/make.bat +0 -0
  181. {python_clu-0.11.4 → python_clu-0.11.6}/docs/source/api.rst +0 -0
  182. {python_clu-0.11.4 → python_clu-0.11.6}/docs/source/conf.py +0 -0
  183. {python_clu-0.11.4 → python_clu-0.11.6}/docs/source/generated/clu.rst +0 -0
  184. {python_clu-0.11.4 → python_clu-0.11.6}/docs/source/index.rst +0 -0
  185. {python_clu-0.11.4 → python_clu-0.11.6}/hooks/autohook.sh +0 -0
  186. {python_clu-0.11.4 → python_clu-0.11.6}/hooks/post-push/00-coverage.sh +0 -0
  187. {python_clu-0.11.4 → python_clu-0.11.6}/hooks/pre-push/00-noop.sh +0 -0
  188. {python_clu-0.11.4 → python_clu-0.11.6}/hooks/pre-push/01-direnv-stdlib.sh +0 -0
  189. {python_clu-0.11.4 → python_clu-0.11.6}/hooks/scripts/coverage.sh +0 -0
  190. {python_clu-0.11.4 → python_clu-0.11.6}/hooks/scripts/display-issues.sh +0 -0
  191. {python_clu-0.11.4 → python_clu-0.11.6}/hooks/scripts/git-pushex +0 -0
  192. {python_clu-0.11.4 → python_clu-0.11.6}/hooks/scripts/noop.sh +0 -0
  193. {python_clu-0.11.4 → python_clu-0.11.6}/mypy.ini +0 -0
  194. {python_clu-0.11.4 → python_clu-0.11.6}/noxfile.py +0 -0
  195. {python_clu-0.11.4 → python_clu-0.11.6}/pyproject.toml +0 -0
  196. {python_clu-0.11.4 → python_clu-0.11.6}/pytest.ini +0 -0
  197. {python_clu-0.11.4 → python_clu-0.11.6}/python_clu.egg-info/SOURCES.txt +0 -0
  198. {python_clu-0.11.4 → python_clu-0.11.6}/python_clu.egg-info/dependency_links.txt +0 -0
  199. {python_clu-0.11.4 → python_clu-0.11.6}/python_clu.egg-info/entry_points.txt +0 -0
  200. {python_clu-0.11.4 → python_clu-0.11.6}/python_clu.egg-info/requires.txt +0 -0
  201. {python_clu-0.11.4 → python_clu-0.11.6}/python_clu.egg-info/top_level.txt +0 -0
  202. {python_clu-0.11.4 → python_clu-0.11.6}/python_clu.egg-info/zip-safe +0 -0
  203. {python_clu-0.11.4 → python_clu-0.11.6}/pytype.cfg +0 -0
  204. {python_clu-0.11.4 → python_clu-0.11.6}/requirements/changelog.txt +0 -0
  205. {python_clu-0.11.4 → python_clu-0.11.6}/requirements/dev.txt +0 -0
  206. {python_clu-0.11.4 → python_clu-0.11.6}/requirements/docs.txt +0 -0
  207. {python_clu-0.11.4 → python_clu-0.11.6}/requirements/install.txt +0 -0
  208. {python_clu-0.11.4 → python_clu-0.11.6}/requirements/nox/codecov.txt +0 -0
  209. {python_clu-0.11.4 → python_clu-0.11.6}/requirements/nox/docs.txt +0 -0
  210. {python_clu-0.11.4 → python_clu-0.11.6}/requirements/nox/manifest.txt +0 -0
  211. {python_clu-0.11.4 → python_clu-0.11.6}/requirements/nox/repl.txt +0 -0
  212. {python_clu-0.11.4 → python_clu-0.11.6}/requirements/nox/tests.txt +0 -0
  213. {python_clu-0.11.4 → python_clu-0.11.6}/requirements/tox.txt +0 -0
  214. {python_clu-0.11.4 → python_clu-0.11.6}/requirements/typecheck.txt +0 -0
  215. {python_clu-0.11.4 → python_clu-0.11.6}/scratch/direnv_transformed_env.py +0 -0
  216. {python_clu-0.11.4 → python_clu-0.11.6}/scratch/inline-tests-ImportError-uggggh.ipynb +0 -0
  217. {python_clu-0.11.4 → python_clu-0.11.6}/scratch/nteract.ipynb +0 -0
  218. {python_clu-0.11.4 → python_clu-0.11.6}/setup.cfg +0 -0
  219. {python_clu-0.11.4 → python_clu-0.11.6}/tests/__init__.py +0 -0
  220. {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/1-58.jpg +0 -0
  221. {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/3471426989_aa8e83cac5_o.jpg +0 -0
  222. {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/3472236406_1fbf1a567d_o.jpg +0 -0
  223. {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/8600JC.jpg +0 -0
  224. {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/8ba.png +0 -0
  225. {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/IMG_20180505_205153567.jpg +0 -0
  226. {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/cheetah-003.jpg +0 -0
  227. {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/config/clu-config.toml +0 -0
  228. {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/config/yodogg.toml +0 -0
  229. {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/shutterstock_90194617.jpg +0 -0
  230. {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/yodata/09163d51421853.5608b3c2a1be0.jpg +0 -0
  231. {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/yodata/5d0227342500004e12e3506d.jpg +0 -0
  232. {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/yodata/BlackCat2_large-22.jpg +0 -0
  233. {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/yodogg/Serval_Cat_Kitten-706.jpg +0 -0
  234. {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/yodogg/Servals_Thoiry_19801.jpg +0 -0
  235. {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/yodogg/video-pride-serval.jpg +0 -0
  236. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_abstract.py +0 -0
  237. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_all.py +0 -0
  238. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_boilerplate.py +0 -0
  239. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_config.py +0 -0
  240. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_config_abc.py +0 -0
  241. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_csv.py +0 -0
  242. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_dicts.py +0 -0
  243. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_dispatch.py +0 -0
  244. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_enum_aliases.py +0 -0
  245. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_exporting.py +0 -0
  246. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_extending.py +0 -0
  247. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_fs_abc.py +0 -0
  248. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_fs_appdirectories.py +0 -0
  249. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_fs_filesystem.py +0 -0
  250. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_fs_misc.py +0 -0
  251. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_importing.py +0 -0
  252. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_keyvalue.py +0 -0
  253. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_mathematics.py +0 -0
  254. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_naming.py +0 -0
  255. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_predicates.py +0 -0
  256. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_repl_columnize.py +0 -0
  257. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_repl_modules.py +0 -0
  258. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_repr.py +0 -0
  259. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_scripts_repl.py +0 -0
  260. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_typespace_namespace.py +0 -0
  261. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_typology.py +0 -0
  262. {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_version.py +0 -0
  263. {python_clu-0.11.4 → python_clu-0.11.6}/tests/yodogg/.tm_properties +0 -0
  264. {python_clu-0.11.4 → python_clu-0.11.6}/tests/yodogg/__init__.py +0 -0
  265. {python_clu-0.11.4 → python_clu-0.11.6}/tests/yodogg/yodogg/__init__.py +0 -0
  266. {python_clu-0.11.4 → python_clu-0.11.6}/tests/yodogg/yodogg/config.py +0 -0
  267. {python_clu-0.11.4 → python_clu-0.11.6}/tests/yodogg/yodogg/exporting.py +0 -0
  268. {python_clu-0.11.4 → python_clu-0.11.6}/tests/yodogg/yodogg/iheard.py +0 -0
  269. {python_clu-0.11.4 → python_clu-0.11.6}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
 
2
2
  [tool.bumpversion]
3
- current_version = "0.11.4"
3
+ current_version = "0.11.6"
4
4
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
5
5
  serialize = ["{major}.{minor}.{patch}"]
6
6
  search = "{current_version}"
@@ -1,5 +1,4 @@
1
1
  Development Status :: 5 - Production/Stable
2
- License :: OSI Approved :: MIT License
3
2
  Framework :: Pytest
4
3
  Intended Audience :: Developers
5
4
  Topic :: Software Development
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-clu
3
- Version: 0.11.4
3
+ Version: 0.11.6
4
4
  Summary: CLU - Common Lightweight Utilities, or Command-Line Utilities (your pick)
5
5
  Home-page: https://github.com/fish2000/clu
6
6
  Download-URL: https://github.com/fish2000/clu/zipball/master
@@ -10,7 +10,6 @@ License: MIT
10
10
  Keywords: command utilities clu fish2000 command-line modules predicates REPL tools
11
11
  Platform: any
12
12
  Classifier: Development Status :: 5 - Production/Stable
13
- Classifier: License :: OSI Approved :: MIT License
14
13
  Classifier: Framework :: Pytest
15
14
  Classifier: Intended Audience :: Developers
16
15
  Classifier: Topic :: Software Development
@@ -0,0 +1 @@
1
+ __version__ = '0.11.6'
@@ -408,7 +408,7 @@ class ManagedContext(contextlib.AbstractContextManager):
408
408
  __all__ = ('Slotted', 'SlotMatch', 'NonSlotted',
409
409
  'UnhashableMeta', 'Unhashable',
410
410
  'Format', 'NonFormat', 'SlottedFormat', 'Sanitizer',
411
- 'Cloneable',
411
+ 'Serializable', 'Cloneable',
412
412
  'ReprWrapper', 'SlottedRepr', 'MappingViewRepr',
413
413
  'evict_announcer',
414
414
  'BaseDescriptor', 'DataDescriptor', 'NamedDescriptor',
@@ -14,7 +14,7 @@ import importlib
14
14
  import inspect
15
15
  import itertools
16
16
  import shelve
17
- import sys, os
17
+ import sys, os, re
18
18
  import warnings
19
19
  import weakref
20
20
 
@@ -106,9 +106,9 @@ def search_by_id(thingID):
106
106
  `sys.modules.values()` (which is potentially completely
107
107
  fucking enormous).
108
108
 
109
- This function implements `search_for_name(…)` – q.v.
109
+ This function helps implement `search_for_name(…)` – q.v.
110
110
  the calling function code sub., and is also used in the
111
- implementation of `determine_module(…)`, - also q.v.
111
+ implementation of `search_for_module(…)`, - also q.v.
112
112
  the calling function code sub.
113
113
 
114
114
  Caching courtesy the `functools.lru_cache(…)` decorator.
@@ -232,6 +232,9 @@ def determine_name(thing, name=None, try_repr=False):
232
232
  # up returning None:
233
233
  return search_for_name(thing)
234
234
 
235
+ # Regexp for matching dashes in dotpaths:
236
+ dash_re = re.compile("\-")
237
+
235
238
  # N.B. Items in the “replaceable_endings” tuple that
236
239
  # possibly contain other such items should appear
237
240
  # *before* the items that they contain, e.g.:
@@ -246,14 +249,16 @@ replaceable_endings = tuple(f"{pre}{suf}" \
246
249
  ending_suffixes))
247
250
  replaceable_endings += ending_suffixes
248
251
 
249
- def path_to_dotpath(path, relative_to=None):
252
+ def path_to_dotpath(path, relative_to=None,
253
+ convert_dashes=True):
250
254
  """ Convert a file path (e.g. “/yo/dogg/iheard/youlike.py”)
251
255
  to a dotpath (á la “yo.dogg.iheard.youlike”) in what I
252
256
  would call a “quick and dirty” fashion.
253
257
 
254
258
  Issues a BadDotpathWarning if the converted path contains
255
- dashes – I don’t quite know what to do about something
256
- like that besides warn, so erm. There you go.
259
+ dashes, and the “convert_datshes” flag is set to False
260
+ – I don’t quite know what to do about something like that
261
+ besides warn, so erm. There you go.
257
262
  """
258
263
  # Garbage in, garbage out:
259
264
  if path is None:
@@ -274,11 +279,15 @@ def path_to_dotpath(path, relative_to=None):
274
279
  while dotpath.startswith(QUALIFIER):
275
280
  dotpath = dotpath[1:]
276
281
 
277
- # Warn before returning, if the converted path
278
- # should contain dashes:
279
282
  if '-' in dotpath:
280
- warnings.warn(f"Dotpath contains dashes: “{dotpath}”",
281
- BadDotpathWarning, stacklevel=2)
283
+ if convert_dashes:
284
+ # Substitute underscores for any dashes found:
285
+ dotpath = dash_re.subn('_', dotpath)[0]
286
+ else:
287
+ # Warn before returning, if the converted path
288
+ # should contain dashes:
289
+ warnings.warn(f"Dotpath contains dashes: “{dotpath}”",
290
+ BadDotpathWarning, stacklevel=2)
282
291
 
283
292
  return dotpath
284
293
 
@@ -310,11 +319,12 @@ class Registry(abc.ABC, metaclass=clu.abstract.Slotted):
310
319
  def __init_subclass__(cls, appname=None, **kwargs):
311
320
  if not appname:
312
321
  appname = determine_name(cls)
313
- if appname in classes:
314
- raise TypeError(f"appname already registered: {appname}")
315
- appnames.add(appname)
316
- classes[appname] = cls
317
- super(Registry, cls).__init_subclass__(**kwargs) # type: ignore
322
+ else:
323
+ if appname in classes:
324
+ raise TypeError(f"appname already registered: {appname}")
325
+ appnames.add(appname)
326
+ classes[appname] = cls
327
+ super().__init_subclass__(**kwargs) # type: ignore
318
328
  cls.instances = weakref.WeakValueDictionary()
319
329
  cls.appname = clu.abstract.ValueDescriptor(appname)
320
330
 
@@ -860,7 +870,7 @@ class ExporterBase(collections.abc.MutableMapping,
860
870
  'has_appname',
861
871
  'for_appname',
862
872
  'unregister'),
863
- super(ExporterBase, self).__dir__()))
873
+ super().__dir__()))
864
874
 
865
875
  class Exporter(ExporterBase, basepath=BASEPATH, appname=APPNAME):
866
876
 
@@ -136,12 +136,13 @@ class BaseFSName(collections.abc.Hashable,
136
136
  os.path.realpath(
137
137
  os.fspath(source or self.name)))
138
138
 
139
- def parent(self):
139
+ def parent(self, followlinks=True):
140
140
  """ Sugar for `self.directory(os.path.abspath(os.path.dirname(self.name)))`
141
141
  …which, if you are curious, gets you the parent directory of the target
142
142
  instance, wrapped in a new `Directory` instance.
143
143
  """
144
- return self.directory(os.path.abspath(os.path.dirname(self.name)))
144
+ realifier = followlinks and os.path.realpath or os.path.abspath
145
+ return self.directory(realifier(os.path.dirname(self.name)))
145
146
 
146
147
  def relparent(self, path):
147
148
  """ Relativize a path, relative to its directory parent, and return it
@@ -614,12 +614,12 @@ class Directory(BaseFSName,
614
614
  setattr(self, 'old', old)
615
615
  setattr(self, 'new', old)
616
616
  return self
617
- setattr(self, 'old', old is not None and old or self.target)
617
+ setattr(self, 'old', old or self.target)
618
618
  setattr(self, 'new', self.target)
619
619
  delattr(self, 'target')
620
620
  return self
621
621
 
622
- def ctx_prepare(self):
622
+ def ctx_prepare(self, old=None):
623
623
  """ Prepares the member values of the Directory instance according
624
624
  to a requisite `self.target` directory-path value; the primary
625
625
  logic performed by this function determines whether or not it
@@ -635,7 +635,8 @@ class Directory(BaseFSName,
635
635
  cause invincibly undebuggable behavioral oddities to crop up
636
636
  in a variety of circumstances.
637
637
  """
638
- self.ctx_set_targets(old=os.getcwd())
638
+ if not self.prepared:
639
+ self.ctx_set_targets(old=old or os.getcwd())
639
640
  if os.path.isdir(self.new):
640
641
  self.will_change = differentfile(self.old, self.new)
641
642
  else:
@@ -759,11 +760,8 @@ class Directory(BaseFSName,
759
760
  yield from os.walk(self.name, followlinks=followlinks)
760
761
 
761
762
  def walkback(self, followlinks=True):
762
- """ Iterator over reverse-walked directories and files.
763
-
764
- N.B. Since I had to implement this myself, “followlinks”
765
- doesn’t do anything yet. This is because I am lazy and
766
- I lack intellectual rigor.
763
+ """ Iterator over reverse-walked directories and files. Use
764
+ the `followlinks=True` flag to do what you think it does.
767
765
 
768
766
  The return triple resembles that yielded by “os.walk(…)” –
769
767
  but unlike that function, modifying the directory listing
@@ -787,7 +785,7 @@ class Directory(BaseFSName,
787
785
  yield directory, dirs, files
788
786
  if directory.name == ROOT_PATH:
789
787
  break
790
- directory = directory.parent()
788
+ directory = directory.parent(followlinks=followlinks)
791
789
 
792
790
  def flatten(self, destination, suffix=None, new_suffix=None):
793
791
  """ Copy the entire directory tree, all contents included, to a new
@@ -937,8 +935,9 @@ class Directory(BaseFSName,
937
935
  dirs[:] = list(filter(excluder, dirs))
938
936
  filenames = filter(excluder,
939
937
  filter(searcher, files))
940
- dotpaths.update(path_to_dotpath(os.path.join(root, filename),
941
- relative_to=self.name)
938
+ dotpaths.update(path_to_dotpath(
939
+ os.path.join(root, filename),
940
+ relative_to=self.name)
942
941
  for filename in filenames)
943
942
  yield from sorted(dotpaths)
944
943
 
@@ -195,17 +195,18 @@ def try_items(itx, *things, default=NoDefault):
195
195
 
196
196
  # SOME COMMON SHORTCUTS:
197
197
 
198
- dunder_or = lambda thing, atx: getpyattr(thing, atx, thing)
198
+ dunder_or = lambda thing, atx: getpyattr(thing, atx, thing)
199
199
 
200
- mro = lambda thing: getpyattr(typeof(thing), 'mro')
201
- unwrap = lambda thing: dunder_or(thing, 'wrapped')
202
- origin = lambda thing: typeof(dunder_or(thing, 'origin'))
203
- rmro = reverse(mro)
200
+ mro = lambda thing: getpyattr(typeof(thing), 'mro')
201
+ unwrap = lambda thing: dunder_or(thing, 'wrapped')
202
+ origin = lambda thing: typeof(dunder_or(thing, 'origin'))
203
+ rmro = reverse(mro)
204
204
 
205
- isancestor = lambda cls, ancestor=object: ancestor in mro(cls)
206
- isorigin = lambda cls, originator=object: isancestor(origin(cls), ancestor=typeof(originator))
205
+ isancestor = lambda cls, ancestor=object: ancestor in mro(cls)
206
+ isorigin = lambda cls, originator=object: isancestor(origin(cls), ancestor=typeof(originator))
207
207
 
208
- ispublic = lambda string: not ispyname(string) and not ismifflin(string)
208
+ ismarkedprivate = lambda string: string.startswith('_')
209
+ ispublic = lambda string: not ispyname(string) and not ismifflin(string)
209
210
 
210
211
  @export
211
212
  class Base(object):
@@ -566,6 +567,7 @@ export(unwrap, name='unwrap', doc="unwrap(thing) → Return ei
566
567
  export(origin, name='origin', doc="origin(thing) → Return either `typeof(thing).__origin__` or `typeof(thing)` for a given `thing`")
567
568
  export(isancestor, name='isancestor', doc="isancestor(thing, ancestor=object) → boolean predicate, True if `ancestor` is found in “mro(thing)”")
568
569
  export(isorigin, name='isorigin', doc="isorigin(thing, original=object) → boolean predicate, True if `original` is an ancestor of “origin(thing)”")
570
+ export(ismarkedprivate, name='ismarkedprivate', doc="ismarkedprivate(string)) → boolean predicate, True if `string` doesn’t begin with an _underscore")
569
571
  export(ispublic, name='ispublic', doc="ispublic(string) → boolean predicate, True if `string` is neither in __dunder__ or _sunder_ (née “_mifflin_”) form")
570
572
 
571
573
  export(predicate_nop, name='predicate_nop', doc="predicate_nop(thing) → boolean predicate that always returns `None`")
@@ -7,6 +7,7 @@ import collections.abc
7
7
  import clu.abstract
8
8
  import clu.dicts
9
9
  import clu.all
10
+ import importlib
10
11
  import pickle
11
12
  import sys
12
13
 
@@ -65,7 +66,7 @@ class ModuleMap(collections.abc.Mapping,
65
66
  if not isinstance(module, (type(self), types.Module)):
66
67
  raise TypeError("module instance required")
67
68
  self.module = getattr(module, 'module', module)
68
- self.reload()
69
+ self.reload(reload_module=False)
69
70
 
70
71
  def __iter__(self):
71
72
  yield from self.dir
@@ -97,7 +98,9 @@ class ModuleMap(collections.abc.Mapping,
97
98
  def items(self):
98
99
  return clu.dicts.OrderedItemsView(self)
99
100
 
100
- def reload(self):
101
+ def reload(self, reload_module=True):
102
+ if reload_module:
103
+ self.module = importlib.reload(self.module)
101
104
  self.dir = tuple(sorted(filter(notpyname, dir(self.module)), key=lowers))
102
105
  length = len(self.dir)
103
106
  if length < 1:
@@ -117,8 +120,12 @@ class ModuleMap(collections.abc.Mapping,
117
120
  def inner_repr(self):
118
121
  return repr(dict(self))
119
122
 
123
+ clu_importall = clu.all.import_all_modules
124
+
120
125
  @cache
121
- def compare_module_lookups_for_all_things(*modules, **options):
126
+ def compare_module_lookups_for_all_things(*modules,
127
+ module_function=clu_importall,
128
+ **options):
122
129
  """ Iterate through each exported item, for each exported module,
123
130
  and look up the original module of the exported item with both:
124
131
 
@@ -139,23 +146,24 @@ def compare_module_lookups_for_all_things(*modules, **options):
139
146
  appname = options.get('appname', consts.APPNAME)
140
147
  exporter_name = options.get('exporter_name', consts.EXPORTER_NAME)
141
148
 
142
- idx = 0
143
149
  total = 0
144
- mismatch_count = 0
150
+ item_idx = 0
151
+ module_idx = 0
152
+ mismatch_idx = 0
145
153
  mismatches = []
146
154
  results = []
147
155
 
148
- clumodules = clu.all.import_all_modules(basepath,
149
- appname,
150
- exporter_name)
151
- assert clumodules
156
+ loaded_modules = module_function(basepath, appname, exporter_name)
157
+ assert loaded_modules
152
158
 
153
159
  modulenames = tuple(modules or Exporter.modulenames())
154
160
 
155
161
  for modulename in modulenames:
156
162
  exports = Exporter[modulename].exports()
157
163
  total += len(exports)
158
- results.append(Result(modulename, tuple(exports.keys()), idx))
164
+ results.append(Result(modulename,
165
+ tuple(exports.keys()),
166
+ module_idx))
159
167
 
160
168
  for name, thing in exports.items():
161
169
  whichmodule = pickle.whichmodule(thing, None)
@@ -167,17 +175,18 @@ def compare_module_lookups_for_all_things(*modules, **options):
167
175
  determination,
168
176
  modulename,
169
177
  nameof(thing),
170
- mismatch_count))
171
- mismatch_count += 1
172
- idx += 1
178
+ mismatch_idx))
179
+ mismatch_idx += 1
180
+ item_idx += 1
181
+ module_idx += 1
173
182
 
174
183
  # In practice the failure rate seemed to be around 7.65 %
175
- failure_rate = 100 * (float(mismatch_count) / float(total))
184
+ failure_rate = 100 * (float(mismatch_idx) / float(total))
176
185
  assert failure_rate < 10.0 # percent
177
186
 
178
- return Results(idx, modulenames, tuple(results)), \
179
- Mismatches(mismatch_count, tuple(mismatches),
180
- failure_rate)
187
+ return Results(item_idx, modulenames, tuple(results)), \
188
+ Mismatches(mismatch_idx, tuple(mismatches),
189
+ failure_rate)
181
190
 
182
191
  export(notpyname, name='notpyname', doc="notpyname(string) → boolean predicate, returns True unless string is a __dunder__ name, when it returns False")
183
192
  export(isplural, name='isplural', doc="isplural(integer) → returns an 's' unless the integer argument is 1, in which case it returns an empty string")
@@ -196,31 +205,38 @@ def test():
196
205
 
197
206
  @inline.fixture
198
207
  def predicate_modules():
199
- modules = ('predicates', 'typology', 'mathematics', 'naming')
208
+ modules = ('predicates', 'typology', 'mathematics', 'naming',
209
+ 'exporting', 'extending', 'all', 'enums')
200
210
  prefixd = tuple(f"clu.{nm}" for nm in modules)
201
211
  return prefixd
202
212
 
203
213
  @inline
204
- def test_one():
214
+ def test_compare_all():
205
215
  """ Basic checks for compare_module_lookups_for_all_things(…) """
206
216
  results, mismatches = compare_module_lookups_for_all_things()
207
217
 
218
+ for idx, result in enumerate(results.result_records):
219
+ assert result.idx == idx
220
+
208
221
  assert results.total > 100
209
222
  assert mismatches.total > 0
210
223
  assert mismatches.failure_rate < 10.0
211
224
 
212
225
  @inline
213
- def test_two():
226
+ def test_compare_all_with_varargs():
214
227
  """ With-vararg checks for compare_module_lookups_for_all_things(…) """
215
228
  results, mismatches = compare_module_lookups_for_all_things(
216
229
  *predicate_modules())
217
230
 
231
+ for idx, result in enumerate(results.result_records):
232
+ assert result.idx == idx
233
+
218
234
  assert results.total > 100
219
235
  assert mismatches.total > 0
220
236
  assert mismatches.failure_rate < 10.0
221
237
 
222
238
  @inline
223
- def test_three():
239
+ def test_modulemap_with_clu_consts():
224
240
  """ Basic checks for ModuleMap adapter """
225
241
  constmap = ModuleMap(consts)
226
242
 
@@ -240,8 +256,12 @@ def test():
240
256
  # doesn’t export any dunder-named things:
241
257
  assert frozenconsts.issuperset(constmap.keys())
242
258
  assert frozenconsts.issubset(constmap.keys())
259
+
260
+ # Try reloading:
261
+ constmap.reload()
262
+ assert constmap.reload() == len(constmap)
243
263
 
244
- return inline.test(50)
264
+ return inline.test(100)
245
265
 
246
266
  if __name__ == '__main__':
247
267
  sys.exit(test())
@@ -35,12 +35,15 @@ from clu.all import import_clu_modules
35
35
  from clu.config.env import Environ
36
36
  from clu.constants import consts
37
37
  from clu.naming import nameof, qualified_import
38
- from clu.predicates import ispublic, listify
38
+ from clu.predicates import ispublic, ismarkedprivate, listify
39
39
  from clu.repl import columnize
40
40
 
41
41
  # Set up the __all__ tuple:
42
42
  __all__ = list()
43
43
 
44
+ # predicate for star-importing:
45
+ ok_for_star_import = lambda name: ispublic(name) and not ismarkedprivate(name)
46
+
44
47
  # MODULE EXPORT FUNCTIONS: given a module name, export
45
48
  # either the module or its contents into a given namespace:
46
49
  def star_export(modulename, namespace, alltuple=__all__):
@@ -50,7 +53,7 @@ def star_export(modulename, namespace, alltuple=__all__):
50
53
  except ValueError:
51
54
  module = importlib.import_module(modulename)
52
55
  for name in dir(module):
53
- if ispublic(name):
56
+ if ok_for_star_import(name):
54
57
  namespace[name] = getattr(module, name)
55
58
  alltuple += listify(name)
56
59
 
@@ -134,7 +137,6 @@ for mod in mods:
134
137
  # Additionals and corner-cases – imports requiring their own
135
138
  # bespoke import-statement forms:
136
139
  import collections.abc
137
- from PIL import Image
138
140
  from pprint import pprint, pformat
139
141
 
140
142
  pp = pprint
@@ -184,6 +186,7 @@ def explain(thing, width=None):
184
186
  ljust=True))
185
187
 
186
188
  try:
189
+ from PIL import Image
187
190
  from instakit.utils.static import asset
188
191
  except (ImportError, SyntaxError, TypeError): # pragma: no cover
189
192
  pass
@@ -207,7 +210,7 @@ if 'user:script' in cluenv:
207
210
  if os.path.exists(user_script_path):
208
211
  user_script_globals = runpy.run_path(user_script_path)
209
212
  GLOBALS.update(user_script_globals)
210
- __all__ += list(filter(ispublic, user_script_globals.keys()))
213
+ __all__ += list(filter(ok_for_star_import, user_script_globals.keys()))
211
214
  else:
212
215
  message = "CLU_USER_SCRIPT needs to point to a Python file"
213
216
  warnings.simplefilter('always')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-clu
3
- Version: 0.11.4
3
+ Version: 0.11.6
4
4
  Summary: CLU - Common Lightweight Utilities, or Command-Line Utilities (your pick)
5
5
  Home-page: https://github.com/fish2000/clu
6
6
  Download-URL: https://github.com/fish2000/clu/zipball/master
@@ -10,7 +10,6 @@ License: MIT
10
10
  Keywords: command utilities clu fish2000 command-line modules predicates REPL tools
11
11
  Platform: any
12
12
  Classifier: Development Status :: 5 - Production/Stable
13
- Classifier: License :: OSI Approved :: MIT License
14
13
  Classifier: Framework :: Pytest
15
14
  Classifier: Intended Audience :: Developers
16
15
  Classifier: Topic :: Software Development
@@ -91,7 +91,7 @@ try:
91
91
  '__version__.py')).read(),
92
92
  '__version__.py', 'exec'))
93
93
  except:
94
- __version__ = '0.11.4'
94
+ __version__ = '0.11.6'
95
95
 
96
96
  # PROJECT DESCRIPTION
97
97
  LONG_DESCRIPTION = project_content('ABOUT.md')
@@ -1 +0,0 @@
1
- __version__ = '0.11.4'
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes