python-clu 0.12.15__tar.gz → 0.12.16__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.12.15 → python_clu-0.12.16}/.bumpversion.toml +1 -1
- {python_clu-0.12.15 → python_clu-0.12.16}/CHANGELOG.md +63 -1
- {python_clu-0.12.15 → python_clu-0.12.16}/PKG-INFO +1 -4
- python_clu-0.12.16/clu/__version__.py +1 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/abstract.py +11 -1
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/config/abc.py +25 -9
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/config/env.py +5 -11
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/config/filebase.py +2 -4
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/config/keymap.py +8 -18
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/dicts.py +1 -4
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/enums.py +3 -1
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/exporting.py +2 -4
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/fs/sourcetree.py +2 -4
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/importing/base.py +1 -4
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/predicates.py +1 -4
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/repl/ansi.py +9 -7
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/repl/cli/ansidocs.py +0 -1
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/scripts/legacy/repl-bpython.py +0 -10
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/scripts/repl.py +1 -1
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/scripts/treeline.py +8 -11
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/typespace/namespace.py +2 -4
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/typology.py +1 -5
- {python_clu-0.12.15 → python_clu-0.12.16}/python_clu.egg-info/PKG-INFO +1 -4
- {python_clu-0.12.15 → python_clu-0.12.16}/python_clu.egg-info/requires.txt +0 -3
- {python_clu-0.12.15 → python_clu-0.12.16}/requirements/install.txt +0 -2
- {python_clu-0.12.15 → python_clu-0.12.16}/requirements/nox/tests.txt +0 -1
- {python_clu-0.12.15 → python_clu-0.12.16}/setup.py +1 -1
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_config.py +1 -1
- python_clu-0.12.15/clu/__version__.py +0 -1
- {python_clu-0.12.15 → python_clu-0.12.16}/.coveragerc +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/.editorconfig +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/.gitchangelog.rc +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/.gitignore +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/.landscape.yml +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/.travis.yml +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/ABOUT.md +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/CLASSIFIERS.txt +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/CLU_Treatment.md +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/CODE_OF_CONDUCT.md +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/LICENSE.txt +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/MANIFEST.in +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/Makefile +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/README.md +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/appveyor.yml +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/__init__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/__main__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/all.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/api/__init__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/api/__main__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/application.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/compilation/__init__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/compilation/compiledb.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/compilation/macros.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/config/__init__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/config/codecs.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/config/formats/__init__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/config/formats/jsonfile.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/config/formats/picklefile.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/config/formats/tomlfile.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/config/formats/yamlfile.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/config/keymaputils.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/config/keymapview.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/config/legacy/__init__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/config/legacy/base.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/config/legacy/fieldtypes.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/config/legacy/settings.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/config/ns.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/config/proxy.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/constants/__init__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/constants/__main__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/constants/consts.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/constants/data.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/constants/enums.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/constants/exceptions.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/constants/polyfills.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/csv.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/dispatch.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/extending.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/fs/__init__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/fs/abc.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/fs/appdirectories.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/fs/filesystem.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/fs/misc.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/fs/pypath.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/importing/__init__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/importing/__main__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/importing/proxy.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/keyvalue.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/mathematics.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/naming.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/repl/__init__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/repl/banners.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/repl/cli/__init__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/repl/cli/boilerplate.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/repl/cli/boilerplate_copy.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/repl/cli/print_version.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/repl/columnize.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/repl/modules.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/repr.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/sanitizer.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/scripts/.gitignore +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/scripts/README.md +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/scripts/__init__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/scripts/ansicolors.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/scripts/boilerplate.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/scripts/dictroast.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/scripts/legacy/forkumask.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/scripts/legacy/repl-ipython.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/scripts/legacy/repl-ptpython.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/scripts/legacy/repl-pyzo.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/scripts/legacy/xdg-runtime.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/scripts/prediversus.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/shelving/__init__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/shelving/redat.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/shelving/redis.conf +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/stdio.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/testing/__init__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/testing/hook.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/testing/obsolete.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/testing/pytest.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/testing/utils.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/trie.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/typespace/__init__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/typespace/__main__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/version/__init__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/version/__main__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/version/git_version.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/clu/version/read_version.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/codecov.yml +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/conftest.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/.DS_Store +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/Makefile +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/doctrees/api.doctree +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/doctrees/environment.pickle +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/doctrees/generated/clu.doctree +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/doctrees/index.doctree +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/.buildinfo +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_sources/api.rst.txt +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_sources/generated/clu.rst.txt +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_sources/index.rst.txt +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/_sphinx_javascript_frameworks_compat.js +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/alabaster.css +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/basic.css +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/css/badge_only.css +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/css/fonts/fontawesome-webfont.svg +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/css/fonts/lato-bold.woff +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/css/fonts/lato-bold.woff2 +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/css/fonts/lato-normal.woff +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/css/fonts/lato-normal.woff2 +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/css/theme.css +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/custom.css +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/doctools.js +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/documentation_options.js +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/file.png +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/jquery-3.6.0.js +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/jquery.js +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/js/badge_only.js +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/js/html5shiv-printshiv.min.js +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/js/html5shiv.min.js +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/js/theme.js +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/language_data.js +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/minus.png +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/plus.png +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/pygments.css +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/searchtools.js +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/underscore-1.13.1.js +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/_static/underscore.js +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/api.html +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/generated/clu.html +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/genindex.html +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/index.html +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/objects.inv +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/py-modindex.html +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/search.html +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/html/searchindex.js +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/build/man/clu.1 +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/make.bat +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/source/api.rst +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/source/conf.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/source/generated/clu.rst +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/docs/source/index.rst +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/hooks/autohook.sh +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/hooks/post-push/00-coverage.sh +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/hooks/pre-push/00-noop.sh +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/hooks/pre-push/01-direnv-stdlib.sh +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/hooks/scripts/coverage.sh +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/hooks/scripts/display-issues.sh +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/hooks/scripts/git-pushex +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/hooks/scripts/noop.sh +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/mypy.ini +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/noxfile.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/pyproject.toml +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/pytest.ini +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/python_clu.egg-info/SOURCES.txt +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/python_clu.egg-info/dependency_links.txt +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/python_clu.egg-info/entry_points.txt +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/python_clu.egg-info/top_level.txt +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/python_clu.egg-info/zip-safe +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/pytype.cfg +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/requirements/changelog.txt +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/requirements/dev.txt +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/requirements/docs.txt +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/requirements/nox/codecov.txt +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/requirements/nox/docs.txt +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/requirements/nox/manifest.txt +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/requirements/nox/pyproject.txt +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/requirements/nox/repl.txt +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/requirements/tox.txt +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/requirements/typecheck.txt +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/scratch/direnv_transformed_env.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/scratch/images/clu-module-list-example-small.jpg +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/scratch/images/clu-module-list-example.jpg +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/scratch/images/clu-module-list-example.pxd +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/scratch/images/clu-testing-time-totals-example-small.jpg +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/scratch/images/clu-testing-time-totals-example.jpg +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/scratch/images/clu-testing-time-totals-example.pxd +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/scratch/images/construx-and-capsela-small.jpg +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/scratch/images/construx-and-capsela.jpg +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/scratch/images/construx-and-capsela.pxd +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/scratch/images/moira.png +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/scratch/images/toml-module-rant.jpg +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/scratch/inline-tests-ImportError-uggggh.ipynb +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/scratch/nteract.ipynb +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/setup.cfg +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/__init__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/data/1-58.jpg +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/data/3471426989_aa8e83cac5_o.jpg +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/data/3472236406_1fbf1a567d_o.jpg +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/data/8600JC.jpg +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/data/8ba.png +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/data/IMG_20180505_205153567.jpg +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/data/cheetah-003.jpg +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/data/config/clu-config.toml +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/data/config/yodogg.toml +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/data/shutterstock_90194617.jpg +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/data/yodata/09163d51421853.5608b3c2a1be0.jpg +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/data/yodata/5d0227342500004e12e3506d.jpg +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/data/yodata/BlackCat2_large-22.jpg +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/data/yodogg/Serval_Cat_Kitten-706.jpg +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/data/yodogg/Servals_Thoiry_19801.jpg +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/data/yodogg/video-pride-serval.jpg +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_abstract.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_all.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_boilerplate.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_config_abc.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_csv.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_dicts.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_dispatch.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_enum_aliases.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_exporting.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_extending.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_fs_abc.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_fs_appdirectories.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_fs_filesystem.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_fs_misc.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_importing.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_keyvalue.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_mathematics.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_naming.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_predicates.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_repl_columnize.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_repl_modules.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_repr.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_scripts_repl.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_typespace_namespace.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_typology.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/test_version.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/yodogg/.tm_properties +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/yodogg/__init__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/yodogg/yodogg/__init__.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/yodogg/yodogg/config.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/yodogg/yodogg/exporting.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tests/yodogg/yodogg/iheard.py +0 -0
- {python_clu-0.12.15 → python_clu-0.12.16}/tox.ini +0 -0
|
@@ -1,7 +1,65 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
## 0.12.
|
|
4
|
+
## 0.12.15:pre12+g3ba5ee3 [SNAPSHOT]
|
|
5
|
+
|
|
6
|
+
### Tweaks
|
|
7
|
+
|
|
8
|
+
* Tweaked many things, in the name of speeeeeed. [Alexander Böhn]
|
|
9
|
+
|
|
10
|
+
### Add
|
|
11
|
+
|
|
12
|
+
* Added a missing __slots__ attribute to some abstract classes. [Alexander Böhn]
|
|
13
|
+
|
|
14
|
+
… dunno if that was possibly causing issues, but you never know
|
|
15
|
+
|
|
16
|
+
### Remove
|
|
17
|
+
|
|
18
|
+
* Removed several more gratuitous error-checks on initialization. [Alexander Böhn]
|
|
19
|
+
|
|
20
|
+
… these are all those that look for TypeErrors in “__init__(…)” or
|
|
21
|
+
“__new__(…)” methods. Best to do without, so far, yes.
|
|
22
|
+
|
|
23
|
+
* Removed the vestigial “more-itertools” package requirement. [Alexander Böhn]
|
|
24
|
+
|
|
25
|
+
* Removed the “six” package requirement. [Alexander Böhn]
|
|
26
|
+
|
|
27
|
+
… yaaaaaay!
|
|
28
|
+
|
|
29
|
+
### Other
|
|
30
|
+
|
|
31
|
+
* Miscellany. [Alexander Böhn]
|
|
32
|
+
|
|
33
|
+
… some kwarg-passing here, some import-trimming there. NBD.
|
|
34
|
+
|
|
35
|
+
* This should be the last of the problematic initializer error-checks. [Alexander Böhn]
|
|
36
|
+
|
|
37
|
+
* Killed dead code. [Alexander Böhn]
|
|
38
|
+
|
|
39
|
+
* Simplified more initializers. [Alexander Böhn]
|
|
40
|
+
|
|
41
|
+
* Simplified `clu.config.keymap.FrozenFlat.__init__(…)`’s `super()` call. [Alexander Böhn]
|
|
42
|
+
|
|
43
|
+
… I have this weird habit of catchint TypeErrors whenever I do a
|
|
44
|
+
“super().__init__(…)” call, because I originally wanted to work
|
|
45
|
+
around some fucked-up PyPy3 bug that necessitated doing that,
|
|
46
|
+
basically. But it’s dumb and probably hiding real problems, so
|
|
47
|
+
let’s no longer do that. Yes.
|
|
48
|
+
|
|
49
|
+
* Updated the `clu.repl.ansi` enums to use `clu.abstract.Appreciative` [Alexander Böhn]
|
|
50
|
+
|
|
51
|
+
… The base type was using a really clumsy “is_ansi(…)” class method
|
|
52
|
+
to do this – that exact same clumsy function is now an offical
|
|
53
|
+
“appreciates(…)” method (see the ABC in question!) and the call
|
|
54
|
+
sites have been updated accordingly too. Now all that needs to
|
|
55
|
+
happen is the method itself has to get totally rewritten. Yes!
|
|
56
|
+
|
|
57
|
+
* A very small update. [Alexander Böhn]
|
|
58
|
+
|
|
59
|
+
… allegedly, “{}” creates an empty dict faster than “dict()” does
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
## v0.12.15 (2025-07-06)
|
|
5
63
|
|
|
6
64
|
### New
|
|
7
65
|
|
|
@@ -48,6 +106,10 @@
|
|
|
48
106
|
|
|
49
107
|
### Other
|
|
50
108
|
|
|
109
|
+
* Bumped version: 0.12.14 → 0.12.15. [Alexander Böhn]
|
|
110
|
+
|
|
111
|
+
* [make] Changelog updated @ 3c4002c. [Alexander Böhn]
|
|
112
|
+
|
|
51
113
|
* That inline test was better as a precheck function. [Alexander Böhn]
|
|
52
114
|
|
|
53
115
|
* Got `clu.config.codecs` working with annotated dicts. [Alexander Böhn]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-clu
|
|
3
|
-
Version: 0.12.
|
|
3
|
+
Version: 0.12.16
|
|
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
|
|
@@ -42,7 +42,6 @@ Requires-Dist: enum34>=1.1.0; python_version < "3.4"
|
|
|
42
42
|
Requires-Dist: humanize>=1.0.0
|
|
43
43
|
Requires-Dist: importlib-metadata>=1.4.0; python_version < "3.8"
|
|
44
44
|
Requires-Dist: mock>=4.0.0
|
|
45
|
-
Requires-Dist: more_itertools>=8.0.0
|
|
46
45
|
Requires-Dist: multidict>=4.7.0
|
|
47
46
|
Requires-Dist: packaging
|
|
48
47
|
Requires-Dist: pout>=0.8.13
|
|
@@ -50,14 +49,12 @@ Requires-Dist: pygments>=2.0.0
|
|
|
50
49
|
Requires-Dist: PyYAML>=5.3.0
|
|
51
50
|
Requires-Dist: redis>=3.4.0
|
|
52
51
|
Requires-Dist: setuptools>=30.0.0
|
|
53
|
-
Requires-Dist: six>=1.10.0
|
|
54
52
|
Requires-Dist: toml>=0.10.0
|
|
55
53
|
Requires-Dist: tomli>=2.2.0
|
|
56
54
|
Requires-Dist: tomli_w>=1.2.0
|
|
57
55
|
Requires-Dist: wheel>=0.34.0
|
|
58
56
|
Requires-Dist: zict>=0.1.2
|
|
59
57
|
Provides-Extra: all
|
|
60
|
-
Requires-Dist: more_itertools>=8.0.0; extra == "all"
|
|
61
58
|
Requires-Dist: numpy>=1.17.0; extra == "all"
|
|
62
59
|
Requires-Dist: Pillow>=7.1.0; extra == "all"
|
|
63
60
|
Requires-Dist: pytest>=5.4.0; extra == "all"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = '0.12.16'
|
|
@@ -118,7 +118,6 @@ class Appreciative(abc.ABC):
|
|
|
118
118
|
class will assume that classes will appreciate… something
|
|
119
119
|
like that. OK? OK.
|
|
120
120
|
"""
|
|
121
|
-
|
|
122
121
|
__slots__ = tuple()
|
|
123
122
|
|
|
124
123
|
@classmethod
|
|
@@ -126,6 +125,13 @@ class Appreciative(abc.ABC):
|
|
|
126
125
|
def appreciates(cls, instance):
|
|
127
126
|
""" Boolean, tests if the class “appreciates” an instance """
|
|
128
127
|
...
|
|
128
|
+
|
|
129
|
+
@classmethod
|
|
130
|
+
def __subclasshook__(cls, subcls):
|
|
131
|
+
if cls is Appreciative:
|
|
132
|
+
appreciates = getattr(subcls, 'appreciates', None)
|
|
133
|
+
return callable(appreciates)
|
|
134
|
+
return NotImplemented
|
|
129
135
|
|
|
130
136
|
class Format(collections.abc.Callable, metaclass=Slotted):
|
|
131
137
|
|
|
@@ -179,6 +185,7 @@ class Serializable(abc.ABC):
|
|
|
179
185
|
class. This dict is based on the class, and contains whatever the
|
|
180
186
|
“from_dict(…)” method expects.
|
|
181
187
|
"""
|
|
188
|
+
__slots__ = tuple()
|
|
182
189
|
|
|
183
190
|
@classmethod
|
|
184
191
|
def from_dict(cls, instance_dict):
|
|
@@ -262,6 +269,7 @@ class SlottedRepr(ReprWrapper, metaclass=Slotted):
|
|
|
262
269
|
inheritance chain’s value for “__slots__” to build the repr
|
|
263
270
|
string for its instances
|
|
264
271
|
"""
|
|
272
|
+
__slots__ = tuple()
|
|
265
273
|
|
|
266
274
|
def inner_repr(self):
|
|
267
275
|
""" Use the union of __slots__, defined across this classes’
|
|
@@ -278,6 +286,7 @@ class MappingViewRepr(ReprWrapper):
|
|
|
278
286
|
""" A ReprWrapper class that simply returns the repr for a
|
|
279
287
|
“self._mapping” value – of which most MappingView types make use.
|
|
280
288
|
"""
|
|
289
|
+
__slots__ = tuple()
|
|
281
290
|
|
|
282
291
|
def inner_repr(self): # pragma: no cover
|
|
283
292
|
""" Return the repr string for “self._mapping” """
|
|
@@ -364,6 +373,7 @@ class ValueDescriptor(Descriptor):
|
|
|
364
373
|
""" A descriptor whose repr-string tries to be a literal reflection
|
|
365
374
|
of its wrapped value
|
|
366
375
|
"""
|
|
376
|
+
__slots__ = tuple()
|
|
367
377
|
|
|
368
378
|
def __repr__(self):
|
|
369
379
|
""" A custom repr for the ValueDescriptor’s literal value """
|
|
@@ -164,14 +164,26 @@ class FrozenKeyMap(FrozenKeyMapBase):
|
|
|
164
164
|
|
|
165
165
|
def submap(self, *namespaces, unprefixed=False):
|
|
166
166
|
""" Return a flattened dict containing only the namespaced items. """
|
|
167
|
+
# Get the frozen version of this class:
|
|
167
168
|
cls = freeze_class(type(self))
|
|
169
|
+
|
|
170
|
+
# Shortcut for unprefixed keys:
|
|
168
171
|
if unprefixed:
|
|
169
|
-
return cls({ nskey : self[nskey]
|
|
172
|
+
return cls({ nskey : self[nskey] \
|
|
173
|
+
for nskey in self \
|
|
174
|
+
if NAMESPACE_SEP not in nskey })
|
|
175
|
+
|
|
176
|
+
# Shortcut for a lack of namespaces:
|
|
170
177
|
if not namespaces:
|
|
171
178
|
return cls(self)
|
|
172
|
-
|
|
179
|
+
|
|
180
|
+
# Iterate namespaces, taking those matching our namespaces
|
|
181
|
+
# for a new instance:
|
|
182
|
+
out = {}
|
|
173
183
|
for namespace in namespaces:
|
|
174
|
-
out.update({ nskey : self[nskey]
|
|
184
|
+
out.update({ nskey : self[nskey] \
|
|
185
|
+
for nskey in self \
|
|
186
|
+
if nskey.startswith(namespace) })
|
|
175
187
|
return cls(out)
|
|
176
188
|
|
|
177
189
|
def keys(self, *namespaces, unprefixed=False):
|
|
@@ -205,7 +217,9 @@ class FrozenKeyMap(FrozenKeyMapBase):
|
|
|
205
217
|
return hash(tuple(self.keys())) ^ len(self)
|
|
206
218
|
|
|
207
219
|
def _get_namespace_foset(self):
|
|
208
|
-
return FlatOrderedSet(get_ns(nskey)
|
|
220
|
+
return FlatOrderedSet(get_ns(nskey) \
|
|
221
|
+
for nskey in self \
|
|
222
|
+
if NAMESPACE_SEP in nskey)
|
|
209
223
|
|
|
210
224
|
def namespaces(self):
|
|
211
225
|
yield from self._get_namespace_foset()
|
|
@@ -374,10 +388,12 @@ class NamespaceWalker(FrozenKeyMap):
|
|
|
374
388
|
if cls is None:
|
|
375
389
|
from clu.config.keymap import FrozenFlat
|
|
376
390
|
cls = FrozenFlat
|
|
377
|
-
return cls({ pack_ns(key, *fragments) : value
|
|
391
|
+
return cls({ pack_ns(key, *fragments) : value \
|
|
392
|
+
for *fragments, key, value in self.walk() })
|
|
378
393
|
|
|
379
394
|
def _get_namespace_foset(self):
|
|
380
|
-
return FlatOrderedSet(concatenate_ns(*fragments)
|
|
395
|
+
return FlatOrderedSet(concatenate_ns(*fragments) \
|
|
396
|
+
for *fragments, _, _ in self.walk() if fragments)
|
|
381
397
|
|
|
382
398
|
def keys(self, *namespaces, unprefixed=False):
|
|
383
399
|
""" Return a namespaced view over either all keys in the mapping,
|
|
@@ -479,9 +495,8 @@ class FlatOrderedSet(collections.abc.Set,
|
|
|
479
495
|
""" Used by `clu.config.codecs` to deserialize FlatOrderedSets """
|
|
480
496
|
out = cls()
|
|
481
497
|
out.things = tuple(instance_dict['things'])
|
|
498
|
+
out.predicate = qualified_import(instance_dict['predicate'])
|
|
482
499
|
return out
|
|
483
|
-
# return cls(*instance_dict['things'],
|
|
484
|
-
# predicate=qualified_import(instance_dict['predicate']))
|
|
485
500
|
|
|
486
501
|
@classmethod
|
|
487
502
|
def appreciates(cls, instance):
|
|
@@ -618,7 +633,8 @@ class FlatOrderedSet(collections.abc.Set,
|
|
|
618
633
|
def clone(self, deep=False, memo=None):
|
|
619
634
|
copier = getattr(copy, deep and 'deepcopy' or 'copy')
|
|
620
635
|
out = type(self)()
|
|
621
|
-
out.things =
|
|
636
|
+
out.things = copier(self.things)
|
|
637
|
+
out.predicate = self.predicate
|
|
622
638
|
return out
|
|
623
639
|
|
|
624
640
|
def inner_repr(self):
|
|
@@ -72,10 +72,7 @@ class FrozenEnviron(NamespaceWalker, clu.abstract.ReprWrapper,
|
|
|
72
72
|
""" Initialize a FrozenKeyMap instance wrapping an environment-variable
|
|
73
73
|
dictionary from a target dictionary, with a supplied appname.
|
|
74
74
|
"""
|
|
75
|
-
|
|
76
|
-
super().__init__(**updates)
|
|
77
|
-
except TypeError:
|
|
78
|
-
super().__init__()
|
|
75
|
+
super().__init__()
|
|
79
76
|
self.appname = appname or APPNAME
|
|
80
77
|
self.environment = environment is None \
|
|
81
78
|
and os.environ.copy() \
|
|
@@ -142,13 +139,10 @@ class Environ(FrozenEnviron, KeyMap, contextlib.AbstractContextManager):
|
|
|
142
139
|
"""
|
|
143
140
|
if environment is None:
|
|
144
141
|
environment = os.environ
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
except TypeError:
|
|
150
|
-
super().__init__(environment=environment,
|
|
151
|
-
appname=appname)
|
|
142
|
+
|
|
143
|
+
super().__init__(environment=environment,
|
|
144
|
+
appname=appname,
|
|
145
|
+
**updates)
|
|
152
146
|
self.stash = None
|
|
153
147
|
|
|
154
148
|
def freeze(self):
|
|
@@ -177,10 +177,8 @@ class FileBase(Nested, FileName): # type: ignore
|
|
|
177
177
|
extra_user_dirs = kwargs.pop('extra_user_dirs', None)
|
|
178
178
|
search_sys_path = kwargs.pop('search_sys_path', False)
|
|
179
179
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
except TypeError:
|
|
183
|
-
super(FileBase, self).__init__()
|
|
180
|
+
# Call super:
|
|
181
|
+
super(FileBase, self).__init__(*args, **kwargs)
|
|
184
182
|
|
|
185
183
|
if isvalidpath(filepath):
|
|
186
184
|
self.filepath = filepath
|
|
@@ -62,10 +62,7 @@ class FrozenFlat(abc.FrozenKeyMap, clu.abstract.ReprWrapper,
|
|
|
62
62
|
output of ‘pack_ns(…)’ (q.v. function definition supra.)
|
|
63
63
|
"""
|
|
64
64
|
# Call up:
|
|
65
|
-
|
|
66
|
-
super().__init__(**updates)
|
|
67
|
-
except TypeError:
|
|
68
|
-
super().__init__()
|
|
65
|
+
super().__init__(**updates)
|
|
69
66
|
|
|
70
67
|
# Sort out our passed-in dictionary:
|
|
71
68
|
if hasattr(dictionary, 'dictionary'):
|
|
@@ -170,9 +167,8 @@ class FrozenNested(abc.NamespaceWalker, clu.abstract.ReprWrapper,
|
|
|
170
167
|
@classmethod
|
|
171
168
|
def from_dict(cls, instance_dict):
|
|
172
169
|
""" Used by `clu.config.codecs` to deserialize keymaps """
|
|
173
|
-
out = cls()
|
|
170
|
+
out = cls(nskeyset=instance_dict.get('nskeyset', None))
|
|
174
171
|
out.tree = instance_dict['tree']
|
|
175
|
-
out.nskeys = instance_dict['nskeyset']
|
|
176
172
|
return out
|
|
177
173
|
|
|
178
174
|
def __init__(self, tree=None, *, nskeyset=None, **updates):
|
|
@@ -180,10 +176,7 @@ class FrozenNested(abc.NamespaceWalker, clu.abstract.ReprWrapper,
|
|
|
180
176
|
target nested dictionary (or a “tree” of dicts).
|
|
181
177
|
"""
|
|
182
178
|
# Call up:
|
|
183
|
-
|
|
184
|
-
super().__init__(**updates)
|
|
185
|
-
except TypeError:
|
|
186
|
-
super().__init__()
|
|
179
|
+
super().__init__()
|
|
187
180
|
|
|
188
181
|
# Sort out the nature of the input:
|
|
189
182
|
if hasattr(tree, 'tree'):
|
|
@@ -192,7 +185,7 @@ class FrozenNested(abc.NamespaceWalker, clu.abstract.ReprWrapper,
|
|
|
192
185
|
tree = getattr(tree.nestify(), 'tree')
|
|
193
186
|
|
|
194
187
|
# Assign, and deal with updates:
|
|
195
|
-
self.tree = dictify(tree or {}
|
|
188
|
+
self.tree = dictify(tree or {})
|
|
196
189
|
if updates:
|
|
197
190
|
for nskey, value in updates.items():
|
|
198
191
|
key, fragments = ns.unpack_ns(nskey)
|
|
@@ -206,7 +199,7 @@ class FrozenNested(abc.NamespaceWalker, clu.abstract.ReprWrapper,
|
|
|
206
199
|
d[key] = value
|
|
207
200
|
|
|
208
201
|
# Keep the keyset we got:
|
|
209
|
-
self.nskeys = nskeyset
|
|
202
|
+
self.nskeys = nskeyset and frozenset(nskeyset) or None
|
|
210
203
|
|
|
211
204
|
def walk(self):
|
|
212
205
|
""" Iteratively walk the nested KeyMap’s tree of dicts. """
|
|
@@ -222,7 +215,7 @@ class FrozenNested(abc.NamespaceWalker, clu.abstract.ReprWrapper,
|
|
|
222
215
|
return thaw_class(type(self))(tree=copy.copy(self.tree),
|
|
223
216
|
nskeyset=copy.copy(self.nskeys))
|
|
224
217
|
|
|
225
|
-
def submap(self, *namespaces, unprefixed=False, cls=
|
|
218
|
+
def submap(self, *namespaces, unprefixed=False, cls=None):
|
|
226
219
|
""" Return a flattened mapping, if possible a mutable one,
|
|
227
220
|
containing only items with keys matching the specified
|
|
228
221
|
namespaces (as namespaced:key:paths).
|
|
@@ -233,7 +226,7 @@ class FrozenNested(abc.NamespaceWalker, clu.abstract.ReprWrapper,
|
|
|
233
226
|
|
|
234
227
|
# Short-circuit for returning unprefixed top-level items:
|
|
235
228
|
if unprefixed:
|
|
236
|
-
return cls({ key
|
|
229
|
+
return cls({ key: value \
|
|
237
230
|
for key, value in self.tree.items() \
|
|
238
231
|
if not ismapping(value) })
|
|
239
232
|
|
|
@@ -298,10 +291,7 @@ class Nested(FrozenNested, abc.KeyMap):
|
|
|
298
291
|
target nested dictionary (or a “tree” of dicts).
|
|
299
292
|
"""
|
|
300
293
|
# Call up, without passing nskeyset:
|
|
301
|
-
|
|
302
|
-
super().__init__(tree=tree, nskeyset=None, **updates)
|
|
303
|
-
except TypeError:
|
|
304
|
-
super().__init__()
|
|
294
|
+
super().__init__(tree=tree, nskeyset=None, **updates)
|
|
305
295
|
|
|
306
296
|
# Mutable-ize the keyset:
|
|
307
297
|
self.nskeys = nskeyset and set(nskeyset) or set(self.nskeyset())
|
|
@@ -108,10 +108,7 @@ class ChainRepr(Repr):
|
|
|
108
108
|
""" Initialize a ChainRepr, with default params
|
|
109
109
|
for ‘maxlevel’, ‘maxstring’, and ‘maxother’.
|
|
110
110
|
"""
|
|
111
|
-
|
|
112
|
-
super().__init__(*args, **kwargs)
|
|
113
|
-
except TypeError:
|
|
114
|
-
super().__init__()
|
|
111
|
+
super().__init__(*args, **kwargs)
|
|
115
112
|
self.maxlevel = maxlevel
|
|
116
113
|
self.maxstring = maxstring
|
|
117
114
|
self.maxother = maxother
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
from __future__ import print_function
|
|
3
3
|
|
|
4
|
+
import abc
|
|
4
5
|
import clu.abstract
|
|
6
|
+
import collections.abc
|
|
5
7
|
|
|
6
8
|
from clu.constants.polyfills import Enum, EnumMeta # type: ignore
|
|
7
9
|
from clu.exporting import Exporter
|
|
@@ -101,7 +103,7 @@ class alias(clu.abstract.BaseDescriptor, metaclass=clu.abstract.Slotted):
|
|
|
101
103
|
cls.__aliases__[self.name] = self.member_for_value(cls, self.aliased)
|
|
102
104
|
|
|
103
105
|
@export
|
|
104
|
-
class AliasingEnumMeta(EnumMeta):
|
|
106
|
+
class AliasingEnumMeta(EnumMeta, abc.ABCMeta):
|
|
105
107
|
|
|
106
108
|
def __new__(metacls, name, bases, attributes, **kwargs):
|
|
107
109
|
""" Ensure `__aliases__` is a dictionary attribute on the new class.
|
|
@@ -434,10 +434,8 @@ class ExporterBase(collections.abc.MutableMapping,
|
|
|
434
434
|
if putative in cls.instances:
|
|
435
435
|
return cls.instances[putative]
|
|
436
436
|
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
except TypeError:
|
|
440
|
-
instance = super().__new__(cls)
|
|
437
|
+
# Call super:
|
|
438
|
+
instance = super().__new__(cls) # type: ignore
|
|
441
439
|
|
|
442
440
|
instance.__exports__ = {}
|
|
443
441
|
instance.path = path
|
|
@@ -23,10 +23,8 @@ class SourceTree(abc.ABC, metaclass=Slotted):
|
|
|
23
23
|
__slots__ = ('directory', 'header_lines', 'filepath')
|
|
24
24
|
|
|
25
25
|
def __init__(self, filepath, path=None, **kwargs):
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
except TypeError:
|
|
29
|
-
super(SourceTree, self).__init__()
|
|
26
|
+
# Call super:
|
|
27
|
+
super(SourceTree, self).__init__(**kwargs)
|
|
30
28
|
|
|
31
29
|
# Check the “srctree” file:
|
|
32
30
|
if not os.path.isfile(filepath):
|
|
@@ -374,10 +374,7 @@ class LoaderBase(clu.abstract.AppName,
|
|
|
374
374
|
# Create and register a new loader, as per the
|
|
375
375
|
# arguments with which to initialize this new
|
|
376
376
|
# loader instance:
|
|
377
|
-
|
|
378
|
-
cls.instances[key] = instance = super().__new__(cls, *args, **kwargs)
|
|
379
|
-
except TypeError:
|
|
380
|
-
cls.instances[key] = instance = super().__new__(cls)
|
|
377
|
+
cls.instances[key] = instance = super().__new__(cls, *args, **kwargs)
|
|
381
378
|
|
|
382
379
|
# Return the newly created instance:
|
|
383
380
|
return instance
|
|
@@ -275,10 +275,7 @@ class Partial(partial):
|
|
|
275
275
|
def __init__(self, *args, **kwargs):
|
|
276
276
|
""" Initialize a new Partial object, with a predicate and a function """
|
|
277
277
|
# N.B. The real action seems to happen in partial.__new__(…)
|
|
278
|
-
|
|
279
|
-
super().__init__(*args, **kwargs)
|
|
280
|
-
except:
|
|
281
|
-
super().__init__() # type: ignore
|
|
278
|
+
super().__init__()
|
|
282
279
|
|
|
283
280
|
# Name the Partial instance, as if it’s a phi-type:
|
|
284
281
|
self.__name__ = self.__qualname__ = φ
|
|
@@ -18,7 +18,7 @@ from clu.predicates import mro, or_none
|
|
|
18
18
|
from clu.typology import dict_types, isstring, isbytes
|
|
19
19
|
from clu.fs.misc import re_matcher
|
|
20
20
|
from clu.naming import nameof, qualified_name, isinspectable
|
|
21
|
-
from clu.enums import alias, AliasingEnumMeta
|
|
21
|
+
from clu.enums import alias, AliasingEnum, AliasingEnumMeta
|
|
22
22
|
from clu.stdio import std, linebreak, flush_all
|
|
23
23
|
from clu.exporting import Exporter
|
|
24
24
|
|
|
@@ -28,12 +28,14 @@ export = exporter.decorator()
|
|
|
28
28
|
print_separator = lambda filler='-': print(filler * SEPARATOR_WIDTH)
|
|
29
29
|
|
|
30
30
|
@export
|
|
31
|
-
class ANSIBase(
|
|
31
|
+
class ANSIBase(clu.abstract.Appreciative, AliasingEnum):
|
|
32
32
|
|
|
33
33
|
""" Root ancestor class for all ANSI-code enums """
|
|
34
34
|
|
|
35
35
|
@classmethod
|
|
36
|
-
def
|
|
36
|
+
def appreciates(cls, instance):
|
|
37
|
+
""" Boolean, tests if the class “appreciates” an instance """
|
|
38
|
+
# N.B. This is far too ripe for false positives
|
|
37
39
|
return cls in mro(instance)
|
|
38
40
|
|
|
39
41
|
@export
|
|
@@ -133,7 +135,7 @@ class ANSI(AliasingEnumMeta):
|
|
|
133
135
|
""" Convert a specifier of unknown type to an enum or alias member """
|
|
134
136
|
if specifier is None:
|
|
135
137
|
return cls.NOTHING
|
|
136
|
-
elif cls.
|
|
138
|
+
elif cls.appreciates(specifier):
|
|
137
139
|
return specifier # Already an ANSI type, return it
|
|
138
140
|
if isstring(specifier):
|
|
139
141
|
return cls.for_name(specifier) # Match by name, decoding if necessary
|
|
@@ -325,7 +327,7 @@ class ANSIFormat(clu.abstract.Format,
|
|
|
325
327
|
text = from_value
|
|
326
328
|
elif isbytes(from_value):
|
|
327
329
|
text = str(from_value, encoding=ENCODING)
|
|
328
|
-
elif ANSIBase.
|
|
330
|
+
elif ANSIBase.appreciates(from_value):
|
|
329
331
|
text = from_value
|
|
330
332
|
instance = cls.get_or_create(Text.convert(text),
|
|
331
333
|
Background.convert(background),
|
|
@@ -583,8 +585,8 @@ wrapper_kws = lambda **kwargs: { **BASE_KWARGS, **kwargs }
|
|
|
583
585
|
@export
|
|
584
586
|
class HighlighterWrapper(TextWrapper):
|
|
585
587
|
|
|
586
|
-
def __init__(self):
|
|
587
|
-
super().__init__(**wrapper_kws())
|
|
588
|
+
def __init__(self, **kwargs):
|
|
589
|
+
super().__init__(**wrapper_kws(**kwargs))
|
|
588
590
|
|
|
589
591
|
@export
|
|
590
592
|
class DualOptionWrapper(clu.abstract.Format):
|
|
@@ -164,7 +164,6 @@ import math
|
|
|
164
164
|
import operator
|
|
165
165
|
import pickle
|
|
166
166
|
import shutil
|
|
167
|
-
import six
|
|
168
167
|
import sysconfig
|
|
169
168
|
import weakref
|
|
170
169
|
|
|
@@ -231,7 +230,6 @@ __all__ = ('Image',
|
|
|
231
230
|
'pickle',
|
|
232
231
|
'reduce',
|
|
233
232
|
'shutil',
|
|
234
|
-
'six',
|
|
235
233
|
'sysconfig',
|
|
236
234
|
'types',
|
|
237
235
|
'weakref',
|
|
@@ -380,14 +378,6 @@ else:
|
|
|
380
378
|
# Extend `__all__`:
|
|
381
379
|
__all__ += ('numpy',)
|
|
382
380
|
|
|
383
|
-
try:
|
|
384
|
-
import more_itertools
|
|
385
|
-
except (ImportError, SyntaxError):
|
|
386
|
-
pass
|
|
387
|
-
else:
|
|
388
|
-
# Extend `__all__`:
|
|
389
|
-
__all__ += ('more_itertools',)
|
|
390
|
-
|
|
391
381
|
try:
|
|
392
382
|
import colorama
|
|
393
383
|
import termcolor
|
|
@@ -116,7 +116,7 @@ mods = ('clu',
|
|
|
116
116
|
'argparse', 'collections', 'contextlib', 'copy',
|
|
117
117
|
'datetime', 'functools', 'importlib', 'inspect',
|
|
118
118
|
'itertools', 'math', 'operator', 'pathlib',
|
|
119
|
-
'pickle', '
|
|
119
|
+
'pickle', 'shutil', 'sysconfig', 'weakref',
|
|
120
120
|
'numpy', 'colorama',
|
|
121
121
|
'xerox', 'zict')
|
|
122
122
|
|
|
@@ -100,13 +100,8 @@ class NodeBase(collections.abc.Hashable,
|
|
|
100
100
|
|
|
101
101
|
def __new__(cls, parent, name, *children, value=None):
|
|
102
102
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
name,
|
|
106
|
-
*children,
|
|
107
|
-
value=value) # type: ignore
|
|
108
|
-
except TypeError:
|
|
109
|
-
instance = super().__new__(cls)
|
|
103
|
+
# Call super:
|
|
104
|
+
instance = super().__new__(cls) # type: ignore
|
|
110
105
|
|
|
111
106
|
instance.node_name = str(name)
|
|
112
107
|
instance.node_value = value
|
|
@@ -489,17 +484,19 @@ class NodeTreeMap(NamespaceWalker, clu.abstract.ReprWrapper,
|
|
|
489
484
|
|
|
490
485
|
def __init__(self, tree=None, **updates):
|
|
491
486
|
""" Initialize a NodeTreeMap, hosting a given node tree """
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
except TypeError:
|
|
495
|
-
super().__init__()
|
|
487
|
+
# Call super:
|
|
488
|
+
super().__init__(**updates)
|
|
496
489
|
tree = getattr(tree, 'tree', tree)
|
|
490
|
+
|
|
497
491
|
# “mnq gvfc” – Nellie
|
|
498
492
|
if tree is not None:
|
|
499
493
|
if type(tree) not in acceptable_types:
|
|
500
494
|
badtype = nameof(typeof(tree))
|
|
501
495
|
raise TypeError(f"NodeTreeMap requires a Node instance, not type {badtype}")
|
|
496
|
+
|
|
497
|
+
# Assign tree:
|
|
502
498
|
self.tree = tree
|
|
499
|
+
|
|
503
500
|
# N.B. – assume updates is a basic KeyMap:
|
|
504
501
|
if updates:
|
|
505
502
|
for nskey, value in updates.items():
|
|
@@ -31,10 +31,8 @@ class NamespaceRepr(Repr):
|
|
|
31
31
|
""" Initialize a NamespaceRepr, with default params
|
|
32
32
|
for ‘maxlevel’, ‘maxstring’, and ‘maxother’.
|
|
33
33
|
"""
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
except TypeError:
|
|
37
|
-
super().__init__()
|
|
34
|
+
# Call super:
|
|
35
|
+
super().__init__(*args, **kwargs)
|
|
38
36
|
self.maxlevel = maxlevel
|
|
39
37
|
self.maxstring = maxstring
|
|
40
38
|
self.maxother = maxother
|
|
@@ -135,11 +135,7 @@ array_types += attrs(numpy, 'ndarray',
|
|
|
135
135
|
scalar_types = frozenset(getattr(numpy, 'ScalarType',
|
|
136
136
|
set(numeric_types) - { decimal.Decimal }))
|
|
137
137
|
|
|
138
|
-
|
|
139
|
-
from six import string_types
|
|
140
|
-
except (ImportError, SyntaxError): # pragma: no cover
|
|
141
|
-
string_types = tuple(uniquify(str, unicode))
|
|
142
|
-
|
|
138
|
+
string_types = tuple(uniquify(str, unicode))
|
|
143
139
|
bytes_types = (bytes, bytearray)
|
|
144
140
|
path_classes = tuplize(argparse.FileType, or_none(os, 'PathLike'), Path) # Path may be “None” in disguise
|
|
145
141
|
path_types = string_types + bytes_types + path_classes # type: ignore
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-clu
|
|
3
|
-
Version: 0.12.
|
|
3
|
+
Version: 0.12.16
|
|
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
|
|
@@ -42,7 +42,6 @@ Requires-Dist: enum34>=1.1.0; python_version < "3.4"
|
|
|
42
42
|
Requires-Dist: humanize>=1.0.0
|
|
43
43
|
Requires-Dist: importlib-metadata>=1.4.0; python_version < "3.8"
|
|
44
44
|
Requires-Dist: mock>=4.0.0
|
|
45
|
-
Requires-Dist: more_itertools>=8.0.0
|
|
46
45
|
Requires-Dist: multidict>=4.7.0
|
|
47
46
|
Requires-Dist: packaging
|
|
48
47
|
Requires-Dist: pout>=0.8.13
|
|
@@ -50,14 +49,12 @@ Requires-Dist: pygments>=2.0.0
|
|
|
50
49
|
Requires-Dist: PyYAML>=5.3.0
|
|
51
50
|
Requires-Dist: redis>=3.4.0
|
|
52
51
|
Requires-Dist: setuptools>=30.0.0
|
|
53
|
-
Requires-Dist: six>=1.10.0
|
|
54
52
|
Requires-Dist: toml>=0.10.0
|
|
55
53
|
Requires-Dist: tomli>=2.2.0
|
|
56
54
|
Requires-Dist: tomli_w>=1.2.0
|
|
57
55
|
Requires-Dist: wheel>=0.34.0
|
|
58
56
|
Requires-Dist: zict>=0.1.2
|
|
59
57
|
Provides-Extra: all
|
|
60
|
-
Requires-Dist: more_itertools>=8.0.0; extra == "all"
|
|
61
58
|
Requires-Dist: numpy>=1.17.0; extra == "all"
|
|
62
59
|
Requires-Dist: Pillow>=7.1.0; extra == "all"
|
|
63
60
|
Requires-Dist: pytest>=5.4.0; extra == "all"
|