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