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.
- {python_clu-0.11.4 → python_clu-0.11.6}/.bumpversion.toml +1 -1
- {python_clu-0.11.4 → python_clu-0.11.6}/CLASSIFIERS.txt +0 -1
- {python_clu-0.11.4 → python_clu-0.11.6}/PKG-INFO +1 -2
- python_clu-0.11.6/clu/__version__.py +1 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/abstract.py +1 -1
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/exporting.py +26 -16
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/fs/abc.py +3 -2
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/fs/filesystem.py +10 -11
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/predicates.py +10 -8
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/repl/modules.py +42 -22
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/repl.py +7 -4
- {python_clu-0.11.4 → python_clu-0.11.6}/python_clu.egg-info/PKG-INFO +1 -2
- {python_clu-0.11.4 → python_clu-0.11.6}/setup.py +1 -1
- python_clu-0.11.4/clu/__version__.py +0 -1
- {python_clu-0.11.4 → python_clu-0.11.6}/.coveragerc +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/.editorconfig +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/.gitchangelog.rc +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/.gitignore +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/.landscape.yml +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/.travis.yml +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/ABOUT.md +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/CHANGELOG.md +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/CODE_OF_CONDUCT.md +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/COPYING.md +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/LICENSE.txt +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/MANIFEST.in +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/Makefile +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/README.md +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/appveyor.yml +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/__init__.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/__main__.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/all.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/api/__init__.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/api/__main__.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/application.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/compilation/__init__.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/compilation/compiledb.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/compilation/macros.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/__init__.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/abc.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/base.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/codecs.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/env.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/fieldtypes.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/filebase.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/formats/__init__.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/formats/jsonfile.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/formats/picklefile.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/formats/tomlfile.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/formats/yamlfile.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/keymap.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/keymapview.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/ns.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/proxy.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/config/settings.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/constants/__init__.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/constants/__main__.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/constants/consts.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/constants/data.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/constants/enums.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/constants/exceptions.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/constants/polyfills.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/csv.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/dicts.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/dispatch.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/enums.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/extending.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/fs/__init__.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/fs/appdirectories.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/fs/misc.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/fs/pypath.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/fs/sourcetree.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/importing/__init__.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/importing/__main__.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/importing/base.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/importing/proxy.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/keyvalue.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/mathematics.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/naming.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/repl/__init__.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/repl/ansi.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/repl/banners.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/repl/cli/__init__.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/repl/cli/boilerplate.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/repl/cli/boilerplate_copy.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/repl/cli/print_version.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/repl/columnize.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/repr.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/sanitizer.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/.gitignore +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/README.md +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/__init__.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/ansicolors.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/boilerplate.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/dictroast.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/legacy/forkumask.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/legacy/repl-bpython.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/legacy/repl-ipython.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/legacy/repl-ptpython.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/legacy/repl-pyzo.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/legacy/xdg-runtime.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/prediversus.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/scripts/treeline.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/shelving/__init__.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/shelving/redat.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/shelving/redis.conf +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/stdio.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/testing/__init__.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/testing/hook.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/testing/obsolete.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/testing/pytest.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/testing/utils.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/typespace/__init__.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/typespace/__main__.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/typespace/namespace.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/typology.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/version/__init__.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/version/__main__.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/version/git_version.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/clu/version/read_version.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/codecov.yml +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/conftest.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/Makefile +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/doctrees/api.doctree +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/doctrees/environment.pickle +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/doctrees/generated/clu.doctree +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/doctrees/index.doctree +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/.buildinfo +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_sources/api.rst.txt +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_sources/generated/clu.rst.txt +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_sources/index.rst.txt +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/_sphinx_javascript_frameworks_compat.js +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/alabaster.css +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/basic.css +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/badge_only.css +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/fontawesome-webfont.svg +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/lato-bold.woff +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/lato-bold.woff2 +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/lato-normal.woff +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/fonts/lato-normal.woff2 +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/css/theme.css +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/custom.css +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/doctools.js +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/documentation_options.js +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/file.png +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/jquery-3.6.0.js +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/jquery.js +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/js/badge_only.js +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/js/html5shiv-printshiv.min.js +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/js/html5shiv.min.js +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/js/theme.js +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/language_data.js +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/minus.png +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/plus.png +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/pygments.css +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/searchtools.js +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/underscore-1.13.1.js +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/_static/underscore.js +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/api.html +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/generated/clu.html +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/genindex.html +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/index.html +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/objects.inv +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/py-modindex.html +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/search.html +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/html/searchindex.js +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/build/man/clu.1 +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/make.bat +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/source/api.rst +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/source/conf.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/source/generated/clu.rst +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/docs/source/index.rst +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/hooks/autohook.sh +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/hooks/post-push/00-coverage.sh +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/hooks/pre-push/00-noop.sh +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/hooks/pre-push/01-direnv-stdlib.sh +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/hooks/scripts/coverage.sh +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/hooks/scripts/display-issues.sh +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/hooks/scripts/git-pushex +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/hooks/scripts/noop.sh +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/mypy.ini +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/noxfile.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/pyproject.toml +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/pytest.ini +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/python_clu.egg-info/SOURCES.txt +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/python_clu.egg-info/dependency_links.txt +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/python_clu.egg-info/entry_points.txt +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/python_clu.egg-info/requires.txt +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/python_clu.egg-info/top_level.txt +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/python_clu.egg-info/zip-safe +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/pytype.cfg +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/requirements/changelog.txt +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/requirements/dev.txt +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/requirements/docs.txt +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/requirements/install.txt +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/requirements/nox/codecov.txt +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/requirements/nox/docs.txt +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/requirements/nox/manifest.txt +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/requirements/nox/repl.txt +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/requirements/nox/tests.txt +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/requirements/tox.txt +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/requirements/typecheck.txt +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/scratch/direnv_transformed_env.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/scratch/inline-tests-ImportError-uggggh.ipynb +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/scratch/nteract.ipynb +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/setup.cfg +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/__init__.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/1-58.jpg +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/3471426989_aa8e83cac5_o.jpg +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/3472236406_1fbf1a567d_o.jpg +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/8600JC.jpg +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/8ba.png +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/IMG_20180505_205153567.jpg +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/cheetah-003.jpg +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/config/clu-config.toml +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/config/yodogg.toml +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/shutterstock_90194617.jpg +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/yodata/09163d51421853.5608b3c2a1be0.jpg +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/yodata/5d0227342500004e12e3506d.jpg +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/yodata/BlackCat2_large-22.jpg +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/yodogg/Serval_Cat_Kitten-706.jpg +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/yodogg/Servals_Thoiry_19801.jpg +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/data/yodogg/video-pride-serval.jpg +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_abstract.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_all.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_boilerplate.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_config.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_config_abc.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_csv.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_dicts.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_dispatch.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_enum_aliases.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_exporting.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_extending.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_fs_abc.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_fs_appdirectories.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_fs_filesystem.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_fs_misc.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_importing.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_keyvalue.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_mathematics.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_naming.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_predicates.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_repl_columnize.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_repl_modules.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_repr.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_scripts_repl.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_typespace_namespace.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_typology.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/test_version.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/yodogg/.tm_properties +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/yodogg/__init__.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/yodogg/yodogg/__init__.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/yodogg/yodogg/config.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/yodogg/yodogg/exporting.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tests/yodogg/yodogg/iheard.py +0 -0
- {python_clu-0.11.4 → python_clu-0.11.6}/tox.ini +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-clu
|
|
3
|
-
Version: 0.11.
|
|
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
|
|
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 `
|
|
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
|
|
256
|
-
|
|
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
|
-
|
|
281
|
-
|
|
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
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
|
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.
|
|
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(
|
|
941
|
-
|
|
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
|
|
198
|
+
dunder_or = lambda thing, atx: getpyattr(thing, atx, thing)
|
|
199
199
|
|
|
200
|
-
mro
|
|
201
|
-
unwrap
|
|
202
|
-
origin
|
|
203
|
-
rmro
|
|
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
|
|
206
|
-
isorigin
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
150
|
+
item_idx = 0
|
|
151
|
+
module_idx = 0
|
|
152
|
+
mismatch_idx = 0
|
|
145
153
|
mismatches = []
|
|
146
154
|
results = []
|
|
147
155
|
|
|
148
|
-
|
|
149
|
-
|
|
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,
|
|
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
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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(
|
|
184
|
+
failure_rate = 100 * (float(mismatch_idx) / float(total))
|
|
176
185
|
assert failure_rate < 10.0 # percent
|
|
177
186
|
|
|
178
|
-
return Results(
|
|
179
|
-
Mismatches(
|
|
180
|
-
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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.
|
|
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
|
|
@@ -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
|
|
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
|
|
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
|